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

This commit is contained in:
Chumva 2018-08-14 10:34:41 +03:00
commit ad7bd6d1c5
9 changed files with 322 additions and 27 deletions

View file

@ -7,11 +7,8 @@ import android.net.ConnectivityManager
import android.net.NetworkInfo import android.net.NetworkInfo
import android.os.Build import android.os.Build
import android.os.Handler import android.os.Handler
import net.osmand.telegram.helpers.OsmandAidlHelper import net.osmand.telegram.helpers.*
import net.osmand.telegram.helpers.OsmandAidlHelper.OsmandHelperListener import net.osmand.telegram.helpers.OsmandAidlHelper.OsmandHelperListener
import net.osmand.telegram.helpers.ShareLocationHelper
import net.osmand.telegram.helpers.ShowLocationHelper
import net.osmand.telegram.helpers.TelegramHelper
import net.osmand.telegram.notifications.NotificationHelper import net.osmand.telegram.notifications.NotificationHelper
import net.osmand.telegram.utils.AndroidUtils import net.osmand.telegram.utils.AndroidUtils
import net.osmand.telegram.utils.UiUtils import net.osmand.telegram.utils.UiUtils
@ -26,6 +23,7 @@ class TelegramApplication : Application(), OsmandHelperListener {
lateinit var notificationHelper: NotificationHelper private set lateinit var notificationHelper: NotificationHelper private set
lateinit var osmandAidlHelper: OsmandAidlHelper private set lateinit var osmandAidlHelper: OsmandAidlHelper private set
lateinit var locationProvider: TelegramLocationProvider private set lateinit var locationProvider: TelegramLocationProvider private set
lateinit var messagesDbHelper: MessagesDbHelper private set
var telegramService: TelegramService? = null var telegramService: TelegramService? = null
@ -37,6 +35,7 @@ class TelegramApplication : Application(), OsmandHelperListener {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
telegramHelper.appDir = filesDir.absolutePath telegramHelper.appDir = filesDir.absolutePath
telegramHelper.init()
settings = TelegramSettings(this) settings = TelegramSettings(this)
telegramHelper.messageActiveTimeSec = settings.locHistoryTime telegramHelper.messageActiveTimeSec = settings.locHistoryTime
@ -61,6 +60,7 @@ class TelegramApplication : Application(), OsmandHelperListener {
showLocationHelper = ShowLocationHelper(this) showLocationHelper = ShowLocationHelper(this)
notificationHelper = NotificationHelper(this) notificationHelper = NotificationHelper(this)
locationProvider = TelegramLocationProvider(this) locationProvider = TelegramLocationProvider(this)
messagesDbHelper = MessagesDbHelper(this)
if (settings.hasAnyChatToShareLocation() && AndroidUtils.isLocationPermissionAvailable(this)) { if (settings.hasAnyChatToShareLocation() && AndroidUtils.isLocationPermissionAvailable(this)) {
shareLocationHelper.startSharingLocation() shareLocationHelper.startSharingLocation()

View file

@ -0,0 +1,118 @@
package net.osmand.telegram.helpers
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import net.osmand.telegram.TelegramApplication
import org.drinkless.td.libcore.telegram.TdApi
class MessagesDbHelper(val app: TelegramApplication) {
private val messages = HashSet<Message>()
private val sqliteHelper: SQLiteHelper
init {
sqliteHelper = SQLiteHelper(app)
sqliteHelper.getMessages().forEach {
app.telegramHelper.loadMessage(it.chatId, it.messageId)
}
app.telegramHelper.addIncomingMessagesListener(object :
TelegramHelper.TelegramIncomingMessagesListener {
override fun onReceiveChatLocationMessages(
chatId: Long, vararg messages: TdApi.Message
) {
messages.forEach { addMessage(chatId, it.id) }
}
override fun onDeleteChatLocationMessages(chatId: Long, messages: List<TdApi.Message>) {
messages.forEach { removeMessage(chatId, it.id) }
}
override fun updateLocationMessages() {}
})
}
fun saveMessages() {
sqliteHelper.clearMessages()
synchronized(messages) {
sqliteHelper.addMessages(messages)
}
}
private fun addMessage(chatId: Long, messageId: Long) {
synchronized(messages) {
messages.add(Message(chatId, messageId))
}
}
private fun removeMessage(chatId: Long, messageId: Long) {
synchronized(messages) {
messages.remove(Message(chatId, messageId))
}
}
private class SQLiteHelper(context: Context) :
SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL(MESSAGES_TABLE_CREATE)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL(MESSAGES_TABLE_DELETE)
onCreate(db)
}
internal fun addMessages(messages: Set<Message>) {
messages.forEach {
writableDatabase?.execSQL(MESSAGES_TABLE_INSERT, arrayOf(it.chatId, it.messageId))
}
}
internal fun getMessages(): Set<Message> {
val res = HashSet<Message>()
readableDatabase?.rawQuery(MESSAGES_TABLE_SELECT, null)?.apply {
if (moveToFirst()) {
do {
res.add(Message(getLong(0), getLong(1)))
} while (moveToNext())
}
close()
}
return res
}
internal fun clearMessages() {
writableDatabase?.execSQL(MESSAGES_TABLE_CLEAR)
}
companion object {
private const val DB_NAME = "messages.db"
private const val DB_VERSION = 1
private const val MESSAGES_TABLE_NAME = "messages"
private const val MESSAGES_COL_CHAT_ID = "chat_id"
private const val MESSAGES_COL_MESSAGE_ID = "message_id"
private const val MESSAGES_TABLE_CREATE =
"CREATE TABLE IF NOT EXISTS $MESSAGES_TABLE_NAME (" +
"$MESSAGES_COL_CHAT_ID LONG, " +
"$MESSAGES_COL_MESSAGE_ID LONG)"
private const val MESSAGES_TABLE_DELETE = "DROP TABLE IF EXISTS $MESSAGES_TABLE_NAME"
private const val MESSAGES_TABLE_SELECT =
"SELECT $MESSAGES_COL_CHAT_ID, $MESSAGES_COL_MESSAGE_ID FROM $MESSAGES_TABLE_NAME"
private const val MESSAGES_TABLE_CLEAR = "DELETE FROM $MESSAGES_TABLE_NAME"
private const val MESSAGES_TABLE_INSERT = "INSERT INTO $MESSAGES_TABLE_NAME (" +
"$MESSAGES_COL_CHAT_ID, $MESSAGES_COL_MESSAGE_ID) VALUES (?, ?)"
}
}
private data class Message(val chatId: Long, val messageId: Long)
}

View file

@ -292,13 +292,20 @@ class TelegramHelper private constructor() {
return if (libraryLoaded) { return if (libraryLoaded) {
// create client // create client
client = Client.create(UpdatesHandler(), null, null) client = Client.create(UpdatesHandler(), null, null)
client!!.send(TdApi.GetAuthorizationState(), defaultHandler)
true true
} else { } else {
false false
} }
} }
fun requestAuthorizationState() {
client?.send(TdApi.GetAuthorizationState()) { obj ->
if (obj is TdApi.AuthorizationState) {
onAuthorizationStateUpdated(obj)
}
}
}
fun isInit() = client != null && haveAuthorization fun isInit() = client != null && haveAuthorization
fun getUserPhotoPath(user: TdApi.User): String? { fun getUserPhotoPath(user: TdApi.User): String? {
@ -473,6 +480,10 @@ class TelegramHelper private constructor() {
} }
} }
fun loadMessage(chatId: Long, messageId: Long) {
requestMessage(chatId, messageId, this@TelegramHelper::addNewMessage)
}
private fun requestMessage(chatId: Long, messageId: Long, onComplete: (TdApi.Message) -> Unit) { private fun requestMessage(chatId: Long, messageId: Long, onComplete: (TdApi.Message) -> Unit) {
client?.send(TdApi.GetMessage(chatId, messageId)) { obj -> client?.send(TdApi.GetMessage(chatId, messageId)) { obj ->
when (obj.constructor) { when (obj.constructor) {

View file

@ -117,6 +117,8 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
} }
} }
}) })
telegramHelper.listener = this
telegramHelper.requestAuthorizationState()
if (osmandAidlHelper.isOsmandBound() && !osmandAidlHelper.isOsmandConnected()) { if (osmandAidlHelper.isOsmandBound() && !osmandAidlHelper.isOsmandConnected()) {
osmandAidlHelper.connectOsmand() osmandAidlHelper.connectOsmand()
@ -138,9 +140,8 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
super.onResume() super.onResume()
paused = false paused = false
if (telegramHelper.listener != this) {
telegramHelper.listener = this telegramHelper.listener = this
if (!telegramHelper.isInit()) {
telegramHelper.init()
} }
app.locationProvider.checkIfLastKnownLocationIsValid() app.locationProvider.checkIfLastKnownLocationIsValid()
@ -167,6 +168,7 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
override fun onStop() { override fun onStop() {
super.onStop() super.onStop()
settings.save() settings.save()
app.messagesDbHelper.saveMessages()
} }
override fun onDestroy() { override fun onDestroy() {
@ -253,7 +255,7 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
if (telegramHelper.getTelegramAuthorizationState() != TelegramAuthorizationState.CLOSED) { if (telegramHelper.getTelegramAuthorizationState() != TelegramAuthorizationState.CLOSED) {
telegramHelper.logout() telegramHelper.logout()
} }
telegramHelper.init() // FIXME: update UI
} }
private fun logoutTelegram(silent: Boolean = false) { private fun logoutTelegram(silent: Boolean = false) {

View file

@ -73,7 +73,7 @@
<!--<asset source="voice/pt-br/pt-br_tts.js" destination="voice/pt-br-tts/pt-br_tts.js" mode="overwriteOnlyIfExists" />--> <!--<asset source="voice/pt-br/pt-br_tts.js" destination="voice/pt-br-tts/pt-br_tts.js" mode="overwriteOnlyIfExists" />-->
<!--<asset source="voice/ro/ro_tts.js" destination="voice/ro-tts/ro_tts.js" mode="overwriteOnlyIfExists" />--> <!--<asset source="voice/ro/ro_tts.js" destination="voice/ro-tts/ro_tts.js" mode="overwriteOnlyIfExists" />-->
<asset source="voice/ru/ru_tts.js" destination="voice/ru-tts/ru_tts.js" mode="alwaysOverwriteOrCopy" /> <asset source="voice/ru/ru_tts.js" destination="voice/ru-tts/ru_tts.js" mode="alwaysOverwriteOrCopy" />
<!--<asset source="voice/sc/sc_tts.js" destination="voice/sc-tts/sc_tts.js" mode="overwriteOnlyIfExists" />--> <asset source="voice/sc/sc_tts.js" destination="voice/sc-tts/sc_tts.js" mode="overwriteOnlyIfExists" />
<!--<asset source="voice/sk/sk_tts.js" destination="voice/sk-tts/sk_tts.js" mode="overwriteOnlyIfExists" />--> <!--<asset source="voice/sk/sk_tts.js" destination="voice/sk-tts/sk_tts.js" mode="overwriteOnlyIfExists" />-->
<!--<asset source="voice/sl/sl_tts.js" destination="voice/sl-tts/sl_tts.js" mode="overwriteOnlyIfExists" />--> <!--<asset source="voice/sl/sl_tts.js" destination="voice/sl-tts/sl_tts.js" mode="overwriteOnlyIfExists" />-->
<!--<asset source="voice/sv/sv_tts.js" destination="voice/sv-tts/sv_tts.js" mode="overwriteOnlyIfExists" />--> <!--<asset source="voice/sv/sv_tts.js" destination="voice/sv-tts/sv_tts.js" mode="overwriteOnlyIfExists" />-->

View file

@ -597,7 +597,7 @@
<string name="poi_camp_site">Kemp</string> <string name="poi_camp_site">Kemp</string>
<string name="poi_caravan_site">Autokemp</string> <string name="poi_caravan_site">Autokemp</string>
<string name="poi_picnic_site">Místo pro piknik</string> <string name="poi_picnic_site">Místo pro piknik</string>
<string name="poi_spring">Pramen</string> <string name="poi_spring">Studánka (pramen)</string>
<string name="poi_hot_spring">Horký pramen</string> <string name="poi_hot_spring">Horký pramen</string>
<string name="poi_geyser">Gejzír</string> <string name="poi_geyser">Gejzír</string>
<string name="poi_tomb">Hrobka</string> <string name="poi_tomb">Hrobka</string>
@ -3700,14 +3700,14 @@
<string name="poi_socket_as3112_current">Maximální proud zásuvky australského typu AS 3112 [A]</string> <string name="poi_socket_as3112_current">Maximální proud zásuvky australského typu AS 3112 [A]</string>
<string name="poi_socket_as3112_output">Maximální výkon zásuvky australského typu AS 3112 [kW]</string> <string name="poi_socket_as3112_output">Maximální výkon zásuvky australského typu AS 3112 [kW]</string>
<string name="poi_car_yes">Vhodné pro Osobní automobily</string> <string name="poi_car_yes">Osobní auta: Ano</string>
<string name="poi_car_no">Nevhodné pro Osobní automobily</string> <string name="poi_car_no">Osobní auta: Ne</string>
<string name="poi_bicycle_yes">Vhodné pro jízdní kola</string> <string name="poi_bicycle_yes">Jízdní kola: Ano</string>
<string name="poi_bicycle_no">Nevhodné pro jízdní kola</string> <string name="poi_bicycle_no">Jízdní kola: Ne</string>
<string name="poi_scooter_yes">Vhodné pro skútry</string> <string name="poi_scooter_yes">Skútry a motorky: Ano</string>
<string name="poi_scooter_no">Nevhodné pro skútry</string> <string name="poi_scooter_no">Skútry a motorky: Ne</string>
<string name="poi_truck_yes">Vhodné pro nákladní automobily</string> <string name="poi_truck_yes">Nákladní automobily: Ano</string>
<string name="poi_truck_no">Nevhodné pro nákladní automobily</string> <string name="poi_truck_no">Nákladní automobily: Ne</string>
<string name="poi_parking_fee_yes">S poplatkem za parkování</string> <string name="poi_parking_fee_yes">S poplatkem za parkování</string>
<string name="poi_parking_fee_no">Bez poplatku za parkování</string> <string name="poi_parking_fee_no">Bez poplatku za parkování</string>

View file

@ -989,7 +989,7 @@ Proporcionální paměť %4$s MB (limit Androidu %5$s MB, Dalvik %6$s MB).</stri
<string name="shared_string_more_actions">Další akce</string> <string name="shared_string_more_actions">Další akce</string>
<string name="monitoring_settings_descr">Konfigurace záznamů vašich cest.</string> <string name="monitoring_settings_descr">Konfigurace záznamů vašich cest.</string>
<string name="install_paid">Instalovat plnou verzi</string> <string name="install_paid">Instalovat plnou verzi</string>
<string name="cancel_navigation">Zastavit navigaci</string> <string name="cancel_navigation">Ukončit navigaci</string>
<string name="use_kalman_filter_compass_descr">Sníží šum v hodnotách z kompasu, ale zpomalí změny směru.</string> <string name="use_kalman_filter_compass_descr">Sníží šum v hodnotách z kompasu, ale zpomalí změny směru.</string>
<string name="use_kalman_filter_compass">Použít Kalmanův filtr</string> <string name="use_kalman_filter_compass">Použít Kalmanův filtr</string>
<string name="use_magnetic_sensor">Používat magnetický senzor</string> <string name="use_magnetic_sensor">Používat magnetický senzor</string>
@ -2709,7 +2709,7 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="north_abbreviation">S</string> <string name="north_abbreviation">S</string>
<string name="optional_point_name">Volitelný název bodu</string> <string name="optional_point_name">Volitelný název bodu</string>
<string name="transport_nearby_routes_within">Trasy v okruhu</string> <string name="transport_nearby_routes_within">Trasy v okruhu</string>
<string name="transport_nearby_routes">POBLÍŽ</string> <string name="transport_nearby_routes">V okruhu</string>
<string name="distance_farthest">Vzdálenost: nejvzdálenější jako první</string> <string name="distance_farthest">Vzdálenost: nejvzdálenější jako první</string>
<string name="distance_nearest">Vzdálenost: nejbližší jako první</string> <string name="distance_nearest">Vzdálenost: nejbližší jako první</string>
<string name="rendering_attr_whiteWaterSports_name">Divoká voda</string> <string name="rendering_attr_whiteWaterSports_name">Divoká voda</string>
@ -2741,9 +2741,9 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="osmand_plus_extended_description_part8">Přibližné pokrytí a kvalita map: • Západní Evropa: **** • Východní Evropa: *** • Rusko: *** • Severní Amerika: *** • Jižní Amerika: ** • Asie: ** • Japonsko &amp; Korea: *** • Střední Východ: ** • Afrika: ** • Antarktida: * Mapy většiny států na zeměkouli jsou dostupné ke stažení! Od Afghánistánu po Zimbabwe, od Austrálie po USA, Argentinu, Brazílii, Kanadu, Francii, Německo, Mexiko, Spojené království, Španělsko, …</string> <string name="osmand_plus_extended_description_part8">Přibližné pokrytí a kvalita map: • Západní Evropa: **** • Východní Evropa: *** • Rusko: *** • Severní Amerika: *** • Jižní Amerika: ** • Asie: ** • Japonsko &amp; Korea: *** • Střední Východ: ** • Afrika: ** • Antarktida: * Mapy většiny států na zeměkouli jsou dostupné ke stažení! Od Afghánistánu po Zimbabwe, od Austrálie po USA, Argentinu, Brazílii, Kanadu, Francii, Německo, Mexiko, Spojené království, Španělsko, …</string>
<string name="group_deleted">Skupina smazána</string> <string name="group_deleted">Skupina smazána</string>
<string name="clear_all_intermediates">Smazat všechny mezicíle</string> <string name="clear_all_intermediates">Smazat všechny mezicíle</string>
<string name="select_waypoints_category_description">Můžete přidat všechny mezicíle na trase, nebo vybrat jednotlivé kategorie.</string> <string name="select_waypoints_category_description">Přidat všechny mezicíle na trase nebo vybrat jednotlivé kategorie.</string>
<string name="shared_string_total">Celkem</string> <string name="shared_string_total">Celkem</string>
<string name="nothing_found_in_radius">Nebylo nalezeno nic v okruhu:</string> <string name="nothing_found_in_radius">Nebylo nic nalezeno:</string>
<string name="shared_string_result">Výsledek</string> <string name="shared_string_result">Výsledek</string>
<string name="use_two_digits_longitude">Použít dvě číslice pro délku</string> <string name="use_two_digits_longitude">Použít dvě číslice pro délku</string>
<string name="shared_string_travel_guides">Cesta</string> <string name="shared_string_travel_guides">Cesta</string>
@ -2823,4 +2823,51 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="error_notification_desc">Zašlete prosím kopii obrazovky s touto chybou na email support@osmand.net</string> <string name="error_notification_desc">Zašlete prosím kopii obrazovky s touto chybou na email support@osmand.net</string>
<string name="quick_action_edit_actions">Upravit akce</string> <string name="quick_action_edit_actions">Upravit akce</string>
<string name="get_osmand_live">Získejte OsmAnd Live pro odemknutí všech funkcí: Denní aktulizace mapových podkladů s neomezeným počtem stahování, všechny placené zásuvné moduly, propojení s Wikipedia, Wikivoyage a mnoho dalšího.</string> <string name="get_osmand_live">Získejte OsmAnd Live pro odemknutí všech funkcí: Denní aktulizace mapových podkladů s neomezeným počtem stahování, všechny placené zásuvné moduly, propojení s Wikipedia, Wikivoyage a mnoho dalšího.</string>
<string name="thank_you_for_feedback">Děkujeme za Vaši zpětnou vazbu</string>
<string name="poi_cannot_be_found">Na Váš dotaz nebylo nic nalezeno.</string>
<string name="search_no_results_feedback">Žádný výsledek vyhledávání?
\nDejte nám o tom vědět, ať to můžeme zlepšit</string>
<string name="release_3_1">• Navigace: opravený indikátor průběhu, přidána možnost pro rychlé prohození začátku a konce trasy
\n
\n • Mapové značky: opravena možnost zapnutí/vypnutí skupin, nově možnost skrýt značky na mapě
\n
\n • Úpravy OSM: nově možnost upravovat tagy všech objektů zájmu v mapě, (nejen bodových jako dosud), opraveny chybějící komentáře v poznámkách, přidána možnost zálohy úprav
\n
\n • Vylepšené vykreslování článků Wikipedie a Wikivoyage, upravené soubory jsou již k dispozici ke stažení
\n
\n • Nabídka: opraveny barvy znaků v nočním režimu, opraveny velikosti dodatečných menu
\n
\n • Lodní navigace: nově podpora vodních cest
\n
\n • Menší opravy nahlášených chyb
\n</string>
<string name="commiting_way">Odesílání cesty…</string>
<string name="increase_search_radius_to">Zvětšit okruh hledání na %1$s</string>
<string name="send_search_query_description">Bude odeslán Váš dotaz pro vyhledávání: <b>\"%1$s\"</b>, spolu s Vaší polohou. <br/><br/> Odeslaná data jsou plně anonymní a nedocházi k žádnému shromažďování Vašich osobních údajů. Zaslaná data slouží pouze k vylepšení vyhledávacího algoritmu.<br/></string>
<string name="send_search_query">Odeslat data?</string>
<string name="shared_string_world">Celý svět</string>
<string name="point_deleted">Bod %1$s byl smazán</string>
<string name="coord_input_edit_point">Upravit bod</string>
<string name="coord_input_add_point">Přidat bod</string>
<string name="coord_input_save_as_track">Uložit jako stopu</string>
<string name="coord_input_save_as_track_descr">Bylo přidáno %1$s bodů. Zadejte název a klepněte na \"Uložit\".</string>
<string name="unirs_render_descr">Upravený základní styl pro zvýšení kontrastu pěších a cyklistických cest. Používá starší barvy Mapnik.</string>
<string name="shared_string_bookmark">Záložka</string>
<string name="off_road_render_descr">Vhodný pro off-road terénní jízdu. Vhodný pro použití se zelenými satelitními snímky použitými jako podkladová vrstva. Zmenšená tloušťka hlavních cest a naopak zvětšená tloušťka polních cest, pěšin, cyklotras a dalších cest. Založeno na \"Topo\" stylu.</string>
<string name="open_wikipedia_link_online">Otevřít odkaz Wikipedia na internetu</string>
<string name="open_wikipedia_link_online_description">Odkaz bude otevřen v intenetovém prohlížeči.</string>
<string name="read_wikipedia_offline_description">Stahování Wikipedia a Wikivoyage článkú do zařízení pro pozdější použití bez přístupu k internetu je dostupné pouze předplatitelům OsmAnd Live.</string>
<string name="how_to_open_link">Jak otevřít odkaz?</string>
<string name="read_wikipedia_offline">Číst Wikipedia bez internetu</string>
<string name="download_all">Stáhnout vše</string>
<string name="purchase_cancelled_dialog_title">Zrušili jste Vaše předplatné OsmAnd Live</string>
<string name="paid_app">Placená aplikace</string>
<string name="paid_plugin">Placený zásuvný modul</string>
<string name="travel_card_update_descr">Jsou dostupná nová data Wikivoyage, aktualizujte je na nejnovější verzi.</string>
<string name="wikivoyage_travel_guide">Turistický Průvodce Wikivoyage</string>
<string name="wikivoyage_travel_guide_descr">Průvodce Wikivoyage Vám ukáže nejzajímavější místa planety, přímo v aplikaci OsmAnd a bez nutnosti připojení k internetu.</string>
<string name="shared_string_gpx_files">Soubory GPX</string>
<string name="access_intermediate_arrival_time">Čas příjezdu do mezicíle</string>
<string name="map_widget_intermediate_time">Do Průjezdního bodu</string>
<string name="test_voice_desrc">Klepněte na tlačítko pro vyslechnutí odpovídajícího hlasového pokynu, aby jste zjistili chybné nebo chybějící pokyny.</string>
</resources> </resources>

View file

@ -657,8 +657,8 @@
<string name="settings_preset_descr">نمای نقشه و تنظیمات راهبری برای هر پروفایل جداگانه ذخیره می‌شود. پروفایل پیش‌فرض خود را اینجا تنظیم کنید.</string> <string name="settings_preset_descr">نمای نقشه و تنظیمات راهبری برای هر پروفایل جداگانه ذخیره می‌شود. پروفایل پیش‌فرض خود را اینجا تنظیم کنید.</string>
<string name="osmand_background_plugin_description">تنظیمات مربوط به فعال‌سازی ردگیری و راهبری در پس‌زمینه را نشان می‌دهد که با ارسال پیام‌های بیدارباش متناوب به جی‌پی‌اس دستگاه این کار را انجام می‌دهد (با نمایشگر خاموش).</string> <string name="osmand_background_plugin_description">تنظیمات مربوط به فعال‌سازی ردگیری و راهبری در پس‌زمینه را نشان می‌دهد که با ارسال پیام‌های بیدارباش متناوب به جی‌پی‌اس دستگاه این کار را انجام می‌دهد (با نمایشگر خاموش).</string>
<string name="av_def_action_choose">انتخاب برحسب تقاضا</string> <string name="av_def_action_choose">انتخاب برحسب تقاضا</string>
<string name="audionotes_location_not_defined">مکانی برای یادداشت‌گذاری تعیین نشده است. <string name="audionotes_location_not_defined">مکانی برای یادداشت‌گذاری تعیین نشده.
\nمکانی را مشخص و از طریق منوی زمینه اقدام کنید.</string> \nمکانی را مشخص و از منوی زمینه اقدام کنید.</string>
<string name="rendering_attr_showRoadMaps_description">انتخاب کنید چه زمانی نقشه‌های فقط-جاده‌ای نشان داده شود:</string> <string name="rendering_attr_showRoadMaps_description">انتخاب کنید چه زمانی نقشه‌های فقط-جاده‌ای نشان داده شود:</string>
<string name="shared_string_target_points">مقصدها</string> <string name="shared_string_target_points">مقصدها</string>
<string name="ending_point_too_far">نقطهٔ پایانی از نزدیک‌ترین جاده خیلی دور است.</string> <string name="ending_point_too_far">نقطهٔ پایانی از نزدیک‌ترین جاده خیلی دور است.</string>
@ -999,7 +999,7 @@
<string name="loading_builds_failed">بازیابی لیست ساخت‌های OsmAnd ناموفق بود</string> <string name="loading_builds_failed">بازیابی لیست ساخت‌های OsmAnd ناموفق بود</string>
<string name="loading_builds">بارگیری ساخت‌های OsmAnd…</string> <string name="loading_builds">بارگیری ساخت‌های OsmAnd…</string>
<string name="select_build_to_install">یک ساخت OsmAnd را برای نصب انتخاب کنید</string> <string name="select_build_to_install">یک ساخت OsmAnd را برای نصب انتخاب کنید</string>
<string name="gps_status_app_not_found">برنامهٔ GPS Status نصب نیست. در فروشگاه اندروید جست‌وجو می‌کنید؟</string> <string name="gps_status_app_not_found">این برنامهٔ وضعیت GPS نصب نیست. در بازار اندروید بگردیم؟</string>
<string name="voice_is_not_available_msg">راهنمای صوتی موجود نیست. لطفاً به «تنطیمات» ← «تنظیمات راهبری» ← «راهنمای صوتی» بروید و یکی از بسته‌های پیام صوتی را انتخاب یا دانلود کنید.</string> <string name="voice_is_not_available_msg">راهنمای صوتی موجود نیست. لطفاً به «تنطیمات» ← «تنظیمات راهبری» ← «راهنمای صوتی» بروید و یکی از بسته‌های پیام صوتی را انتخاب یا دانلود کنید.</string>
<string name="voice_is_not_available_title">راهنمای صوتی انتخاب نشده</string> <string name="voice_is_not_available_title">راهنمای صوتی انتخاب نشده</string>
<string name="download_files_question">آیا {0} فایل دانلود شود ({1} مگابایت)؟</string> <string name="download_files_question">آیا {0} فایل دانلود شود ({1} مگابایت)؟</string>

View file

@ -1884,4 +1884,121 @@
<string name="poi_racquet">סקווש</string> <string name="poi_racquet">סקווש</string>
<string name="poi_roller_skating">גלגיליות</string> <string name="poi_roller_skating">גלגיליות</string>
<string name="poi_rowing">חתירה</string> <string name="poi_rowing">חתירה</string>
<string name="poi_rugby_union">התאחדות רוגבי</string>
<string name="poi_rugby_league">ליגת רוגבי</string>
<string name="poi_sailing">שיט מפרשיות</string>
<string name="poi_shooting">ירי</string>
<string name="poi_skating">החלקה על גלגיליות</string>
<string name="poi_skateboard">סקייטבורד</string>
<string name="poi_skiing">סקי</string>
<string name="poi_soccer">כדורגל</string>
<string name="poi_surfing">גלישה</string>
<string name="poi_swimming">שחייה</string>
<string name="poi_table_tennis">טניס שולחן</string>
<string name="poi_tennis">טניס</string>
<string name="poi_toboggan">מזחלות שלג</string>
<string name="poi_volleyball">כדורעף</string>
<string name="poi_museum">מוזיאון</string>
<string name="poi_memorial">אתר הנצחה</string>
<string name="poi_artwork">מיצג אומנותי</string>
<string name="poi_archaeological_site">אתר ארכיאולוגי</string>
<string name="poi_battlefield">שדה קרב</string>
<string name="poi_boundary_stone">אבן גבול</string>
<string name="poi_historic_cannon">תותח היסטורי</string>
<string name="poi_castle">טירה</string>
<string name="poi_city_gate">שער עיר</string>
<string name="poi_fort">מבצר</string>
<string name="poi_fountain">מזרקה</string>
<string name="poi_historic_ruins">חורבות היסטוריות</string>
<string name="poi_wreck">אונייה טרופה</string>
<string name="poi_historic_ship">ספינה היסטורית</string>
<string name="poi_historic_mine">מכרה היסטורי</string>
<string name="poi_monument">אתר מורשת</string>
<string name="poi_zoo">גן חיות</string>
<string name="poi_aquarium">אקווריום</string>
<string name="poi_attraction">מוקד משיכה תיירותי</string>
<string name="poi_tourism_yes">פריט תיירותי</string>
<string name="poi_attraction_animal">חיה (מוקד משיכה)</string>
<string name="poi_attraction_big_wheel">גלגל ענק</string>
<string name="poi_attraction_carousel">קרוסלה</string>
<string name="poi_attraction_summer_toboggan">מזחלת קיץ</string>
<string name="poi_wilderness_hut">בקתת פרא</string>
<string name="poi_denomination_united">מאוחדת</string>
<string name="poi_denomination_united_reformed">מאוחדת רפורמית</string>
<string name="poi_denomination_church_of_scotland">כנסיית סקוטלנד</string>
<string name="poi_denomination_iglesia_ni_cristo">איגלסיה ני קריסטו (הכנסייה של ישו)</string>
<string name="poi_denomination_uniting">הכנסייה הלותרנית של אוסטרליה</string>
<string name="poi_denomination_mennonite">מנוניטיזם</string>
<string name="poi_denomination_quaker">קווייקריזם</string>
<string name="poi_denomination_bulgarian_orthodox">אורתודוכסית בולגרית</string>
<string name="poi_denomination_nondenominational">על־זרמית</string>
<string name="poi_denomination_adventist">אדוונטיזם</string>
<string name="poi_denomination_serbian_orthodox">אורתודכסיות סרבית</string>
<string name="poi_denomination_romanian_orthodox">אורתודוכסיות רומנית</string>
<string name="poi_piste_snow_park">פארק שלג</string>
<string name="poi_piste_ice_skate">החלקרח</string>
<string name="poi_cutline">קו תפר</string>
<string name="poi_distance_mark">סמן מרחק</string>
<string name="poi_floating_dock">רציף צף</string>
<string name="poi_fog_signal">אות ערפל</string>
<string name="poi_military_landuse">אזור צבאי</string>
<string name="poi_military_airfield">מנחת צבאי</string>
<string name="poi_military_bunker">בונקר צבאי</string>
<string name="poi_military_barracks">קסרקטין</string>
<string name="poi_military_danger_area">אזור סכנה</string>
<string name="poi_military_range">שטח צבאי</string>
<string name="poi_wiki_lang_new">ויקי בנווארית</string>
<string name="poi_wiki_lang_vo">ויקי בוולאפיק</string>
<string name="poi_wiki_lang_zh">ויקי בסינית</string>
<string name="poi_wiki_lang_af">ויקי באפריקאנס</string>
<string name="poi_wiki_lang_als">ויקי באלזסית</string>
<string name="poi_wiki_lang_az">ויקי באזרית</string>
<string name="poi_wiki_lang_bn">ויקי בבנגלית</string>
<string name="poi_wiki_lang_br">ויקי בברטונית</string>
<string name="poi_wiki_lang_bs">ויקי בבוסנית</string>
<string name="poi_wiki_lang_cy">ויקי בוולשית</string>
<string name="poi_wiki_lang_eo">ויקי באספרנטו</string>
<string name="poi_wiki_lang_eu">ויקי בבסקית</string>
<string name="poi_wiki_lang_fa">ויקי בפרסית</string>
<string name="poi_wiki_lang_fy">ויקי בפריזית</string>
<string name="poi_wiki_lang_ga">ויקי באירית</string>
<string name="poi_wiki_lang_hy">ויקי בארמנית</string>
<string name="poi_wiki_lang_is">ויקי באיסלנדית</string>
<string name="poi_wiki_lang_ka">ויקי בגיאורגית</string>
<string name="poi_wiki_lang_ku">ויקי בכורדית</string>
<string name="poi_wiki_lang_la">ויקי בלטינית</string>
<string name="poi_wiki_lang_lb">ויקי בלוקסמבורגית</string>
<string name="poi_wiki_lang_mk">ויקי במקדונית</string>
<string name="poi_wiki_lang_ml">ויקי במלאיאלאם</string>
<string name="poi_wiki_lang_mr">ויקי במרטהי</string>
<string name="poi_wiki_lang_nv">ויקי בנבאחו</string>
<string name="poi_wiki_lang_os">ויקי באוסטית</string>
<string name="poi_wiki_lang_sc">ויקי בסרדו</string>
<string name="poi_wiki_lang_sh">ויקי בסרבו קרואטית</string>
<string name="poi_wiki_lang_sq">ויקי באלבנית</string>
<string name="poi_wiki_lang_ta">ויקי בטמילית</string>
<string name="poi_wiki_lang_tl">ויקי בפיליפינית</string>
<string name="poi_wiki_lang_kk">ויקי בקזחית</string>
<string name="poi_wiki_lang_uz">ויקי באוזבקית</string>
<string name="poi_wiki_lang_ce">ויקי בצ׳צ׳נית</string>
<string name="poi_wiki_lang_ur">ויקי באורדו</string>
<string name="poi_wiki_lang_oc">ויקי באוקסיטנית</string>
<string name="poi_wiki_lang_mg">ויקי במלגשי</string>
<string name="poi_wiki_lang_tt">ויקי בטטרית</string>
<string name="poi_wiki_lang_ky">ויקי בקירגיזית</string>
<string name="poi_wiki_lang_zhyue">ויקי בקנטונית</string>
<string name="poi_wiki_lang_tg">ויקי בטג׳יקית</string>
<string name="poi_wiki_lang_ba">ויקי בבשקירית</string>
<string name="poi_wiki_lang_sco">ויקי בסקוטית</string>
<string name="poi_wiki_lang_pnb">ויקי בפנג׳בית</string>
<string name="poi_wiki_lang_cv">ויקי בצ׳ובשית</string>
<string name="poi_wiki_lang_my">ויקי בבורמית</string>
<string name="poi_wiki_lang_yo">ויקי ביורובה</string>
<string name="poi_wiki_lang_an">ויקי באראגונית</string>
<string name="poi_wiki_lang_ne">ויקי בנפאלית</string>
<string name="poi_wiki_lang_gu">ויקי בגוג׳רטית</string>
<string name="poi_wiki_lang_mn">ויקי במונגולית</string>
<string name="poi_cycle_barrier">מחסום אופניים</string>
<string name="poi_motorcycle_barrier">מחסום אופנועים</string>
</resources> </resources>