conflict resolved

This commit is contained in:
simon 2020-10-08 12:09:32 +03:00
commit e8fc5959de
146 changed files with 6131 additions and 2376 deletions

4
.gitignore vendored
View file

@ -19,6 +19,10 @@ OsmAndCore_*.aar
.project
out/
# Huawei
agconnect-services.json
OsmAndHms.jks
# Android Studio
/.idea
*.iml

View file

@ -20,6 +20,8 @@ import net.osmand.aidlapi.mapmarker.UpdateMapMarkerParams;
import net.osmand.aidlapi.calculateroute.CalculateRouteParams;
import net.osmand.aidlapi.profile.ExportProfileParams;
import net.osmand.aidlapi.gpx.ImportGpxParams;
import net.osmand.aidlapi.gpx.ShowGpxParams;
import net.osmand.aidlapi.gpx.StartGpxRecordingParams;
@ -103,6 +105,8 @@ import net.osmand.aidlapi.events.AKeyEventsParams;
import net.osmand.aidlapi.info.AppInfoParams;
import net.osmand.aidlapi.profile.ExportProfileParams;
// NOTE: Add new methods at the end of file!!!
interface IOsmAndAidlInterface {
@ -867,4 +871,6 @@ interface IOsmAndAidlInterface {
AppInfoParams getAppInfo();
boolean setMapMargins(in MapMarginsParams params);
boolean exportProfile(in ExportProfileParams params);
}

View file

@ -4,6 +4,8 @@ public interface OsmAndCustomizationConstants {
// Navigation Drawer:
String DRAWER_ITEM_ID_SCHEME = "drawer.action.";
String DRAWER_SWITCH_PROFILE_ID = DRAWER_ITEM_ID_SCHEME + "switch_profile";
String DRAWER_CONFIGURE_PROFILE_ID = DRAWER_ITEM_ID_SCHEME + "configure_profile";
String DRAWER_DASHBOARD_ID = DRAWER_ITEM_ID_SCHEME + "dashboard";
String DRAWER_MAP_MARKERS_ID = DRAWER_ITEM_ID_SCHEME + "map_markers";
String DRAWER_MY_PLACES_ID = DRAWER_ITEM_ID_SCHEME + "my_places";

View file

@ -9,12 +9,21 @@ import net.osmand.aidlapi.AidlParams;
public class CopyFileParams extends AidlParams {
public static final String DESTINATION_DIR_KEY = "destinationDir";
public static final String FILE_NAME_KEY = "fileName";
public static final String FILE_PART_DATA_KEY = "filePartData";
public static final String START_TIME_KEY = "startTime";
public static final String DONE_KEY = "done";
private String destinationDir;
private String fileName;
private byte[] filePartData;
private long startTime;
private boolean done;
public CopyFileParams(@NonNull String fileName, @NonNull byte[] filePartData, long startTime, boolean done) {
public CopyFileParams(@NonNull String destinationDir, @NonNull String fileName, @NonNull byte[] filePartData,
long startTime, boolean done) {
this.destinationDir = destinationDir;
this.fileName = fileName;
this.filePartData = filePartData;
this.startTime = startTime;
@ -37,6 +46,10 @@ public class CopyFileParams extends AidlParams {
}
};
public String getDestinationDir() {
return destinationDir;
}
public String getFileName() {
return fileName;
}
@ -55,23 +68,26 @@ public class CopyFileParams extends AidlParams {
@Override
public void writeToBundle(Bundle bundle) {
bundle.putString("fileName", fileName);
bundle.putByteArray("filePartData", filePartData);
bundle.putLong("startTime", startTime);
bundle.putBoolean("done", done);
bundle.putString(DESTINATION_DIR_KEY, destinationDir);
bundle.putString(FILE_NAME_KEY, fileName);
bundle.putByteArray(FILE_PART_DATA_KEY, filePartData);
bundle.putLong(START_TIME_KEY, startTime);
bundle.putBoolean(DONE_KEY, done);
}
@Override
protected void readFromBundle(Bundle bundle) {
fileName = bundle.getString("fileName");
filePartData = bundle.getByteArray("filePartData");
startTime = bundle.getLong("startTime");
done = bundle.getBoolean("done");
destinationDir = bundle.getString(DESTINATION_DIR_KEY);
fileName = bundle.getString(FILE_NAME_KEY);
filePartData = bundle.getByteArray(FILE_PART_DATA_KEY);
startTime = bundle.getLong(START_TIME_KEY);
done = bundle.getBoolean(DONE_KEY);
}
@Override
public String toString() {
return "CopyFileParams {" +
" destinationDir=" + destinationDir +
" fileName=" + fileName +
", filePartData size=" + filePartData.length +
", startTime=" + startTime +

View file

@ -5,15 +5,31 @@ import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
import net.osmand.aidlapi.profile.AExportSettingsType;
import java.util.ArrayList;
import static net.osmand.aidlapi.profile.ExportProfileParams.SETTINGS_TYPE_KEY;
public class ProfileSettingsParams extends AidlParams {
public static final String VERSION_KEY = "version";
public static final String REPLACE_KEY = "replace";
public static final String LATEST_CHANGES_KEY = "latestChanges";
public static final String PROFILE_SETTINGS_URI_KEY = "profileSettingsUri";
private Uri profileSettingsUri;
private String latestChanges;
private int version;
private ArrayList<String> settingsTypeKeyList = new ArrayList<>();
boolean replace;
public ProfileSettingsParams(Uri profileSettingsUri, String latestChanges, int version) {
public ProfileSettingsParams(Uri profileSettingsUri, ArrayList<AExportSettingsType> settingsTypeList, boolean replace,
String latestChanges, int version) {
this.profileSettingsUri = profileSettingsUri;
for (AExportSettingsType settingsType : settingsTypeList) {
settingsTypeKeyList.add(settingsType.name());
}
this.replace = replace;
this.latestChanges = latestChanges;
this.version = version;
}
@ -46,17 +62,29 @@ public class ProfileSettingsParams extends AidlParams {
return profileSettingsUri;
}
public ArrayList<String> getSettingsTypeKeys() {
return settingsTypeKeyList;
}
public boolean isReplace() {
return replace;
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putInt("version", version);
bundle.putString("latestChanges", latestChanges);
bundle.putParcelable("profileSettingsUri", profileSettingsUri);
bundle.putInt(VERSION_KEY, version);
bundle.putString(LATEST_CHANGES_KEY, latestChanges);
bundle.putParcelable(PROFILE_SETTINGS_URI_KEY, profileSettingsUri);
bundle.putStringArrayList(SETTINGS_TYPE_KEY, settingsTypeKeyList);
bundle.putBoolean(REPLACE_KEY, replace);
}
@Override
protected void readFromBundle(Bundle bundle) {
version = bundle.getInt("version");
latestChanges = bundle.getString("latestChanges");
profileSettingsUri = bundle.getParcelable("profileSettingsUri");
version = bundle.getInt(VERSION_KEY);
latestChanges = bundle.getString(LATEST_CHANGES_KEY);
profileSettingsUri = bundle.getParcelable(PROFILE_SETTINGS_URI_KEY);
settingsTypeKeyList = bundle.getStringArrayList(SETTINGS_TYPE_KEY);
replace = bundle.getBoolean(REPLACE_KEY);
}
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidlapi.profile;
parcelable AExportSettingsType;

View file

@ -0,0 +1,11 @@
package net.osmand.aidlapi.profile;
public enum AExportSettingsType {
PROFILE,
QUICK_ACTIONS,
POI_TYPES,
MAP_SOURCES,
CUSTOM_RENDER_STYLE,
CUSTOM_ROUTING,
AVOID_ROADS;
}

View file

@ -0,0 +1,3 @@
package net.osmand.aidlapi.profile;
parcelable ExportProfileParams;

View file

@ -0,0 +1,61 @@
package net.osmand.aidlapi.profile;
import android.os.Bundle;
import android.os.Parcel;
import net.osmand.aidlapi.AidlParams;
import java.util.ArrayList;
import java.util.List;
public class ExportProfileParams extends AidlParams {
public static final String PROFILE_KEY = "profile";
public static final String SETTINGS_TYPE_KEY = "settings_type";
private String profile;
private ArrayList<String> settingsTypeKeyList = new ArrayList<>();
public ExportProfileParams(String profile, ArrayList<AExportSettingsType> settingsTypeList) {
this.profile = profile;
for (AExportSettingsType settingsType : settingsTypeList) {
settingsTypeKeyList.add(settingsType.name());
}
}
public ExportProfileParams(Parcel in) {
readFromParcel(in);
}
public static final Creator<ExportProfileParams> CREATOR = new Creator<ExportProfileParams>() {
@Override
public ExportProfileParams createFromParcel(Parcel in) {
return new ExportProfileParams(in);
}
@Override
public ExportProfileParams[] newArray(int size) {
return new ExportProfileParams[size];
}
};
public String getProfile() {
return profile;
}
public List<String> getSettingsTypeKeys() {
return settingsTypeKeyList;
}
@Override
public void writeToBundle(Bundle bundle) {
bundle.putString(PROFILE_KEY, profile);
bundle.putStringArrayList(SETTINGS_TYPE_KEY, settingsTypeKeyList);
}
@Override
protected void readFromBundle(Bundle bundle) {
profile = bundle.getString(PROFILE_KEY);
settingsTypeKeyList = bundle.getStringArrayList(SETTINGS_TYPE_KEY);
}
}

View file

@ -739,7 +739,7 @@ public class RoutePlannerFrontEnd {
res = searchRouteImpl(ctx, points, routeDirection);
}
if (ctx.calculationProgress != null) {
ctx.calculationProgress.timeToCalculate += (System.nanoTime() - timeToCalculate);
ctx.calculationProgress.timeToCalculate = (System.nanoTime() - timeToCalculate);
}
BinaryRoutePlanner.printDebugMemoryInformation(ctx);
if (res != null) {

View file

@ -20,7 +20,7 @@
android:screenOrientation="unspecified"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ui.TrackerLogcatActivity" />
<activity
android:name=".ui.MainActivity"
android:configChanges="orientation|screenSize"

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/card_bg_color">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/action_bar_height">
<net.osmand.telegram.ui.views.TextViewEx
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:text="@string/logcat_buffer"
android:textColor="@color/app_bar_title_light"
android:textSize="@dimen/title_text_size"
app:typeface="@string/font_roboto_mono_bold"/>
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/screen_bg_light"
android:clipToPadding="false"
android:orientation="vertical"
android:scrollbars="vertical" />
</LinearLayout>

View file

@ -447,6 +447,50 @@
</LinearLayout>
<include layout="@layout/list_item_divider"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/card_bg_color">
<LinearLayout
android:id="@+id/logcat_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:orientation="vertical">
<net.osmand.telegram.ui.views.TextViewEx
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:paddingLeft="@dimen/content_padding_standard"
android:paddingRight="@dimen/content_padding_standard"
android:text="@string/logcat_buffer"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/list_item_title_text_size"
app:firstBaselineToTopHeight="28sp"
app:typeface="@string/font_roboto_medium" />
<net.osmand.telegram.ui.views.TextViewEx
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/content_padding_standard"
android:paddingRight="@dimen/content_padding_standard"
android:text="@string/logcat_buffer_descr"
android:textColor="?android:attr/textColorSecondary"
android:textSize="@dimen/list_item_description_text_size"
app:firstBaselineToTopHeight="20sp"
app:lastBaselineToBottomHeight="16sp"
app:typeface="@string/font_roboto_regular" />
</LinearLayout>
</FrameLayout>
<include layout="@layout/card_bottom_divider"/>
</LinearLayout>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:minHeight="@dimen/list_description_height"
android:paddingLeft="@dimen/content_padding_standard"
android:paddingRight="@dimen/content_padding_standard"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/hint_text_size"
android:linksClickable="true"
android:lineSpacingMultiplier="@dimen/text_description_line_spacing_multiplier"
tools:text="Some long description"
android:paddingEnd="@dimen/content_padding_standard"
android:paddingStart="@dimen/content_padding_standard" />

View file

@ -267,4 +267,8 @@
<string name="last_response_duration">Letzte Antwort: vor %1$s</string>
<string name="duration_ago">vor %1$s</string>
<string name="shared_string_error_short">ERR</string>
<string name="shared_string_export">Export</string>
<string name="logcat_buffer">Logcat-Puffer</string>
<string name="logcat_buffer_descr">Protokolle der Anwendung einsehen und freigeben</string>
<string name="send_report">Bericht senden</string>
</resources>

View file

@ -267,4 +267,8 @@
<string name="last_response_duration">Viimane vastus: %1$s tagasi</string>
<string name="duration_ago">%1$s tagasi</string>
<string name="shared_string_error_short">ERR</string>
<string name="shared_string_export">Ekspordi</string>
<string name="logcat_buffer">Logcati puhver</string>
<string name="logcat_buffer_descr">Vaata ja jaga rakenduse detailseid logisid</string>
<string name="send_report">Saada ettekanne</string>
</resources>

View file

@ -267,4 +267,8 @@
<string name="set_time_description">Définissez l\'heure à laquelle les contacts et groupes sélectionnés verront votre position en temps réel.</string>
<string name="osmand_connect">OsmAnd connect</string>
<string name="time_ago">depuis</string>
<string name="logcat_buffer">Buffer Logcat</string>
<string name="logcat_buffer_descr">Vérifier et partager les logs détaillés de l\'application</string>
<string name="shared_string_export">Exporter</string>
<string name="send_report">Envoyer le rapport</string>
</resources>

View file

@ -268,4 +268,8 @@
<string name="last_response_duration">תגובה אחרונה: לפני %1$s</string>
<string name="duration_ago">לפני %1$s</string>
<string name="shared_string_error_short">שגיאה</string>
<string name="shared_string_export">ייצוא</string>
<string name="logcat_buffer">מכלא Logcat</string>
<string name="logcat_buffer_descr">בדיקה ושיתוף יומני תיעוד מפורטים של היישומים</string>
<string name="send_report">שליחת דיווח</string>
</resources>

View file

@ -268,4 +268,8 @@
<string name="last_response_duration">Utolsó válasz: %1$s</string>
<string name="duration_ago">Ennyivel ezelőtt: %1$s</string>
<string name="shared_string_error_short">HIBA</string>
<string name="shared_string_export">Exportálás</string>
<string name="logcat_buffer">Logcat-puffer (hibanapló)</string>
<string name="logcat_buffer_descr">Az alkalmazás részletes naplóinak ellenőrzése és megosztása</string>
<string name="send_report">Jelentés küldése</string>
</resources>

View file

@ -267,4 +267,8 @@
<string name="last_response_duration">Última resposta: %1$s atrás</string>
<string name="duration_ago">%1$s atrás</string>
<string name="shared_string_error_short">ERR</string>
<string name="shared_string_export">Exportar</string>
<string name="logcat_buffer">Buffer de Logcat</string>
<string name="logcat_buffer_descr">Verifique e compartilhe registros detalhados do aplicativo</string>
<string name="send_report">Enviar o relatório</string>
</resources>

View file

@ -108,7 +108,7 @@
<string name="not_found_yet">Ainda não encontrado</string>
<string name="re_send_location">Reenvie o local</string>
<string name="last_available_location">Última localização disponível</string>
<string name="sharing_status">Status de compartilhamento</string>
<string name="sharing_status">Estado de compartilhamento</string>
<string name="location_sharing_status">Compartilhamento: %1$s</string>
<string name="shared_string_enabled">Ativado</string>
<string name="no_gps_connection">Sem conexão GPS</string>

View file

@ -75,7 +75,7 @@
<string name="by_distance">По расстоянию</string>
<string name="by_name">По имени</string>
<string name="by_group">По группе</string>
<string name="shared_string_sort">Сортировать</string>
<string name="shared_string_sort">Сортировка</string>
<string name="shared_string_sort_by">Сортировать по</string>
<string name="turn_off_all">Отстановить все</string>
<string name="shared_string_exit">Выход</string>
@ -267,4 +267,8 @@
<string name="last_update_from_telegram_duration">Последнее обновление от Telegram: %1$s назад</string>
<string name="last_response_date">Последний ответ: %1$s</string>
<string name="last_update_from_telegram_date">Последнее обновление от Telegram: %1$s</string>
<string name="shared_string_export">Экспорт</string>
<string name="logcat_buffer">Буфер Logcat</string>
<string name="logcat_buffer_descr">Проверьте и поделитесь подробными журналами приложения</string>
<string name="send_report">Отправить отчёт</string>
</resources>

View file

@ -268,4 +268,8 @@
<string name="last_response_duration">Ùrtima risposta: %1$s a como</string>
<string name="duration_ago">%1$s a como</string>
<string name="shared_string_error_short">ERR</string>
<string name="shared_string_export">Esporta</string>
<string name="logcat_buffer">Buffer de Logcat</string>
<string name="logcat_buffer_descr">Verìfica e cumpartzi sos registros de s\'aplicatzione fatos a sa minuda</string>
<string name="send_report">Imbia resumu</string>
</resources>

View file

@ -267,4 +267,8 @@
<string name="last_response_duration">Son cevap: %1$s önce</string>
<string name="duration_ago">%1$s önce</string>
<string name="shared_string_error_short">HATA</string>
<string name="shared_string_export">Dışa aktar</string>
<string name="logcat_buffer">Logcat tamponu</string>
<string name="logcat_buffer_descr">Uygulamanın ayrıntılı günlük kayıtlarına göz atın ve paylaşın</string>
<string name="send_report">Rapor gönder</string>
</resources>

View file

@ -118,7 +118,7 @@
<string name="shared_string_settings">Налаштування</string>
<string name="no_location_permission">Застосунок не має дозволу до отримання даних позиціювання.</string>
<string name="gps_not_available">Будь ласка, увімкніть «Позиціювання» у системних налаштуваннях</string>
<string name="osmand_service">Фоновий режим</string>
<string name="osmand_service">Режим тла</string>
<string name="osmand_service_descr">OsmAnd Tracker працює у фоновому режимі з вимкненим екраном.</string>
<string name="shared_string_distance">Відстань</string>
<string name="share_location">Поділитися позицією</string>
@ -267,4 +267,8 @@
<string name="last_response_duration">Остання відповідь: %1$s тому</string>
<string name="duration_ago">%1$s тому</string>
<string name="shared_string_error_short">ПМЛК</string>
<string name="shared_string_export">Експорт</string>
<string name="logcat_buffer">Буфер logcat</string>
<string name="logcat_buffer_descr">Переглянути та надіслати докладний журнал застосунку</string>
<string name="send_report">Надіслати звіт</string>
</resources>

View file

@ -270,4 +270,8 @@
<string name="last_response_duration">最後回應:%1$s 前</string>
<string name="duration_ago">%1$s 前</string>
<string name="shared_string_error_short">ERR</string>
<string name="send_report">傳送報告</string>
<string name="shared_string_export">匯出</string>
<string name="logcat_buffer">Logcat 緩衝</string>
<string name="logcat_buffer_descr">檢查及分享應用程式的詳細紀錄</string>
</resources>

View file

@ -27,6 +27,7 @@
<dimen name="dialog_welcome_title_top_margin">89dp</dimen>
<dimen name="list_header_height">48dp</dimen>
<dimen name="list_description_height">44dp</dimen>
<dimen name="list_header_with_descr_height">42dp</dimen>
<dimen name="list_item_height">56dp</dimen>

View file

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="send_report">Send report</string>
<string name="logcat_buffer_descr">Check and share detailed logs of the app</string>
<string name="logcat_buffer">Logcat buffer</string>
<string name="shared_string_export">Export</string>
<string name="shared_string_error_short">ERR</string>
<string name="last_update_from_telegram_date">Last update from Telegram: %1$s</string>
<string name="last_response_date">Last response: %1$s</string>

View file

@ -3,16 +3,20 @@ package net.osmand.telegram
import android.app.Application
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.ConnectivityManager
import android.net.NetworkInfo
import android.os.Build
import android.os.Handler
import net.osmand.PlatformUtil
import net.osmand.telegram.ui.TrackerLogcatActivity
import net.osmand.telegram.helpers.*
import net.osmand.telegram.helpers.OsmandAidlHelper.OsmandHelperListener
import net.osmand.telegram.helpers.OsmandAidlHelper.UpdatesListener
import net.osmand.telegram.notifications.NotificationHelper
import net.osmand.telegram.utils.AndroidUtils
import net.osmand.telegram.utils.UiUtils
import java.io.File
class TelegramApplication : Application() {
@ -200,4 +204,33 @@ class TelegramApplication : Application() {
fun runInUIThread(action: (() -> Unit), delay: Long) {
uiHandler.postDelayed(action, delay)
}
fun sendCrashLog(file: File) {
val intent = Intent(Intent.ACTION_SEND)
intent.putExtra(Intent.EXTRA_EMAIL, arrayOf("crash@osmand.net"))
intent.putExtra(Intent.EXTRA_STREAM, AndroidUtils.getUriForFile(this, file))
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
intent.type = "vnd.android.cursor.dir/email"
intent.putExtra(Intent.EXTRA_SUBJECT, "OsmAnd bug")
val text = StringBuilder()
text.append("\nDevice : ").append(Build.DEVICE)
text.append("\nBrand : ").append(Build.BRAND)
text.append("\nModel : ").append(Build.MODEL)
text.append("\nProduct : ").append(Build.PRODUCT)
text.append("\nBuild : ").append(Build.DISPLAY)
text.append("\nVersion : ").append(Build.VERSION.RELEASE)
text.append("\nApp : ").append(getString(R.string.app_name_short))
try {
val info = packageManager.getPackageInfo(packageName, 0)
if (info != null) {
text.append("\nApk Version : ").append(info.versionName).append(" ").append(info.versionCode)
}
} catch (e: PackageManager.NameNotFoundException) {
PlatformUtil.getLog(TrackerLogcatActivity::class.java).error("", e)
}
intent.putExtra(Intent.EXTRA_TEXT, text.toString())
val chooserIntent = Intent.createChooser(intent, getString(R.string.send_report))
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(chooserIntent)
}
}

View file

@ -110,7 +110,7 @@ private const val PROXY_ENABLED = "proxy_enabled"
private const val PROXY_PREFERENCES_KEY = "proxy_preferences"
private const val SHARING_INITIALIZATION_TIME = 60 * 2L // 2 minutes
private const val WAITING_TDLIB_TIME = 3 // 3 seconds
private const val WAITING_TDLIB_TIME = 7 // 7 seconds
private const val GPS_UPDATE_EXPIRED_TIME = 60 * 3L // 3 minutes
@ -540,14 +540,24 @@ class TelegramSettings(private val app: TelegramApplication) {
if (initTime && initSending) {
initializing = true
} else {
var waitingTimeError = false
val maxWaitingTime = WAITING_TDLIB_TIME * MAX_MESSAGES_IN_TDLIB_PER_CHAT * max(1, chatsCount)
val textSharingError = !shareInfo.lastTextMessageHandled && currentTime - shareInfo.lastSendTextMessageTime > maxWaitingTime
val mapSharingError = !shareInfo.lastMapMessageHandled && currentTime - shareInfo.lastSendMapMessageTime > maxWaitingTime
if (shareInfo.hasSharingError
|| (shareTypeValue == SHARE_TYPE_MAP_AND_TEXT && (textSharingError || mapSharingError))
val textSharingWaitingTime = currentTime - shareInfo.lastSendTextMessageTime
val mapSharingWaitingTime = currentTime - shareInfo.lastSendMapMessageTime
val textSharingError = !shareInfo.lastTextMessageHandled && textSharingWaitingTime > maxWaitingTime
val mapSharingError = !shareInfo.lastMapMessageHandled && mapSharingWaitingTime > maxWaitingTime
if ((shareTypeValue == SHARE_TYPE_MAP_AND_TEXT && (textSharingError || mapSharingError))
|| textSharingError && (shareTypeValue == SHARE_TYPE_TEXT)
|| mapSharingError && (shareTypeValue == SHARE_TYPE_MAP)
) {
|| mapSharingError && (shareTypeValue == SHARE_TYPE_MAP)) {
waitingTimeError = true
log.debug("Send chats error for share type \"$shareTypeValue\"" +
"\nMax waiting time: ${maxWaitingTime}s" +
"\nLast text message handled: ${shareInfo.lastTextMessageHandled}" +
"\nText sharing waiting time: ${textSharingWaitingTime}s" +
"\nLast map message handled: ${shareInfo.lastMapMessageHandled}" +
"\nMap sharing waiting time: ${mapSharingWaitingTime}s")
}
if (shareInfo.hasSharingError || waitingTimeError) {
sendChatsErrors = true
locationTime = max(shareInfo.lastTextSuccessfulSendTime, shareInfo.lastMapSuccessfulSendTime)
chatsIds.add(shareInfo.chatId)

View file

@ -776,6 +776,7 @@ class TelegramHelper private constructor() {
client?.send(TdApi.CreatePrivateChat(userId, false)) { obj ->
when (obj.constructor) {
TdApi.Error.CONSTRUCTOR -> {
log.debug("createPrivateChatWithUser ERROR $obj")
val error = obj as TdApi.Error
if (error.code != IGNORED_ERROR_CODE) {
shareInfo.hasSharingError = true
@ -969,7 +970,7 @@ class TelegramHelper private constructor() {
val messageType = if (isBot) MESSAGE_TYPE_BOT else MESSAGE_TYPE_TEXT
when (obj.constructor) {
TdApi.Error.CONSTRUCTOR -> {
log.debug("handleTextLocationMessageUpdate - ERROR")
log.debug("handleTextLocationMessageUpdate - ERROR $obj")
val error = obj as TdApi.Error
if (error.code != IGNORED_ERROR_CODE) {
shareInfo.hasSharingError = true

View file

@ -213,6 +213,12 @@ class SettingsDialogFragment : BaseDialogFragment() {
DisconnectTelegramBottomSheet.showInstance(childFragmentManager)
}
mainView.findViewById<View>(R.id.logcat_row).setOnClickListener {
val intent = Intent(activity, TrackerLogcatActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
app.startActivity(intent)
}
return mainView
}

View file

@ -0,0 +1,271 @@
package net.osmand.telegram.ui
import android.os.AsyncTask
import android.os.Bundle
import android.view.*
import android.widget.ProgressBar
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import net.osmand.PlatformUtil
import net.osmand.telegram.R
import net.osmand.telegram.TelegramApplication
import java.io.*
import java.lang.ref.WeakReference
import java.util.*
class TrackerLogcatActivity : AppCompatActivity() {
private var logcatAsyncTask: LogcatAsyncTask? = null
private val logs: MutableList<String> = ArrayList()
private var adapter: LogcatAdapter? = null
private val LEVELS = arrayOf("D", "I", "W", "E")
private var filterLevel = 1
private lateinit var recyclerView: RecyclerView
override fun onCreate(savedInstanceState: Bundle?) {
val app: TelegramApplication = getApplication() as TelegramApplication
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_tracker_logcat)
val toolbar = findViewById<Toolbar>(R.id.toolbar).apply {
navigationIcon = app.uiUtils.getThemedIcon(R.drawable.ic_arrow_back)
setNavigationOnClickListener { onBackPressed() }
}
setSupportActionBar(toolbar)
setupIntermediateProgressBar()
adapter = LogcatAdapter()
recyclerView = findViewById<View>(R.id.recycler_view) as RecyclerView
recyclerView!!.layoutManager = LinearLayoutManager(this)
recyclerView!!.adapter = adapter
}
protected fun setupIntermediateProgressBar() {
val progressBar = ProgressBar(this)
progressBar.visibility = View.GONE
progressBar.isIndeterminate = true
val supportActionBar = supportActionBar
if (supportActionBar != null) {
supportActionBar.setDisplayShowCustomEnabled(true)
supportActionBar.customView = progressBar
setSupportProgressBarIndeterminateVisibility(false)
}
}
override fun setSupportProgressBarIndeterminateVisibility(visible: Boolean) {
val supportActionBar = supportActionBar
if (supportActionBar != null) {
supportActionBar.customView.visibility = if (visible) View.VISIBLE else View.GONE
}
}
override fun onResume() {
super.onResume()
startLogcatAsyncTask()
}
override fun onPause() {
super.onPause()
stopLogcatAsyncTask()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
val app: TelegramApplication = applicationContext as TelegramApplication
val share: MenuItem = menu.add(0, SHARE_ID, 0, R.string.shared_string_export)
share.icon = app.uiUtils.getThemedIcon(R.drawable.ic_action_share)
share.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
val level = menu.add(0, LEVEL_ID, 0, "")
level.title = getFilterLevel()
level.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
return super.onCreateOptionsMenu(menu)
}
private fun getFilterLevel(): String {
return "*:" + LEVELS[filterLevel]
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val itemId = item.itemId
when (itemId) {
android.R.id.home -> {
finish()
return true
}
LEVEL_ID -> {
filterLevel++
if (filterLevel >= LEVELS.size) {
filterLevel = 0
}
item.title = getFilterLevel()
stopLogcatAsyncTask()
logs.clear()
adapter!!.notifyDataSetChanged()
startLogcatAsyncTask()
return true
}
SHARE_ID -> {
startSaveLogsAsyncTask()
return true
}
}
return false
}
private fun startSaveLogsAsyncTask() {
val saveLogsAsyncTask = SaveLogsAsyncTask(this, logs)
saveLogsAsyncTask.execute()
}
private fun startLogcatAsyncTask() {
logcatAsyncTask = LogcatAsyncTask(this, getFilterLevel())
logcatAsyncTask!!.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
}
private fun stopLogcatAsyncTask() {
if (logcatAsyncTask != null && logcatAsyncTask!!.status == AsyncTask.Status.RUNNING) {
logcatAsyncTask!!.cancel(false)
logcatAsyncTask!!.stopLogging()
}
}
private inner class LogcatAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val itemView = inflater.inflate(R.layout.item_description_long, viewGroup, false) as TextView
itemView.gravity = Gravity.CENTER_VERTICAL
return LogViewHolder(itemView)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is LogViewHolder) {
val log = getLog(position)
holder.logTextView.text = log
}
}
override fun getItemCount(): Int {
return logs.size
}
private fun getLog(position: Int): String {
return logs[position]
}
private inner class LogViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val logTextView: TextView = itemView.findViewById(R.id.description)
}
}
class SaveLogsAsyncTask internal constructor(logcatActivity: TrackerLogcatActivity, logs: Collection<String>) : AsyncTask<Void?, String?, File?>() {
private val logcatActivity: WeakReference<TrackerLogcatActivity>
private val logs: Collection<String>
override fun onPreExecute() {
val activity = logcatActivity.get()
activity?.setSupportProgressBarIndeterminateVisibility(true)
}
override fun doInBackground(vararg voids: Void?): File {
val app: TelegramApplication = logcatActivity.get()?.applicationContext as TelegramApplication
val file = File(app.getExternalFilesDir(null), LOGCAT_PATH)
try {
if (file.exists()) {
file.delete()
}
val stringBuilder = StringBuilder()
for (log in logs) {
stringBuilder.append(log)
stringBuilder.append("\n")
}
if (file.parentFile.canWrite()) {
val writer = BufferedWriter(FileWriter(file, true))
writer.write(stringBuilder.toString())
writer.close()
}
} catch (e: Exception) {
log.error(e)
}
return file
}
override fun onPostExecute(file: File?) {
val activity = logcatActivity.get()
if (activity != null && file != null) {
val app: TelegramApplication = activity.applicationContext as TelegramApplication
activity.setSupportProgressBarIndeterminateVisibility(false)
app.sendCrashLog(file)
}
}
init {
this.logcatActivity = WeakReference(logcatActivity)
this.logs = logs
}
}
class LogcatAsyncTask internal constructor(logcatActivity: TrackerLogcatActivity?, filterLevel: String) : AsyncTask<Void?, String?, Void?>() {
private var processLogcat: Process? = null
private val logcatActivity: WeakReference<TrackerLogcatActivity?>
private val filterLevel: String
override fun doInBackground(vararg voids: Void?): Void? {
try {
val filter = android.os.Process.myPid().toString()
val command = arrayOf("logcat", filterLevel, "--pid=$filter", "-T", MAX_BUFFER_LOG.toString())
processLogcat = Runtime.getRuntime().exec(command)
val bufferedReader = BufferedReader(InputStreamReader(processLogcat?.inputStream))
var line: String?
while (bufferedReader.readLine().also { line = it } != null && logcatActivity.get() != null) {
if (isCancelled) {
break
}
publishProgress(line)
}
stopLogging()
} catch (e: IOException) { // ignore
} catch (e: Exception) {
log.error(e)
}
return null
}
override fun onProgressUpdate(vararg values: String?) {
if (values.size > 0 && !isCancelled) {
val activity = logcatActivity.get()
if (activity != null) {
val autoscroll = !activity.recyclerView!!.canScrollVertically(1)
for (s in values) {
if (s != null) {
activity.logs.add(s)
}
}
activity.adapter!!.notifyDataSetChanged()
if (autoscroll) {
activity.recyclerView!!.scrollToPosition(activity.logs.size - 1)
}
}
}
}
fun stopLogging() {
if (processLogcat != null) {
processLogcat!!.destroy()
}
}
init {
this.logcatActivity = WeakReference(logcatActivity)
this.filterLevel = filterLevel
}
}
companion object {
private const val LOGCAT_PATH = "logcat.log"
private const val MAX_BUFFER_LOG = 10000
private const val SHARE_ID = 0
private const val LEVEL_ID = 1
private val log = PlatformUtil.getLog(TrackerLogcatActivity::class.java)
}
}

3
OsmAnd/.gitignore vendored
View file

@ -13,10 +13,13 @@ libs/it.unibo.alice.tuprolog-tuprolog-3.2.1.jar
libs/commons-codec-commons-codec-1.11.jar
libs/OsmAndCore_android-0.1-SNAPSHOT.jar
# Huawei
libs/huawei-*.jar
huaweidrmlib/
HwDRM_SDK_*
drm_strings.xml
agconnect-services.json
OsmAndHms.jks
# copy_widget_icons.sh
res/drawable-large/map_*

View file

@ -2,24 +2,31 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="com.huawei.android.sdk.drm.DrmDialogActivity"
android:configChanges="screenSize|orientation|keyboardHidden"
android:exported="false"
android:theme="@android:style/Theme.Translucent">
<application
android:icon="@mipmap/icon_free"
android:label="@string/app_name_free"
tools:replace="android:icon, android:label">
<meta-data
android:name="hwc-theme"
android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>
android:name="com.huawei.hms.client.appid"
android:value="101486545" />
<meta-data
android:name="com.huawei.hms.client.cpid"
android:value="890031000000000038" />
<activity
android:name="net.osmand.plus.activities.MapActivity"
android:theme="@style/FirstSplashScreenFree"
tools:replace="android:theme"/>
<service
android:name="net.osmand.plus.NavigationService"
tools:replace="android:process"
android:process="net.osmand.huawei"/>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="net.osmand.huawei.fileprovider"
tools:replace="android:authorities" />
<service
android:name="net.osmand.plus.NavigationService"
android:process="net.osmand.huawei"
tools:replace="android:process" />
tools:replace="android:authorities"
android:authorities="net.osmand.huawei.fileprovider"/>
</application>
</manifest>

View file

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="com.huawei.android.sdk.drm.DrmDialogActivity"
android:configChanges="screenSize|orientation|keyboardHidden"
android:exported="false"
android:theme="@android:style/Theme.Translucent">
<meta-data
android:name="hwc-theme"
android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="net.osmand.plus.huawei.fileprovider"
tools:replace="android:authorities" />
<service
android:name="net.osmand.plus.NavigationService"
android:process="net.osmand.plus.huawei"
tools:replace="android:process" />
</application>
</manifest>

View file

@ -40,6 +40,15 @@ android {
keyAlias "osmand"
keyPassword System.getenv("OSMAND_APK_PASSWORD")
}
publishingHuawei {
storeFile file("/var/lib/jenkins/osmand_hw_key")
storePassword System.getenv("OSMAND_HW_APK_PASSWORD")
keyAlias "osmand"
keyPassword System.getenv("OSMAND_HW_APK_PASSWORD")
v1SigningEnabled true
v2SigningEnabled true
}
}
defaultConfig {
@ -107,19 +116,26 @@ android {
debug {
manifest.srcFile "AndroidManifest-debug.xml"
}
full {
java.srcDirs = ["src-google"]
}
fulldev {
java.srcDirs = ["src-google"]
}
free {
java.srcDirs = ["src-google"]
manifest.srcFile "AndroidManifest-free.xml"
}
freedev {
java.srcDirs = ["src-google"]
manifest.srcFile "AndroidManifest-freedev.xml"
}
freecustom {
java.srcDirs = ["src-google"]
manifest.srcFile "AndroidManifest-freecustom.xml"
}
huawei {
manifest.srcFile "AndroidManifest-huawei.xml"
}
freehuawei {
java.srcDirs = ["src-huawei"]
manifest.srcFile "AndroidManifest-freehuawei.xml"
}
@ -189,17 +205,12 @@ android {
dimension "version"
applicationId "net.osmand.plus"
resConfig "en"
//resConfigs "xxhdpi", "nodpi"
}
huawei {
dimension "version"
applicationId "net.osmand.plus.huawei"
// resConfigs "xxhdpi", "nodpi"
}
freehuawei {
dimension "version"
applicationId "net.osmand.huawei"
}
// CoreVersion
legacy {
dimension "coreversion"
@ -223,9 +234,13 @@ android {
release {
buildConfigField "String", "OSM_OAUTH_CONSUMER_KEY", "\"Ti2qq3fo4i4Wmuox3SiWRIGq3obZisBHnxmcM05y\""
buildConfigField "String", "OSM_OAUTH_CONSUMER_SECRET", "\"lxulb3HYoMmd2cC4xxNe1dyfRMAY8dS0eNihJ0DM\""
if (gradle.startParameter.taskNames.toString().contains("huawei")) {
signingConfig signingConfigs.publishingHuawei
} else {
signingConfig signingConfigs.publishing
}
}
}
}
@ -280,46 +295,6 @@ task downloadWorldMiniBasemap {
}
}
task downloadHuaweiDrmZip {
doLast {
ant.get(src: 'https://obs.cn-north-2.myhwclouds.com/hms-ds-wf/sdk/HwDRM_SDK_2.5.2.300_ADT.zip', dest: 'HwDRM_SDK_2.5.2.300_ADT.zip', skipexisting: 'true')
ant.unzip(src: 'HwDRM_SDK_2.5.2.300_ADT.zip', dest: 'huaweidrmlib/')
}
}
task copyHuaweiDrmLibs(type: Copy) {
dependsOn downloadHuaweiDrmZip
from "huaweidrmlib/HwDRM_SDK_2.5.2.300_ADT/libs"
into "libs"
}
task copyHuaweiDrmValues(type: Copy) {
dependsOn downloadHuaweiDrmZip
from "huaweidrmlib/HwDRM_SDK_2.5.2.300_ADT/res"
into "res"
}
task downloadPrebuiltHuaweiDrm {
dependsOn copyHuaweiDrmLibs, copyHuaweiDrmValues
}
task cleanHuaweiDrmLibs(type: Delete) {
delete "huaweidrmlib"
delete fileTree("libs").matching {
include "**/huawei-*.jar"
}
}
task cleanHuaweiDrmValues(type: Delete) {
delete fileTree("res").matching {
include "**/drm_strings.xml"
}
}
task cleanPrebuiltHuaweiDrm {
dependsOn cleanHuaweiDrmLibs, cleanHuaweiDrmValues
}
task collectVoiceAssets(type: Sync) {
from "../../resources/voice"
into "assets/voice"
@ -401,8 +376,6 @@ task copyLargePOIIcons(type: Sync) {
}
}
task copyWidgetIconsXhdpi(type: Sync) {
from "res/drawable-xxhdpi/"
into "res/drawable-large-xhdpi/"
@ -448,15 +421,6 @@ task collectExternalResources {
copyWidgetIconsXhdpi,
copyPoiCategories,
downloadWorldMiniBasemap
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString().toLowerCase()
// Use Drm SDK only for huawei build
if (tskReqStr.contains("huawei")) {
dependsOn downloadPrebuiltHuaweiDrm
} else {
dependsOn cleanPrebuiltHuaweiDrm
}
}
// Legacy core build
@ -507,10 +471,16 @@ task cleanupDuplicatesInCore() {
file("libs/x86_64/libc++_shared.so").renameTo(file("libc++/x86_64/libc++_shared.so"))
}
}
afterEvaluate {
android.applicationVariants.all { variant ->
variant.javaCompiler.dependsOn(collectExternalResources, buildOsmAndCore, cleanupDuplicatesInCore)
}
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString().toLowerCase()
if (tskReqStr.contains("huawei")) {
apply plugin: 'com.huawei.agconnect'
}
}
task appStart(type: Exec) {
@ -520,7 +490,6 @@ task appStart(type: Exec) {
// commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'net.osmand.plus/net.osmand.plus.activities.MapActivity'
}
dependencies {
implementation project(path: ':OsmAnd-java', configuration: 'android')
implementation project(':OsmAnd-api')
@ -572,6 +541,5 @@ dependencies {
}
implementation 'com.jaredrummler:colorpicker:1.1.0'
huaweiImplementation files('libs/huawei-android-drm_v2.5.2.300.jar')
freehuaweiImplementation files('libs/huawei-android-drm_v2.5.2.300.jar')
freehuaweiImplementation 'com.huawei.hms:iap:5.0.2.300'
}

View file

@ -1,9 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="12dp"
android:height="6dp"
android:height="12dp"
android:viewportWidth="12"
android:viewportHeight="6">
android:viewportHeight="12">
<path
android:pathData="M0,6L6,0L12,6H0Z"
android:pathData="M0,12L6,0L12,12L6,8L0,12Z"
android:fillColor="#ffffff"/>
</vector>

View file

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/buttons_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:gravity="center"
android:orientation="vertical"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/content_padding_small">
<include
android:id="@+id/third_button"
layout="@layout/bottom_sheet_dialog_button"
android:layout_width="match_parent"
android:layout_height="@dimen/dialog_button_height"
android:visibility="gone"
tools:visibility="visible" />
<View
android:id="@+id/buttons_divider_top"
android:layout_width="match_parent"
android:layout_height="@dimen/content_padding"
android:visibility="gone"
tools:visibility="visible" />
<include
android:id="@+id/right_bottom_button"
layout="@layout/bottom_sheet_dialog_button"
android:layout_width="match_parent"
android:layout_height="@dimen/dialog_button_height"
android:visibility="gone"
tools:visibility="visible" />
<View
android:id="@+id/buttons_divider"
android:layout_width="match_parent"
android:layout_height="@dimen/content_padding"
tools:visibility="visible" />
<include
android:id="@+id/dismiss_button"
layout="@layout/bottom_sheet_dialog_button"
android:layout_width="match_parent"
android:layout_height="@dimen/dialog_button_height" />
</LinearLayout>

View file

@ -3,7 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_list_item_height"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:gravity="center_vertical"
android:minHeight="@dimen/bottom_sheet_list_item_height"
@ -28,7 +28,7 @@
android:layout_marginRight="@dimen/content_padding"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:maxLines="4"
android:textAppearance="@style/TextAppearance.ListItemTitle"
tools:text="Some Title"/>

View file

@ -35,10 +35,8 @@
android:layout_width="match_parent"
android:layout_height="10dp"
android:layout_gravity="bottom"
android:visibility="gone"
android:background="@drawable/bg_contextmenu_shadow_top_light" />
android:background="@drawable/bg_contextmenu_shadow_top_light"
android:visibility="gone" />
</FrameLayout>
<include layout="@layout/bottom_buttons" />
</LinearLayout>

View file

@ -721,9 +721,9 @@
<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">خريطة التنقل متوفرة حالياً لهذا الموقع.
<string name="switch_to_vector_map_to_see">خريطة التنقل متوفرة لهذا الموقع فعلها عبر
\n
\nلتفعليها \'القائمة\' ← \'ضبط الخريطة\' ← \'مصدر الخريطة\' ← \'الخريطة المحملة\'.</string>
\n\'القائمة\' ← \'ضبط الخريطة\' ← \'مصدر الخريطة\' ← \'الخريطة المحملة\'.</string>
<string name="choose_audio_stream">مصدر التوجيه الصوتي</string>
<string name="choose_audio_stream_descr">اختيار قناة لتشغيل التوجيه الصوتي.</string>
<string name="voice_stream_voice_call">صوت المكالمة الهاتفية ( كما يحاول قطع ستريو بلوتوث السيارة )</string>
@ -1645,7 +1645,7 @@
<string name="road_blocked">الطريق محظور</string>
<string name="shared_string_select">تحديد</string>
<string name="switch_start_finish">اعكس نقطة الانطلاق والوصول</string>
<string name="rendering_attr_hideIcons_name">أيقونات POI</string>
<string name="rendering_attr_hideIcons_name">أيقونات نقاط الاهتمام</string>
<string name="shared_string_type">النوع</string>
<string name="shared_string_not_selected">غير محدد</string>
<string name="rec_split">قسم مسجل</string>
@ -1972,7 +1972,7 @@
<string name="sd_unmounted">بطاقة الذاكرة غير متاحة.
\nلن تكون قادرا على رؤية الخرائط أو العثور على أماكن.</string>
<string name="sd_mounted_ro">بطاقة الذاكرة في وضع القراءة فقط.
\n يمكنك فقط مشاهدة الخريطة المحملة مسبقا ولا يمكنك التحميل من الإنترنت.</string>
\n يمكنك فقط مشاهدة الخريطة المحملة مسبقاً ولا يمكنك التحميل من الإنترنت.</string>
<string name="route_tshr">انعطف يميناً بشكل حاد</string>
<string name="route_tshl">انعطف يساراً بشكل حاد</string>
<string name="route_tu">قم بالدوران وواصل</string>
@ -3891,4 +3891,6 @@
<string name="sort_last_modified">آخر تعديل</string>
<string name="sort_name_descending">الاسم: أ ي</string>
<string name="sort_name_ascending">الاسم: أ ي</string>
<string name="start_finish_icons">رموز البدء/الانتهاء</string>
<string name="contour_lines_thanks">شكرا لشرائك \"خطوط الكنتور\"</string>
</resources>

View file

@ -3844,4 +3844,5 @@
<string name="poi_traffic_signals_arrow">Šipka</string>
<string name="poi_traffic_signals_vibration">Vibrace</string>
<string name="poi_fire_hydrant_pressure_filter">Tlak</string>
<string name="poi_fuel_lng">Zkapalněný zemní plyn</string>
</resources>

View file

@ -3525,4 +3525,57 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="quick_action_remove_next_destination">Smazat následující cílový bod</string>
<string name="use_volume_buttons_as_zoom_descr">Umožní ovládat úroveň přiblížení mapy pomocí tlačítek hlasitosti zařízení.</string>
<string name="use_volume_buttons_as_zoom">Tlačítka hlasitosti pro přibližování</string>
<string name="threshold_distance">Mezní vzdálenost</string>
<string name="navigation_profile">Navigační profil</string>
<string name="route_between_points_add_track_desc">Vyberte soubor stopy, do níž se nový úsek přidá.</string>
<string name="street_level_imagery">Snímky z úrovně ulice</string>
<string name="plan_route_exit_dialog_descr">Opravdu chcete zavřít plánovanou trasu a zahodit tak všechny změny\?</string>
<string name="in_case_of_reverse_direction">V případě opačného směru</string>
<string name="shared_string_save_as_gpx">Uložit jako nový soubor stopy</string>
<string name="add_segment_to_the_track">Přidat do souboru stopy</string>
<string name="shared_string_gpx_files">Stopy</string>
<string name="layer_gpx_layer">Stopy</string>
<string name="show_gpx">Stopy</string>
<string name="save_track_to_gpx_globally">"Ukládat trasu do GPX souboru"</string>
<string name="shared_string_gpx_route">Trasa ze stopy</string>
<string name="empty_state_my_tracks">Přidat soubory stop</string>
<string name="simplified_track">Zjednodušená trasa</string>
<string name="simplified_track_description">Uloží se pouze linie trasy, mezicíle budou odstraněny.</string>
<string name="shared_string_file_name">Název souboru</string>
<string name="number_of_gpx_files_selected_pattern">%s vybraných souborů stop</string>
<string name="monitoring_control_start">REC</string>
<string name="disable_recording_once_app_killed_descrp">Pozastaví záznam trasy, pokud je aplikace ukončena (přes nedávné aplikace). (Ikona režimu na pozadí zmizí z notifikační oblasti Androidu.)</string>
<string name="gpx_monitoring_stop">Pozastavit záznam trasy</string>
<string name="gpx_monitoring_start">Pokračovat v záznamu trasy</string>
<string name="system_default_theme">Výchozí</string>
<string name="all_next_segments">Všechny následující úseky</string>
<string name="previous_segment">Přecházející úsek</string>
<string name="all_previous_segments">Všechny předcházející úseky</string>
<string name="only_selected_segment_recalc">Pouze vybraný úsek bude přepočítán pomocí vybraného profilu.</string>
<string name="all_next_segments_will_be_recalc">Všechny následující úseky budou přepočítány pomocí vybraného profilu.</string>
<string name="all_previous_segments_will_be_recalc">Všechny předcházející úseky budou přepočítány pomocí vybraného profilu.</string>
<string name="open_saved_track">Otevřít uloženou trasu</string>
<string name="shared_string_is_saved">je uloženo</string>
<string name="one_point_error">Přidejte prosím alespoň dva body.</string>
<string name="shared_string_redo">Znovu</string>
<string name="release_3_8">• Vylepšená funkce plánování trasy: umožňuje použít různé typy navigace pro úseky trasy a přidává stopy
\n
\n • Nové menu pro vzhled stop: zvolte barvu, tloušťku, směrové šipky, ikony startu a cíle
\n
\n • Vylepšená viditelnost bodů pro cyklistiku.
\n
\n • Stopy je nyní možné aktivovat, nabízejí kontextové menu se základními údaji.
\n
\n • Vylepšený algoritmus vyhledávání
\n
\n • Vylepšené možnosti následování stopy v navigaci
\n
\n • Opravené problémy s importem a exportem nastavení profilů
\n
\n</string>
<string name="sort_last_modified">Naposledy změněno</string>
<string name="sort_name_descending">Název: Z A</string>
<string name="sort_name_ascending">Název: A Z</string>
<string name="start_finish_icons">Ikony startu/cíle</string>
<string name="contour_lines_thanks">Děkujeme za zakoupení modulu \'Vrstevnice\'</string>
</resources>

View file

@ -3842,4 +3842,14 @@
<string name="poi_give_box">Donationsboks</string>
<string name="poi_traffic_signals_arrow_no">Pil: nej</string>
<string name="poi_elevator">Elevator</string>
<string name="poi_nuts">Nøddebutik</string>
<string name="poi_beehive">Bikube</string>
<string name="poi_departures_board_timetable">Tidsplan</string>
<string name="poi_departures_board_realtime">Realtid</string>
<string name="poi_departures_board_delay">Forsinkelse</string>
<string name="poi_departures_board_yes">Ja</string>
<string name="poi_departures_board_no">Afgangstavle: nej</string>
<string name="poi_recycling_small_electrical_appliances">Små elektriske apparater</string>
<string name="poi_departures_board">Afgangstavle</string>
<string name="poi_drinking_water_refill">Genopfyldning af drikkevand</string>
</resources>

View file

@ -3243,7 +3243,7 @@
<string name="screen_alerts_descr">Advarsler vises nederst til venstre under navigationen.</string>
<string name="switch_profile">Skift profil</string>
<string name="language_and_output">Sprog og output</string>
<string name="reset_to_default">Gendan standardværdi</string>
<string name="reset_to_default">Nulstil til standard</string>
<string name="manage_profiles_descr">Opret, importer, rediger profiler</string>
<string name="manage_profiles">Administrer programprofiler…</string>
<string name="osmand_settings_descr">Påvirker hele programmet</string>
@ -3756,8 +3756,8 @@
<string name="delete_address">Slet adresse</string>
<string name="add_address">Tilføj adresse</string>
<string name="access_hint_enter_address">Angiv adresse</string>
<string name="plan_route_trim_before">Trim før</string>
<string name="plan_route_trim_after">Trim efter</string>
<string name="plan_route_trim_before">Trimme før</string>
<string name="plan_route_trim_after">Trimme efter</string>
<string name="plan_route_change_route_type_before">Skift rutetype før</string>
<string name="plan_route_change_route_type_after">Skift rutetype efter</string>
<string name="simplified_track">Forenklet spor</string>
@ -3771,4 +3771,21 @@
<string name="shared_string_is_saved">er gemt</string>
<string name="one_point_error">Tilføj mindst to punkter.</string>
<string name="shared_string_redo">Omgøre</string>
<string name="navigate_to_track_descr">Navigere fra position til sporet</string>
<string name="pass_whole_track_descr">Punkt på sporet for at navigere</string>
<string name="number_of_gpx_files_selected_pattern">%s sporfiler valgt</string>
<string name="sort_last_modified">Sidst ændret</string>
<string name="sort_name_descending">Navn: Z A</string>
<string name="sort_name_ascending">Navn: A Z</string>
<string name="plan_route_select_track_file_for_open">Vælg en sporfil, der skal åbnes.</string>
<string name="route_between_points_add_track_desc">Vælg en sporfil, som det nye segment skal føjes til.</string>
<string name="plan_route_exit_dialog_descr">Kasser alle ændringer i den planlagte rute ved at lukke den\?</string>
<string name="add_segment_to_the_track">Føj til en sporfil</string>
<string name="import_track_descr">Vælg sporfil, der skal følges eller importeres fra enheden.</string>
<string name="simplified_track_description">Kun rutelinjen gemmes, rutepunkter slettes.</string>
<string name="all_next_segments">Alle efterfølgende segmenter</string>
<string name="only_selected_segment_recalc">Kun det valgte segment genberegnes igen ved hjælp af den valgte profil.</string>
<string name="all_next_segments_will_be_recalc">Alle efterfølgende segmenter genberegnes ved hjælp af den valgte profil.</string>
<string name="all_previous_segments_will_be_recalc">Alle tidligere segmenter genberegnes ved hjælp af den valgte profil.</string>
<string name="start_finish_icons">Start-/slutikoner</string>
</resources>

View file

@ -3847,4 +3847,5 @@
<string name="poi_beehive">Bienenstock</string>
<string name="poi_recycling_small_electrical_appliances">Kleine Elektrogeräte</string>
<string name="poi_nuts">Nussladen</string>
<string name="poi_fuel_lng">Flüssigerdgas</string>
</resources>

View file

@ -3876,9 +3876,7 @@
<string name="import_track_descr">Track Datei zum Folgen auswählen, oder vom Gerät importieren.</string>
<string name="disable_recording_once_app_killed_descrp">Die GPX-Aufzeichnung wird angehalten, wenn OsmAnd beendet wird (über „zuletzt verwendete Apps“). (Die Hintergrunddienst-Anzeige verschwindet aus der Android-Benachrichtigungsleiste.)</string>
<string name="save_global_track_interval_descr">Aufzeichnungsintervall für die generelle Track-Aufzeichnung festlegen (via Schaltfläche \'GPX\' auf dem Kartenbildschirm).</string>
<string name="route_between_points_warning_desc">Um diese Option nutzen zu können, muss OsmAnd den Track auf die Straßen der Karte einrasten.
\n
\n Wählen Sie im nächsten Schritt ein Navigationsprofil um festzulegen, welche Straßentypen verwendet werden sollen, und wählen Sie einen Wert für die maximal zulässige Entfernung zwischen Track und Straße.</string>
<string name="route_between_points_warning_desc">Als nächstes können Sie Ihren Track mit einem Ihrer Navigationsprofile auf die nächstgelegene erlaubte Straße einrasten lassen, um diese Option zu nutzen.</string>
<string name="quick_action_add_gpx">Track-Wegpunkt hinzufügen</string>
<string name="number_of_gpx_files_selected_pattern">%s Track Dateien ausgewählt</string>
<string name="simplified_track_description">Nur die Routenlinie wird gespeichert, die Wegpunkte werden gelöscht.</string>
@ -3910,4 +3908,6 @@
<string name="sort_last_modified">Zuletzt geändert</string>
<string name="sort_name_descending">Name: Z A</string>
<string name="sort_name_ascending">Name: A Z</string>
<string name="start_finish_icons">Start-/Ziel-Symbole</string>
<string name="contour_lines_thanks">Vielen Dank für den Kauf von \'Höhenlinien\'</string>
</resources>

View file

@ -3851,4 +3851,5 @@
<string name="poi_recycling_small_electrical_appliances">Pequeños electrodomésticos</string>
<string name="poi_beehive">Panal de abejas</string>
<string name="poi_nuts">Frutos secos</string>
<string name="poi_fuel_lng">Gas natural licuado</string>
</resources>

View file

@ -385,14 +385,14 @@
\nCualquiera de estos mapas puede usarse como el mapa predefinido que se mostrará, o como una superposición o subyacencia de otro mapa base (como los mapas estándar de OsmAnd en línea). Ciertos elementos de los mapas vectoriales de OsmAnd pueden ocultarse a través del menú «Configurar mapa» para hacer cualquier subyacencia mas visible.
\n
\nDescarga las teselas de los mapas directamente en línea, o prepáralo para su uso sin conexión (copiar manualmente en la carpeta de datos OsmAnd) como una base de datos SQLite que puede ser producida por una variedad de herramientas de preparación de mapas de terceros.</string>
<string name="record_plugin_description">Este complemento activa la funcionalidad para registrar y guardar tus trazas manualmente pulsando el widget de grabación GPX en el mapa, o automáticamente registrando todas tus rutas navegadas en un archivo GPX.
<string name="record_plugin_description">Activa la funcionalidad para registrar y guardar tus trazas manualmente pulsando el widget de grabación GPX en el mapa, o automáticamente registrando todas tus rutas navegadas en un archivo GPX.
\n
\nLas trazas grabadas pueden ser compartidas con tus amigos o ser usadas para contribuir a OSM. Los atletas pueden usar las trazas grabadas para seguir sus entrenamientos. Algunos análisis básicos de trazas se pueden realizar directamente en OsmAnd, como tiempos por vuelta, velocidad media, etc., y por supuesto las trazas pueden analizarse posteriormente con herramientas de análisis de terceros.</string>
<string name="srtm_paid_version_title">Complemento de curvas de nivel</string>
<string name="osmand_srtm_long_description_1000_chars">Este complemento proporciona una capa superpuesta de curvas de nivel y una capa (de relieve) sombreada, que se pueden visualizar sobre los mapas descargados de OsmAnd. Esta funcionalidad será muy apreciada por atletas, caminantes, excursionistas, y cualquiera interesado en la estructura de relieve de un paisaje.
<string name="osmand_srtm_long_description_1000_chars">Proporciona una capa superpuesta de curvas de nivel y una capa (de relieve) sombreada, que se pueden visualizar sobre los mapas descargados de OsmAnd. Esta funcionalidad será muy apreciada por atletas, caminantes, excursionistas, y cualquiera interesado en la estructura de relieve de un paisaje.
\n
\nLos datos globales (entre 70° norte y 70° sur) se basan en mediciones de SRTM (Shuttle Radar Topography Mission, o en español Misión de Topografía por Radar desde Transbordador) y ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer, o en español Radiómetro Espacial Avanzado de Emisión Térmica y Reflexión), un instrumento de captura de imágenes a bordo de Terra, el satélite insignia del Sistema de Observación de la Tierra de la NASA. ASTER es un esfuerzo cooperativo entre la NASA, el Ministerio de Economía, Comercio e Industria de Japón (METI) y Sistemas Espaciales de Japón (J-spacesystems).</string>
<string name="srtm_plugin_description">Este complemento proporciona tanto una capa superpuesta de curvas de nivel y una capa (de relieve) sombreada, que se pueden visualizar sobre los mapas descargados de OsmAnd. Esta funcionalidad será muy apreciada por atletas, caminantes, excursionistas, y cualquiera interesado en la estructura de relieve de un paisaje. (Note que las curvas de nivel y/o los datos de relieve están disponibles en descargas adicionales separadas luego de activar el complemento.)
<string name="srtm_plugin_description">Proporciona tanto una capa superpuesta de curvas de nivel y una capa (de relieve) sombreada, que se pueden visualizar sobre los mapas descargados de OsmAnd. Esta funcionalidad será muy apreciada por atletas, caminantes, excursionistas, y cualquiera interesado en la estructura de relieve de un paisaje. (Note que las curvas de nivel y/o los datos de relieve están disponibles en descargas adicionales separadas luego de activar el complemento.)
\n
\nLos datos globales (entre 70° norte y 70° sur) se basan en mediciones de SRTM (Shuttle Radar Topography Mission, o en español Misión de Topografía por Radar Shuffle) y ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer, o en español Radiómetro Espacial Avanzado de Emisión Térmica y Reflexión), un instrumento de captura de imágenes a bordo de Terra, el satélite insignia del Sistema de Observación de la Tierra de la NASA. ASTER es un esfuerzo cooperativo entre la NASA, el Ministerio de Economía, Comercio e Industria de Japón (METI) y Sistemas Espaciales de Japón (J-spacesystems).</string>
<string name="plugin_touringview_descr">Activando esta vista cambia el estilo del mapa OsmAnd a la «Vista turística», que es una vista de alto detalle especial para viajeros y conductores profesionales.
@ -406,12 +406,12 @@
\nNo es necesario descargar un mapa especial, la vista es creada a partir de nuestros mapas estándar.
\n
\nEsta vista puede ser revertida desactivando de nuevo aquí, o cambiando el «Estilo del mapa» desde «Configurar mapa» cuando lo desees.</string>
<string name="plugin_nautical_descr">Este complemento enriquece el mapa y la navegación de OsmAnd al producir también mapas náuticos para el canotaje, vela y otros tipos de deportes acuáticos.
<string name="plugin_nautical_descr">Enriquece el mapa y la navegación de OsmAnd al producir también mapas náuticos para el canotaje, vela y otros tipos de deportes acuáticos.
\n
\nUn mapa especial complementado para OsmAnd proporcionará toda las marcas de navegación náutica y símbolos cartográficos para el interior, así como para la navegación cerca de la costa. La descripción de cada marca de navegación proporciona los datos necesarios para su identificación y su significado (categoría, forma, color, número, referencia, etc.).
\n
\nPara volver a uno de los estilos del mapas convencionales de OsmAnd, simplemente desactiva este complemento de nuevo, o cambia el «Estilo del mapa» en «Configurar mapa» cuando lo desees.</string>
<string name="plugin_ski_descr">Este complemento para OsmAnd pone a tu alcance detalles sobre pistas de esquí de descenso, de travesía, rutas de esquí alpino, teleféricos y remontes a nivel mundial. Las rutas y pistas se muestran por código de color en función de su dificultad y representados con un estilo del mapa especial «Invierno» que lo asemeja a un paisaje invernal nevado.
<string name="plugin_ski_descr">Detalles sobre pistas de esquí de descenso, de travesía, rutas de esquí alpino, teleféricos y remontes a nivel mundial. Las rutas y pistas se muestran por código de color en función de su dificultad y representados con un estilo del mapa especial «Invierno» que lo asemeja a un paisaje invernal nevado.
\n
\nActivando esta vista, cambia el estilo del mapa a «Invierno y esquí», mostrando las características del terreno en condiciones invernales. Esta vista se puede revertir desactivando de nuevo aquí o cambiando el «Estilo del mapa» en «Configurar mapa» cuando lo desees.</string>
<string name="audionotes_plugin_description">Toma notas de audio, fotografía y/o video durante un viaje, usando un botón en el mapa o el menú contextual de la ubicación.</string>
@ -3907,4 +3907,6 @@
<string name="sort_last_modified">Último modificado</string>
<string name="sort_name_descending">Nombre: Z A</string>
<string name="sort_name_ascending">Nombre: A Z</string>
<string name="start_finish_icons">Iconos de inicio/fin</string>
<string name="contour_lines_thanks">Gracias por comprar las «Curvas de nivel»</string>
</resources>

View file

@ -3851,4 +3851,5 @@
<string name="poi_departures_board">Tablero de partidas</string>
<string name="poi_nuts">Frutos secos</string>
<string name="poi_beehive">Panal de abejas</string>
<string name="poi_fuel_lng">Gas natural licuado</string>
</resources>

View file

@ -3904,4 +3904,5 @@
<string name="sort_name_descending">Nombre: Z A</string>
<string name="sort_name_ascending">Nombre: A Z</string>
<string name="sort_last_modified">Último modificado</string>
<string name="start_finish_icons">Iconos de inicio/fin</string>
</resources>

View file

@ -1588,7 +1588,7 @@
<string name="poi_memorial_koshinto">Koshinto</string>
<string name="poi_memorial_blue_plaque">Placa azul</string>
<string name="poi_memorial_jizo">Jizo</string>
<string name="poi_memorial_cross">Crucero (monumento)</string>
<string name="poi_memorial_cross">Cruz</string>
<string name="poi_historic_quarry">Cantera histórica</string>
<string name="poi_resource_aggregate">Agregado</string>
<string name="poi_resource_antimony">Antimonio</string>
@ -1825,7 +1825,7 @@
<string name="poi_training_martial_art">Capacitación: artes marciales</string>
<string name="poi_training_aviation">Capacitación: aviación</string>
<string name="poi_training_hairdressing">Capacitación: peluquería</string>
<string name="poi_monument_yes">Monumento</string>
<string name="poi_monument_yes">Objeto monumental</string>
<string name="poi_industrial_oil">Tipo: industria petrolera</string>
<string name="poi_industrial_wellsite">Tipo: Área de pozos</string>
<string name="poi_industrial_factory">Tipo: fábrica</string>
@ -1868,7 +1868,7 @@
<string name="poi_fuel_100ll">100LL (con plomo, para aviones)</string>
<string name="poi_fuel_autogas">Autogas (Etanol libre de plomo)</string>
<string name="poi_fuel_jeta1">Jet A-1 (diésel)</string>
<string name="poi_fuel_adblue">AdBlue</string>
<string name="poi_fuel_adblue">Líquido de escape de diesel</string>
<string name="poi_fuel_wood">Combustible: madera</string>
<string name="poi_fuel_charcoal">Combustible: carbón vegetal</string>
<string name="poi_fuel_coal">Combustible: carbón</string>
@ -3798,7 +3798,7 @@
<string name="poi_fire_hydrant_type_pipe">Tubo</string>
<string name="poi_drinking_water_refill_network">Red de recarga de agua potable</string>
<string name="poi_drinking_water_refill_no">Recarga de agua potable: no</string>
<string name="poi_drinking_water_refill_yes">Recarga de agua potable: sí</string>
<string name="poi_drinking_water_refill_yes">Sí</string>
<string name="poi_seamark_obstruction">Obstrucción</string>
<string name="poi_seamark_water_level_below_mwl">Nivel de agua: por debajo del nivel medio del agua</string>
<string name="poi_seamark_water_level_above_mwl">Nivel de agua: por encima del nivel medio del agua</string>

View file

@ -23,7 +23,7 @@
<string name="local_openstreetmap_delete">Borrar edición</string>
<string name="local_openstreetmap_descr_title">Edición asíncrona OSM:</string>
<string name="local_openstreetmap_settings">PDI/Notas de OSM guardados en el dispositivo</string>
<string name="local_openstreetmap_settings_descr">Muestra y gestiona PDI/notas de OSM guardadas en la base de datos del dispositivo.</string>
<string name="local_openstreetmap_settings_descr">Muestra y gestiona PDI/Notas de OSM en la base de datos de tu dispositivo.</string>
<string name="live_monitoring_interval_descr">Indica el intervalo del seguimiento en línea.</string>
<string name="live_monitoring_interval">Intervalo del seguimiento en línea</string>
<string name="live_monitoring_url_descr">Indica la dirección web con sintaxis de parámetros : lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.</string>
@ -163,7 +163,7 @@
<string name="tts_language_not_supported">El idioma elegido es incompatible con el motor TTS (texto a voz) instalado en Android, se usará el idioma TTS predefinido. ¿Buscar otro motor TTS en la tienda de aplicaciones\?</string>
<string name="tts_missing_language_data_title">Faltan datos</string>
<string name="tts_missing_language_data">¿Ir a la tienda de aplicaciones para descargar el idioma elegido?</string>
<string name="gpx_option_reverse_route">Invertir la dirección GPX</string>
<string name="gpx_option_reverse_route">Invertir la dirección de la traza</string>
<string name="gpx_option_destination_point">Usar destino actual</string>
<string name="gpx_option_from_start_point">Pasar a lo largo de la traza completa</string>
<string name="switch_to_vector_map_to_see">Mapa vectorial presente para esta ubicación.
@ -265,10 +265,7 @@
<string name="osmand_net_previously_installed">Todos los datos sin conexión en la versión vieja de OsmAnd son compatibles con la nueva versión, pero los puntos de Favoritos deben exportarse desde la versión vieja y luego, importarse en la nueva.</string>
<string name="build_installed">Compilación {0} instalada ({1}).</string>
<string name="downloading_build">Descargando compilación…</string>
<string name="install_selected_build">¿Instalar OsmAnd\?
\nVersión: {0}
\nFecha: {1}
\nTamaño: {2} MB</string>
<string name="install_selected_build">¿Instalar OsmAnd - {0} de {1} {2} MB\?</string>
<string name="loading_builds_failed">Error al recuperar la lista de compilaciones de OsmAnd</string>
<string name="loading_builds">Cargando compilaciones de OsmAnd…</string>
<string name="select_build_to_install">Instalar compilación de OsmAnd</string>
@ -441,7 +438,7 @@
<string name="search_offline_address">Búsqueda sin conexión</string>
<string name="search_online_address">Búsqueda en línea</string>
<string name="max_level_download_tile">Máximo zoom en línea</string>
<string name="max_level_download_tile_descr">No buscar en las teselas de mapas en línea para niveles de zoom más allá de esto.</string>
<string name="max_level_download_tile_descr">No busca en los mapas en línea niveles de zoom más allá de éste.</string>
<string name="route_general_information">Distancia total %1$s, tiempo de viaje %2$d h %3$d min.</string>
<string name="router_service_descr">Servicios de navegación con o sin conexión.</string>
<string name="router_service">Servicio de navegación</string>
@ -606,7 +603,7 @@
<string name="left_side_navigation_descr">Para países donde la gente conduce por el lado izquierdo del camino.</string>
<string name="unknown_from_location">Punto de partida aún no determinado.</string>
<string name="confirm_interrupt_download">¿Cancelar la descarga\?</string>
<string name="basemap_was_selected_to_download">El mapa base necesario para proporcionar la funcionalidad básica, está en la cola de descarga.</string>
<string name="basemap_was_selected_to_download">El mapa base necesario para proporcionar funcionalidad básica está en la cola de descargas.</string>
<string name="map_online_plugin_is_not_installed">Activa el complemento «Mapas en línea», para elegir diferentes fuentes de mapas</string>
<string name="map_online_data">Mapas en línea y teselas</string>
<string name="map_online_data_descr">Usa mapas en línea (descarga y guarda teselas en la tarjeta de memoria).</string>
@ -729,8 +726,8 @@
<string name="osmand_parking_pm">PM</string>
<string name="osmand_parking_am">AM</string>
<string name="osmand_parking_position_name">Lugar de aparcamiento</string>
<string name="osmand_parking_plugin_description">Este complemento, registra dónde se ha aparcado el automóvil y cuánto tiempo queda (si hay un límite de tiempo).
\nTanto la ubicación como el tiempo del aparcamiento se muestran en el menú principal y en un widget sobre el mapa. Puedes añadir una notificación al calendario, en el caso de que desees tener un recordatorio al respecto.</string>
<string name="osmand_parking_plugin_description">Te permite egistrar dónde has aparcado el automóvil y cuánto tiempo queda (si hay un límite de tiempo).
\nTanto la ubicación como el tiempo del aparcamiento se muestran en el menú principal y en un control sobre el mapa. Puedes añadir un recordatorio al calendario, de Android.</string>
<string name="osmand_parking_plugin_name">Aparcamiento</string>
<string name="context_menu_item_add_parking_point">Marcar como aparcamiento</string>
<string name="context_menu_item_delete_parking_point">Quitar marcador de aparcamiento</string>
@ -890,7 +887,7 @@
<string name="srtm_plugin_name">Curvas de nivel</string>
<string name="download_select_map_types">Otros mapas</string>
<string name="download_srtm_maps">Curvas de nivel</string>
<string name="audionotes_plugin_description">Este complemento, proporciona la funcionalidad para tomar notas de audio, fotografía y/o video durante un viaje, usando un botón en el mapa, o directamente en el menú contextual para cualquier ubicación en el mapa.</string>
<string name="audionotes_plugin_description">Tomar notas de audio/foto/video durante un viaje, usando un botón de mapa o un menú contextual de la ubicación.</string>
<string name="audionotes_plugin_name">Notas audio/vídeo</string>
<string name="osmand_srtm_short_description_80_chars">Complemento OsmAnd para curvas de nivel sin conexión</string>
<string name="osmand_srtm_long_description_1000_chars">Este complemento proporciona una capa superpuesta de curvas de nivel y una capa (de relieve) sombreada, que se pueden visualizar sobre los mapas descargados de OsmAnd. Esta funcionalidad será muy apreciada por atletas, caminantes, excursionistas, y cualquiera interesado en la estructura de relieve de un paisaje.
@ -930,7 +927,7 @@
<string name="recording_description">Grabando %1$s %3$s %2$s</string>
<string name="srtm_paid_version_msg">Por favor, considera pagar por el complemento «Curvas de nivel» para apoyar desarrollos adicionales.</string>
<string name="srtm_paid_version_title">Complemento de curvas de nivel</string>
<string name="dropbox_plugin_description">El complemento de Dropbox, permite sincronizar trazas y notas multimedia con tu cuenta de Dropbox.</string>
<string name="dropbox_plugin_description">Sincroniza trazas y notas multimedia con tu cuenta de Dropbox.</string>
<string name="dropbox_plugin_name">Complemento Dropbox</string>
<string name="intermediate_points_change_order">Cambiar orden</string>
<string name="recording_context_menu_show">Mostrar</string>
@ -1003,8 +1000,8 @@
<string name="plugin_distance_point">Punto</string>
<string name="gpx_file_name">Nombre del archivo GPX</string>
<string name="gpx_saved_sucessfully">Archivo GPX guardado en {0}</string>
<string name="osmand_distance_planning_plugin_description">Este complemento proporciona un widget en el mapa, permitiendo crear caminos pulsando el mapa, usando o modificando archivos GPX existentes, para planificar un viaje y medir la distancia entre puntos. Los resultados pueden guardarse como un archivo GPX y usarse luego para la orientación.</string>
<string name="osmand_distance_planning_plugin_name">Distancias y planificación</string>
<string name="osmand_distance_planning_plugin_description">Crea caminos pulsando en el mapa, o usando o modificando archivos GPX existentes, para planificar un viaje y medir la distancia entre puntos. El resultado puede guardarse como un archivo GPX y usarse luego para la orientación.</string>
<string name="osmand_distance_planning_plugin_name">Calculadora de distancias y herramienta de planificación</string>
<string name="use_distance_measurement_help">* Pulse para marcar un punto.
\n * Mantenga pulsado el mapa para quitar el punto anterior.
\n * Mantenga pulsado en un punto para ver e incluir la descripción.
@ -1309,7 +1306,7 @@
<string name="record_plugin_name">Grabación de viaje</string>
<string name="record_plugin_description">Este complemento activa la funcionalidad para registrar y guardar tus trazas manualmente pulsando el widget de grabación GPX en el mapa, o automáticamente registrando todas tus rutas navegadas en un archivo GPX.
\n
\nLas trazas grabadas pueden ser compartidas con sus amigos o ser usadas para contribuir a OSM. Los atletas pueden usar las trazas grabadas para seguir sus entrenamientos. Algunos análisis básicos de trazas se pueden realizar directamente en OsmAnd, como tiempos por vuelta, velocidad media, etc., y por supuesto las trazas pueden analizarse posteriormente con herramientas de análisis de terceros.</string>
\nLas trazas grabadas pueden ser compartidas con tus amigos o ser usadas para contribuir a OSM. Los atletas pueden usar las trazas grabadas para monitorizar sus entrenamientos. Algunos análisis básicos de trazas pueden realizarse directamente en OsmAnd, como tiempos por vuelta, velocidad media, etc., y por supuesto las trazas pueden analizarse posteriormente con herramientas de análisis de terceros.</string>
<string name="rendering_attr_publicTransportMode_name">Rutas de autobús, trolebús y lanzadera</string>
<string name="save_track_interval_globally">Intervalo de registro</string>
<string name="save_track_to_gpx_globally_descr">Registra la ubicación en un archivo GPX, pudiendo des/activarlo usando el widget de grabación GPX en el mapa.</string>
@ -1433,7 +1430,7 @@
<string name="rendering_attr_pisteGrooming_name">Pista de entrenamiento</string>
<string name="roads_only">Sólo caminos</string>
<string name="share_note">Compartir nota</string>
<string name="notes">Notas</string>
<string name="notes">Notas A/V</string>
<string name="online_map">Mapa en línea</string>
<string name="shared_string_export">Exportar</string>
<string name="shared_string_audio">Audio</string>
@ -1781,7 +1778,7 @@
<string name="dashboard_or_drawer_description">Se ofrece la opción de controlar la aplicación principalmente a través del panel de control flexible o de un menú estático. Se puede cambiar esto luego, en los ajustes del panel.</string>
<string name="use_dashboard_btn">Usar panel de control</string>
<string name="use_drawer_btn">Usar menú</string>
<string name="access_from_map_description">El botón del menú, muestra el panel de control en lugar del menú</string>
<string name="access_from_map_description">El botón del menú muestra el panel de control en lugar del menú</string>
<string name="access_from_map">Acceso desde el mapa</string>
<string name="please_specify_poi_type_only_from_list">Indica el tipo de PDI correcto u omítelo.</string>
<string name="routing_attr_avoid_stairs_name">Sin escaleras</string>
@ -1880,7 +1877,7 @@
\nSe utiliza {3} MB temporalmente, {1} MB constantemente. (De {2} MB.)</string>
<string name="select_map_marker">Elegir marcador del mapa</string>
<string name="map_markers_other">Otros marcadores</string>
<string name="upload_osm_note_description">Subir notas de OSM anónimas o usar el perfil de OpenStreetMap.org.</string>
<string name="upload_osm_note_description">Sube tu nota de OSM de forma anónima o usando tu perfil de OpenStreetMap.org.</string>
<string name="upload_osm_note">Subir nota(s) de OSM</string>
<string name="upload_anonymously">Subir anónimamente</string>
<string name="shared_string_topbar">Barra superior</string>
@ -1910,7 +1907,7 @@
\nParte de los ingresos vuelven a la comunidad de OSM y se paga por cada contribución OSM.
\nSi amas a OsmAnd, OSM y quieres apoyarlos y ser apoyado por ellos, esta es una perfecta manera de hacerlo.</string>
<string name="show_transparency_seekbar">Mostrar barra de transparencia en el mapa</string>
<string name="storage_directory_readonly_desc">Se ha cambiado a la memoria interna, porque la carpeta de almacenamiento de datos elegida es de sólo lectura. Elige un directorio de almacenamiento válido.</string>
<string name="storage_directory_readonly_desc">Se ha cambiado a la memoria interna, porque la carpeta de almacenamiento de datos elegida está protegida de escritura. Elige un directorio de almacenamiento válido.</string>
<string name="storage_directory_shared">Memoria compartida</string>
<string name="storage_permission_restart_is_required">La aplicación ya permite escribir en el almacenamiento externo, pero se debe reiniciar la aplicación.</string>
<string name="shared_string_move_up">Subir ↑</string>
@ -1918,7 +1915,7 @@
<string name="finish_navigation">Finalizar navegación</string>
<string name="avoid_road">Evitar camino</string>
<string name="full_report">Informe completo</string>
<string name="open_street_map_login_and_pass">Nombre de usuario y contraseña de OpenStreetMap</string>
<string name="open_street_map_login_and_pass">Nombre de usuario y contraseña de OSM</string>
<string name="report">Informe</string>
<string name="no_map_markers_found">Añade marcadores a través del mapa</string>
<string name="no_waypoints_found">No se encontraron puntos de referencia</string>
@ -2009,16 +2006,16 @@
<string name="no_inet_connection_desc_map">Necesario para descargar mapas.</string>
<string name="search_location">Buscando la ubicación…</string>
<string name="storage_free_space">Espacio libre</string>
<string name="storage_place_description">Almacenamiento de datos de OsmAnd (para mapas, archivos GPX, etc.): %1$s.</string>
<string name="storage_place_description">Almacenamiento de datos de OsmAnd (para mapas, trazas, etc.): %1$s.</string>
<string name="give_permission">Conceder permiso</string>
<string name="allow_access_location">Permitir el acceso a la ubicación</string>
<string name="first_usage_greeting">Obtenga direcciones y descubra lugares nuevos, sin una conexión a Internet</string>
<string name="search_my_location">Encontrar mi ubicación</string>
<string name="no_update_info_desc">Omite la búsqueda de nuevas versiones o descuentos relacionados con OsmAnd.</string>
<string name="no_update_info">Ocultar nuevas versiones</string>
<string name="osm_live_payment_desc">Suscripción mensual. Puede cancelarlo en cualquier momento en Google Play.</string>
<string name="donation_to_osm">Donaciones a la comunidad de OpenStreetMap</string>
<string name="donation_to_osm_desc">Parte de tu donación se envía a usuarios que realicen cambios en OpenStreetMap. El costo de la suscripción sigue siendo la misma.</string>
<string name="osm_live_payment_desc">Suscripción mensual. Puedes cancelarla en cualquier momento en Google Play.</string>
<string name="donation_to_osm">Donación a la comunidad de OSM</string>
<string name="donation_to_osm_desc">Parte de tu donación se envía a los contribuidores a OSM. El coste de la suscripción sigue siendo el mismo.</string>
<string name="osm_live_subscription_desc">La suscripción permite actualizaciones cada hora, día o semana y descargas ilimitadas para los mapas de todo el mundo.</string>
<string name="get_it">Obtener</string>
<string name="get_for">Obtener por %1$s</string>
@ -2032,8 +2029,8 @@
<string name="upload_poi">Subir PDI</string>
<string name="route_calculation">Cálculo de la ruta</string>
<string name="search_map_hint">Ciudad o región</string>
<string name="gpx_no_tracks_title">Sin archivos GPX aún</string>
<string name="gpx_no_tracks_title_folder">También puedes añadir archivos GPX a la carpeta</string>
<string name="gpx_no_tracks_title">No tienes archivos de trazas aún</string>
<string name="gpx_no_tracks_title_folder">También puedes añadir archivos de trazas a la carpeta</string>
<string name="gpx_add_track">Añadir más…</string>
<string name="shared_string_appearance">Aspecto</string>
<string name="shared_string_notifications">Notificaciones</string>
@ -2047,7 +2044,7 @@
<string name="routing_attr_allow_motorway_name">Usar autopistas</string>
<string name="routing_attr_allow_motorway_description">Permite usar autopistas.</string>
<string name="trip_rec_notification_settings">Activar la grabación rápida</string>
<string name="trip_rec_notification_settings_desc">Muestra una notificación del sistema que permite la grabación del viaje.</string>
<string name="trip_rec_notification_settings_desc">Muestra una notificación del sistema que permite empezar la grabación del viaje.</string>
<string name="shared_string_trip">Viaje</string>
<string name="shared_string_recorded">Grabado</string>
<string name="shared_string_record">Grabar</string>
@ -2121,7 +2118,7 @@
<string name="quick_action_take_photo_note_descr">Un botón que añade una nota fotográfica en el centro de la pantalla.</string>
<string name="quick_action_add_osm_bug_descr">Un botón que añade una nota de OSM en el centro de la pantalla.</string>
<string name="quick_action_add_poi_descr">Un botón que añade un PDI en el centro de la pantalla.</string>
<string name="quick_action_navigation_voice_descr">Un botón que des/activa las indicaciones por voz durante la navegación.</string>
<string name="quick_action_navigation_voice_descr">Un botón que activa o desactiva las indicaciones por voz durante la navegación.</string>
<string name="quick_action_add_parking_descr">Un botón que añade la ubicación del aparcamiento en el centro de la pantalla.</string>
<string name="quick_action_interim_dialog">Mostrar un diálogo temporal</string>
<string name="favorite_autofill_toast_text">" guardado como "</string>
@ -2188,7 +2185,7 @@
\nProporciona un código completo</string>
<string name="navigate_point_olc_info_area">OLC completo y válido.
\nÁrea representada: %1$s x %2$s</string>
<string name="quick_action_page_list_descr">Un botón que muestra la siguiente lista.</string>
<string name="quick_action_page_list_descr">Un botón para paginar a través de la lista de abajo.</string>
<string name="quick_action_map_overlay_switch">Mapa superpuesto cambiado a «%s».</string>
<string name="quick_action_map_underlay_switch">Mapa subyacente cambiado a «%s».</string>
<string name="shared_string_slope">Pendiente</string>
@ -2286,15 +2283,15 @@
\n ¡Más países alrededor del globo están disponibles para descargar!
\n Obtén un navegador confiable en tu país - ya sea Francia, Alemania, México, Reino Unido, España, Países bajos, Estados Unidos, Rusia, Brasil o cualquier otro.</string>
<string name="quick_action_auto_zoom">Alternar zoom automático del mapa</string>
<string name="quick_action_auto_zoom_desc">Un botón que des/activa el zoom automático del mapa de acuerdo a la velocidad.</string>
<string name="quick_action_auto_zoom_on">Activar zoom automático del mapa</string>
<string name="quick_action_auto_zoom_off">Desactivar zoom automático del mapa</string>
<string name="quick_action_auto_zoom_desc">Botón para activar o desactivar el zoom automático controlado por la velocidad.</string>
<string name="quick_action_auto_zoom_on">Activar zoom automático</string>
<string name="quick_action_auto_zoom_off">Desactivar zoom automático</string>
<string name="quick_action_add_destination">Definir destino</string>
<string name="quick_action_replace_destination">Reemplazar destino</string>
<string name="quick_action_add_first_intermediate">Añadir primer destino intermedio</string>
<string name="quick_action_add_destination_desc">Un botón que añade el destino de la ruta en el centro de la pantalla, cualquier destino previamente elegido se convierte en el último destino intermedio.</string>
<string name="quick_action_replace_destination_desc">Este botón de acción, añade un nuevo destino de ruta en el centro de la pantalla, reemplazando el anterior destino (si existe).</string>
<string name="quick_action_add_first_intermediate_desc">Un botón que añade el primer destino intermedio en el centro de la pantalla.</string>
<string name="quick_action_add_destination_desc">Un botón que añade el centro de la pantalla como destino de la ruta, cualquier destino previamente elegido se convierte en el último destino intermedio.</string>
<string name="quick_action_replace_destination_desc">Un botón que añade el centro de la pantalla como destino de la nueva ruta, reemplazando el anterior destino (si existe).</string>
<string name="quick_action_add_first_intermediate_desc">Un botón que añade el centro de la pantalla como el primer destino intermedio.</string>
<string name="no_overlay">Sin superposición</string>
<string name="no_underlay">Sin subyacencia</string>
<string name="subscribe_email_error">Error</string>
@ -2327,13 +2324,14 @@
<string name="animate_my_location">Ubicación propia animada</string>
<string name="animate_my_location_desc">Activa el desplazamiento animado del mapa para «Mi ubicación» durante la navegación.</string>
<string name="shared_string_overview">Resumen</string>
<string name="osmand_plus_extended_description_part2">Navegación GPS
<string name="osmand_plus_extended_description_part2">Navegación
\n • Funciona en línea (rápido) o sin conexión (sin cargos de roaming al viajar al extranjero)
\n • Guía por voz giro-a-giro (voces grabadas y sintetizadas)
\n • (Opcional) Guía de carriles, nombres de calles y tiempo estimado al destino
\n • Soporta puntos intermedios en el itinerario
\n • (Opcional) Guía de carriles, nombres de calles y tiempo estimado de llegada
\n • Soporta puntos intermedios en tu itinerario
\n • La ruta se recalcula al salirse de la misma
\n • Busca destinos por dirección, por tipo (por ejemplo: Restaurantes, hoteles, gasolineras, museos), o por coordenada geográfica</string>
\n • Busca lugares por dirección, por tipo (por ejemplo: Restaurantes, hoteles, gasolineras, museos), o por coordenadas geográficas
\n</string>
<string name="osmand_plus_extended_description_part3">Vista del mapa
\n • Muestra tu ubicación y orientación
\n • (Opcional) Ajusta el mapa a la dirección del movimiento (o la brújula)
@ -2397,7 +2395,7 @@
<string name="quick_action_showhide_osmbugs_title">Mostrar u ocultar notas de OSM</string>
<string name="quick_action_osmbugs_show">Mostrar notas de OSM</string>
<string name="quick_action_osmbugs_hide">Ocultar notas de OSM</string>
<string name="quick_action_showhide_osmbugs_descr">Un botón que muestra u oculta las notas de OSM en el mapa.</string>
<string name="quick_action_showhide_osmbugs_descr">Botón para mostrar u ocultar las notas de OSM en el mapa.</string>
<string name="sorted_by_distance">Ordenados por distancia</string>
<string name="search_favorites">Buscar en Favoritos</string>
<string name="hide_from_zoom_level">Ocultar desde el nivel de zoom</string>
@ -2419,7 +2417,7 @@
<string name="open_mapillary">Abrir Mapillary</string>
<string name="shared_string_install">Instalar</string>
<string name="improve_coverage_mapillary">Mejorar cobertura de fotos con Mapillary</string>
<string name="improve_coverage_install_mapillary_desc">Instala Mapillary para añadir una o más fotos a esta ubicación del mapa.</string>
<string name="improve_coverage_install_mapillary_desc">Instala Mapillary para añadir fotos a esta ubicación del mapa.</string>
<string name="online_photos">Fotos en línea</string>
<string name="mapillary_image">Imagen de Mapillary</string>
<string name="shared_string_permissions">Permisos</string>
@ -2449,10 +2447,10 @@
<string name="min_max">Min/Máx</string>
<string name="rendering_value_translucent_pink_name">Rosa translúcido</string>
<string name="quick_action_resume_pause_navigation">Pausar/reanudar navegación</string>
<string name="quick_action_resume_pause_navigation_descr">Este botón de acción, pausa o reanuda la navegación.</string>
<string name="quick_action_resume_pause_navigation_descr">Botón para pausar o reanudar navegación.</string>
<string name="quick_action_show_navigation_finish_dialog">Mostrar diálogo «Navegación finalizada»</string>
<string name="quick_action_start_stop_navigation">Iniciar/parar navegación</string>
<string name="quick_action_start_stop_navigation_descr">Este botón de acción, inicia o para la navegación.</string>
<string name="quick_action_start_stop_navigation_descr">Botón para iniciar o terminar la navegación.</string>
<string name="live_monitoring_max_interval_to_send">Tiempo del búfer para el seguimiento en línea</string>
<string name="live_monitoring_max_interval_to_send_desrc">Indica el tiempo que el búfer mantendrá los lugares para enviar sin conexión</string>
<string name="none_point_error">Añadir al menos un punto.</string>
@ -2468,7 +2466,7 @@
<string name="route_point_one">Punto de ruta 1</string>
<string name="waypoint_one">Punto de referencia 1</string>
<string name="do_not_use_animations">Sin animaciones</string>
<string name="do_not_use_animations_descr">Desactiva las animaciones en la aplicación.</string>
<string name="do_not_use_animations_descr">Desactiva las animaciones de los mapas.</string>
<string name="keep_showing_on_map">Mantener en el mapa</string>
<string name="exit_without_saving">¿Salir sin guardar?</string>
<string name="line">Línea</string>
@ -2492,9 +2490,9 @@
<string name="move_all_to_history">Mover todo al historial</string>
<string name="show_direction">Indicación de distancia</string>
<string name="sort_by">Ordenar por</string>
<string name="marker_show_distance_descr">Elige cómo se indica la distancia y dirección a los marcadores del mapa en la pantalla del mapa:</string>
<string name="marker_show_distance_descr">Elige cómo se indica la distancia y dirección a los marcadores del mapa en el mapa:</string>
<string name="map_orientation_change_in_accordance_with_speed">Umbral de orientación del mapa</string>
<string name="map_orientation_change_in_accordance_with_speed_descr">Velocidad a partir de la cual la orientación del mapa cambia de «Dirección del movimiento» a «Dirección de la brújula».</string>
<string name="map_orientation_change_in_accordance_with_speed_descr">Selecciona la velocidad a partir de la que la orientación del mapa cambia de «Dirección del movimiento» a «Dirección de la brújula».</string>
<string name="all_markers_moved_to_history">Todos los marcadores del mapa movidos al historial</string>
<string name="marker_moved_to_history">Marcador del mapa movido al historial</string>
<string name="marker_moved_to_active">Marcador del mapa movido a los activos</string>
@ -2603,8 +2601,8 @@
<string name="one_tap_active_descr">Pulsa un marcador en el mapa para moverlo al primer lugar de los marcadores activos, sin abrir el menú contextual.</string>
<string name="one_tap_active">Activar «Una pulsación»</string>
<string name="empty_state_av_notes">¡Toma notas!</string>
<string name="empty_state_av_notes_desc">Añade una nota de audio, vídeo o foto para cada punto del mapa, utilizando el widget o el menú contextual.</string>
<string name="notes_by_date">Notas por fecha</string>
<string name="empty_state_av_notes_desc">Añade una nota de audio, vídeo o foto a cualquier punto del mapa, utilizando el control o el menú contextual.</string>
<string name="notes_by_date">Notas A/V por fecha</string>
<string name="by_date">Por fecha</string>
<string name="by_type">Por tipo</string>
<string name="what_is_here">Aquí hay:</string>
@ -2852,7 +2850,7 @@
<string name="lang_gn_py">Guaraní</string>
<string name="run_full_osmand_msg">Está utilizando el mapa «{0}» que funciona con OsmAnd. ¿Quiere ejecutar la versión completa de OsmAnd\?</string>
<string name="run_full_osmand_header">¿Ejecutar OsmAnd\?</string>
<string name="quick_action_switch_day_night_descr">Un botón que alterna entre el modo diurno y nocturno para OsmAnd.</string>
<string name="quick_action_switch_day_night_descr">Un botón que alterna entre los modos diurno y nocturno para OsmAnd.</string>
<string name="quick_action_switch_day_mode">Modo diurno</string>
<string name="quick_action_switch_night_mode">Modo nocturno</string>
<string name="quick_action_day_night_switch_mode">Alternar modos diurno/nocturno</string>
@ -2956,7 +2954,7 @@
<string name="rendering_attr_highway_class_motorway_name">Autopista</string>
<string name="rendering_attr_highway_class_state_road_name">Carretera/ruta estatal</string>
<string name="rendering_attr_highway_class_road_name">Carretera principal</string>
<string name="rendering_attr_highway_class_street_name">Calle residencial</string>
<string name="rendering_attr_highway_class_street_name">Calle</string>
<string name="rendering_attr_highway_class_service_name">Vía de servicio</string>
<string name="rendering_attr_highway_class_footway_name">Acera</string>
<string name="rendering_attr_highway_class_track_name">Camino rural</string>
@ -3103,7 +3101,7 @@
<string name="select_nav_profile_dialog_title">Elegir el tipo de navegación</string>
<string name="base_profile_descr_car">Automóvil, camión, motocicleta</string>
<string name="base_profile_descr_bicycle">Bicicleta de montaña, ciclomotor, caballo</string>
<string name="base_profile_descr_pedestrian">Caminata, senderismo, correr</string>
<string name="base_profile_descr_pedestrian">Caminata, senderismo, carrera</string>
<string name="base_profile_descr_public_transport">Tipos de transporte público</string>
<string name="base_profile_descr_boat">Barco, remo, vela</string>
<string name="base_profile_descr_aircraft">Avión, ala delta</string>
@ -3139,7 +3137,7 @@
<string name="routing_attr_difficulty_preference_name">Dificultad preferida</string>
<string name="routing_attr_difficulty_preference_description">Preferir rutas de esta dificultad, aunque el trazado sobre pistas más duras o más fáciles sigue siendo posible si son más cortas.</string>
<string name="routing_attr_freeride_policy_name">Fuera de pista</string>
<string name="routing_attr_freeride_policy_description">Los senderos libres y fuera de pista son rutas y pasajes no oficiales. Típicamente descuidados, no mantenidos por los oficiales y no controlados por la noche. Entrar bajo su propio riesgo.</string>
<string name="routing_attr_freeride_policy_description">Los senderos libres y fuera de pista son rutas y pasajes no oficiales. Típicamente descuidados, no mantenidos y no controlados por la noche. Entra bajo tu propio riesgo.</string>
<string name="routing_profile_geocoding">Geocodificación</string>
<string name="shared_string_crash">Error</string>
<string name="app_mode_offroad">Todo terreno</string>
@ -3361,7 +3359,7 @@
<string name="empty_filename">El nombre de archivo está vacío</string>
<string name="track_saved">Traza guardada</string>
<string name="shared_string_revert">Revertir</string>
<string name="quick_action_directions_from_desc">Un botón para centrar en la pantalla el punto de partida y calcular la ruta hacia el destino o abre un cuadro de diálogo para elegir el destino si el marcador no está en el mapa.</string>
<string name="quick_action_directions_from_desc">Un botón que añade el centro de la pantalla como punto de partida. Pedirá luego que se fije el destino o iniciará el cálculo de la ruta.</string>
<string name="rendering_attr_showCycleNodeNetworkRoutes_name">Mostrar nodo de la red de rutas ciclistas</string>
<string name="clear_confirmation_msg">¿Borrar %1$s\?</string>
<string name="download_map_dialog">Diálogo de descarga del mapa</string>
@ -3394,7 +3392,7 @@
<string name="select_color">Elegir el color</string>
<string name="edit_profiles_descr">Los perfiles predefinidos de OsmAnd no pueden borrarse , pero sí desactivarse (en la pantalla anterior), o moverse a la parte inferior.</string>
<string name="edit_profiles">Editar perfiles</string>
<string name="select_nav_profile_dialog_message">El \'tipo de navegación\' domina como se calculan las ruta.</string>
<string name="select_nav_profile_dialog_message">El \'Tipo de navegación\' determina cómo se calculan las rutas.</string>
<string name="profile_appearance">Apariencia del perfil</string>
<string name="choose_icon_color_name">Icono, color y nombre</string>
<string name="reorder_profiles">Editar lista de perfiles</string>
@ -3679,7 +3677,7 @@
<string name="search_poi_types">Buscar tipos de PDI</string>
<string name="download_unsupported_action">Acción %1$s no admitida</string>
<string name="index_item_world_basemap_detailed">Mapa general del mundo (detallado)</string>
<string name="unsupported_type_error">Tipo no admitido</string>
<string name="unsupported_type_error">Tipo no soportado</string>
<string name="width_limit_description">Proporciona la anchura de tu vehículo, algunas restricciones de ruta pueden aplicarse para vehículos anchos.</string>
<string name="height_limit_description">Proporciona la altura de tu vehículo, algunas restricciones de ruta pueden aplicarse para vehículos altos.</string>
<string name="weight_limit_description">Proporciona el peso de tu vehículo, algunas restricciones de ruta pueden aplicarse para vehículos pesados.</string>
@ -3715,7 +3713,7 @@
<string name="tiles_storage_descr">Elige cómo se guardarán las teselas descargadas.</string>
<string name="export_import_quick_actions_with_profiles_promo">Puede exportar o importar acciones rápidas con perfiles de aplicación.</string>
<string name="shared_string_delete_all_q">¿Eliminar todo\?</string>
<string name="delete_all_actions_message_q">¿Estás seguro de que deseas eliminar irrevocablemente% d acciones rápidas\?</string>
<string name="delete_all_actions_message_q">¿Estás seguro deseas eliminar de forma irreversible %d acciones rápidas\?</string>
<string name="screen_timeout">Tiempo de apagado de la pantalla</string>
<string name="screen_timeout_descr">Si \"%1$s\" está encendido, el tiempo de actividad dependerá de ello.</string>
<string name="shared_string_meters">metros</string>
@ -3740,7 +3738,7 @@
<string name="lang_ur">Urdu</string>
<string name="lang_tg">Tayiko</string>
<string name="lang_bar">Bávaro</string>
<string name="tracker_item">Rastreador OsmAnd</string>
<string name="tracker_item">Trazador OsmAnd</string>
<string name="legend_item_description">La guía para la simbología del mapa.</string>
<string name="parking_positions">Posiciones de estacionamiento</string>
<string name="turn_screen_on_power_button_disabled">Deshabilitado. Requiere \'Mantener la pantalla encendida\' dentro de \'Tiempo de espera después de la activación\'.</string>
@ -3849,7 +3847,7 @@
<string name="threshold_distance">Distancia umbral</string>
<string name="navigation_profile">Perfil de navegación</string>
<string name="route_between_points_add_track_desc">Selecciona un archivo de traza al que agregar el nuevo segmento.</string>
<string name="street_level_imagery">Imágenes a pie de calle</string>
<string name="street_level_imagery">Fotos a pie de calle</string>
<string name="plan_route_exit_dialog_descr">¿Estás seguro de que quieres descartar todos los cambios en la ruta planeada cerrándola\?</string>
<string name="in_case_of_reverse_direction">En caso de dirección contraria</string>
<string name="shared_string_save_as_gpx">Guardar como nuevo archivo de traza</string>

View file

@ -524,7 +524,7 @@
<string name="poi_fuel_octane_95">Oktaan 95</string>
<string name="poi_fuel_octane_98">Oktaan 98</string>
<string name="poi_fuel_octane_100">Oktaan 100</string>
<string name="poi_fuel_cng">CNG</string>
<string name="poi_fuel_cng">Surugaas</string>
<string name="poi_fuel_1_25">1:25 kütus</string>
<string name="poi_fuel_1_50">1:50 kütus</string>
<string name="poi_fuel_ethanol">Etanool</string>
@ -3826,4 +3826,5 @@
<string name="poi_recycling_small_electrical_appliances">Väikesed elektriseadmed</string>
<string name="poi_beehive">Mesitaru</string>
<string name="poi_nuts">Pähklipood</string>
<string name="poi_fuel_lng">Veeldatud maagaas</string>
</resources>

View file

@ -40,7 +40,7 @@
<string name="shared_string_control_start">Start</string>
<string name="shared_string_control_stop">Stop</string>
<string name="shared_string_import">Import</string>
<string name="shared_string_export">Eksport</string>
<string name="shared_string_export">Ekspordi</string>
<string name="shared_string_more">Veel…</string>
<string name="shared_string_more_actions">Veel tegevusi</string>
<string name="shared_string_do_not_show_again">Ära enam näita</string>
@ -910,7 +910,7 @@
<string name="route_parameters_descr">Seadista teekonna parameetrid</string>
<string name="route_parameters">Teekonna parameetrid</string>
<string name="application_profile_changed">Rakenduse profiiliks muudetud \"%s\"</string>
<string name="logcat_buffer">Logcat puhver</string>
<string name="logcat_buffer">Logcati puhver</string>
<string name="plugins_settings">Laienduse seaded</string>
<string name="shared_string_by_default">Vaikimisi</string>
<string name="download_detailed_map">Selle ala vaatlemiseks lae alla üksikasjalik %s kaart.</string>
@ -3364,7 +3364,7 @@
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Ikooni kuvatakse vaid navigeerimise või liikumise ajal.</string>
<string name="select_map_icon_descr">Peatumisel näidatav ikoon.</string>
<string name="logcat_buffer_descr">Kontrolli ja jaga rakenduse detailseid logisid</string>
<string name="logcat_buffer_descr">Vaata ja jaga rakenduse detailseid logisid</string>
<string name="search_offline_geo_error">Geokavatsuse väärtusest \'%s\' ei saanud aru.</string>
<string name="permission_is_required">Selle valiku kasutamine vajab luba.</string>
<string name="monitoring_min_speed_descr">See on madala kiirusega väljalülitusfilter, et mitte salvestada punkte, mis jäävad alla teatud kiiruse. See võib muuta salvestatud rajad kaardil vaadates sujuvamaks.</string>
@ -3497,7 +3497,7 @@
<string name="custom_color">Kohandatud värv</string>
<string name="set_working_days_to_continue">Jätkamiseks vali tööpäevad</string>
<string name="route_between_points">Teekond punktide vahel</string>
<string name="plan_a_route">Kavanda teekonda</string>
<string name="plan_a_route">Kavanda teekond</string>
<string name="add_to_a_track">Lisa rajale</string>
<string name="track_show_start_finish_icons">Näita alguse ja lõpu ikoone</string>
<string name="select_track_width">Vali laius</string>
@ -3762,4 +3762,6 @@
<string name="sort_last_modified">Viimati muudetud</string>
<string name="sort_name_descending">Nimi: Z A</string>
<string name="sort_name_ascending">Nimi: A Z</string>
<string name="screen_timeout">Ekraani väljalülitamine</string>
<string name="app_mode_wheelchair_forward">Ratastool edasi</string>
</resources>

View file

@ -9,7 +9,7 @@
<string name="poi_butcher">فروشگاه گوشت</string>
<string name="poi_deli">بقالی</string>
<string name="poi_farm">فروشگاه محصولات دامی</string>
<string name="poi_greengrocer">سبزی فروشی</string>
<string name="poi_greengrocer">میوه و سبزی‌فروشی</string>
<string name="poi_seafood">فروشگاه غذاهای دریایی</string>
<string name="poi_confectionery">شیرینی و آجیل فروشی</string>
<string name="poi_ice_cream">بستنی فروشی</string>

View file

@ -3278,7 +3278,7 @@
<string name="routing_attr_piste_type_skitour_name">تور اسکی</string>
<string name="routing_attr_piste_type_skitour_description">مسیرها برای تور اسکی.</string>
<string name="app_mode_camper">کمپر</string>
<string name="app_mode_campervan">ون کمپر</string>
<string name="app_mode_campervan">ون کمپر (RV)</string>
<string name="app_mode_wagon">واگن</string>
<string name="app_mode_pickup_truck">کامیون پیک‌آپ</string>
<string name="analytics_pref_title">تحلیل‌ها</string>
@ -3553,7 +3553,7 @@
<string name="profile_type_custom_string">پروفایل سفارشی</string>
<string name="shared_string_angle_param">زاویه: %s°</string>
<string name="shared_string_angle">زاویه</string>
<string name="recalc_angle_dialog_descr">تا مسیریابی مجدد انجام شود، از موقعیت من تا مسیر محاسبه‌شده پاره‌خط مستقیمی نمایش داده می‌شود</string>
<string name="recalc_angle_dialog_descr">تا مسیریابی مجدد انجام نشده، از موقعیت من تا مسیر محاسبه‌شده پاره‌خط مستقیمی نمایش داده می‌شود</string>
<string name="recalc_angle_dialog_title">کمترین زاویه میان موقعیت من و مسیر</string>
<string name="shared_string_preparing">آماده‌سازی</string>
<string name="shared_string_nothing_selected">چیزی انتخاب نشده</string>
@ -3873,7 +3873,7 @@
<string name="save_as_new_track">ذخیره به‌عنوان رد جدید</string>
<string name="reverse_route">برعکس‌کردن مسیر</string>
<string name="route_between_points_whole_track_button_desc">تمام رد با استفاده از پروفایل انتخابی بازمحاسبه خواهد شد.</string>
<string name="route_between_points_next_segment_button_desc">با استفاده از پروفایل انتخابی فقط پارهٔ بعدی بازمحاسبه خواهد شد.</string>
<string name="route_between_points_next_segment_button_desc">فقط پارهٔ بعدی با استفاده از پروفایل انتخابی بازمحاسبه خواهد شد.</string>
<string name="all_next_segments">همهٔ پاره‌های بعدی</string>
<string name="previous_segment">پارهٔ قبلی</string>
<string name="all_previous_segments">همهٔ پاره‌های قبلی</string>
@ -3928,4 +3928,9 @@
<string name="save_global_track_interval_descr">بازهٔ زمانی برای ضبط رد را انتخاب کنید (که از طریق ابزار ضبط سفر روی نقشه فعال می‌شود).</string>
<string name="gpx_monitoring_stop">نگه‌داشتن ضبط سفر</string>
<string name="gpx_monitoring_start">ازسرگیری ضبط سفر</string>
<string name="app_mode_inline_skates">اسکیت این‌لاین</string>
<string name="app_mode_enduro_motorcycle">موتور پرشی</string>
<string name="app_mode_motor_scooter">اسکوتر موتوری</string>
<string name="app_mode_wheelchair_forward">ویلچر رو به جلو</string>
<string name="threshold_distance">فاصله آستانه</string>
</resources>

View file

@ -1762,7 +1762,7 @@
<string name="poi_trade_plumbing">Fournitures de plomberie</string>
<string name="poi_trade_wood">Fournitures de bois</string>
<string name="poi_bicycle_parking_anchors">Ancres pour vélo</string>
<string name="poi_bicycle_parking_stands">Râtelier pour vélo</string>
<string name="poi_bicycle_parking_stands">Arceaux pour vélo</string>
<string name="poi_information_terminal">Terminal d\'informations</string>
<string name="poi_information_tactile_map">Carte tactile</string>
<string name="poi_board_type_notice">Tableau d\'affichage</string>
@ -3380,7 +3380,7 @@
<string name="poi_zoo_wildlife_park">Parc animalier</string>
<string name="poi_zoo_enclosure">Enceinte</string>
<string name="poi_zoo_safari_park">Parc safari</string>
<string name="poi_stands">Râtelier pour vélo</string>
<string name="poi_stands">Arceaux pour vélo</string>
<string name="poi_motorcycle_type_sportbike">Vélo de sport</string>
<string name="poi_motorcycle_type_chopper">Hachoir</string>
<string name="poi_motorcycle_type_offroad">Hors route</string>

View file

@ -3412,7 +3412,7 @@
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Icône affiché pendant la navigation ou en déplacement.</string>
<string name="select_map_icon_descr">Icône affiché à l\'arrêt.</string>
<string name="logcat_buffer_descr">Consultez et partagez les journaux de l\'application (pour debug)</string>
<string name="logcat_buffer_descr">Vérifier et partager les logs détaillés de l\'application</string>
<string name="permission_is_required">Vous n\'êtes pas autorisés à utiliser cette option.</string>
<string name="live_monitoring_tracking_interval">Intervalle de suivi</string>
<string name="live_monitoring_adress">Adresse web</string>
@ -3883,4 +3883,6 @@
<string name="sort_last_modified">Dernière modification</string>
<string name="sort_name_descending">Nom : Z A</string>
<string name="sort_name_ascending">Nom : A Z</string>
<string name="start_finish_icons">Icônes de départ / arrivée</string>
<string name="contour_lines_thanks">Merci pour votre achat de \'Courbes de niveaux\'</string>
</resources>

View file

@ -294,7 +294,7 @@
<string name="poi_traffic_calming_choker">Forgalomlassító útszűkület</string>
<string name="poi_fuel_diesel">Gázolaj</string>
<string name="poi_fuel_biodiesel">Biodízel</string>
<string name="poi_fuel_lpg">Cseppfolyós gáz (LPG)</string>
<string name="poi_fuel_lpg">LPG (cseppfolyósított PB-gáz)</string>
<string name="poi_fuel_octane_80">80-as oktánszámú</string>
<string name="poi_fuel_octane_91">91-es oktánszámú</string>
<string name="poi_fuel_octane_92">92-es oktánszámú</string>
@ -3835,4 +3835,5 @@
<string name="poi_drinking_water_refill">Ivóvíz-utántöltés</string>
<string name="poi_nuts">Mag- és aszaltgyümölcsbolt</string>
<string name="poi_beehive">Méhkaptár</string>
<string name="poi_fuel_lng">LNG (cseppfolyósított földgáz)</string>
</resources>

View file

@ -3277,7 +3277,7 @@
<string name="map_look">Térképnézet</string>
<string name="reset_to_default">Alapértelmezés visszaállítása</string>
<string name="copy_from_other_profile">Másolás egy másik profilból</string>
<string name="logcat_buffer">Logcat-puffer</string>
<string name="logcat_buffer">Logcat-puffer (hibanapló)</string>
<string name="shared_string_by_default">Alapértelmezés szerint</string>
<string name="rendering_attr_piste_type_snow_park_name">Hópark</string>
<string name="rendering_attr_piste_type_sleigh_name">Lovas szán</string>
@ -3424,8 +3424,8 @@
<string name="osm_editing">OSM-szerkesztés</string>
<string name="osm_edits_view_descr">Az összes még fel nem töltött szerkesztés vagy OSM-hiba megtalálható a %1$s helyen. A már feltöltött pontok nem láthatók az OsmAndban.</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Az ikon navigáció vagy haladás közben jelenik meg.</string>
<string name="select_map_icon_descr">Az ikon álló helyzetben jelenik meg.</string>
<string name="select_nav_icon_descr">Navigáció vagy haladás közben megjelenő ikon.</string>
<string name="select_map_icon_descr">Álló helyzetben megjelenő ikon.</string>
<string name="logcat_buffer_descr">Az alkalmazás részletes naplóinak ellenőrzése és megosztása</string>
<string name="permission_is_required">A beállítás használatához engedélyre van szükség.</string>
<string name="rearrange_categories">Kategóriák átrendezése</string>
@ -3896,4 +3896,6 @@
<string name="sort_last_modified">Utolsó módosítás</string>
<string name="sort_name_descending">Név: ZA</string>
<string name="sort_name_ascending">Név: AZ</string>
<string name="start_finish_icons">Kiindulás/érkezés ikonjai</string>
<string name="contour_lines_thanks">Köszönjük, hogy megvásárolta a szintvonalbővítményt (Contour lines)</string>
</resources>

View file

@ -1954,7 +1954,7 @@
<string name="use_osm_live_routing">Navigazione OsmAnd Live</string>
<string name="map_widget_battery">Livello della batteria</string>
<string name="lang_hu_formal">Ungherese (formale)</string>
<string name="current_track">Tracciato attuale</string>
<string name="current_track">Traccia attuale</string>
<string name="change_markers_position">Cambia posizione del marcatore</string>
<string name="lang_es_us">Spagnolo americano</string>
<string name="lang_ast">Asturiano</string>
@ -3620,7 +3620,7 @@
<string name="index_item_world_basemap_detailed">Mappa mondiale generale (dettagliata)</string>
<string name="extra_maps_menu_group">Mappe extra</string>
<string name="download_unsupported_action">Azione non supportata %1$s</string>
<string name="tracker_item">OsmAnd tracker</string>
<string name="tracker_item">Tracker OsmAnd</string>
<string name="mapillary_item">OsmAnd + Mapillary</string>
<string name="quick_action_item">Azione veloce</string>
<string name="radius_ruler_item">Righello radiale</string>
@ -3812,7 +3812,7 @@
<string name="add_to_a_track">Aggiungi ad una Traccia</string>
<string name="gpx_split_interval_descr">Seleziona l\'intervallo a cui i segnaposti con distanza o orario sulla traccia verranno mostrati.</string>
<string name="gpx_split_interval_none_descr">Seleziona l\'opzione desiderata per la divisione: per tempo o per distanza.</string>
<string name="gpx_direction_arrows">Frecce delle direzioni</string>
<string name="gpx_direction_arrows">Frecce della direzione</string>
<string name="select_track_width">Seleziona larghezza</string>
<string name="plan_route_last_edited">Ultima modificata</string>
<string name="plan_route_import_track">Importa una traccia</string>
@ -3900,7 +3900,9 @@
\n
\n</string>
<string name="simplified_track">Traccia semplificata</string>
<string name="sort_last_modified">Ultimo modificato</string>
<string name="sort_last_modified">Cronologico</string>
<string name="sort_name_descending">Nome: Z A</string>
<string name="sort_name_ascending">Nome: A Z</string>
<string name="start_finish_icons">Icona Partenza/Arrivo</string>
<string name="contour_lines_thanks">Grazie per l\'acquisto del \'Plugin delle curve di livello\'</string>
</resources>

View file

@ -1390,7 +1390,7 @@
<string name="poi_car_sharing">שיתוף רכב</string>
<string name="poi_boat_sharing">שיתוף סירות</string>
<string name="poi_dock">מעגן</string>
<string name="poi_toilets">בית שימוש</string>
<string name="poi_toilets">בית שימוש;אסלה;טואלט</string>
<string name="poi_shower">מקלחת</string>
<string name="poi_sauna">סאונה</string>
<string name="poi_brothel">בית בושת</string>
@ -2043,7 +2043,7 @@
<string name="poi_toll_hgv_yes">אגרה למשאיות</string>
<string name="poi_tactile_paving_yes">כן</string>
<string name="poi_traffic_signals_sound_yes">כן</string>
<string name="poi_traffic_signals_sound_no">לא</string>
<string name="poi_traffic_signals_sound_no">שמע: לא</string>
<string name="poi_traffic_signals_sound_walk">רק כאשר מותר לחצות</string>
<string name="poi_rescue_station">תחנת הצלה</string>
<string name="poi_services">אזור שירות</string>
@ -2119,7 +2119,7 @@
<string name="poi_fuel_100ll">דלק 100LL</string>
<string name="poi_fuel_autogas">גפ״מ</string>
<string name="poi_fuel_jeta1">דלק מטוסים A-1</string>
<string name="poi_fuel_adblue">תוסף AdBlue</string>
<string name="poi_fuel_adblue">נוזל מפלט לדיזל</string>
<string name="poi_atm">כספומט</string>
<string name="poi_car_pooling">מקום בנסיעה שיתופית</string>
<string name="poi_denomination_wesleyan">וסליאן</string>
@ -2159,4 +2159,19 @@
<string name="poi_climbing_crag">כן</string>
<string name="poi_climbing_crag_filter">מצוק טיפוס</string>
<string name="poi_rtsa_scale_filter">קטגוריית קושי</string>
<string name="poi_fire_hydrant_type_pipe">צינור</string>
<string name="poi_drinking_water_refill_network">רשת מילוי מי שתייה</string>
<string name="poi_drinking_water_refill_no">מילוי מי שתייה: אין</string>
<string name="poi_drinking_water_refill_yes">כן</string>
<string name="poi_give_box">תיבת תרומה</string>
<string name="poi_traffic_signals_arrow_no">חץ: אין</string>
<string name="poi_traffic_signals_arrow_yes">כן</string>
<string name="poi_traffic_signals_vibration_yes">כן</string>
<string name="poi_elevator">מעלית</string>
<string name="poi_departures_board_realtime">זמן אמת</string>
<string name="poi_departures_board_delay">השהיה</string>
<string name="poi_departures_board_yes">כן</string>
<string name="poi_departures_board_timetable">לוח זמנים</string>
<string name="poi_beehive">כוורת דבורים</string>
<string name="poi_nuts">חנות אגוזים</string>
</resources>

View file

@ -2103,7 +2103,7 @@
<string name="shared_string_deselect_all">ביטול הבחירה</string>
<string name="shared_string_delete_all">למחוק הכול</string>
<string name="shared_string_share">שיתוף</string>
<string name="shared_string_export">יצוא</string>
<string name="shared_string_export">ייצוא</string>
<string name="shared_string_more">עוד…</string>
<string name="shared_string_remember_my_choice">שמירת הבחירה</string>
<string name="shared_string_unexpected_error">שגיאה בלתי צפויה</string>
@ -3248,7 +3248,7 @@
<string name="coordinates_format_info">התצורה הנבחרת תחול בכל רחבי היישומון.</string>
<string name="pref_selected_by_default_for_profiles">הגדרה זו נבחרת כבררת מחדל על הפרופילים: %s</string>
<string name="change_default_settings">החלפת הגדרה</string>
<string name="logcat_buffer">זיכרון זמני של Logcat</string>
<string name="logcat_buffer">מכלא Logcat</string>
<string name="shared_string_by_default">כבררת מחדל</string>
<string name="plugins_settings">הגדרות תוסף</string>
<string name="download_detaile_map">הורדת המפה המפורטת %s, כדי לצפות באזור זה.</string>
@ -3428,7 +3428,7 @@
<string name="select_nav_icon_descr">סמל שמופיע רק בעת ניווט או תזוזה.</string>
<string name="select_map_icon_descr">סמל שמופיע במנוחה.</string>
<string name="button_rate">דירוג</string>
<string name="logcat_buffer_descr">לבדוק ולשתף תיעוד מפורט של יומני היישומון</string>
<string name="logcat_buffer_descr">בדיקה ושיתוף יומני תיעוד מפורטים של היישומים</string>
<string name="permission_is_required">נדרשת הרשאה כדי להשתמש באפשרות הזו.</string>
<string name="rearrange_categories">סידור הקטגוריות מחדש</string>
<string name="create_custom_categories_list_promo">ניתן להחליף את סדר הרשימה ולהסתיר קטגוריות בלתי נחוצות. אפשר לייבא או לייצא את כל השינויים עם פרופילים.</string>
@ -3909,4 +3909,6 @@
<string name="sort_last_modified">שינוי אחרון</string>
<string name="sort_name_descending">שם: ת א</string>
<string name="sort_name_ascending">שם: א ת</string>
<string name="start_finish_icons">סמלי התחלה/סיום</string>
<string name="contour_lines_thanks">תודה לך על רכישת ‚קווי מתאר’</string>
</resources>

View file

@ -1258,7 +1258,7 @@
<string name="poi_vacuum_cleaner_yes">有り</string>
<string name="poi_vacuum_cleaner_no">掃除機:無し</string>
<string name="poi_amenity_vacuum_cleaner">掃除機</string>
<string name="poi_fuel_adblue">アドブルー・尿素水還元剤</string>
<string name="poi_fuel_adblue">ディーゼル排気用液(AdBlue・尿素水)</string>
<string name="poi_drive_through">ドライブスルー</string>
<string name="poi_drive_through_yes">有り</string>
<string name="poi_drive_through_no">無し</string>
@ -3822,4 +3822,16 @@
<string name="poi_osmand_fire_hydrant_pressure_suction">吸引</string>
<string name="poi_osmand_fire_hydrant_pressure_pressurized">加圧</string>
<string name="poi_fire_hydrant_style_water_source_groundwater">地下水</string>
<string name="poi_nuts">ナッツ専門店</string>
<string name="poi_beehive">養蜂箱</string>
<string name="poi_departures_board_realtime">リアルタイム時刻表</string>
<string name="poi_departures_board_timetable">一般的な時刻表</string>
<string name="poi_departures_board_delay">大まかな時刻表</string>
<string name="poi_departures_board_yes">有り</string>
<string name="poi_departures_board_no">時刻表:無し</string>
<string name="poi_elevator">エレベーター</string>
<string name="poi_city_block">街区</string>
<string name="poi_borough">行政区</string>
<string name="poi_give_box">ギブボックス(提供品置場)</string>
<string name="poi_fire_hydrant_type_pipe">簡易給水栓</string>
</resources>

View file

@ -1190,7 +1190,7 @@ POIの更新は利用できません</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_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>
@ -1350,7 +1350,7 @@ POIの更新は利用できません</string>
<string name="wake_on_voice">画面の電源オン設定</string>
<string name="wake_on_voice_descr">方向転換地点に近づいたらデバイスの画面を(オフの場合指定時間)オンにします</string>
<string name="shared_string_never">しない</string>
<string name="impassable_road">除外する道の指定…</string>
<string name="impassable_road">避ける道の指定…</string>
<string name="rendering_attr_trainLightrailRoutes_name">電車でのルート</string>
<string name="rendering_attr_tramRoutes_name">路面電車でのルート</string>
<string name="rendering_attr_shareTaxiRoutes_name">タクシーのルート共有</string>
@ -1625,7 +1625,7 @@ POIの更新は利用できません</string>
<string name="rendering_value_walkingRoutesScopeOSMC_name">所属ネットワークに応じたカラー変更</string>
<string name="rendering_value_walkingRoutesOSMC_name">OSMCのハイキングシンボルカラー</string>
<string name="traffic_warning_hazard">被災域</string>
<string name="rendering_value_boldOutline_name">太線</string>
<string name="rendering_value_boldOutline_name">輪郭強調</string>
<string name="no_updates_available">更新はありません</string>
<string name="download_live_updates">ライブ更新</string>
<string name="we_really_care_about_your_opinion">ユーザーからの意見やフィードバックを大切にしています。</string>
@ -1816,7 +1816,7 @@ POIの更新は利用できません</string>
<string name="shared_string_move_up">上に移動</string>
<string name="shared_string_move_down">下に移動</string>
<string name="finish_navigation">ナビゲーションの終了</string>
<string name="avoid_road">使用しない道路として指定</string>
<string name="avoid_road">避ける道を指定</string>
<string name="storage_directory_readonly_desc">選択したデータ保存フォルダーが書き込み保護されているため、内部メモリに切り替えました。書き込み可能な保存用ディレクトリを選択してください。</string>
<string name="storage_directory_shared">共有記憶域</string>
<string name="full_report">より詳細なレポートは以下サイトにて</string>
@ -2496,7 +2496,7 @@ POIの更新は利用できません</string>
<string name="this_year">今年</string>
<string name="move_all_to_history">全て履歴に移動</string>
<string name="show_direction">距離表示</string>
<string name="sort_by">並び順の変更</string>
<string name="sort_by">並び順:</string>
<string name="keep_showing_on_map">マップ上に表示し続ける</string>
<string name="exit_without_saving">保存せずに終了しますか?</string>
<string name="line"></string>
@ -3010,9 +3010,9 @@ POIの更新は利用できません</string>
<string name="select_icon_profile_dialog_title">アイコン選択</string>
<string name="profile_type_base_string">基本プロファイル</string>
<string name="shared_string_icon">アイコン</string>
<string name="shared_string_min_speed">最低速度</string>
<string name="shared_string_max_speed">最高速度</string>
<string name="default_speed_setting_title">標準移動速度</string>
<string name="shared_string_min_speed">予想最低速度</string>
<string name="shared_string_max_speed">予想最高速度</string>
<string name="default_speed_setting_title">予想標準速度</string>
<string name="default_speed_dialog_msg">すべての道路の移動速度を制限し、種別や制限速度が不明な道路が多い場合の到着時間予測に役立ちます(ルート計算に影響します)</string>
<string name="app_mode_offroad">オフロード</string>
<string name="edit_profile_setup_title">プロファイルの個別設定</string>
@ -3590,7 +3590,7 @@ POIの更新は利用できません</string>
<string name="create_edit_poi">POIの作成/編集</string>
<string name="parking_positions">駐車位置</string>
<string name="add_edit_favorite">お気に入りの追加/編集</string>
<string name="reset_deafult_order">アイテム順序をデフォルトに戻</string>
<string name="reset_deafult_order">アイテム順序を初期状態に戻しま</string>
<string name="back_to_editing">編集に戻る</string>
<string name="quick_action_switch_profile_descr">選択したプロファイルを切り替えるボタンです。</string>
<string name="shared_string_add_profile">プロファイルの追加</string>
@ -3667,12 +3667,12 @@ POIの更新は利用できません</string>
<string name="context_menu_actions">コンテキストメニュー</string>
<string name="reorder_or_hide_from">項目の並べ替えや非表示するものを指定できます。</string>
<string name="shared_string_divider">分割</string>
<string name="divider_descr">分割線で区切られた部分より下にある項目が適用されます。</string>
<string name="divider_descr">ここで指定された項目は、区切り線より下に配置されます。</string>
<string name="shared_string_hidden">非表示</string>
<string name="hidden_items_descr">これらの項目はメニューに表示されなくなりますが、オプションやプラグインはそのまま機能します。</string>
<string name="shared_string_items">項目</string>
<string name="reset_items_descr">設定を非表示にすると、元の状態にリセットされます。</string>
<string name="main_actions_descr">ボタンは4つしかありません。</string>
<string name="main_actions_descr">ボタンの数は4つ固定で変更できません。</string>
<string name="main_actions">主要機能</string>
<string name="additional_actions_descr">“%1$s”ボタンをタップすると、これらの機能にアクセスできます。</string>
<string name="move_inside_category">アイテムはこのカテゴリ内でのみ移動できます。</string>
@ -3794,7 +3794,7 @@ POIの更新は利用できません</string>
\n
\n国の法律に基づいて、使用を望むかどうかを決定する必要があります。
\n
\n%1$sを選択すると、スピードカメラに関するアラートと警告が表示されます。
\n%1$sを選択すると、スピードカメラに関するアラートと警告機能を使用できます。
\n
\n%2$sを選択すると、スピードカメラに関するすべてのデータ(警告、通知、POI)が、OsmAndの再インストールを行うまで削除されます。</string>
<string name="keep_active">機能を維持</string>

View file

@ -751,7 +751,7 @@
<string name="safe_mode">Sikker modus</string>
<string name="native_library_not_running">Programmet kjører i sikker modus (skru det av i \'Innstillinger\').</string>
<string name="interrupt_music_descr">Talemeldinger stopper midlertidig musikkavspilling.</string>
<string name="interrupt_music">Avbryt musikk</string>
<string name="interrupt_music">Sett musikk på pause</string>
<string name="gpxup_public">Offentlig</string>
<string name="rendering_attr_appMode_description">Optimaliser kart for</string>
<string name="rendering_attr_contourLines_description">Vis fra zoom-nivå (krever kotedata):</string>
@ -1650,7 +1650,7 @@
<string name="shared_string_selected">Valgt</string>
<string name="shared_string_selected_lowercase">valgte</string>
<string name="remove_the_tag">FJERN MERKELAPPEN</string>
<string name="version_settings_descr">Last ned nattlige utviklerversjoner.</string>
<string name="version_settings_descr">Last ned aktuelle utviklingsversjoner.</string>
<string name="version_settings">Byggversjoner</string>
<string name="proxy_pref_descr">Spesifiser en mellomtjener.</string>
<string name="logged_as">Innlogget som %1$s</string>
@ -2142,7 +2142,7 @@
<string name="quick_action_showhide_osmbugs_title">Vis/skjul OSM-notater</string>
<string name="quick_action_osmbugs_show">Vis OSM-notater</string>
<string name="quick_action_osmbugs_hide">Skjul OSM-notater</string>
<string name="quick_action_showhide_osmbugs_descr">Å trykke denne handlingsknappen viser eller skjuler OSM-notater på kartet.</string>
<string name="quick_action_showhide_osmbugs_descr">Knapp til å vise eller skjule OSM-notater på kartet.</string>
<string name="sea_depth_thanks">Takk for at du kjøpte \'Havdybdekonturer\'</string>
<string name="index_item_depth_contours_osmand_ext">Havdybdekonturer</string>
<string name="download_depth_countours">Havdybdekonturer</string>
@ -2257,17 +2257,17 @@
<string name="quick_action_edit_action">Rediger handling</string>
<string name="quick_actions_delete">Slett handling</string>
<string name="quick_favorites_name_preset">Navneforvalg</string>
<string name="quick_action_add_marker_descr">Trykk på denne handlingsknappen legger til en kartmarkør i skjermsenteret.</string>
<string name="quick_action_add_gpx_descr">Trykking på denne handlingsknappen legger til et GPX-rutepunkt i midten av skjermen.</string>
<string name="quick_action_take_audio_note_descr">Trykking på denne handlingsknappen legger til et lydnotat i midten av skjermen.</string>
<string name="quick_action_take_video_note_descr">Trykking på denne handlingsknappen legger til et videonotat i midten av skjermen.</string>
<string name="quick_action_take_photo_note_descr">Trykking på denne handlingsknappen legger til et bildenotat i midten av skjermen.</string>
<string name="quick_action_add_osm_bug_descr">Trykking på denne handlingsknappen legger til et OSM-notat i midten av skjermen.</string>
<string name="quick_action_navigation_voice_descr">Trykking på denne handlingsknappen slår av eller på taleveiledning under navigering.</string>
<string name="quick_action_add_parking_descr">Trykking på denne handlingsknappen legger til en parkeringsplass i midten av skjermen.</string>
<string name="quick_action_add_marker_descr">En knapp for å legge til en kartmarkør i skjermsenteret.</string>
<string name="quick_action_add_gpx_descr">En knapp for å legge til et GPX-rutepunkt i midten av skjermen.</string>
<string name="quick_action_take_audio_note_descr">En knapp for å legge til et lydnotat i midten av skjermen.</string>
<string name="quick_action_take_video_note_descr">En knapp for å legge til et videonotat i midten av skjermen.</string>
<string name="quick_action_take_photo_note_descr">En knapp for å legge til et bildenotat i midten av skjermen.</string>
<string name="quick_action_add_osm_bug_descr">En knapp for å legge til et OSM-notat i midten av skjermen.</string>
<string name="quick_action_navigation_voice_descr">En knapp til å slå av eller på taleveiledning under navigering.</string>
<string name="quick_action_add_parking_descr">En knapp for å legge til en parkeringsplass i midten av skjermen.</string>
<string name="quick_action_interim_dialog">Vis en midlertidig dialog</string>
<string name="favorite_autofill_toast_text">" lagret i "</string>
<string name="quick_action_showhide_favorites_descr">Trykking på denne handlingsknappen viser eller skjuler favorittpunktene på kartet.</string>
<string name="quick_action_showhide_favorites_descr">En knapp til å vise eller skjule favorittpunktene på kartet.</string>
<string name="quick_action_add_create_items">Opprett elementer</string>
<string name="quick_action_fav_name_descr">La stå tomt for å bruke adressen eller stedsnavnet.</string>
<string name="quick_action_bug_descr">Denne meldingen inkluderes i kommentarfeltet.</string>
@ -2341,10 +2341,10 @@
<string name="tap_on_map_to_hide_interface_descr">Et trykk på kartet skjuler/viser kontrollknappene og miniprogrammene.</string>
<string name="mark_passed">Marker som passert</string>
<string name="osn_modify_dialog_error">Kunne ikke endre notatet.</string>
<string name="quick_action_auto_zoom_desc">Trykking på denne handlingsknappen slår av/på automatisk kartforstørrelse i henhold til hastigheten din.</string>
<string name="quick_action_add_destination_desc">Trykking på denne handlingsknappen gjør skjermsenteret til rutemål, ethvert tidligere valgt reisemål blir det siste mellomliggende målet.</string>
<string name="quick_action_replace_destination_desc">Trykking på denne handlingsknappen gjør skjermsenteret det nye rutemålet, og erstatter det tidligere valgte reisemålet (hvis noe).</string>
<string name="quick_action_add_first_intermediate_desc">Trykking på denne handlingsknappen gjør skjermsenteret til det første mellomliggende reisemålet.</string>
<string name="quick_action_auto_zoom_desc">Knapp til å slå av eller på hastighetsbasert auto-zoom.</string>
<string name="quick_action_add_destination_desc">En knapp for å gjøre skjermsenteret til rutemålet, et tidligere valgt reisemål blir det siste mellomliggende målet.</string>
<string name="quick_action_replace_destination_desc">En knapp for å gjøre skjermsenteret til det nye rutemålet, erstatter det tidligere valgte reisemålet (hvis noe).</string>
<string name="quick_action_add_first_intermediate_desc">En knapp for å gjøre skjermsenteret til det første mellomliggende reisemålet.</string>
<string name="subscribe_email_desc">Abonner på vår e-postliste om programrabatter og få tre kartnedlastinger til!</string>
<string name="index_item_depth_points_southern_hemisphere">Havdybdepunkter for sørlige halvkule</string>
<string name="index_item_depth_points_northern_hemisphere">Havdybdepunkter for nordlige halvkule</string>
@ -2382,7 +2382,7 @@
<string name="activate_seamarks_plugin">Aktiver \"sjøkartvisning\" -tillegget</string>
<string name="save_poi_too_many_uppercase">Navnet inneholder for mange store bokstaver. Fortsett\?</string>
<string name="quick_action_add_poi">Legg til interessepunkt</string>
<string name="quick_action_showhide_poi_descr">Trykking på denne handlingsknappen viser eller skjuler interessepunkter på kartet.</string>
<string name="quick_action_showhide_poi_descr">En knapp til å vise eller skjule interessepunkter på kartet.</string>
<string name="quick_action_page_list_descr">En knapp til å bla gjennom listen nedenfor.</string>
<string name="quick_action_empty_param_error">Fyll ut alle parametere</string>
<string name="quick_action_btn_tutorial_descr">Ved å trykke lenge og dra knappen endres dens plassering på skjermen.</string>
@ -2408,7 +2408,7 @@
<string name="context_menu_points_of_group">Alle punkter i gruppen</string>
<string name="av_locations_selected_desc">GPX-fil med de valgte notatenes koordinater og data.</string>
<string name="av_locations_all_desc">GPX-fil med alle notaters koordinater og data.</string>
<string name="quick_action_add_poi_descr">Trykking på denne handlingsknappen legger til et interessepunkt i midten av skjermen.</string>
<string name="quick_action_add_poi_descr">En knapp for å legge til et interessepunkt i midten av skjermen.</string>
<string name="open_from">Åpen fra</string>
<string name="open_till">Åpen til</string>
<string name="will_close_at">Stenger</string>
@ -2859,10 +2859,10 @@
<string name="run_full_osmand_msg">Du bruker {0} kart levert av OsmAnd. Vil du starte fullversjonen av OsmAnd\?</string>
<string name="run_full_osmand_header">Kjør OsmAnd\?</string>
<string name="lang_gn_py">Guaraní</string>
<string name="quick_action_switch_day_night_descr">Vekselvender mellom dag- og nattmodus i OsmAnd</string>
<string name="quick_action_switch_day_night_descr">En knapp til å skifte mellom dag- og nattmodus i OsmAnd.</string>
<string name="quick_action_switch_day_mode">Dagmodus</string>
<string name="quick_action_switch_night_mode">Nattmodus</string>
<string name="quick_action_day_night_switch_mode">Veksle dag-/nattmodus</string>
<string name="quick_action_day_night_switch_mode">Bytt dag/natt-modus</string>
<string name="app_mode_public_transport">Offentlig transport</string>
<string name="add_destination_point">Sett reisemål</string>
<string name="add_intermediate_point">Legg til mellomliggende</string>
@ -3256,7 +3256,7 @@
<string name="exported_osmand_profile">OsmAnd-profil: %1$s</string>
<string name="profile_import">Profil-import</string>
<string name="rendering_value_white_name">Hvit</string>
<string name="default_speed_dialog_msg">Brukes til å estimere ankomsttid for ukjente veityper, og for å begrense farten på alle veier (kan endre rute)</string>
<string name="default_speed_dialog_msg">Estimerer ankomsttid for ukjente veityper og begrenser farten for alle veier (kan påvirke ruting)</string>
<string name="track_storage_directory">Spor-lagringsmappe</string>
<string name="track_storage_directory_descrp">Spor kan lagres i \'rec\'-mappen, månedlige eller daglige mapper.</string>
<string name="store_tracks_in_rec_directory">Ta opp spor til \'rec\'-mappen</string>
@ -3286,13 +3286,13 @@
\n
\n</string>
<string name="apply_preference_to_all_profiles">Du kan bruke denne endringen på alle eller bare på den valgte profilen.</string>
<string name="quick_action_contour_lines_descr">En bryter for å vise eller skjule koter på kartet.</string>
<string name="quick_action_contour_lines_descr">Knapp som viser eller skjuler koter på kartet.</string>
<string name="export_profile">Eksporter profil</string>
<string name="overwrite_profile_q">\"%1$s\" finnes allerede. Overskriv\?</string>
<string name="export_profile_failed">Kunne ikke eksportere profil.</string>
<string name="profile_import_descr">Legg til en profil ved å åpne profilfilen med OsmAnd.</string>
<string name="file_import_error">%1$s feil under import: %2$s</string>
<string name="file_imported_successfully">%1$s ble importert.</string>
<string name="file_import_error">%1$s importfeil: %2$s</string>
<string name="file_imported_successfully">%1$s importert.</string>
<string name="swap_two_places">Bytt %1$s og %2$s</string>
<string name="route_start_point">Startpunkt</string>
<string name="rendering_attr_ice_road_name">Isvei</string>
@ -3345,20 +3345,20 @@
<string name="navigate_point_format_olc">Åpen plasseringskode (OLC)</string>
<string name="coordinates_format_info">Valgt format vil benyttes i programmet.</string>
<string name="pref_selected_by_default_for_profiles">Denne innstillingen er valgt som forvalg for profiler: %s</string>
<string name="apply_to_current_profile">Bruk kun for «%1$s»</string>
<string name="apply_to_all_profiles">Bruk for alle profiler</string>
<string name="apply_to_current_profile">Bruk kun for \"%1$s\"</string>
<string name="apply_to_all_profiles">Bruk alle profiler</string>
<string name="analytics_pref_title">Analyseinstrumenter</string>
<string name="turn_screen_on_info">Vis kart på låseskjermen under navigering.</string>
<string name="route_parameters_info">Innstillinger for ruting i valgt profil «%1$s».</string>
<string name="route_parameters_info">Innstillinger for ruting i den valgte profilen \"%1$s\".</string>
<string name="wake_time">Tidsavbrudd etter oppvåkning</string>
<string name="screen_alerts_descr">Varsler vises nede til venstre under navigering.</string>
<string name="map_during_navigation_info">Kart under navigasjon</string>
<string name="map_during_navigation">Kart under navigasjon</string>
<string name="voice_announces_info">Stemmekunngjøringer finner kun sted under navigasjon.</string>
<string name="voice_announces_descr">Navigasjonsinstruks og kunngjøringer</string>
<string name="voice_announces">Stemmekunngjøringer</string>
<string name="voice_announces">Talemeldinger</string>
<string name="route_parameters_descr">Sett opp ruteparameter</string>
<string name="route_parameters">Ruteparameter</string>
<string name="route_parameters">Ruteparametere</string>
<string name="download_detailed_map">Last ned detaljert %s-kart for å vise dette området.</string>
<string name="rendering_attr_piste_type_sleigh_name">Slede</string>
<string name="rendering_attr_piste_type_sled_name">Akebrett</string>
@ -3398,13 +3398,13 @@
<string name="personal_category_name">Personlig</string>
<string name="shared_string_downloading_formatted">Laster ned %s</string>
<string name="rendering_value_thick_name">Tykk</string>
<string name="desert_render_descr">For ørkener og andre tynt befolkede områder. Høyere detaljnivå.</string>
<string name="desert_render_descr">For ørkener og andre tynt befolkede områder. Mer detaljert.</string>
<string name="select_navigation_icon">Posisjonsikon under bevegelse</string>
<string name="select_map_icon">Posisjonsikon i hviletilstand</string>
<string name="delete_profiles_descr">Trykk på \'Bruk\' sletter fjernede profiler permanent.</string>
<string name="master_profile">Hovedprofil</string>
<string name="select_color">Velg farge</string>
<string name="edit_profiles_descr">Du kan ikke slette forvalgsprofilene, men du kan skru dem av før dette steget, eller flytte dem til bunnen.</string>
<string name="edit_profiles_descr">OsmAnd-Standardprofiler kan ikke slettes, men deaktiveres (på forrige skjermbilde), eller bli sortert til bunnen.</string>
<string name="edit_profiles">Rediger profiler</string>
<string name="select_nav_profile_dialog_message">Navigasjonstype har innvirkning på regler for ruteberegning.</string>
<string name="profile_appearance">Profilutseende</string>
@ -3418,8 +3418,8 @@
<string name="ltr_or_rtl_combine_via_space">%1$s %2$s</string>
<string name="import_profile">Importer profil</string>
<string name="app_mode_osm">OSM</string>
<string name="file_does_not_contain_routing_rules">\"%1$s\"-filen inneholder ingen ruteplanleggingsregler, velg en annen fil.</string>
<string name="not_support_file_type_with_ext">Ustøttet filtype. Du må velge en fil med %1$s-filendelse.</string>
<string name="file_does_not_contain_routing_rules">Ingen rutingsregler i \'%1$s\'. Velg en annen fil.</string>
<string name="not_support_file_type_with_ext">Velg en støttet fil med %1$s-endelse isteden.</string>
<string name="import_from_file">Importer fra fil</string>
<string name="import_routing_file">Importer ruteplanleggingsfil</string>
<string name="monitoring_prefs_descr">Navigasjon, loggingsnøyaktighet</string>
@ -3429,7 +3429,7 @@
<string name="live_monitoring_descr">Tillater deg å dele nåværende plassering ved bruk av turopptak.</string>
<string name="live_monitoring">Nettbasert sporing</string>
<string name="save_track_logging_accuracy">Loggingsnøyaktighet</string>
<string name="tracks_view_descr">Du kan finne alle dine innspilte spor i %1$s, eller i OsmAnd-mappen.</string>
<string name="tracks_view_descr">Dine innspilte spor er i %1$s, eller i OsmAnd-mappen.</string>
<string name="multimedia_notes_view_descr">Du finner alle dine OSM-notater i %1$s.</string>
<string name="video_notes">Videonotater</string>
<string name="photo_notes">Bildenotater</string>
@ -3601,7 +3601,7 @@
<string name="logcat_buffer_descr">Sjekk og del detaljert loggføring fra programmet</string>
<string name="use_system_screen_timeout">Bruk systemets skjermtidsavbrudd</string>
<string name="plugin_disabled">Programtillegg av</string>
<string name="no_recalculation_setting">Ingen omregning</string>
<string name="no_recalculation_setting">Ingen ny beregning</string>
<string name="please_provide_profile_name_message">Angi et navn for profilen</string>
<string name="select_data_to_import">Velg data å importere.</string>
<string name="slope_read_more">Du kan lese mer om løyper i %1$s.</string>
@ -3627,7 +3627,7 @@
\nSkru av ubrukte programtillegg for å skjule alle deres styringskontroller. %1$s.</string>
<string name="hidden_items_descr">Disse elementene er skjult fra menyen, men de representerte valgene eller programtilleggene vil fortsette å virke.</string>
<string name="select_wikipedia_article_langs">Velg språkene Wikipedia-artikler skal vises på i kartet. Du kan bytte mellom alle tilgjengelige språk mens du leser artikkelen.</string>
<string name="legend_item_description">Veiledning til kartets merking.</string>
<string name="legend_item_description">Veiledning til kartets symbolbruk.</string>
<string name="shared_string_routing">Ruteplanlegging</string>
<string name="route_recalculation_dist_title">Minsteavstand for å beregne rute på nytt</string>
<string name="import_duplicates_description">OsmAnd har allerede elementer med samme navn som de i importen.
@ -3662,7 +3662,7 @@
<string name="speed_camera_pois">Fotoboks-interessepunkter</string>
<string name="shared_string_uninstall">Avinstaller</string>
<string name="vessel_height_warning">Du kan sette fartøyhøyde for å unngå lave broer. Hvis broen endrer høyde, brukes høyden i åpen tilstand.</string>
<string name="quick_action_remove_next_destination">Slett neste målpunkt</string>
<string name="quick_action_remove_next_destination">Slett nærmeste målpunkt</string>
<string name="please_provide_point_name_error">Navngi punktet</string>
<string name="quick_action_showhide_mapillary_title">Vis/skjul Mapillary</string>
<string name="quick_action_mapillary_hide">Skjul Mapillary</string>
@ -3675,19 +3675,19 @@
<string name="listed_exist"/>
<string name="turn_screen_on_navigation_instructions">Navigasjonsinstruks</string>
<string name="speed_cameras_restart_descr"/>
<string name="shared_string_uninstall_and_restart"/>
<string name="shared_string_uninstall_and_restart">Avinstaller og start på nytt</string>
<string name="quick_action_remove_next_destination_descr"/>
<string name="app_mode_wheelchair">Rullestol</string>
<string name="app_mode_go_cart">Gokart</string>
<string name="plan_a_route">Planlegg en rute</string>
<string name="additional_actions_descr">Du får tilgang til disse handlingene ved å trykke på knappen “%1$s”.</string>
<string name="use_volume_buttons_as_zoom_descr">Slå på for å stille inn zoomnivået på kartet med enhetens volumknapper.</string>
<string name="use_volume_buttons_as_zoom_descr">Styr zoomnivået på kartet med enhetens volumknapper.</string>
<string name="add_hidden_group_info">Det tillagte punktet vil ikke være synlig på kartet, siden den valgte gruppen er skjult, du kan finne det i \"%s\".</string>
<string name="app_mode_motor_scooter">Scooter</string>
<string name="app_mode_wheelchair_forward">Rullestol framover</string>
<string name="set_working_days_to_continue">Du må definere arbeidsdagene for å fortsette</string>
<string name="set_working_days_to_continue">Still inn arbeidsdager for å fortsette</string>
<string name="add_to_a_track">Legg til i et spor</string>
<string name="track_show_start_finish_icons">Vis ikoner for start-mål</string>
<string name="track_show_start_finish_icons">Vis ikoner for start og mål</string>
<string name="select_track_width">Velg bredde</string>
<string name="gpx_split_interval_descr">Velg intervallet hvor markeringer med avstand eller tid på sporet vil vises.</string>
<string name="gpx_split_interval_none_descr">Velg det ønskede oppdelingsalternativet: etter tid eller etter avstand.</string>
@ -3702,7 +3702,7 @@
<string name="plan_route_last_edited">Sist redigert</string>
<string name="plan_route_import_track">Importer spor</string>
<string name="plan_route_open_existing_track">Åpne eksisterende spor</string>
<string name="plan_route_select_track_file_for_open">Velg en sporfil for åpning.</string>
<string name="plan_route_select_track_file_for_open">Velg en sporfil for å åpne.</string>
<string name="reverse_route">Snu rute</string>
<string name="overwrite_track">Overskriv spor</string>
<string name="route_between_points_whole_track_button_desc">Hele sporet blir beregnet på nytt med den valgte profilen.</string>
@ -3722,7 +3722,7 @@
<string name="empty_state_my_tracks_desc">Importer eller ta opp sporfiler</string>
<string name="follow_track">Følg spor</string>
<string name="follow_track_descr">Velg sporfil å følge</string>
<string name="import_track_descr">Velg sporfil å følge, eller importer en.</string>
<string name="import_track_descr">Velg sporfil å følge eller importer fra enheten din.</string>
<string name="select_another_track">Velg et annet spor</string>
<string name="start_of_the_track">Starten av sporet</string>
<string name="nearest_point">Nærmeste punkt</string>
@ -3747,4 +3747,15 @@
<string name="sort_last_modified">Sist endret</string>
<string name="sort_name_descending">Navn: Å - A</string>
<string name="sort_name_ascending">Navn: A - Å</string>
<string name="start_finish_icons">Start/mål-ikoner</string>
<string name="shared_string_save_as_gpx">Lagre som ny sporfil</string>
<string name="add_segment_to_the_track">Legg til i en sporfil</string>
<string name="shared_string_gpx_files">Spor</string>
<string name="layer_gpx_layer">Spor</string>
<string name="show_gpx">Spor</string>
<string name="map_widget_monitoring">Turopptak</string>
<string name="marker_save_as_track">Lagre som sporfil</string>
<string name="number_of_gpx_files_selected_pattern">%s sporfiler valgt</string>
<string name="gpx_monitoring_stop">Sett turopptak på pause</string>
<string name="gpx_monitoring_start">Gjenoppta turopptak</string>
</resources>

View file

@ -3812,7 +3812,7 @@
<string name="poi_tactile_paving_contrasted">Skontrastowane</string>
<string name="poi_drinking_water_refill_network">Uzupełnianie wody pitnej: woda z sieci</string>
<string name="poi_drinking_water_refill_no">Uzupełnianie wody pitnej: nie</string>
<string name="poi_drinking_water_refill_yes">Uzupełnianie wody pitnej: tak</string>
<string name="poi_drinking_water_refill_yes">Tak</string>
<string name="poi_seamark_water_level_floating">Poziom wody: utrzymujący się na powierzchni</string>
<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>
@ -3834,4 +3834,7 @@
<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>
<string name="poi_recycling_small_electrical_appliances">Małogabarytowe urządzenia elektryczne</string>
<string name="poi_departures_board">Tablica odjazdów/odlotów</string>
<string name="poi_drinking_water_refill">Uzupełnianie wody pitnej</string>
</resources>

View file

@ -3844,4 +3844,5 @@
<string name="poi_recycling_small_electrical_appliances">Pequenos aparelhos elétricos</string>
<string name="poi_beehive">Colmeia</string>
<string name="poi_nuts">Loja de nozes</string>
<string name="poi_fuel_lng">GNL</string>
</resources>

View file

@ -3427,7 +3427,7 @@
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Ícone mostrado ao navegar ou mover.</string>
<string name="select_map_icon_descr">Ícone mostrado em repouso.</string>
<string name="logcat_buffer_descr">Verifique e compartilhe logs detalhados do aplicativo</string>
<string name="logcat_buffer_descr">Verifique e compartilhe registros detalhados do aplicativo</string>
<string name="search_offline_geo_error">Não foi possível analisar a intenção geográfica \'%s\'.</string>
<string name="permission_is_required">É necessária permissão para usar esta opção.</string>
<string name="monitoring_min_speed_descr">Este é um filtro de corte de baixa velocidade para não registrar pontos abaixo de uma determinada velocidade. Isso pode fazer com que as faixas gravadas pareçam mais suaves quando visualizadas no mapa.</string>
@ -3899,4 +3899,6 @@
<string name="sort_last_modified">Última modificação</string>
<string name="sort_name_descending">Nome: Z A</string>
<string name="sort_name_ascending">Nome: A Z</string>
<string name="start_finish_icons">Ícones de início/término</string>
<string name="contour_lines_thanks">Obrigado por adquirir \'curvas de nível\'</string>
</resources>

View file

@ -436,7 +436,7 @@
<string name="poi_telephone_exchange">Central telefônica</string>
<string name="poi_recycling">Reciclagem</string>
<string name="poi_recycling_centre">Centro de reciclagem</string>
<string name="poi_recycling_container">Contêiner</string>
<string name="poi_recycling_container">Contentor</string>
<string name="poi_recycling_glass">Vidro</string>
<string name="poi_recycling_paper">Papel</string>
<string name="poi_recycling_clothes">Roupas</string>
@ -1775,7 +1775,7 @@
<string name="poi_vending_toys">Brinquedos</string>
<string name="poi_vending_ice_cream">Sorvete</string>
<string name="poi_vending_sim_cards">Cartão SIM</string>
<string name="poi_branch">Seção</string>
<string name="poi_branch">Secção</string>
<string name="poi_memorial_war">Memorial de guerra</string>
<string name="poi_memorial_plaque">Placa comemorativa</string>
<string name="poi_memorial_statue">Estátua</string>
@ -2400,7 +2400,7 @@
<string name="poi_cargo_passengers">Passageiros</string>
<string name="poi_cargo_vehicle">Veículos</string>
<string name="poi_cargo_bicycle">Bicicletas</string>
<string name="poi_cargo_container">Contêineres</string>
<string name="poi_cargo_container">Contentor</string>
<string name="poi_cargo_hgv">Veículos pesados</string>
<string name="poi_fitness_station">Academia ao ar livre</string>
<string name="poi_hackerspace">Hackerspace</string>
@ -2808,9 +2808,9 @@
<string name="poi_pump_type_gravity">Tipo de bomba: gravidade</string>
<string name="poi_pump_style_modern">Estilo de bomba: moderno</string>
<string name="poi_pump_style_historic">Estilo de bomba: histórico</string>
<string name="poi_pump_status_ok">Status da bomba: ok</string>
<string name="poi_pump_status_broken">Status da bomba: quebrado</string>
<string name="poi_pump_status_locked">Status da bomba: bloqueado</string>
<string name="poi_pump_status_ok">Estado da bomba: ok</string>
<string name="poi_pump_status_broken">Estado da bomba: quebrado</string>
<string name="poi_pump_status_locked">Estado da bomba: bloqueado</string>
<string name="poi_payment_troika_yes">Troika</string>
<string name="poi_payment_troika_no">Cartão Troika não aceito</string>
<string name="poi_telescope">Telescópio</string>
@ -3563,7 +3563,7 @@
<string name="poi_rtsa_scale_3b">3B</string>
<string name="poi_rtsa_scale_3b_asterisk">3B*</string>
<string name="poi_flare">Explosão de gás;Queimador de gás</string>
<string name="poi_change_delete">Objeto excluído</string>
<string name="poi_change_delete">Objeto apagado</string>
<string name="poi_rescue_box">Caixa de resgate</string>
<string name="poi_climbing_crag">Sim</string>
<string name="reddit">Reddit</string>
@ -3829,4 +3829,5 @@
<string name="poi_recycling_small_electrical_appliances">Pequenos aparelhos elétricos</string>
<string name="poi_beehive">Colmeia</string>
<string name="poi_nuts">Loja de nozes</string>
<string name="poi_fuel_lng">GNL</string>
</resources>

View file

@ -239,7 +239,7 @@
<string name="recalculate_route_to_your_location">Meio de transporte:</string>
<string name="mark_final_location_first">Por favor, define o destino primeiro</string>
<string name="get_directions">Navegação</string>
<string name="gps_status_app_not_found">A aplicação do estado do GPS não está instalada. Pesquisar na loja de aplicações\?</string>
<string name="gps_status_app_not_found">A app do estado do GPS não está instalada. Pesquisar na loja de apps\?</string>
<string name="opening_hours">Horas de abertura</string>
<string name="opening_changeset">Abrindo conjunto de alterações …</string>
<string name="closing_changeset">Fechando conjunto de alterações…</string>
@ -294,7 +294,7 @@
<string name="shared_string_add_to_favorites">Adicionar aos \'Favoritos\'</string>
<string name="use_english_names_descr">Escolher entre os nomes nativos e inglês.</string>
<string name="use_english_names">Usar nomes em inglês</string>
<string name="app_settings">Configurações da aplicação</string>
<string name="app_settings">Configurações da app</string>
<string name="search_address">Pesquisar endereço</string>
<string name="choose_building">Escolher edifício</string>
<string name="choose_street">Escolher rua</string>
@ -486,7 +486,7 @@
<string name="use_fluorescent_overlays_descr">Usar cores fluorescentes para mostrar trajetos e rotas.</string>
<string name="offline_edition">Edição offline</string>
<string name="offline_edition_descr">Usar sempre a edição offline.</string>
<string name="update_poi_does_not_change_indexes">As alterações de POI dentro da aplicação não afetam os ficheiros de mapas descarregados; essas alterações são guardadas num ficheiro separado no seu aparelho.</string>
<string name="update_poi_does_not_change_indexes">As alterações de POI dentro da app não afetam os ficheiros de mapas descarregados; essas alterações são guardadas num ficheiro separado no seu aparelho.</string>
<string name="local_openstreetmap_uploading">A enviar…</string>
<string name="local_openstreetmap_were_uploaded">{0} POI/anotações enviados</string>
<string name="local_openstreetmap_uploadall">Enviar todos</string>
@ -523,7 +523,7 @@
<string name="fav_export_confirmation">Já existe um ficheiro de favoritos exportados anteriormente. Quer substitui-lo\?</string>
<string name="profile_settings">Configurações específicas de Perfil</string>
<string name="global_settings">Configurações Globais</string>
<string name="global_app_settings">Configurações globais da aplicação</string>
<string name="global_app_settings">Configurações globais da app</string>
<string name="download_files_not_enough_space">Espaço livre insuficiente, precisa de %1$s MB (só tem: %2$s disponíveis).</string>
<string name="download_files_question_space">Descarregar {0} ficheiro(s)\?
\n {1} MB (de {2} MB) será utilizado.</string>
@ -554,7 +554,7 @@
<string name="old_poi_file_should_be_deleted">O ficheiro POI \'%1$s\' é redundante e pode ser eliminado.</string>
<string name="update_poi_file_not_found">Não foi encontrado (e não pôde ser criado) o ficheiro local para guardar as mudanças de POI.</string>
<string name="button_upgrade_osmandplus">Upgrade para OsmAnd+</string>
<string name="map_version_changed_info">Descarregue a nova versão da aplicação para poder usar os novos ficheiros de mapas.</string>
<string name="map_version_changed_info">Descarregue a nova versão da app para poder usar os novos ficheiros de mapas.</string>
<string name="shared_string_rename">Mudar o nome</string>
<string name="poi_filter_nominatim">Online Nomeação</string>
<string name="search_position_current_location_search">Procurando posição…</string>
@ -624,7 +624,7 @@
<string name="voice_stream_voice_call">Áudio de chamada telefónica (para interromper os aparelhos de som Bluetooth do carro)</string>
<string name="voice_stream_notification">Áudio de Notificação</string>
<string name="voice_stream_music">Áudio de mídia/navegação</string>
<string name="warning_tile_layer_not_downloadable">A aplicação não conseguiu descarregar a camada do mapa %1$s, se a tornar a instalar pode resolver o problema.</string>
<string name="warning_tile_layer_not_downloadable">A app não conseguiu descarregar a camada do mapa %1$s, se a tornar a instalar pode resolver o problema.</string>
<string name="overlay_transparency_descr">Ajustar a transparência da sobreposição.</string>
<string name="overlay_transparency">Transparência da Sobreposição</string>
<string name="map_transparency_descr">Ajustar a transparência do mapa base.</string>
@ -646,7 +646,7 @@
<string name="error_doing_search">Não foi possível executar a pesquisa offline.</string>
<string name="search_osm_offline">Pesquisa por localização geográfica</string>
<string name="system_locale">Sistema</string>
<string name="preferred_locale_descr">Idioma de exibição da aplicação (usado após OsmAnd ser reiniciado).</string>
<string name="preferred_locale_descr">Idioma de exibição da app (usado após OsmAnd ser reiniciado).</string>
<string name="preferred_locale">Linguagem</string>
<string name="shared_string_next">Próximo</string>
<string name="shared_string_previous">Anterior</string>
@ -671,7 +671,7 @@
\nO serviço de navegação está temporariamente mudado para CloudMade on-line.</string>
<string name="specified_dir_doesnt_exist">Não foi possível encontrar a pasta especificada.</string>
<string name="application_dir">Local de armazenamento</string>
<string name="osmand_net_previously_installed">Todos os dados offline na aplicação instalada antiga serão suportados pela nova aplicação, mas os pontos Favoritos devem ser exportados da aplicação antiga e depois importados na nova aplicação.</string>
<string name="osmand_net_previously_installed">Todos os dados offline na app instalada antiga serão suportados pela nova, mas os pontos Favoritos devem ser exportados da app antiga e depois importados na nova.</string>
<string name="build_installed">Build {0} foi instalado ({1}).</string>
<string name="downloading_build">Descarregando construção…</string>
<string name="install_selected_build">Instalar OsmAnd - {0} de {1} {2} MB \?</string>
@ -789,12 +789,12 @@
<string name="email">e-mail</string>
<string name="osmand_long_description_1000_chars">OsmAnd (direções automatizadas de navegação OSM)
\n
\nO OsmAnd é uma aplicação de navegação livre, com acesso a uma ampla variedade de dados globais do OSM. Todos os dados dos mapas (mapas vetoriais ou imagens raster) podem ser armazenados no cartão de memória do telemóvel para usar desligado da Internet. O OsmAnd também permite roteamento, tanto ligado como desligado da Internet, incluindo a funcionalidade de roteamento curva a curva com orientação por voz.
\nO OsmAnd é uma app de navegação livre, com acesso a uma ampla variedade de dados globais do OSM. Todos os dados dos mapas (mapas vetoriais ou imagens raster) podem ser armazenados no cartão de memória do telemóvel para usar desligado da Internet. O OsmAnd também permite roteamento, tanto ligado como desligado da Internet, incluindo a funcionalidade de roteamento curva a curva com orientação por voz.
\n
\nAlgumas das características principais:
\n- Funcionalidade totalmente desligado da Internet (guarda os mapas obtidos, sejam eles vetoriais ou imagens, numa pasta selecionável).
\n- Mapas vetoriais compactados do mundo inteiro disponíveis.
\n- Descarregar mapas de países ou regiões diretamente na aplicação.
\n- Descarregar mapas de países ou regiões diretamente na app.
\n- Sobreposição de mapas diversos, como GPX ou trajetos de navegação, pontos de interesse (POI), favoritos, curvas de nível, paragens de transportes públicos, mapas adicionais com transparência personalizável.
\n- Pesquisa desligado da Internet para endereços e locais (POIs).
\n- Encaminhamento desligado da Internet para distâncias médias.
@ -846,9 +846,9 @@
<string name="download_roads_only_item">Só Estradas</string>
<string name="download_regular_maps">Mapa padrão</string>
<string name="download_roads_only_maps">Mapas só de estradas</string>
<string name="safe_mode_description">Executar a aplicação no modo de segurança (usando o código do Android mais lento em vez do nativo).</string>
<string name="safe_mode_description">Executar a app no modo de segurança (usando o código do Android mais lento em vez do nativo).</string>
<string name="safe_mode">Modo seguro</string>
<string name="native_library_not_running">A aplicação está a ser executada no modo de segurança (desligue-a em \"Definições\").</string>
<string name="native_library_not_running">A app está a ser executada no modo de segurança (desligue-a em \"Definições\").</string>
<string name="background_service_is_enabled_question">O serviço de segundo plano OsmAnd ainda está em execução. Tambẽm pará-lo\?</string>
<string name="close_changeset">Fechar conjunto de alterações</string>
<string name="search_villages_and_postcodes">Pesquisar mais povoações/códigos postais</string>
@ -893,7 +893,7 @@
<string name="av_def_action_choose">Sob demanda\?</string>
<string name="av_video_format_descr">Formato de saída de vídeo:</string>
<string name="av_use_external_recorder_descr">Usar gravador do sistema para vídeo.</string>
<string name="av_use_external_camera_descr">Utilize aplicação do sistema para fotos.</string>
<string name="av_use_external_camera_descr">Utilize a app do sistema para fotos.</string>
<string name="av_use_external_camera">Usar aplicação da câmara</string>
<string name="recording_playing">A tocar o áudio da gravação. \n%1$s</string>
<string name="recording_unavailable">Indisponível</string>
@ -927,14 +927,14 @@
<string name="item_unchecked">desmarcado</string>
<string name="map_widget_max_speed">Limite de Velocidade</string>
<string name="no_buildings_found">Nenhum edifício encontrado.</string>
<string name="zxing_barcode_scanner_not_found">A aplicação do leitor de código de barras ZXing não está instalada. Procurar no Google Play\?</string>
<string name="zxing_barcode_scanner_not_found">A app do leitor de código de barras ZXing não está instalada. Procurar no Google Play\?</string>
<string name="support_new_features_descr">Faça uma doação para ver novas funcionalidades implementadas nesta aplicação.</string>
<string name="incomplete_locale">incompleto</string>
<string name="street_name">Nome da rua</string>
<string name="hno">Número de casa</string>
<string name="monitoring_settings">Gravação de viagem</string>
<string name="choose_osmand_theme_descr">Personalizar a aparência da aplicação.</string>
<string name="choose_osmand_theme">Tema da aplicação</string>
<string name="choose_osmand_theme_descr">Personalizar a aparência da app.</string>
<string name="choose_osmand_theme">Tema da app</string>
<string name="accessibility_options">Opções de acessibilidade</string>
<string name="select_address_activity">Especifique um endereço</string>
<string name="favourites_list_activity">Selecione favorito</string>
@ -1047,14 +1047,14 @@
<string name="base_world_map">Mapa mundial</string>
<string name="osmand_plus_long_description_1000_chars">OsmAnd+ (Direções de Navegação Automatizada do OSM)
\n
\n OsmAnd+ é uma aplicação de navegação livre, com acesso a uma ampla variedade de dados globais do OSM. Todos os dados dos mapas (mapas vetoriais ou imagens raster) podem ser armazenados no cartão de memória do telemóvel para usar desligado da Internet. O OsmAnd também permite roteamento, tanto ligado como desligado da Internet, incluindo a funcionalidade de roteamento curva a curva com orientação por voz.
\n OsmAnd+ é uma app de navegação livre, com acesso a uma ampla variedade de dados globais do OSM. Todos os dados dos mapas (mapas vetoriais ou imagens raster) podem ser armazenados no cartão de memória do telemóvel para usar desligado da Internet. O OsmAnd também permite roteamento, tanto ligado como desligado da Internet, incluindo a funcionalidade de roteamento curva a curva com orientação por voz.
\n
\n OsmAnd+ é a versão paga da aplicação, ao comprá-lo está a apoiar o projeto, a financiar o desenvolvimento de novas funcionalidades e a receber as últimas atualizações.
\n OsmAnd+ é a versão paga da app, ao comprá-lo está a apoiar o projeto, a financiar o desenvolvimento de novas funcionalidades e a receber as últimas atualizações.
\n
\n Algumas das características principais:
\n - Funcionalidade totalmente desligado da Internet (guarda os mapas obtidos, sejam eles vetoriais ou imagens, numa pasta selecionável).
\n - Mapas vetoriais compactados do mundo inteiro disponíveis.
\n - Descarregamento de mapas de países ou regiões diretamente na aplicação.
\n - Descarregamento de mapas de países ou regiões diretamente na app.
\n - Recurso Wikipédia desligado da Internet (descarregamento de POIs da Wikipédia), ótimo para passeios turísticos.
\n - Possibilidade de sobreposição de várias camadas de mapas, como trilhos GPX ou navegação, pontos de Interesse, favoritos, curvas de nível, paragens de transporte público, mapas adicionais com transparência personalizável.
\n
@ -1086,7 +1086,7 @@
<string name="amenity_type_osmwiki">Wikipédia (off-line)</string>
<string name="amenity_type_seamark">Marca Marítima</string>
<string name="app_modes_choose_descr">Escolha perfis visíveis.</string>
<string name="app_modes_choose">Perfis da aplicação</string>
<string name="app_modes_choose">Perfis da app</string>
<string name="route_descr_destination">Destino</string>
<string name="rendering_value_pink_name">Rosa</string>
<string name="rendering_value_brown_name">Castanho</string>
@ -1341,7 +1341,7 @@
<string name="watch">Ver</string>
<string name="navigate_point_northing">Norte</string>
<string name="navigate_point_easting">Leste</string>
<string name="storage_directory_internal_app">Memória interna da aplicação</string>
<string name="storage_directory_internal_app">Memória interna da app</string>
<string name="shared_string_go">Ir</string>
<string name="routing_settings_2">Configurações de navegação</string>
<string name="general_settings_2">Configurações gerais</string>
@ -1521,8 +1521,8 @@
<string name="map_downloaded_descr">O mapa %1$s está pronto para ser usado.</string>
<string name="map_downloaded">Mapa descarregado</string>
<string name="go_to_map">Mostrar mapa</string>
<string name="simulate_initial_startup_descr">Define o sinalizador que indica a primeira inicialização da aplicação, mantém todas as outras configurações inalteradas.</string>
<string name="simulate_initial_startup">Simular arranque inicial da aplicação</string>
<string name="simulate_initial_startup_descr">Define o sinalizador que indica a primeira inicialização da app, mantém todas as outras configurações inalteradas.</string>
<string name="simulate_initial_startup">Simular arranque inicial da app</string>
<string name="share_geo">geo:</string>
<string name="share_menu_location">Partilhar Localização</string>
<string name="shared_string_send">Enviar</string>
@ -1572,7 +1572,7 @@
<string name="select_voice_provider">Escolher orientação por voz</string>
<string name="select_voice_provider_descr">Escolher ou descarregar a orientação por voz para o seu idioma.</string>
<string name="night">Noite</string>
<string name="dashboard_or_drawer_description">Há uma nova opção para controlar principalmente a aplicação através do painel de controlo flexível ou um menu estático. A sua escolha pode ser alterada nas configurações do painel.</string>
<string name="dashboard_or_drawer_description">Há uma nova opção para controlar principalmente a app através do painel de controlo flexível ou um menu estático. A sua escolha pode ser alterada nas configurações do painel.</string>
<string name="dashboard_or_drawer_title">Painel de controlo ou menu de controlo</string>
<string name="update">Atualizar</string>
<string name="only_download_over_wifi">Apenas descarregar com Wi-Fi</string>
@ -1661,7 +1661,7 @@
<string name="rendering_value_thin_name">Fino</string>
<string name="rendering_value_medium_name">Média</string>
<string name="rendering_value_bold_name">Negrito</string>
<string name="storage_permission_restart_is_required">Agora a aplicação está autorizada a escrever no armazenamento externo, mas primeiro é necessário reiniciar a aplicação.</string>
<string name="storage_permission_restart_is_required">Agora a app está autorizada a escrever no armazenamento externo, mas primeiro é necessário reiniciar a app.</string>
<string name="shared_string_move_up">Mover ↑</string>
<string name="shared_string_move_down">Mover ↓</string>
<string name="finish_navigation">Terminar a navegação</string>
@ -1959,7 +1959,7 @@
<string name="no_overlay">Sem sobreposição</string>
<string name="no_underlay">Sem subposição</string>
<string name="subscribe_email_error">Erro</string>
<string name="subscribe_email_desc">Assine a nossa lista de e-mail sobre descontos da aplicação e ganhe mais 3 descarregamentos de mapas!</string>
<string name="subscribe_email_desc">Assine a nossa lista de e-mail sobre descontos da app e ganhe mais 3 descarregamentos de mapas!</string>
<string name="depth_contour_descr">Curvas de nível de profundidade marítima e seamarks.</string>
<string name="sea_depth_thanks">Muito obrigado por comprar \'Contornos de profundidade náutica\'</string>
<string name="index_item_depth_contours_osmand_ext">Contornos de profundidade náutica</string>
@ -1973,10 +1973,10 @@
<string name="fonts_header">Fontes do mapa</string>
<string name="right_side_navigation">Circulação pela direita</string>
<string name="driving_region_automatic">Automático</string>
<string name="do_not_send_anonymous_app_usage">Não envie estatísticas anónimas de utilização da aplicação</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd recolhe informação sobre as secções da aplicação que abriu. Não são enviadas: a sua localização; a informação que introduz na aplicação; detalhes de áreas que veja, procure ou descarregue.</string>
<string name="do_not_send_anonymous_app_usage">Não envie estatísticas anónimas de utilização da app</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd recolhe informação sobre as secções da app que abriu. Não são enviadas: a sua localização; a informação que introduz na app; detalhes de áreas que veja, procure ou descarregue.</string>
<string name="do_not_show_startup_messages">Não mostrar mensagens ao iniciar</string>
<string name="do_not_show_startup_messages_desc">Nâo mostrar descontos da aplicação e mensagens de eventos locais especiais.</string>
<string name="do_not_show_startup_messages_desc">Nâo mostrar descontos da app e mensagens de eventos locais especiais.</string>
<string name="parking_options">Opções de estacionamento</string>
<string name="full_version_thanks">Muito obrigado por comprar a versão paga de OsmAnd.</string>
<string name="routing_attr_relief_smoothness_factor_hills_name">Inclinado</string>
@ -2208,7 +2208,7 @@
<string name="how_to_open_link">Como abrir a hiperligação\?</string>
<string name="read_wikipedia_offline">Ler a Wikipédia desligado da Internet</string>
<string name="download_all">Descarregar tudo</string>
<string name="shared_string_restart">Reiniciar a aplicação</string>
<string name="shared_string_restart">Reiniciar a app</string>
<string name="show_images">Mostrar imagens</string>
<string name="purchase_cancelled_dialog_title">Cancelou a sua assinatura do OsmAnd Live</string>
<string name="purchase_cancelled_dialog_descr">Renovar assinatura para continuar a utilizar todas as funcionalidades:</string>
@ -2232,7 +2232,7 @@
<string name="wikivoyage_travel_guide_descr">Guias para os lugares mais interessantes do mundo dentro do OsmAnd, sem uma conexão com a Internet.</string>
<string name="monthly_map_updates">Atualizações de mapa mensais</string>
<string name="daily_map_updates">Atualizações de mapa a cada hora</string>
<string name="in_app_purchase">Compra na aplicação</string>
<string name="in_app_purchase">Compra na app</string>
<string name="in_app_purchase_desc">Pagamento de uma só vez</string>
<string name="in_app_purchase_desc_ex">Uma vez comprado, estará sempre disponível para si.</string>
<string name="purchase_unlim_title">Comprar - %1$s</string>
@ -2475,7 +2475,7 @@
\nRepresenta área: %1$s x %2$s</string>
<string name="speed_limit_exceed">Tolerância do limite de velocidade</string>
<string name="speed_limit_exceed_message">Selecione a margem de tolerância de limite de velocidade, acima do qual receberá um aviso de voz.</string>
<string name="fav_point_emoticons_message">O nome do Favorito foi modificado para %1$s para facilitar gravar corretamente a sequência de caracteres com emoticons para um ficheiro.</string>
<string name="fav_point_emoticons_message">O nome do favorito foi modificado para %1$s para facilitar gravar corretamente a cadeia de caracteres com emoticons num ficheiro.</string>
<string name="print_route">Imprimir rota</string>
<string name="fav_point_dublicate">Nome de favorito duplicado</string>
<string name="fav_point_dublicate_message">Nome favorito especificado já está em uso, foi alterado para %1$s para evitar a duplicação.</string>
@ -2551,7 +2551,7 @@
<string name="rendering_attr_alpineHiking_description">Renderizar caminhos de acordo com a escala de SAC.</string>
<string name="rendering_attr_hikingRoutesOSMC_description">Renderizar caminhos de acordo com traços OSMC.</string>
<string name="map_widget_intermediate_time">Hora intermediária</string>
<string name="osmand_extended_description_part1">OsmAnd (sigla em inglês de direções de navegação automatizada do OSM) é uma aplicação de mapas e navegação com acesso a dados livres, mundiais e de alta qualidade do OSM.
<string name="osmand_extended_description_part1">OsmAnd (sigla em inglês de direções de navegação automatizada do OSM) é uma app de mapas e navegação com acesso a dados livres, mundiais e de alta qualidade do OSM.
\n
\nPoderá usar o navegador visual e por voz, ver POIs (pontos de interesse), criar e gerir trilhos GPX, usar (através de um suplemento) curvas de nível e dados de altitude, escolher entre os modos motorista, ciclista e pedestre, editar o OpenStreetMap e muito mais.</string>
<string name="osmand_extended_description_part2">Navegação GPS
@ -2595,7 +2595,7 @@
\n • Envie trilhos GPX para o OpenStretMap diretamente da aplicação
\n • Adicione POIs e envie-os diretamente para o OpenStretMap (ou mais tarde se estiver desconectado da Internet)
\n</string>
<string name="osmand_extended_description_part8">OsmAnd é um programa de fonte aberta desenvolvido ativamente. Todos podem contribuir para a aplicação reportando erros, melhorando as traduções ou programando novas funcionalidades. Além disso, o projeto conta com contribuições financeiras para financiar a programação e testes de novas funcionalidades.
<string name="osmand_extended_description_part8">OsmAnd é um programa de fonte aberta desenvolvido ativamente. Todos podem contribuir para a app reportando erros, melhorando as traduções ou programando novas funcionalidades. Além disso, o projeto conta com contribuições financeiras para financiar a programação e testes de novas funcionalidades.
\n Cobertura de mapa e qualidade aproximada:
\n • Europa Ocidental: ****
\n • Europa Oriental: ***
@ -2609,10 +2609,10 @@
\n • Antártida: *
\n A maioria dos países ao redor do globo está disponível para descarregar!
\n Obtenha um navegador confiável no seu país - seja em França, Alemanha, México, Reino Unido, Espanha, Holanda, EUA, Rússia, Brasil ou qualquer outro.</string>
<string name="osmand_plus_extended_description_part1">OsmAnd+ (direções de navegação automatizada do OSM) é uma aplicação de mapas e navegação com acesso a dados livres do OSM, de todo o mundo e de alta qualidade.
\nDesfrute da navegação visual ou por voz, vendo POIs (pontos de interesse), criando e gerindo trilhos GPX, usando informação de altitude e curvas de nível, escolher entre modos dirigir, andar de bicicleta e pedestre, editar o OpenStreetMap e muito mais.
<string name="osmand_plus_extended_description_part1">OsmAnd+ (direções de navegação automatizada do OSM) é uma app de mapas e navegação com acesso a dados livres do OSM, de todo o mundo e de alta qualidade.
\nDesfrute da navegação visual ou por voz, ver POIs (pontos de interesse), criando e gerindo trilhos GPX, usando informação de altitude e curvas de nível, escolher entre modos dirigir, andar de bicicleta e pedestre, editar o OpenStreetMap e muito mais.
\n
\nOsmAnd+ é a versão paga da aplicação. Ao comprá-lo, está a apoiar o projeto, a financiar o desenvolvimento de novas funcionalidades e a receber as últimas atualizações.
\nOsmAnd+ é a versão paga da app. Ao comprá-lo, está a apoiar o projeto, a financiar o desenvolvimento de novas funcionalidades e a receber as últimas atualizações.
\n
\nAlgumas das características principais:</string>
<string name="osmand_plus_extended_description_part2">Navegação
@ -2654,10 +2654,10 @@
\n• Visualização de curvas de nível e sombreamento de relevo (via suplemento adicional)</string>
<string name="osmand_plus_extended_description_part7">Contribua diretamente para o OpenStreetMap
\n • Envie relatórios de erros.
\n • Envie trilhos GPX para o OpenStretMap diretamente da aplicação.
\n • Envie trilhos GPX para o OpenStretMap diretamente da app.
\n • Adicione POIs e envie-os diretamente para o OpenStretMap (ou mais tarde se estiver desconectado da Internet).
\n • Gravação de viagem opcional também em plano de fundo (enquanto o aparelho está no modo adormecido).
\n OsmAnd é um programa de fonte aberta desenvolvido ativamente. Todos podem contribuir para a aplicação reportando erros, melhorando as traduções ou programando novas funcionalidades. Além disso, o projeto conta com contribuições financeiras para financiar a programação e testes de novas funcionalidades.
\n OsmAnd é um programa de fonte aberta desenvolvido ativamente. Todos podem contribuir para a app por reportar erros, a melhorar as traduções ou a programar novas funcionalidades. Além disso, o projeto conta com contribuições financeiras para financiar a programação e testes de novas funcionalidades.
\n</string>
<string name="osmand_plus_extended_description_part8">Cobertura de mapa e qualidade aproximada:
\n• Europa Ocidental: ****
@ -3358,7 +3358,7 @@
<string name="delete_profiles_descr">Tocar em \'Aplicar\' apagará os perfis removidos permanentemente.</string>
<string name="master_profile">Perfil principal</string>
<string name="select_color">Selecione a cor</string>
<string name="edit_profiles_descr">Perfis padrão do OsmAnd não podem ser apagados, mas desativados (na tela anterior) ou classificados na parte inferior.</string>
<string name="edit_profiles_descr">Perfis predefinidos do OsmAnd não podem ser apagados, mas desativados (no ecrã anterior) ou classificados na parte inferior.</string>
<string name="edit_profiles">Editar perfis</string>
<string name="select_nav_profile_dialog_message">O \'Tipo de navegação\' controla como as rotas são calculadas.</string>
<string name="profile_appearance">Aspeto do perfil</string>
@ -3887,7 +3887,7 @@
<string name="simplified_track_description">Apenas a linha da rota será gravada, os pontos de passagem serão apagados.</string>
<string name="shared_string_file_name">Nome do ficheiro</string>
<string name="number_of_gpx_files_selected_pattern">%s ficheiros de faixa selecionados</string>
<string name="disable_recording_once_app_killed_descrp">Vai pausar o registo de faixas quando a aplicação for morta (através de aplicações recentes). (indicação de fundo de OsmAnd desaparece da barra de notificação do Android.)</string>
<string name="disable_recording_once_app_killed_descrp">Vai pausar o registo de faixas quando a app for morta (através de apps recentes). (indicação de fundo de OsmAnd desaparece da barra de notificação do Android.)</string>
<string name="release_3_8">- Função atualizada de Planear uma rota: permite utilizar diferentes tipos de navegação por segmento e a inclusão de faixas
\n
\n - Novo menu Aparência para trilhos: selecionar cor, espessura, setas de direção de visualização, ícones de início/fim
@ -3903,4 +3903,9 @@
\n - Problemas com as configurações de importação/exportação de perfis resolvidos
\n
\n</string>
<string name="sort_last_modified">Última modificação</string>
<string name="sort_name_descending">Nome: Z A</string>
<string name="sort_name_ascending">Nome: A Z</string>
<string name="start_finish_icons">Ícones de início/fim</string>
<string name="contour_lines_thanks">Obrigado por comprar \'Curvas de nível\'</string>
</resources>

View file

@ -3832,4 +3832,5 @@
<string name="poi_recycling_small_electrical_appliances">Малые электроприборы</string>
<string name="poi_nuts">Магазин орехов</string>
<string name="poi_beehive">Улей</string>
<string name="poi_fuel_lng">СПГ</string>
</resources>

View file

@ -52,7 +52,7 @@
<string name="shared_string_plugin">Плагин</string>
<string name="srtm_purchase_header">Приобретите и установите плагин «Контурные линии» для отображения градуированных вертикальных областей.</string>
<string name="srtm_color_scheme">Цветовая схема</string>
<string name="show_from_zoom_level">Показывать, начиная с уровня масштабирования</string>
<string name="show_from_zoom_level">Показывать начиная с масштаба</string>
<string name="animate_my_location">Анимация моего положения</string>
<string name="animate_my_location_desc">Включить анимацию прокрутки карты с моим положением во время навигации.</string>
<string name="display_zoom_level">Масштаб: %1$s</string>
@ -60,7 +60,7 @@
<string name="change_color">Выбрать цвет</string>
<string name="edit_name">Задать имя</string>
<string name="route_is_too_long_v2">Для больших расстояний: добавьте промежуточные пункты, если маршрут не построен в течение 10 минут.</string>
<string name="routing_attr_allow_private_name">Разрешить частный доступ</string>
<string name="routing_attr_allow_private_name">Разрешить частные зоны</string>
<string name="routing_attr_allow_private_description">Разрешить доступ на частную территорию.</string>
<string name="shared_string_overview">Обзор</string>
<string name="select_street">Выберите улицу</string>
@ -71,7 +71,7 @@
<string name="nearest_cities">Ближайшие города</string>
<string name="select_city">Выберите город</string>
<string name="select_postcode">Поиск почтового индекса</string>
<string name="quick_action_take_audio_note">Аудио⁣заметка</string>
<string name="quick_action_take_audio_note">Запись аудио⁣</string>
<string name="quick_action_take_video_note">Записать видео</string>
<string name="quick_action_take_photo_note">Фотозаметка</string>
<string name="quick_action_add_osm_bug">OSM-заметка</string>
@ -86,7 +86,7 @@
<string name="shared_string_visible">Видимые</string>
<string name="restore_purchases">Восстановить покупки</string>
<string name="fonts_header">Шрифты карты</string>
<string name="analyze_on_map">Посмотреть на карте</string>
<string name="analyze_on_map">Анализ на карте</string>
<string name="nautical_maps">Морские карты</string>
<string name="download_depth_countours">Контуры морских глубин</string>
<string name="index_item_depth_contours_osmand_ext">Контуры морских глубин</string>
@ -105,7 +105,7 @@
<string name="quick_action_add_destination_desc">Добавление нового пункта назначения в центре экрана. Ранее выбранный пункт назначения станет последним промежуточным пунктом.</string>
<string name="quick_action_directions_from_desc">Кнопка для установки центра экрана пунктом отправления. Затем нужно будет выбрать пункт назначения или запустить расчёт маршрута.</string>
<string name="quick_action_replace_destination_desc">Кнопка для установки центра экрана пунктом назначения с заменой предыдущего (если был задан).</string>
<string name="quick_action_add_first_intermediate_desc">Установка центра экрана первой промежуточной точкой маршрута.</string>
<string name="quick_action_add_first_intermediate_desc">Установка центра экрана местом первой остановки на маршруте.</string>
<string name="no_overlay">Нет покрытия</string>
<string name="no_underlay">Нет подложки</string>
<string name="routing_attr_relief_smoothness_factor_hills_name">Гористый</string>
@ -115,7 +115,7 @@
<string name="routing_attr_driving_style_balance_name">Сбалансированный</string>
<string name="routing_attr_driving_style_safety_name">Предпочитать переулки</string>
<string name="relief_smoothness_factor_descr">Выберите предпочтительный рельеф.</string>
<string name="shared_string_slope">Склон</string>
<string name="shared_string_slope">Уклон</string>
<string name="add_new_folder">Добавить новую папку</string>
<string name="points_delete_multiple_succesful">Точки удалены.</string>
<string name="points_delete_multiple">Вы уверены, что хотите удалить %1$d точки\?</string>
@ -171,7 +171,7 @@
<string name="quick_action_map_source_action">Добавить источник карты</string>
<string name="quick_action_map_source_switch">Источник карты изменён на «%s».</string>
<string name="quick_action_btn_tutorial_descr">Удерживайте кнопку для перемещения её по экрану.</string>
<string name="rendering_attr_depthContours_description">Показывать контуры и точки глубины.</string>
<string name="rendering_attr_depthContours_description">Показывать контуры и точки глубин.</string>
<string name="rendering_attr_depthContours_name">Контуры морских глубин</string>
<string name="rendering_attr_contourDensity_description">Частота горизонталей</string>
<string name="rendering_attr_contourDensity_name">Частота горизонталей</string>
@ -202,7 +202,7 @@
<string name="shared_string_continue">Продолжить</string>
<string name="shared_string_pause">Пауза</string>
<string name="shared_string_trip">Поездка</string>
<string name="shared_string_recorded">Записано</string>
<string name="shared_string_recorded">Записано в трек</string>
<string name="shared_string_record">Запись</string>
<string name="gpx_logging_no_data">Нет данных</string>
<string name="save_track_min_speed">Минимальная скорость для записи</string>
@ -233,7 +233,7 @@
<string name="save_filter">Сохранить фильтр</string>
<string name="delete_filter">Удалить фильтр</string>
<string name="new_filter">Новый фильтр</string>
<string name="change_markers_position">Изменить позицию</string>
<string name="change_markers_position">Изменение позиции</string>
<string name="current_track">Текущий путь</string>
<string name="use_osm_live_routing">Навигация OsmAnd Live</string>
<string name="map_widget_battery">Уровень заряда батареи</string>
@ -317,18 +317,18 @@
<string name="recording_open_external_player">Открыть внешний проигрыватель</string>
<string name="recording_delete_confirm">Удалить эту запись?</string>
<string name="recording_unavailable">недоступно</string>
<string name="recording_context_menu_arecord">Аудиозаметка</string>
<string name="recording_context_menu_vrecord">Видеозаметка</string>
<string name="layer_recordings">Слой аудиозаписей</string>
<string name="recording_can_not_be_played">Запись не может быть воспроизведена.</string>
<string name="recording_context_menu_arecord">Запись аудио</string>
<string name="recording_context_menu_vrecord">Запись видео</string>
<string name="layer_recordings">Слой медиазаписей</string>
<string name="recording_can_not_be_played">Не удаётся воспроизвести запись.</string>
<string name="recording_context_menu_delete">Удалить запись</string>
<string name="recording_context_menu_play">Проиграть</string>
<string name="recording_description">Запись %1$s %3$s %2$s</string>
<string name="recording_default_name">Запись</string>
<string name="map_widget_av_notes">Аудиозаметки</string>
<string name="map_widget_av_notes">Медиазаметки</string>
<string name="osmand_srtm_short_description_80_chars">OsmAnd-плагин для линий высот</string>
<string name="map_widget_distancemeasurement">Измерение расстояний</string>
<string name="audionotes_location_not_defined">Нажмите «Использовать местоположение…» чтобы добавить заметку к данному местоположению.</string>
<string name="audionotes_location_not_defined">Нажмите «Использовать местоположение…» для добавления заметки к месту.</string>
<string name="map_widget_audionotes">Аудиозаметки</string>
<string name="audionotes_plugin_description">Создавайте аудио-, видео- и фотозаметки в поездке, используя виджет или контекстное меню.</string>
<string name="audionotes_plugin_name">Аудио/видеозаметки</string>
@ -368,9 +368,9 @@
<string name="map_online_data_descr">Использовать онлайн-карты (загрузка и кеширование на SD-карте).</string>
<string name="shared_string_online_maps">Онлайн-карты</string>
<string name="online_map_settings_descr">Выберите источник онлайн или кешированных растровых карт.</string>
<string name="osmand_rastermaps_plugin_description">Доступ ко множеству онлайн-карт (т. н. тайловых или растровых): от встроенных OSM (как Mapnik), до спутниковых снимков и слоёв специального назначения, таких как карты погоды, климатические, геологические карты, затенения рельефа и др.
<string name="osmand_rastermaps_plugin_description">Доступ ко множеству онлайн-карт (т.н. тайловых или растровых): от встроенных OSM (как Mapnik) до спутниковых снимков и слоёв специального назначения, таких как карты погоды, климатические, геологические карты, затенения рельефа и др.
\n
\n Любая из этих карт может быть использована в качестве базовой либо как наложение или подложка к другой базовой карте (например стандартной локальной карте OsmAnd). Некоторые элементы векторной карты OsmAnd можно скрыть в меню «Настройки карты».
\n Любая из этих карт может быть использована как основная или в качестве подложки к другой карте (например стандартной локальной карте OsmAnd). Некоторые элементы векторной карты OsmAnd можно скрыть в меню «Настройки карты».
\n
\n Карты можно загрузить непосредственно из интернета или подготовить для использования в автономном режиме (и вручную скопировать в папку данных OsmAnd) в виде базы данных sqlite, которая может быть создана с помощью различных инструментов подготовки карт сторонних производителей.</string>
<string name="osmand_background_plugin_description">Показывает настройки для включения фонового отслеживания и навигации путём периодического пробуждения устройства GPS (с выключенным экраном).</string>
@ -505,7 +505,7 @@
<string name="local_indexes_cat_tts">Голосовые подсказки (TTS)</string>
<string name="local_indexes_cat_voice">Голосовые подсказки (записанные)</string>
<string name="local_indexes_cat_poi">Данные POI</string>
<string name="ttsvoice">Голос TTS</string>
<string name="ttsvoice">TTS</string>
<string name="search_offline_clear_search">Новый поиск</string>
<string name="map_text_size_descr">Размер текста для названий на карте:</string>
<string name="map_text_size">Размер текста</string>
@ -518,14 +518,14 @@
<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">Для этого региона доступны локальные векторные карты.
<string name="switch_to_vector_map_to_see">Для этого региона есть локальные векторные карты.
\n\t
\n\tДля их использования выберите в \"Меню\" → \"Настройка карты\" → \"Источник карты…\" → \"Векторные карты\".</string>
<string name="choose_audio_stream">Голосовые инструкции</string>
\n\tДля использования выберите их в качестве источника (Меню → Настройка карты → Источник карты → Локальные векторные карты).</string>
<string name="choose_audio_stream">Аудиоканал голосовых инструкций</string>
<string name="choose_audio_stream_descr">Выберите канал вывода голосовых подсказок.</string>
<string name="voice_stream_voice_call">Канал голосовых звонков (прерывает автомобильную Bluetooth стереосистему)</string>
<string name="voice_stream_notification">Канал уведомлений</string>
<string name="voice_stream_music">Канал медиа/навигации</string>
<string name="voice_stream_voice_call">Голосовые звонки (для прерывания автомобильной стереосистемы Bluetooth)</string>
<string name="voice_stream_notification">Уведомления</string>
<string name="voice_stream_music">Мультимедиа, навигация</string>
<string name="warning_tile_layer_not_downloadable">Приложение не может загрузить слой карты %1$s, переустановка может решить проблему.</string>
<string name="overlay_transparency_descr">Отрегулируйте прозрачность наложения.</string>
<string name="overlay_transparency">Прозрачность наложения</string>
@ -605,7 +605,7 @@
<string name="reading_cached_tiles">Чтение кешированных растровых карт…</string>
<string name="version_index_is_big_for_memory">Недостаточно памяти для локальной карты «{0}»</string>
<string name="version_index_is_not_supported">Версия локальной карты «{0}» не поддерживается</string>
<string name="osmand_routing_experimental">Локальная навигация OsmAnd является экспериментальной функцией и не работает на длинные расстояния более 20 километров.
<string name="osmand_routing_experimental">Офлайн-навигация OsmAnd — это экспериментальная функция, и она не работает на дистанциях больше 20 км.
\n
\nНавигация временно переключена на онлайн-сервис CloudMade.</string>
<string name="specified_dir_doesnt_exist">Невозможно найти указанную папку.</string>
@ -616,7 +616,7 @@
<string name="install_selected_build">Установить OsmAnd — {0} из {1} {2} МБ\?</string>
<string name="loading_builds_failed">Не удалось получить список сборок OsmAnd</string>
<string name="loading_builds">Загружаются сборки OsmAnd…</string>
<string name="select_build_to_install">Выберите сборку OsmAnd для установки</string>
<string name="select_build_to_install">Выберите сборку для установки</string>
<string name="voice_is_not_available_msg">Голосовая навигация недоступна. Перейдите в «Настройки» → «Настройки навигации», выберите профиль → «Голосовые данные» и выберите или загрузите пакет голосовых подсказок.</string>
<string name="voice_is_not_available_title">Выберите пакет голосовых подсказок</string>
<string name="trace_rendering_descr">Показывать производительность отрисовки.</string>
@ -638,7 +638,7 @@
<string name="fast_route_mode">Самый быстрый маршрут</string>
<string name="fast_route_mode_descr">Расчёт скоростного маршрута вместо кратчайшего.</string>
<string name="tiles_to_download_estimated_size">На масштабе {0} загрузить {1} тайлов ({2} МБ)</string>
<string name="shared_string_download_map">Загрузить карту</string>
<string name="shared_string_download_map">Скачать карту</string>
<string name="select_max_zoom_preload_area">Наибольший масштаб для предварительной загрузки</string>
<string name="maps_could_not_be_downloaded">Выбранная карта не может быть загружена</string>
<string name="continuous_rendering">Непрерывная отрисовка</string>
@ -669,9 +669,9 @@
<string name="vector_data">Локальные векторные карты</string>
<string name="poi_context_menu_modify">Редактировать POI</string>
<string name="poi_context_menu_delete">Удалить POI</string>
<string name="rotate_map_compass_opt">По направлению компаса</string>
<string name="rotate_map_bearing_opt">По направлению движения</string>
<string name="rotate_map_none_opt">Не вращать (север сверху)</string>
<string name="rotate_map_compass_opt">по направлению компаса</string>
<string name="rotate_map_bearing_opt">по направлению движения</string>
<string name="rotate_map_none_opt">не вращать (север сверху)</string>
<string name="rotate_map_to_bearing_descr">Выравнивание карты:</string>
<string name="rotate_map_to_bearing">Ориентация карты</string>
<string name="show_route">Детали маршрута</string>
@ -715,10 +715,10 @@
<string name="search_poi_filter">Фильтр</string>
<string name="menu_mute_off">Звук</string>
<string name="menu_mute_on">Без звука</string>
<string name="voice_provider_descr">Выберите язык голосовых инструкции для навигации.</string>
<string name="voice_provider_descr">Выберите голосовое сопровождение для навигации.</string>
<string name="voice_provider">Голосовые данные</string>
<string name="voice_data_initializing">Инициализируются голосовые данные…</string>
<string name="voice_data_not_supported">Голосовые данные не поддерживаются текущей версией приложения</string>
<string name="voice_data_not_supported">Неподдерживаемая версия голосовых данных</string>
<string name="voice_data_corrupted">Выбранные голосовые данные не правильного формата</string>
<string name="voice_data_unavailable">Выбранный пакет голосовых подсказок не доступен</string>
<string name="sd_unmounted">SD-карта недоступна.
@ -726,13 +726,13 @@
<string name="sd_mounted_ro">Карта памяти доступна только для чтения.
\nТеперь можно только просматривать предварительно загруженную карту, а не загружать новые области.</string>
<string name="unzipping_file">Файл распаковывается…</string>
<string name="route_tr">Направо и прямо</string>
<string name="route_tshr">Резко направо и прямо</string>
<string name="route_tslr">Плавно направо и прямо</string>
<string name="route_tl">Налево и прямо</string>
<string name="route_tshl">Резко налево и прямо</string>
<string name="route_tsll">Плавно налево и прямо</string>
<string name="route_tu">Выполните разворот, затем прямо</string>
<string name="route_tr">Направо</string>
<string name="route_tshr">Резко направо</string>
<string name="route_tslr">Плавно направо</string>
<string name="route_tl">Налево</string>
<string name="route_tshl">Резко налево</string>
<string name="route_tsll">Плавно налево</string>
<string name="route_tu">Выполните разворот</string>
<string name="route_head">Двигайтесь прямо</string>
<string name="first_time_continue">Продолжить</string>
<string name="first_time_download">Загрузить детальные карты регионов</string>
@ -844,7 +844,7 @@
<string name="save_current_track">Сохранить текущий трек</string>
<string name="save_track_interval_descr">Укажите интервал фиксирования точек для записи трека во время навигации</string>
<string name="save_track_interval">Интервал записи во время навигации</string>
<string name="save_track_to_gpx_descrp">Во время навигации GPX треки будут автоматически сохранены в папку с треками.</string>
<string name="save_track_to_gpx_descrp">Во время навигации GPX-треки будут автоматически сохранены в папку с треками.</string>
<string name="save_track_to_gpx">Автозапись трека во время навигации</string>
<string name="update_tile">Обновить карту</string>
<string name="reload_tile">Обновить часть карты</string>
@ -864,7 +864,7 @@
<string name="map_view_3d">3D вид</string>
<string name="show_poi_over_map_description">Показать последние использованные POI на карте.</string>
<string name="show_poi_over_map">Показывать POI</string>
<string name="map_tile_source_descr">Выберите источник онлайн или кешированных тайлов карты</string>
<string name="map_tile_source_descr">Выберите источник онлайн- или кешированных тайлов карт.</string>
<string name="map_tile_source">Растровые карты</string>
<string name="map_source">Источник карты</string>
<string name="use_internet">Использовать интернет</string>
@ -901,7 +901,7 @@
<string name="search_address_building_option">Дом</string>
<string name="search_address_street_option">Пересечение улиц</string>
<string name="context_menu_item_update_map">Обновить карту</string>
<string name="context_menu_item_create_poi">Создать POI</string>
<string name="context_menu_item_create_poi">Добавление POI</string>
<string name="shared_string_yes">Да</string>
<string name="shared_string_cancel">Отмена</string>
<string name="shared_string_no">Нет</string>
@ -1160,10 +1160,10 @@
\n — подсказки полосы движения, отображение ограничения скорости, предварительно записанные и синтезированные голосовые подсказки
\n</string>
<string name="avoid_motorway">Без автомагистралей</string>
<string name="snap_to_road_descr">Привязываться к дорогам во время навигации.</string>
<string name="snap_to_road_descr">Привязывать позицию к дороге во время навигации.</string>
<string name="snap_to_road">Привязка к дороге</string>
<string name="intermediate_point_too_far">Промежуточный пункт %1$s слишком далеко от ближайшей дороги.</string>
<string name="arrived_at_intermediate_point">Достигнут промежуточный пункт</string>
<string name="arrived_at_intermediate_point">Вы прибыли в промежуточный пункт</string>
<string name="context_menu_item_intermediate_point">Промежуточный пункт</string>
<string name="map_widget_intermediate_distance">Промежуточный пункт</string>
<string name="ending_point_too_far">Конец маршрута слишком далеко от ближайшей дороги.</string>
@ -1177,11 +1177,11 @@
<string name="poi_filter_restaurants">Рестораны</string>
<string name="poi_filter_sightseeing">Достопримечательности</string>
<string name="context_menu_item_last_intermediate_point">Последний промежуточный пункт</string>
<string name="context_menu_item_first_intermediate_point">Первый промежуточный пункт</string>
<string name="add_as_last_destination_point">Добавить последним промежуточным пунктом</string>
<string name="add_as_first_destination_point">Добавить первым промежуточным пунктом</string>
<string name="context_menu_item_first_intermediate_point">Сделать начальной остановкой</string>
<string name="add_as_last_destination_point">Сделать последней остановкой</string>
<string name="add_as_first_destination_point">Сделать начальной остановкой</string>
<string name="replace_destination_point">Заменить пункт назначения</string>
<string name="new_destination_point_dialog">Пункт назначения уже задан:</string>
<string name="new_destination_point_dialog">Пункт назначения уже задан</string>
<string name="target_point">Пункт %1$s</string>
<string name="shared_string_target_points">Точки маршрута</string>
<string name="intermediate_point">Промежуточный пункт %1$s</string>
@ -1201,11 +1201,11 @@
<string name="av_settings">Настройки аудио и видео </string>
<string name="intermediate_points_change_order">Изменить порядок</string>
<string name="recording_context_menu_show">Просмотр</string>
<string name="av_def_action_picture">Сделать фото</string>
<string name="av_def_action_picture">Снимок</string>
<string name="recording_context_menu_precord">Сделать фото</string>
<string name="dropbox_plugin_description">Синхронизация треков и медиазаметок с вашим аккаунтом Dropbox.</string>
<string name="dropbox_plugin_name">Плагин Dropbox</string>
<string name="osmand_srtm_long_description_1000_chars">Плагин обеспечивает наложение контурных линии и (рельефа) затемняющего слоя, которые будут отображаться поверх стандартных карт OsmAnd. Эта функция высоко оценится спортсменами, туристами, путешественниками и всеми, кто заинтересован в рельефной структуре ландшафта.
<string name="osmand_srtm_long_description_1000_chars">Плагин обеспечивает наложение контурных линии и затемняющего слоя (рельефа), которые будут отображаться поверх стандартных карт OsmAnd. Эту функцию оценят спортсмены, туристы, путешественники и все, для кого рельеф местности имеет значение.
\n
\nГлобальные данные (между 70° на севере и 70° на юге) основываются на измерениях SRTM (Shuttle Radar Topography Mission) и ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), инструментом визуализации Terra, флагманского спутника Земли системы наблюдения NASA. ASTER является результатом совместных усилий NASA, министерства экономики Японии, торговли и промышленности (METI), космических систем Японии (J-spacesystems).</string>
<string name="recording_photo_description">Фото %1$s %2$s</string>
@ -1227,7 +1227,7 @@
<string name="access_arrival_time">Время прибытия</string>
<string name="map_widget_gps_info">Информация GPS</string>
<string name="max_speed_none">нет</string>
<string name="layer_hillshade">Слой рельефа местности</string>
<string name="layer_hillshade">Слой затенения рельефа</string>
<string name="street_name">Название улицы</string>
<string name="hno">Номер дома</string>
<string name="download_using_mobile_internet">Нет соединения по Wi-Fi. Использовать текущее интернет-соединение для загрузки\?</string>
@ -1239,7 +1239,7 @@
<string name="select_address_activity">Укажите адрес</string>
<string name="favourites_list_activity">Выбор избранной</string>
<string name="local_openstreetmap_act_title">Модификации OSM</string>
<string name="av_def_action_choose">Выбирать</string>
<string name="av_def_action_choose">Выбрать</string>
<string name="osmand_play_title_30_chars">OsmAnd карты и навигация</string>
<string name="osmand_plus_play_title_30_chars">OsmAnd+ карты и навигация</string>
<string name="use_kalman_filter_compass_descr">Уменьшает «шум» компаса, но добавляет инерцию.</string>
@ -1258,7 +1258,7 @@
<string name="cancel_route">Отменить маршрут</string>
<string name="clear_destination">Очистить пункт назначения</string>
<string name="search_street_in_neighborhood_cities">Искать улицу в ближайших населённых пунктах</string>
<string name="intermediate_items_sort_by_distance">В порядке следования домов</string>
<string name="intermediate_items_sort_by_distance">Расположить в оптимальном порядке</string>
<string name="available_downloads_left">Доступно %1$d файлов для скачивания</string>
<string name="files_limit">осталось %1$d файлов</string>
<string name="wait_current_task_finished">Подождите, пока завершится текущая операция</string>
@ -1273,9 +1273,9 @@
<string name="plugin_distance_point_ele">высота</string>
<string name="local_osm_changes_backup_successful">OsmChange-файл создан за %1$s</string>
<string name="use_distance_measurement_help">* Нажмите, чтобы отметить точку.
\n* Удерживайте нажатие на карте, чтобы удалить предыдущую точку.
\n* Удерживайте нажатие на точке, чтобы просмотреть и добавить описание.
\n* Нажмите на виджет измерения, чтобы увидеть больше действий.</string>
\n* Нажмите и удерживайте карту, чтобы удалить предыдущую точку.
\n* Удерживайте точку для просмотра и добавления описания.
\n* Нажмите на виджет измерения для других действий.</string>
<string name="use_magnetic_sensor_descr">Использовать магнитный датчик вместо датчика ориентации.</string>
<string name="other_location">Другие</string>
<string name="local_indexes_cat_srtm">Контурные линии</string>
@ -1301,9 +1301,9 @@
<string name="speak_traffic_warnings">Дорожные предупреждения</string>
<string name="clear_intermediate_points">Очистить промежуточные пункты</string>
<string name="keep_intermediate_points">Оставить промежуточные пункты</string>
<string name="route_to">К:</string>
<string name="route_to">Назначение:</string>
<string name="route_via">Через:</string>
<string name="route_from">От:</string>
<string name="route_from">Отправление:</string>
<string name="new_directions_point_dialog">Промежуточные пункты уже заданы.</string>
<string name="speak_street_names">Названия улиц (TTS)</string>
<string name="speak_title">Объявлять…</string>
@ -1345,9 +1345,9 @@
<string name="animate_routing_route">Симуляция использования рассчитанного маршрута </string>
<string name="animate_routing_gpx">Симуляция использования трека GPX</string>
<string name="auto_zoom_none">Без автомасштаба</string>
<string name="auto_zoom_close">Ближний план</string>
<string name="auto_zoom_far">Средний план</string>
<string name="auto_zoom_farthest">Дальний план</string>
<string name="auto_zoom_close">К ближнему плану</string>
<string name="auto_zoom_far">К среднему плану</string>
<string name="auto_zoom_farthest">К дальнему плану</string>
<string name="routing_attr_avoid_motorway_description">Избегать автомагистралей</string>
<string name="routing_attr_avoid_motorway_name">Без автомагистралей</string>
<string name="routing_attr_prefer_motorway_name">Предпочитать автомагистрали</string>
@ -1358,7 +1358,7 @@
<string name="routing_attr_avoid_unpaved_description">Избегать грунтовых дорог</string>
<string name="routing_attr_avoid_ferries_name">Без паромов</string>
<string name="routing_attr_avoid_ferries_description">Исключить паромные переправы</string>
<string name="routing_attr_weight_name">Максимальная масса</string>
<string name="routing_attr_weight_name">Предельная масса</string>
<string name="routing_attr_weight_description">Укажите допустимый предел массы автомобиля для учёта при построении маршрута.</string>
<string name="map_widget_map_rendering">Отображение карты</string>
<string name="amenity_type_seamark">Навигационные знаки (водоёмы)</string>
@ -1386,7 +1386,7 @@
<string name="route_descr_select_destination">Задать пункт назначения</string>
<string name="route_preferences">Предпочтения маршрута</string>
<string name="route_info">Информация про маршрут</string>
<string name="keep_and_add_destination_point">Добавить как новый пункт назначения</string>
<string name="keep_and_add_destination_point">Добавить пункт назначения</string>
<string name="use_displayed_track_for_navigation">Использовать показанный путь для навигации?</string>
<string name="calculate_osmand_route_without_internet">Рассчитать сегмент маршрута OsmAnd без интернета</string>
<string name="gpx_option_calculate_first_last_segment">Рассчитать маршрут OsmAnd для первого и последнего сегмента маршрута</string>
@ -1445,15 +1445,15 @@
<string name="voice_pref_title">Голос</string>
<string name="misc_pref_title">Разное</string>
<string name="localization_pref_title">Локализация</string>
<string name="interrupt_music_descr">Голосовые подсказки приостанавливают воспроизведение музыки.</string>
<string name="interrupt_music">Приостановить музыку</string>
<string name="interrupt_music_descr">Приостановка воспроизведения во время подсказок.</string>
<string name="interrupt_music">Прерывать музыку</string>
<string name="share_route_as_gpx">Поделиться маршрутом используя файл GPX</string>
<string name="navigation_intent_invalid">Неправильный формат: %s</string>
<string name="share_route_subject">Маршрут предоставленный через OsmAnd</string>
<string name="keep_informing_never">Только вручную (нажатием «стрелочки»)</string>
<string name="keep_informing_never">При нажатии на стрелку (вручную)</string>
<string name="keep_informing_descr">Повторять навигационные инструкции с регулярными интервалами.</string>
<string name="keep_informing">Повторять навигационные инструкции</string>
<string name="arrival_distance">Объявление прибытия</string>
<string name="arrival_distance">Объявление о прибытии</string>
<string name="arrival_distance_descr">Как скоро следует сообщать о прибытии?</string>
<string name="share_fav_subject">Места, отправленные в OsmAnd</string>
<string name="use_points_as_intermediates">Рассчитать маршрут между точками</string>
@ -1492,7 +1492,7 @@
<string name="gpx_selection_number_of_points"> %1$s точек</string>
<string name="gpx_selection_point">Точка %1$s</string>
<string name="gpx_selection_route_points">%1$s \nМаршрутных точек %2$s</string>
<string name="show_zoom_buttons_navigation_descr">Показывать кнопки изменения масштаба во время навигации.</string>
<string name="show_zoom_buttons_navigation_descr">Показывать кнопки масштаба во время навигации.</string>
<string name="show_zoom_buttons_navigation">Кнопки масштаба</string>
<string name="sort_by_distance">Сортировать по расстоянию</string>
<string name="sort_by_name">Сортировать по имени</string>
@ -1536,14 +1536,14 @@
<string name="lang_sr">Сербский (кириллица)</string>
<string name="lang_zh_cn">Китайский (упрощённый)</string>
<string name="lang_zh_tw">Китайский (традиционный)</string>
<string name="rendering_attr_subwayMode_name">Маршруты метро</string>
<string name="rendering_attr_subwayMode_name">Линии метро</string>
<string name="continue_navigation">Продолжить навигацию</string>
<string name="pause_navigation">Приостановить навигацию</string>
<string name="rendering_attr_alpineHiking_description">Визуализация пути по шкале SAC.</string>
<string name="rendering_attr_hikingRoutesOSMC_description">Визуализация пути согласно трассам OSMC.</string>
<string name="arrival_distance_factor_early">Пораньше</string>
<string name="arrival_distance_factor_normally">Как обычно</string>
<string name="arrival_distance_factor_late">Попозже</string>
<string name="rendering_attr_alpineHiking_description">Отрисовка дорог cогласно шкале SAC.</string>
<string name="rendering_attr_hikingRoutesOSMC_description">Отрисовка дорог согласно трассам OSMC.</string>
<string name="arrival_distance_factor_early">Раннее</string>
<string name="arrival_distance_factor_normally">По умолчанию</string>
<string name="arrival_distance_factor_late">Позднее</string>
<string name="arrival_distance_factor_at_last">На последних метрах</string>
<string name="rendering_attr_alpineHiking_name">Пеший горный туризм по шкале (SAC)</string>
<string name="rendering_attr_hikingRoutesOSMC_name">Наложение туристических меток</string>
@ -1581,7 +1581,7 @@
<string name="traffic_warning_calming">Снизьте скорость</string>
<string name="traffic_warning_speed_camera">Камера скорости</string>
<string name="traffic_warning">Дорожные предупреждения</string>
<string name="speed_limit_exceed_message">Выберите допустимое значение превышения скорости выше которого вы получите голосовое предупреждение.</string>
<string name="speed_limit_exceed_message">Выберите значение скорости, при превышении которого вы получите голосовое предупреждение.</string>
<string name="speed_limit_exceed">Допустимое превышение скорости</string>
<string name="fav_point_emoticons_message">Избранная точка переименована на «%1$s», чтобы сохранить строку, содержащую эмотикон в файл.</string>
<string name="print_route">Печать маршрута</string>
@ -1739,7 +1739,7 @@
<string name="shared_string_deselect_all">Отменить выбор всех</string>
<string name="shared_string_share">Поделиться</string>
<string name="shared_string_my_places">Мои места</string>
<string name="shared_string_my_favorites">Точки</string>
<string name="shared_string_my_favorites">Избранные</string>
<string name="shared_string_tracks">Треки</string>
<string name="shared_string_currently_recording_track">Текущий трек</string>
<string name="share_note">Поделиться заметкой</string>
@ -1780,7 +1780,7 @@
\n
\nВ случае активации этого вида, стиль карты меняется на «Зимний/лыжный», показывая все детали пейзажа так, как они выглядят зимой. Такой (зимний) вид может быть отменён либо путём деактивации здесь, либо если вы поменяете «Стиль карты» в меню «Настройки карты» на желаемый вид.</string>
<string name="current_route">Текущий маршрут</string>
<string name="welmode_download_maps">Скачать карты</string>
<string name="welmode_download_maps">Загрузка карт</string>
<string name="welcome_select_region">Для правильного отображения дорожных знаков и правил выберите свой регион вождения:</string>
<string name="welcome_header">Добро пожаловать</string>
<string name="mark_to_delete">Отметить для удаления</string>
@ -1815,8 +1815,8 @@
<string name="application_dir_change_warning3">Переместить файлы данных Osmand в новое место назначения\?</string>
<string name="search_poi_category_hint">Напечатайте для поиска</string>
<string name="rendering_attr_hideHouseNumbers_name">Номера домов</string>
<string name="routing_attr_avoid_borders_description">Избегать перехода границы</string>
<string name="routing_attr_height_name">Максимальная высота</string>
<string name="routing_attr_avoid_borders_description">Избегать пересечения границ</string>
<string name="routing_attr_height_name">Предельная высота</string>
<string name="routing_attr_height_description">Укажите высоту транспортного средства для учёта при построении маршрута.</string>
<string name="use_fast_recalculation">Умный пересчёт маршрута</string>
<string name="use_fast_recalculation_desc">Для больших маршрутов пересчитывать только начало.</string>
@ -1905,8 +1905,8 @@
<string name="shared_string_skip">Пропустить</string>
<string name="app_name_osmand">OsmAnd</string>
<string name="plugin_settings">Плагины</string>
<string name="offline_maps_and_navigation">Локальные карты
\nи Навигация</string>
<string name="offline_maps_and_navigation">Офлайн-карты
\nи навигация</string>
<string name="building_number">Номер дома</string>
<string name="rendering_attr_pisteGrooming_name">Тип лыжной трассы</string>
<string name="download_live_updates">Автообновления</string>
@ -2030,13 +2030,13 @@
<string name="context_menu_item_edit_waypoint">Изменить путевую точку GPX</string>
<string name="routing_attr_avoid_stairs_name">Без лестниц</string>
<string name="routing_attr_avoid_stairs_description">Избегать ступеней и лестниц</string>
<string name="routing_attr_avoid_borders_name">Без пересечений границ</string>
<string name="routing_attr_avoid_borders_name">Без перехода границы</string>
<string name="update">Обновлять</string>
<string name="only_download_over_wifi">Загружать только по Wi-Fi</string>
<string name="update_now">Обновить сейчас</string>
<string name="missing_write_external_storage_permission">Приложение не имеет разрешения на использование SD-карты</string>
<string name="available_maps">Доступные карты</string>
<string name="starting_point">Начальный пункт</string>
<string name="starting_point">Пункт отправления</string>
<string name="shared_string_not_selected">Не выбрано</string>
<string name="rec_split_storage_size">Размер хранилища</string>
<string name="shared_string_sound">Звук</string>
@ -2065,7 +2065,7 @@
<string name="rec_split">Разбиение на клипы</string>
<string name="rec_split_title">Использовать разбиение на клипы</string>
<string name="rec_split_desc">Циклическая перезапись клипов при превышении заданного объёма хранилища.</string>
<string name="switch_start_finish">Поменять местами пункты отправления и назначения</string>
<string name="switch_start_finish">Поменять местами пункты отправления и назначения</string>
<string name="shared_string_remove">Удалить</string>
<string name="rendering_attr_hideUnderground_name">Подземные объекты</string>
<string name="data_is_not_available">Данные недоступны</string>
@ -2110,7 +2110,7 @@
<string name="item_removed">Запись удалена</string>
<string name="n_items_removed">элементы удалены</string>
<string name="live_updates">Автообновления</string>
<string name="select_voice_provider_descr">Выберите или скачайте голосовые подсказки для вашего языка.</string>
<string name="select_voice_provider_descr">Выберите или скачайте голосовое сопровождение для вашего языка.</string>
<string name="full_report">Полный отчёт</string>
<string name="recalculate_route">Пересчёт маршрута</string>
<string name="open_street_map_login_and_pass">Имя пользователя и пароль OSM</string>
@ -2235,7 +2235,7 @@
<string name="get_it">Получить</string>
<string name="osm_live_banner_desc">Получайте неограниченное количество загрузок карт, вдобавок к еженедельным, ежедневным и даже почасовым обновлениям.</string>
<string name="osmand_plus_banner_desc">Неограниченный доступ к картам, обновлениям и плагину «Википедия».</string>
<string name="select_voice_provider">Голосовое сопровождение</string>
<string name="select_voice_provider">Голосовые инструкции</string>
<string name="osm_live_payment_desc">Абонентская плата взимается за выбранный период. Отменить подписку можно в Google Play в любой момент.</string>
<string name="donation_to_osm">Пожертвование для сообщества OSM</string>
<string name="donation_to_osm_desc">Часть вашего пожертвования будет отправлена участникам OSM. Стоимость подписки при этом остаётся прежней.</string>
@ -2281,16 +2281,16 @@
<string name="quick_action_btn_tutorial_title">Изменить положение кнопки</string>
<string name="shared_string_action_name">Название действия</string>
<string name="lang_sr_latn">Сербский (латиница)</string>
<string name="quick_action_navigation_voice">Голос вкл/выкл</string>
<string name="quick_action_navigation_voice_off">Включить голос</string>
<string name="quick_action_navigation_voice_on">Выключить голос</string>
<string name="quick_action_navigation_voice">Голосовая навигация</string>
<string name="quick_action_navigation_voice_off">Включить подсказки</string>
<string name="quick_action_navigation_voice_on">Выключить подсказки</string>
<string name="file_can_not_be_moved">Не удалось переместить файл.</string>
<string name="sea_depth_thanks">Благодарим вас за покупку контуров морских глубин</string>
<string name="shared_string_add_photos">Добавить фото</string>
<string name="shared_string_permissions">Разрешения</string>
<string name="online_photos">Онлайн-фото</string>
<string name="no_photos_descr">Здесь нет фотографий.</string>
<string name="mapillary_action_descr">Поделитесь вашим просмотром улиц через Mapillary.</string>
<string name="no_photos_descr">Здесь нет фото.</string>
<string name="mapillary_action_descr">Поделитесь своими уличными видами через Mapillary.</string>
<string name="mapillary_widget">Виджет Mapillary</string>
<string name="mapillary_widget_descr">Позволяет быстро внести свой вклад в Mapillary.</string>
<string name="mapillary_descr">Фото с улиц онлайн для каждого. Открывайте места, взаимодействуйте, запечатлейте весь мир.</string>
@ -2337,7 +2337,7 @@
<string name="measurement_tool">Измерить расстояние</string>
<string name="none_point_error">Добавьте хотя бы одну точку.</string>
<string name="mapillary_image">Фотография Mapillary</string>
<string name="improve_coverage_mapillary">Улучшить фотопокрытие через Mapillary</string>
<string name="improve_coverage_mapillary">Улучшить фотопокрытие в Mapillary</string>
<string name="hide_from_zoom_level">Скрыть, начиная с уровня масштабирования</string>
<string name="rendering_value_translucent_pink_name">Прозрачно-розовый</string>
<string name="lang_ber">Берберский</string>
@ -2380,7 +2380,7 @@
<string name="routing_attr_avoid_ice_roads_fords_description">Избегать ледовых дорог и бродов.</string>
<string name="my_location">Моё местоположение</string>
<string name="shared_string_finish">Финиш</string>
<string name="shared_string_sort">Сортировать</string>
<string name="shared_string_sort">Сортировка</string>
<string name="marker_save_as_track_descr">Экспорт маркеров в следующий файл GPX:</string>
<string name="shared_string_markers">Маркеры</string>
<string name="osn_modify_dialog_title">Изменить заметку</string>
@ -2392,7 +2392,7 @@
<string name="order_by">Критерий сортировки:</string>
<string name="marker_show_distance_descr">Выберите способ указания расстояния и направления до маркеров на карте:</string>
<string name="map_orientation_change_in_accordance_with_speed">Смена ориентации карты</string>
<string name="map_orientation_change_in_accordance_with_speed_descr">Выберите скорость, при которой переключается ориентация карты с «По направлению движения» на «По направлению компаса».</string>
<string name="map_orientation_change_in_accordance_with_speed_descr">Выберите скорость, при которой ориентация по направлению движения переключится на ориентацию по компасу.</string>
<string name="all_markers_moved_to_history">Все маркеры перемещены в историю</string>
<string name="marker_moved_to_history">Маркер перемещён в историю</string>
<string name="marker_moved_to_active">Маркер перемещён в действующие</string>
@ -2440,7 +2440,7 @@
<string name="quick_action_take_photo_note_descr">Кнопка для добавления фотозаметки в центре экрана.</string>
<string name="quick_action_add_osm_bug_descr">Добавление в центре экрана OSM-заметки.</string>
<string name="quick_action_add_poi_descr">Добавление POI в центре экрана.</string>
<string name="quick_action_navigation_voice_descr">Переключатель, чтобы включить или выключить голосовые подсказки во время навигации.</string>
<string name="quick_action_navigation_voice_descr">Включение/отключение голосового сопровождения при навигации.</string>
<string name="quick_action_add_parking_descr">Добавление в центре экрана места парковки.</string>
<string name="quick_action_interim_dialog">Показывать промежуточный диалог</string>
<string name="mappilary_no_internet_desc">Фотографии Mapillary доступны только онлайн.</string>
@ -2470,7 +2470,7 @@
<string name="tap_on_map_to_hide_interface">Полноэкранный режим</string>
<string name="mark_passed">Отметить пройденным</string>
<string name="import_track_desc">Файл %1$s не содержит путевых точек, импортировать его как трек?</string>
<string name="add_track_to_markers_descr">Выберите трек, чтобы добавить в маркеры его точки.</string>
<string name="add_track_to_markers_descr">Выберите трек, чтобы добавить в маркеры его точки.</string>
<string name="shared_string_gpx_waypoints">Трек путевых точек</string>
<string name="shared_string_right">Направо</string>
<string name="shared_string_left">Налево</string>
@ -2521,13 +2521,13 @@
\n• Запись собственного или отправка GPX трека и следование ему
\n</string>
<string name="osmand_extended_description_part3">Карта
\n• Отображает POI (точки интереса) около вас
\n• Адаптирует карту в направлении вашего движения (или компаса)
\n• Показывает, где вы находитесь и куда вы смотрите
\n• Делитесь своим расположением, чтобы друзья смогли найти вас
\n• Сохраняет ваши самые важные места в избранных
\n• Позволяет вам выбрать как отображать названия на карте: на английском, местным или с фонетическим написанием
\n• Отображает специальные онлайн-тайлы, спутниковые снимки (с Bing), различные метки, как туристические/навигационные треки GPX и дополнительные слои с настраиваемой прозрачностью
\n• Отображает POI (точки интереса) вокруг вас
\n• Поворачивает карту по направлению движения (или компаса)
\n• Показывает вашу позицию и направление взгляда
\n• Делитесь вашим местоположением, чтобы вас могли найти друзья
\n• Сохраняет важные для вас места в избранных
\n• Позволяет выбрать способ отображения названий на карте: на английском, местное или фонетическое написание.
\n• Отображает специальные онлайн-тайлы, спутниковые снимки (Bing), различные метки, как туристические/навигационные треки GPX и дополнительные слои с настраиваемой прозрачностью
\n</string>
<string name="osmand_extended_description_part4">Катание на лыжах
\n• OsmAnd-плагин лыжные карты позволяет видеть лыжные трассы с уровнем сложности и некоторой дополнительной информацией, как расположение подъёмников и других объектов.</string>
@ -2668,9 +2668,9 @@
<string name="copy_location_name">Копировать местоположение/название POI</string>
<string name="toast_empty_name_error">Место без названия</string>
<string name="shared_string_current">Текущий</string>
<string name="last_intermediate_dest_description">Добавляет промежуточную остановку</string>
<string name="first_intermediate_dest_description">Добавляет начальную остановку</string>
<string name="subsequent_dest_description">Перемещает пункт назначения и создаёт промежуточную точку</string>
<string name="last_intermediate_dest_description">Добавить последним промежуточным пунктом</string>
<string name="first_intermediate_dest_description">Добавить первым промежуточным пунктом</string>
<string name="subsequent_dest_description">Ранее выбранный пункт назначения станет последним промежуточным пунктом</string>
<string name="show_closed_notes">Показать закрытые заметки</string>
<string name="switch_osm_notes_visibility_desc">Показать/скрыть заметки OSM на карте.</string>
<string name="gpx_file_desc">GPX — подходит для экспорта в JOSM и другие OSM редакторы.</string>
@ -2683,7 +2683,7 @@
<string name="osm_notes">OSM-заметки</string>
<string name="tunnel_warning">Впереди туннель</string>
<string name="show_tunnels">Туннели</string>
<string name="make_as_start_point">Сделать отправной точкой</string>
<string name="make_as_start_point">Сделать пунктом отправления</string>
<string name="enter_the_file_name">Введите имя файла.</string>
<string name="map_import_error">Ошибка импорта карты</string>
<string name="map_imported_successfully">Карта импортирована</string>
@ -2764,7 +2764,7 @@
<string name="start_editing">Начать редактирование</string>
<string name="get_unlimited_access">Получить неограниченный доступ</string>
<string name="welcome_to_open_beta">Добро пожаловать на открытое бета-тестирование</string>
<string name="contour_lines_hillshade_maps">Карты горизонталей и карты с отмывкой рельефа</string>
<string name="contour_lines_hillshade_maps">Карты горизонталей и затенение рельефа</string>
<string name="download_wikipedia_description">Скачать статьи Википедии для %1$s, чтобы читать их в автономном режиме.</string>
<string name="download_wikipedia_label">Загрузка данных Википедии</string>
<string name="open_in_browser_wiki">Открыть статью в интернете</string>
@ -2788,7 +2788,7 @@
<string name="ski_map_render_descr">Для катания на лыжах. Выделяет горнолыжные трассы, подъёмники, трассы для беговых лыж и прочее. Меньше отвлекающих второстепенных объектов на карте.</string>
<string name="download_all">Скачать все</string>
<string name="light_rs_render_descr">Простой стиль для вождения. Мягкий ночной режим, контурные линии, контрастные дороги в оранжевом стиле, тусклые второстепенные объекты карты.</string>
<string name="topo_render_descr">Для пеших походов, трекинга и велосипедных прогулок на природе. Читабельный на открытом воздухе и при сложном освещении. Контрастные дороги и природные объекты, различные типы маршрутов, контурные линии с расширенными настройками, дополнительные детали. Функция «Качество дорожного покрытия» позволяет различать дороги с различным качеством поверхности. Нет ночного режима.</string>
<string name="topo_render_descr">Для пеших походов, трекинга и велопоездок на природе. Хорошо читается при сложном освещении. Контрастные дороги и природные объекты, различные типы маршрутов, контурные линии с расширенными настройками, дополнительные детали. Параметр «Дорожное покрытие» позволяет различать поверхность и качество дорог. Ночной режим отсутствует.</string>
<string name="mapnik_render_descr">Старый стиль по умолчанию «Mapnik». Похожие цвета на «Mapnik».</string>
<string name="default_render_descr">Стиль общего назначения. Густонаселённые города показаны упрощённо. Выделяет контурные линии, маршруты, качество поверхности, ограничения доступа, дорожные щиты, визуализация пешеходных маршрутов по шкале SAC, объекты спортивных сплавов.</string>
<string name="open_wikipedia_link_online">Открыть ссылку Википедии в онлайн</string>
@ -2796,13 +2796,13 @@
<string name="read_wikipedia_offline_description">Получите подписку на OsmAnd Live, чтобы читать статьи в Википедии и Викигиде в автономном режиме.</string>
<string name="how_to_open_link">Как открыть ссылку?</string>
<string name="read_wikipedia_offline">Читать Википедию в автономном режиме</string>
<string name="touring_view_render_descr">Туристический стиль с высоким контрастом и максимальной детализацией. Включает все функции стиля OsmAnd по умолчанию, также отображая как можно больше деталей, в частности дороги, тропы и другие пути для передвижения. Чёткое различие между типами дорог, как во многих туристических атласах. Подходит для дневного, ночного и уличного использования.</string>
<string name="touring_view_render_descr">Туристический стиль с высоким контрастом и максимальной детализацией. Включает все функции стиля OsmAnd по умолчанию, отображая максимальное количество деталей, в частности дороги, тропы и другие пути передвижения. Чёткое различие между типами дорог (как в туристических атласах). Подходит для использования днём, ночью и при ярком освещении.</string>
<string name="shared_string_bookmark">Сохранить</string>
<string name="off_road_render_descr">Для езды по бездорожью, основано на топографическом стиле (англ. «Topo»), можно использовать с зелёными спутниковыми снимками в качестве подложки. Уменьшенная толщина основных дорог, увеличенная толщина путей, дорожек, велосипедных и других маршрутов.</string>
<string name="unirs_render_descr">Модификация стиля по умолчанию для увеличения контраста пешеходных и велосипедных дорог. Использует старые цвета Mapnik.</string>
<string name="get_osmand_live">Получите OsmAnd Live, чтобы разблокировать все функции: ежедневные обновления карт с неограниченной загрузкой, все платные и бесплатные плагины, Википедия, Викигид и многое другое.</string>
<string name="access_intermediate_arrival_time">Промежуточное время прибытия</string>
<string name="map_widget_intermediate_time">Промежуточное время</string>
<string name="map_widget_intermediate_time">Прибытие в промежуточный пункт</string>
<string name="quick_action_edit_actions">Редактировать действие</string>
<string name="error_notification_desc">Пожалуйста, пришлите скриншот этого уведомления на support@osmand.net</string>
<string name="coord_input_edit_point">Редактировать точку</string>
@ -2855,7 +2855,7 @@
<string name="ask_for_location_permission">Для продолжения дайте OsmAnd разрешение на определение местоположения.</string>
<string name="rendering_value_black_name">Чёрный</string>
<string name="search_street">Поиск улицы</string>
<string name="start_search_from_city">Сначала выберите город/населённый пункт/местность</string>
<string name="start_search_from_city">Укажите город/место/район</string>
<string name="shared_string_restore">Восстановить</string>
<string name="keep_passed_markers_descr">Маркеры, добавленные как группа избранных или путевых точек GPX и отмеченные как пройденные, останутся на карте. Если группа не активна, маркеры исчезнут с карты.</string>
<string name="keep_passed_markers">Оставить пройденные маркеры на карте</string>
@ -2891,7 +2891,7 @@
<string name="points_of_interests">Точки интереса (POI)</string>
<string name="waiting_for_route_calculation">Расчёт маршрута…</string>
<string name="app_mode_public_transport">Общественный транспорт</string>
<string name="avoid_roads_descr">Выберите дорогу на карте или из списка ниже, которую вы хотите избежать во время навигации:</string>
<string name="avoid_roads_descr">Выберите на карте или в списке ниже дорогу, которой хотите избежать при навигации:</string>
<string name="simulate_navigation">Моделировать навигацию</string>
<string name="choose_track_file_to_follow">Выберите файл трека для следования</string>
<string name="voice_announcements">Голосовые подсказки</string>
@ -2908,7 +2908,7 @@
<string name="on_foot">пешком</string>
<string name="show_along_the_route">Показывать вдоль маршрута</string>
<string name="routeInfo_surface_name">Покрытие</string>
<string name="routeInfo_roadClass_name">Тип дороги</string>
<string name="routeInfo_roadClass_name">Класс дороги</string>
<string name="routeInfo_steepness_name">Крутизна</string>
<string name="add_home">Добавить дом</string>
<string name="add_work">Добавить работу</string>
@ -2923,7 +2923,7 @@
<string name="quick_action_gpx_tracks_hide">Скрыть треки</string>
<string name="quick_action_gpx_tracks_show">Показать треки</string>
<string name="time_of_day">Время суток</string>
<string name="step_by_step">Поворот за поворотом</string>
<string name="step_by_step">По шагам</string>
<string name="routeInfo_road_types_name">Типы дорог</string>
<string name="quick_action_show_hide_gpx_tracks_descr">Переключатель, чтобы показать или скрыть выбранные треки на карте.</string>
<string name="by_transport_type">На %1$s</string>
@ -2987,7 +2987,7 @@
<string name="rendering_attr_highway_class_steps_name">Ступеньки</string>
<string name="rendering_attr_highway_class_path_name">Тропа</string>
<string name="rendering_attr_highway_class_cycleway_name">Велодорожка</string>
<string name="rendering_attr_undefined_name">Неопределённая</string>
<string name="rendering_attr_undefined_name">Не определено</string>
<string name="public_transport_warning_descr_blog">Узнайте больше о маршрутизации OsmAnd в нашем блоге.</string>
<string name="public_transport_warning_title">Навигация на общественном транспорте в настоящее время проходит бета-тестирование, возможны ошибки и неточности.</string>
<string name="add_intermediate">Добавить промежуточную точку</string>
@ -3066,7 +3066,7 @@
<string name="app_mode_subway">Метро</string>
<string name="app_mode_horse">Лошадь</string>
<string name="app_mode_helicopter">Вертолёт</string>
<string name="osmand_routing_promo">Вы можете добавить собственную модифицированную версию routing.xml в ..osmand/routing</string>
<string name="osmand_routing_promo">Вы можете добавить свою модифицированную версию файла routing.xml в ..osmand/routing</string>
<string name="select_icon_profile_dialog_title">Выберите значок</string>
<string name="routing_profile_ski">Лыжи</string>
<string name="profile_type_descr_string">Тип: %s</string>
@ -3101,20 +3101,20 @@
<string name="zoom_by_wunderlinq">Использовать WunderLINQ для контроля</string>
<string name="shared_string_icon">Значок</string>
<string name="collected_data">Собранные данные</string>
<string name="press_again_to_change_the_map_orientation">Нажмите ещё раз, чтобы изменить ориентацию карты</string>
<string name="press_again_to_change_the_map_orientation">Нажмите ещё раз для смены ориентации карты</string>
<string name="last_launch_crashed">Последний запуск OsmAnd завершился ошибкой. Пожалуйста, помогите нам улучшить OsmAnd, отправив нам отчёт об ошибке.</string>
<string name="settings_routing_mode_string">Режим: %s</string>
<string name="settings_derived_routing_mode_string">Режим пользователя, полученный из: %s</string>
<string name="profile_alert_duplicate_name_title">Повторяющееся имя</string>
<string name="routing_profile_broutrer">BRouter (локально)</string>
<string name="routing_attr_piste_type_downhill_name">Альпийские/горные лыжи</string>
<string name="routing_attr_piste_type_downhill_name">Горнолыжные спуски</string>
<string name="routing_attr_piste_type_downhill_description">Склоны для катания и спуска на горных лыжах и доступ к подъёмникам.</string>
<string name="routing_attr_piste_type_skitour_name">Лыжные туры</string>
<string name="routing_attr_piste_type_sled_name">Сани</string>
<string name="routing_attr_piste_type_sled_description">Склоны для катания на санях.</string>
<string name="routing_attr_allow_intermediate_description">Более сложные маршруты с крутыми участками дороги. В целом, препятствия, которых следует избегать.</string>
<string name="routing_attr_allow_advanced_description">Сложные маршруты, с опасными препятствиями и крутыми участками.</string>
<string name="routing_attr_difficulty_preference_name">Предпочитаемая сложность</string>
<string name="routing_attr_difficulty_preference_name">Предпочтительная сложность</string>
<string name="process_downloading_service">Служба скачивания OsmAnd</string>
<string name="shared_string_color_magenta">Пурпурный</string>
<string name="button_rate">Оценить</string>
@ -3158,7 +3158,7 @@
<string name="shared_string_crash">Сбой</string>
<string name="app_mode_offroad">Внедорожник</string>
<string name="edit_profile_setup_map_subtitle">Выбор настроек карты для профиля</string>
<string name="edit_profile_screen_options_subtitle">Выбор настроек экрана для профиля</string>
<string name="edit_profile_screen_options_subtitle">Настройка элементов экрана для профиля</string>
<string name="edit_profile_nav_settings_subtitle">Выбор настроек навигации для профиля</string>
<string name="routing_attr_max_num_changes_description">Выбор верхней границы изменений</string>
<string name="turn_screen_on_sensor">Использовать бесконтактный датчик (сенсорный выключатель)</string>
@ -3187,8 +3187,8 @@
\nРасчёт: %.1f с, %d дорог, %d тайлов)</string>
<string name="quick_action_need_to_add_item_to_list">Добавьте хотя бы один элемент в список «Быстрые действия» в настройках</string>
<string name="routing_attr_piste_type_skitour_description">Маршруты для горнолыжного туризма.</string>
<string name="routing_attr_freeride_policy_name">Офпист</string>
<string name="routing_attr_freeride_policy_description">Фрирайды и офписты являются неофициальными неадаптированными трассами. Обычно неухоженные, неразмеченные и неосвещённые вечером. Вход на свой страх и риск.</string>
<string name="routing_attr_freeride_policy_name">Вне трассы</string>
<string name="routing_attr_freeride_policy_description">Фрирайды и внетрассовые маршруты — это неофициальные неподготовленные трассы. Обычно неухоженные, неразмеченные и неосвещённые вечером. Вход на свой страх и риск.</string>
<string name="shared_string_open_track">Открыть трек</string>
<string name="gpx_join_gaps">Соединить разрывы (исключить пробелы)</string>
<string name="app_mode_camper">Кемпер</string>
@ -3233,11 +3233,11 @@
<string name="map_during_navigation">Карта во время навигации</string>
<string name="vehicle_parameters_descr">Скорость движения, размеры, масса транспортного средства</string>
<string name="vehicle_parameters">Параметры транспортного средства</string>
<string name="voice_announces_info">Голосовые оповещения происходят только во время навигации.</string>
<string name="voice_announces_info">Голосовые инструкции работают только при навигации.</string>
<string name="voice_announces_descr">Навигационные инструкции и объявления</string>
<string name="voice_announces">Голосовые подсказки</string>
<string name="screen_alerts">Экранные оповещения</string>
<string name="route_parameters_descr">Настройка параметров маршрута</string>
<string name="route_parameters_descr">Настройки маршрутизации</string>
<string name="route_parameters">Параметры маршрута</string>
<string name="logcat_buffer">Буфер Logcat</string>
<string name="plugins_settings">Настройки плагинов</string>
@ -3319,7 +3319,7 @@
<string name="overwrite_profile_q">«%1$s» уже существует. Перезаписать\?</string>
<string name="export_profile_failed">Не удалось экспортировать профиль.</string>
<string name="profile_import">Импорт профиля</string>
<string name="profile_import_descr">Чтобы добавить профиль, откройте его с помощью OsmAnd.</string>
<string name="profile_import_descr">Для добавления профиля откройте файл профиля с помощью OsmAnd.</string>
<string name="file_imported_successfully">%1$s импортирован.</string>
<string name="rendering_value_white_name">Белый</string>
<string name="tts_initialization_error">Невозможно запустить механизм преобразования текста в речь.</string>
@ -3365,8 +3365,8 @@
<string name="routing_attr_allow_skating_only_name">Разрешить только маршруты для катания на коньках</string>
<string name="routing_attr_allow_skating_only_description">Маршруты, подготовленные для фристайла или катания только на коньках без классических треков.</string>
<string name="routing_attr_allow_classic_only_name">Разрешить только классические маршруты</string>
<string name="routing_attr_allow_classic_only_description">Маршруты, подготовленные только для классического стиля без конькобежных трасс. Сюда входят маршруты, подготовленные небольшим снегоходом с более свободной лыжнёй и трассами, подготовленные вручную лыжниками.</string>
<string name="routing_attr_difficulty_preference_description">Предпочитать маршруты заданной сложности, хотя прокладка маршрута по более сложным или лёгким трассам всё же возможна, если они короче.</string>
<string name="routing_attr_allow_classic_only_description">Маршруты только для классического стиля, без конькобежных трасс. Сюда входят маршруты, подготовленные небольшим снегоходом с более свободной лыжнёй и трассами, подготовленные вручную лыжниками.</string>
<string name="routing_attr_difficulty_preference_description">Предпочитаемый уровень сложности маршрутов. Более сложные или лёгкие трассы могут использоваться, если они короче.</string>
<string name="turn_screen_on_router">Включать на повороте</string>
<string name="rendering_attr_highway_class_track_grade1_name">Класс 1</string>
<string name="rendering_attr_highway_class_track_grade2_name">Класс 2</string>
@ -3390,7 +3390,7 @@
<string name="rendering_attr_piste_difficulty_expert_name">Эксперт</string>
<string name="rendering_attr_piste_difficulty_freeride_name">Фрирайд</string>
<string name="rendering_attr_piste_difficulty_extreme_name">Экстрим</string>
<string name="rendering_attr_piste_difficulty_undefined_name">Неопределённо</string>
<string name="rendering_attr_piste_difficulty_undefined_name">Неопределённая</string>
<string name="rendering_attr_piste_difficulty_aerialway_name">Канатная дорога</string>
<string name="rendering_attr_piste_difficulty_connection_name">Соединение</string>
<string name="simulate_your_location_gpx_descr">Симулировать свою позицию используя записанный GPX трек.</string>
@ -3534,12 +3534,12 @@
<string name="saving_new_profile">Сохранение нового профиля</string>
<string name="profile_backup_failed">Не удалось создать резервную копию профиля.</string>
<string name="clear_recorded_data_warning">Очистить записанные данные\?</string>
<string name="monitoring_min_speed_descr_side_effect">Побочный эффект: в записи трека будут отсутствовать все участки, где критерий минимальной скорости не был соблюдён (например, когда вы толкаете велосипед вверх по крутому склону). Также не будет информации о периодах покоя, например, во время отдыха. Это влияет на любой анализ или последующую обработку, например, при попытке определить общую продолжительность поездки, время в движении или среднюю скорость.</string>
<string name="monitoring_min_speed_descr_side_effect">Побочный эффект: в треке будут отсутствовать все участки, где не соблюдён критерий минимальной скорости (например где вы толкаете велосипед вверх по крутому склону). Также не будет информации о периодах покоя, например во время отдыха. Это влияет на любой анализ или последующую обработку, например при попытке определить общую продолжительность поездки, время в движении или среднюю скорость.</string>
<string name="monitoring_min_accuracy_descr_side_effect">Побочный эффект: в результате фильтрации по точности, точки могут быть полностью пропущены, например, под мостами, под деревьями, между высокими зданиями или при определённых погодных условиях.</string>
<string name="monitoring_min_accuracy_descr_remark">Примечание: при включении GPS непосредственно перед записью точность определения первой точки может быть снижена, поэтому мы рассматриваем добавление секундной задержки перед записью точки (либо записи лучшей из трёх последовательных точек и т. д.), но пока это не реализовано.</string>
<string name="monitoring_min_distance_descr">Фильтр предотвращает запись точек при отсутствии фактического перемещения и улучшает вид треков без обработки.</string>
<string name="monitoring_min_distance_descr_side_effect">Побочные эффекты: периоды в состоянии покоя не записываются вообще или только по одной точке каждый. Небольшие (в реальности) перемещения (например, в сторону, указывающие возможное изменение направления движения) могут быть отфильтрованы. Файл содержит меньше информации для последующей обработки и имеет худшую статистику, отфильтровывая явно избыточные точки во время записи, при этом потенциально сохраняя артефакты, вызванные плохим приёмом или эффектами модуля GPS.</string>
<string name="monitoring_min_distance_descr_recommendation">Рекомендация: настройка 5 метров может должна вас устроить, если нет необходимости учитывать более короткие перемещения, и вы точное не хотите записывать данные в состоянии покоя.</string>
<string name="monitoring_min_distance_descr_recommendation">Рекомендация: настройка 5 метров может подойти вам, если нет необходимости учитывать более короткие перемещения, и вы точно не хотите записывать данные в состоянии покоя.</string>
<string name="listed_exist">Указанные %1$s уже существуют в OsmAnd.</string>
<string name="importing_from">Импорт данных из %1$s</string>
<string name="shared_string_importing">Импортирование</string>
@ -3553,9 +3553,9 @@
<string name="select_distance_route_will_recalc">Отклонение, при котором маршрут будет пересчитан.</string>
<string name="shared_string_legend">Легенда</string>
<string name="search_offline_geo_error">Невозможно разобрать геоссылку «%s».</string>
<string name="hillshade_download_description">Для отображения затенения рельефа на карте необходимы дополнительные карты.</string>
<string name="hillshade_download_description">Для отображения затенения рельефа требуются дополнительные карты.</string>
<string name="shared_string_min">Мин.</string>
<string name="terrain_empty_state_text">Отображение затенения рельефа или карты уклонов. Подробнее об этих типах карт вы можете прочитать на нашем сайте.</string>
<string name="terrain_empty_state_text">Способы отображения рельефа местности: посредством теней (затенение рельефа) или цветов (карта уклонов). Подробнее об этих типах карт вы можете прочитать на нашем сайте.</string>
<string name="shared_string_transparency">Прозрачность</string>
<string name="shared_string_zoom_levels">Уровни масштаба</string>
<string name="recalculate_route_in_deviation">Пересчитывать маршрут в случае отклонения</string>
@ -3580,14 +3580,15 @@
<string name="monitoring_min_speed_descr_remark">Примечание: проверка скорости &gt; 0: большинство модулей GPS сообщают значение скорости только в том случае, если алгоритм определяет, что вы движетесь, и ничего, если вы не перемещаетесь. Следовательно, использование параметра &gt; 0 в этом фильтре в некотором смысле приводит к обнаружению факта перемещения модуля GPS. Но даже если мы не производим данную фильтрацию во время записи, то всё равно эта функция используется при анализе GPX для определения скорректированного расстояния, то есть значение, отображаемое в этом поле, является расстоянием, записанным во время движения.</string>
<string name="multimedia_rec_split_title">Разделение записи</string>
<string name="live_monitoring_adress_descr">Укажите веб-адрес со следующими параметрами: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.</string>
<string name="monitoring_min_accuracy_descr">В этом случае будут записываться только точки, измеренные с минимальной точностью (в метрах/футах согласно настройкам устройства). Точность — это близость измерений к истинному местоположению и не имеет прямого отношения к точности, подразумевающейся под разбросом повторных замеров.</string>
<string name="monitoring_min_accuracy_descr">"Будут записываться только точки, отвечающие
\n в минимальной точностью (в метрах/футах —зависит от настроек системы). Точность — это близость измерений к истинному положению, и она не связана напрямую с точностью, которая представляет собой разброс повторных измерений."</string>
<string name="monitoring_min_speed_descr_recommendation">Рекомендация: попробуйте сначала воспользоваться детектором движения через фильтр минимального смещения (B), что может дать лучшие результаты и вы потеряете меньше данных. Если треки остаются шумными на низких скоростях, попробуйте использовать ненулевые значения. Обратите внимание, что некоторые измерения могут вообще не указывать значения скорости (некоторые сетевые методы), и в этом случае ничего не будет записываться.</string>
<string name="slope_description">Уклон использует цвета для визуализации крутизны рельефа.</string>
<string name="slope_description">Для визуализации крутизны рельефа используются цвета.</string>
<string name="slope_read_more">Подробнее об уклонах можно прочитать в %1$s.</string>
<string name="shared_string_hillshade">Затенение рельефа</string>
<string name="hillshade_description">Затенение рельефа использует тёмные оттенки для отображения склонов, вершин и низменностей.</string>
<string name="slope_download_description">Для отображения склонов на карте необходимы дополнительные карты.</string>
<string name="download_slope_maps">Уклоны</string>
<string name="hillshade_description">Для отображения склонов, вершин и низменностей используются тёмные тени.</string>
<string name="slope_download_description">Для отображения уклонов требуются дополнительные карты.</string>
<string name="download_slope_maps">Карта уклонов</string>
<string name="replace_point_descr">Заменить этой точкой другую.</string>
<string name="changes_applied_to_profile">Изменения применены к профилю «%1$s».</string>
<string name="settings_item_read_error">Невозможно прочитать из «%1$s».</string>
@ -3789,7 +3790,7 @@
<string name="use_volume_buttons_as_zoom_descr">Изменение масштаба карты кнопками громкости.</string>
<string name="use_volume_buttons_as_zoom">Масштабирование кнопками громкости</string>
<string name="lenght_limit_description">Укажите длину автомобиля, для длинных транспортных средств могут применяться ограничения на маршруте.</string>
<string name="quick_action_remove_next_destination">Удалить следующий пункт</string>
<string name="quick_action_remove_next_destination">Удалить ближайший пункт</string>
<string name="please_provide_point_name_error">Задайте название точки</string>
<string name="quick_action_remove_next_destination_descr">Следующая точка маршрута будет удалена. Если это конечный пункт, навигация завершится.</string>
<string name="plugin_wikipedia_description">Информация о достопримечательностях из Википедии. Ваш карманный офлайн-путеводитель — просто включите плагин Википедии и читайте об объектах вокруг вас.</string>
@ -3803,7 +3804,7 @@
<string name="add_to_a_track">Добавить к треку</string>
<string name="set_working_days_to_continue">Для продолжения задайте рабочие дни</string>
<string name="route_between_points">Маршрут между точками</string>
<string name="plan_a_route">Составить маршрут</string>
<string name="plan_a_route">Составление маршрута</string>
<string name="gpx_split_interval_none_descr">Выберите способ разбиения: по времени или по расстоянию.</string>
<string name="gpx_split_interval_descr">Интервал между метками расстояния или времени на треке.</string>
<string name="shared_string_custom">Своё</string>
@ -3883,17 +3884,17 @@
<string name="shared_string_is_saved">сохранен</string>
<string name="one_point_error">Добавьте хотя бы две точки.</string>
<string name="shared_string_redo">ПОВТОРИТЬ</string>
<string name="release_3_8">• Обновлённый режим планирования маршрута позволяет использовать разные типы навигации для каждого сегмента и прикрепляет любой трек к дорогам
<string name="release_3_8">• Обновлённая функция планирования маршрута позволяет применять к сегментам разные режимы навигации и настраивать привязку к дорогам
\n
\n • Новые параметры внешнего вида для треков: можно выбрать цвет, толщину, включите стрелки направления и отметки начала/окончания
\n • Новые настройки вида треков: выбор цвета и толщины линии, указатели направления, метки начала и конца маршрута
\n
\n • Улучшена видимость велосипедных узлов
\n • Повышенная видимость велосипедных узлов
\n
\n • Контекстное меню для треков с основной информацией
\n • Контекстное меню с основной информацией для треков
\n
\n • Улучшенные алгоритмы поиска
\n
\n • Улучшены параметры следования по треку в навигации
\n • Улучшенные настройки следования по треку в Навигации
\n
\n • Исправлены проблемы с импортом/экспортом настроек профиля
\n
@ -3901,4 +3902,6 @@
<string name="sort_last_modified">Последнее изменение</string>
<string name="sort_name_descending">Имя: Я - А</string>
<string name="sort_name_ascending">Имя: А - Я</string>
<string name="start_finish_icons">Значки старта и финиша</string>
<string name="contour_lines_thanks">Спасибо за покупку \'Контурных линий\'</string>
</resources>

View file

@ -3840,4 +3840,5 @@
<string name="poi_recycling_small_electrical_appliances">Eletrodomèsticos minores</string>
<string name="poi_departures_board">Tabellone de sas tzucadas</string>
<string name="poi_drinking_water_refill">Ricàrriga de abba potàbile</string>
<string name="poi_fuel_lng">GNL (LNG)</string>
</resources>

View file

@ -3903,4 +3903,6 @@
<string name="sort_last_modified">Ùrtima modìfica</string>
<string name="sort_name_descending">Nùmene: Z A</string>
<string name="sort_name_ascending">Nùmene: A Z</string>
<string name="start_finish_icons">Iconas de incumintzu/fine</string>
<string name="contour_lines_thanks">Gràtzias pro àere comporadu \'Curvas de livellu\'</string>
</resources>

View file

@ -3274,9 +3274,9 @@
<string name="poi_denomination_mahayana">Mahájana</string>
<string name="poi_deadlock">Zamrznutí</string>
<string name="poi_information_trail_blaze">Turistická/trasová značka</string>
<string name="poi_memorial_koshinto"/>
<string name="poi_memorial_jizo"/>
<string name="poi_memorial_prasat"/>
<string name="poi_memorial_koshinto">Ko-Shintō</string>
<string name="poi_memorial_jizo">Jizō</string>
<string name="poi_memorial_prasat">Prasat</string>
<string name="poi_denomination_assemblies_of_god">Apoštolská cirkev</string>
<string name="poi_health_specialty_radiotheraphy_yes">Radiačná onkológia</string>
<string name="poi_hazard">Nebezpečenstvo</string>
@ -3567,4 +3567,89 @@
<string name="poi_traffic_signals_arrow">Šípka</string>
<string name="poi_traffic_signals_vibration">Vibrácie</string>
<string name="poi_fire_hydrant_pressure_filter">Tlak</string>
<string name="poi_fuel_lng">Skvapalnený zemný plyn</string>
<string name="poi_nuts">Obchod s orechmi</string>
<string name="poi_beehive">Včelí úľ</string>
<string name="poi_departures_board_timetable">Cestovný poriadok</string>
<string name="poi_departures_board_realtime">Odjazdy v reálnom čase</string>
<string name="poi_departures_board_delay">Intervaly</string>
<string name="poi_departures_board_yes">Áno</string>
<string name="poi_departures_board_no">Tabuľa odjazdov: nie</string>
<string name="poi_elevator">Výťah</string>
<string name="poi_city_block">Mestský blok</string>
<string name="poi_borough">Mestský obvod</string>
<string name="poi_traffic_signals_arrow_no">Šípka: nie</string>
<string name="poi_traffic_signals_arrow_yes">Nie</string>
<string name="poi_traffic_signals_vibration_yes">Áno</string>
<string name="poi_traffic_signals_vibration_no">Vibrovanie: nie</string>
<string name="poi_cash_withdrawal_foreign_cards">Výber hotovosti: cudzie karty</string>
<string name="poi_cash_withdrawal_purchase_minimum">Výber hotovosti: minimálny nákup</string>
<string name="poi_cash_withdrawal_fee_no">Poplatok za výber hotovosti: nie</string>
<string name="poi_cash_withdrawal_fee_yes">Poplatok za výber hotovosti: áno</string>
<string name="poi_cash_withdrawal_purchase_required_no">Výber hotovosti: nie je vyžadovaný nákup</string>
<string name="poi_cash_withdrawal_purchase_required_yes">Výber hotovosti: vyžadovaný nákup</string>
<string name="poi_cash_withdrawal_currency">Mena výberu hotovosti</string>
<string name="poi_cash_withdrawal_limit">Limit výberu hotovosti</string>
<string name="poi_cash_withdrawal_type_self_checkout">Typ výberu hotovosti: samoobslužný výber</string>
<string name="poi_cash_withdrawal_type_checkout">Typ výberu hotovosti: pri pokladni</string>
<string name="poi_cash_withdrawal_operator">Operátor výberu hotovosti</string>
<string name="poi_cash_withdrawal">Výber hotovosti</string>
<string name="poi_cash_withdrawal_yes">Výber hotovosti: áno</string>
<string name="poi_climbing_mixed_no">Zmiešané: nie</string>
<string name="poi_climbing_mixed_yes">Zmiešané: áno</string>
<string name="poi_climbing_ice_no">Ľad: nie</string>
<string name="poi_climbing_ice_yes">Ľad: áno</string>
<string name="poi_water_place_durability_emergency">Trvanlivosť vodného zdroja: núdzový</string>
<string name="poi_water_place_durability_durable">Trvanlivosť vodného zdroja: trvalý</string>
<string name="poi_office_midwife">Ordinácia pôrodnej asistentky</string>
<string name="poi_office_nursing_service">Opatrovateľská služba</string>
<string name="poi_office_psychologist">Ordinácia psychológa</string>
<string name="poi_office_healer">Ordinácia liečiteľa</string>
<string name="poi_office_therapist">Ordinácia terapeuta</string>
<string name="poi_office_physician">Ordinácia lekára</string>
<string name="poi_health_service_test_no">Zdravotná služba: testovanie: nie</string>
<string name="poi_health_service_test_yes">Zdravotná služba: testovanie: áno</string>
<string name="poi_health_service_support_no">Zdravotná služba: podpora: nie</string>
<string name="poi_health_service_support_yes">Zdravotná služba: podpora: áno</string>
<string name="poi_health_service_prevention_vaccination_no">Zdravotná služba: očkovanie: nie</string>
<string name="poi_health_service_prevention_vaccination_yes">Zdravotná služba: očkovanie: áno</string>
<string name="poi_health_service_prevention_no">Zdravotná služba: prevencia: nie</string>
<string name="poi_health_service_prevention_yes">Zdravotná služba: prevencia: áno</string>
<string name="poi_health_service_child_care_no">Zdravotná služba: starostlivosť o deti: nie</string>
<string name="poi_health_service_child_care_yes">Zdravotná služba: starostlivosť o deti: áno</string>
<string name="poi_health_service_examination_no">Zdravotná služba: vyšetrenie: nie</string>
<string name="poi_health_service_examination_yes">Zdravotná služba: vyšetrenie: áno</string>
<string name="poi_health_service_counselling_no">Zdravotná služba: poradenstvo: nie</string>
<string name="poi_health_service_counselling_yes">Zdravotná služba: poradenstvo: áno</string>
<string name="poi_health_service_nursing_yes">Zdravotná služba: opatrovateľstvo: áno</string>
<string name="poi_health_service_nursing_no">Zdravotná služba: opatrovateľstvo: nie</string>
<string name="poi_health_specialty_behavior_yes">Správanie</string>
<string name="poi_health_specialty_sports_medicine_yes">Športová medicína</string>
<string name="poi_recycling_small_electrical_appliances">Malé elektrické spotrebiče</string>
<string name="poi_departures_board">Tabuľa odjazdov/cestovný poriadok</string>
<string name="poi_drinking_water_refill">Doplnenie pitnej vody</string>
<string name="poi_osmand_fire_hydrant_pressure_suction">Nasávanie</string>
<string name="poi_osmand_fire_hydrant_pressure_pressurized">Pod tlakom</string>
<string name="poi_fire_hydrant_style_water_source_groundwater">Spodná voda</string>
<string name="poi_fire_hydrant_type_pipe">Potrubie</string>
<string name="poi_drinking_water_refill_network">Sieť doplnenia pitnej vody</string>
<string name="poi_drinking_water_refill_no">Doplnenie pitnej vody: nie</string>
<string name="poi_drinking_water_refill_yes">Áno</string>
<string name="poi_seamark_obstruction">Prekážka</string>
<string name="poi_seamark_water_level_below_mwl">Výška vody: pod strednou hladinou</string>
<string name="poi_seamark_water_level_above_mwl">Výška vody: nad strednou hladinou</string>
<string name="poi_seamark_water_level_covers">Výška vody: prekrýva</string>
<string name="poi_seamark_water_level_dry">Výška vody: suché</string>
<string name="poi_seamark_water_level_submerged">Výška vody: ponorené</string>
<string name="poi_seamark_water_level_part_submerged">Výška vody: čiastočne ponorené</string>
<string name="poi_tactile_paving_incorrect">Nesprávne</string>
<string name="poi_tactile_paving_primitive">Primitívne</string>
<string name="poi_tactile_paving_contrasted">Kontrastné</string>
<string name="poi_traffic_signals_sound_locate">Len keď je povolená chôdza</string>
<string name="poi_video_no">Nie</string>
<string name="poi_video_yes">Áno</string>
<string name="poi_booth">Typ búdky</string>
<string name="poi_covered_booth">Búdka</string>
<string name="poi_sms_no">Nie</string>
<string name="poi_sms_yes">Áno</string>
</resources>

View file

@ -224,7 +224,7 @@
<string name="button_upgrade_osmandplus">Aktualizovať OsmAnd+</string>
<string name="map_version_changed_info">Stiahnite novú verziu aplikácie, aby ste mohli použiť nové mapové súbory.</string>
<string name="poi_filter_nominatim">Online filter Nominatim</string>
<string name="search_position_current_location_search">Hľadám umiestnenie</string>
<string name="search_position_current_location_search">Hľadám polohu</string>
<string name="search_position_current_location_found">Moja poloha (nájdená)</string>
<string name="search_position_address">Adresa…</string>
<string name="search_position_favorites">Obľúbené miesta…</string>
@ -325,11 +325,11 @@
<string name="foot">ft</string>
<string name="mile_per_hour">mph</string>
<string name="mile">mi</string>
<string name="send_location_way_choose_title">Zdieľať umiestnenie cez</string>
<string name="send_location_way_choose_title">Zdieľať polohu cez</string>
<string name="send_location_sms_pattern">Pozícia: %1$s\n%2$s</string>
<string name="send_location_email_pattern">Na zobrazenie umiestnenia nasledujte webový odkaz %1$s alebo odkaz androidovského obsahu (intent link) %2$s</string>
<string name="send_location">Poslať umiestnenie</string>
<string name="context_menu_item_share_location">Zdieľať umiestnenie</string>
<string name="send_location">Poslať polohu</string>
<string name="context_menu_item_share_location">Zdieľať polohu</string>
<string name="add_waypoint_dialog_added">GPX bod (waypoint) \"{0}\" pridaný</string>
<string name="add_waypoint_dialog_title">Pridať waypoint do nahranej GPX stopy</string>
<string name="amenity_type_administrative">Administratíva</string>
@ -419,7 +419,7 @@
<string name="download_type_to_filter">sem zadajte čo chcete nájsť</string>
<string name="use_high_res_maps">Mapa s vysokým rozlíšením</string>
<string name="use_high_res_maps_descr">Nerozťahovať (a nerozmazať) mapové dlaždice na obrazovkách s vysokou hustotou bodov.</string>
<string name="unknown_location">Umiestnenie zatiaľ nenájdené.</string>
<string name="unknown_location">Poloha zatiaľ nezistená.</string>
<string name="context_menu_item_search_transport">Hľadať hromadnú dopravu</string>
<string name="transport_searching_transport">Hľadá sa preprava (bez cieľa):</string>
<string name="transport_searching_route">Hľadá sa preprava ({0} ako cieľ):</string>
@ -743,7 +743,7 @@
<string name="osmand_parking_add_event">Pridať pripomienku do aplikácie Kalendár</string>
<string name="osmand_parking_time_limit">Časovo obmedzené parkovanie</string>
<string name="osmand_parking_time_no_limit">Časovo neobmedzené parkovanie</string>
<string name="osmand_parking_position_description">Umiestnenie vášho zaparkovaného vozidla. %1$s</string>
<string name="osmand_parking_position_description">Poloha vášho zaparkovaného vozidla. %1$s</string>
<string name="osmand_parking_position_description_add">Vyzdvihnúť vozidlo o:</string>
<string name="osmand_parking_pm">popoludní</string>
<string name="osmand_parking_am">dopoludnia</string>
@ -754,7 +754,7 @@
<string name="context_menu_item_add_parking_point">Označiť ako parkovacie miesto</string>
<string name="context_menu_item_delete_parking_point">Odstrániť parkovaciu značku</string>
<string name="starting_point_too_far">Východzí bod je príliš ďaleko od najbližšej cesty.</string>
<string name="shared_location">Zdieľané umiestnenie</string>
<string name="shared_location">Zdieľaná poloha</string>
<string name="global_app_allocated_memory_descr">Pridelená pamäť %1$s MB (Android limit %2$s MB, Dalvik %3$s MB).</string>
<string name="global_app_allocated_memory">Pridelená pamäť</string>
<string name="native_app_allocated_memory_descr">Celková natívna pamäť pridelená aplikácii %1$s MB (Dalvik %2$s MB, iné %3$s MB).
@ -886,7 +886,7 @@
\n
\nGlobálne údaje (medzi 70° severne a 70° južne) sú založené na meraní SRTM (Shuttle Radar Topography Mission) a ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), zobrazovacieho nástroja na palube Terra, vlajkového satelitu NASA Earth Observing System. ASTER je kooperatívne úsilie medzi NASA, Japonským ministerstvom hospodárstva, obchodu a priemyslu (METI) a Japonských vesmírnych systémov (J-spacesystems).</string>
<string name="map_widget_distancemeasurement">Meranie vzdialenosti</string>
<string name="audionotes_location_not_defined">Stlačte \"Použiť umiestnenie…\" pre pridanie poznámky k polohe.</string>
<string name="audionotes_location_not_defined">Stlačte \"Použiť polohu…\" pre pridanie poznámky k polohe.</string>
<string name="map_widget_audionotes">Zvukové poznámky</string>
<string name="audionotes_plugin_description">Vytvárajte obrazové/zvukové/video poznámky počas výletu, buď tlačidlom na mape alebo v kontextovom menu polohy na mape.</string>
<string name="audionotes_plugin_name">Audio/video poznámky</string>
@ -1393,7 +1393,9 @@
\n
\nTento pohľad môže byť vypnutý jeho deaktivovaním tu alebo zmenou hodnoty v \"Štýl vykresľovania\" v \"Nastaviť mapu\".</string>
<string name="plugin_touringview_name">Cestovný mapový pohľad</string>
<string name="location_on_map">Umiestnenie:\n Šírka %1$s\n Dĺžka %2$s</string>
<string name="location_on_map">Poloha:
\n Šírka %1$s
\n Dĺžka %2$s</string>
<string name="watch">Zobraziť</string>
<string name="days_behind">dní pozadu</string>
<string name="rename_failed">Premenovanie zlyhalo.</string>
@ -2632,7 +2634,7 @@
<string name="touring_view_renderer">Cestovný pohľad</string>
<string name="nautical_renderer">Námorný</string>
<string name="copy_location_name">Kopírovať názov bodu/umiestnenia</string>
<string name="toast_empty_name_error">Nepomenované umiestnenie</string>
<string name="toast_empty_name_error">Nepomenované miesto</string>
<string name="show_closed_notes">Zobraziť uzavreté poznámky</string>
<string name="switch_osm_notes_visibility_desc">Zobraziť/skryť OSM poznámky na mape.</string>
<string name="gpx_file_desc">GPX - vhodné na export do JOSM a iných editorov OSM.</string>
@ -3890,16 +3892,18 @@
\n
\n • Zlepšená viditeľnosť bodov pre bicykle.
\n
\n • Stopy je teraz možné aktivovať, pre kontextové menu sú základnými údajmi.
\n • Stopy je teraz možné aktivovať a majú kontextové menu so základnými údajmi.
\n
\n • Zlepšený algoritmus vyhľadávania
\n
\n • Zlepšené možnosti nasledovania stopy v navigácii
\n
\n • Opravené problému s importom a exportom nastavení profilov
\n • Opravené problémy s importom a exportom nastavení profilov
\n
\n</string>
<string name="sort_last_modified">Naposledy zmenené</string>
<string name="sort_name_descending">Názov: Z A</string>
<string name="sort_name_ascending">Názov: A Z</string>
<string name="start_finish_icons">Ikony štartu/cieľa</string>
<string name="contour_lines_thanks">Ďakujeme za zakúpenie modulu \'Vrstevnice\'</string>
</resources>

View file

@ -45,7 +45,7 @@
<string name="poi_user_defined_other">Kullanıcı tanımlı</string>
<string name="poi_palaeontological_site">Paleontolojik alan</string>
<string name="poi_bakery">Fırın</string>
<string name="poi_alcohol">Likör dükkanı</string>
<string name="poi_alcohol">İçki dükkanı</string>
<string name="poi_cheese">Peynir dükkanı</string>
<string name="poi_chocolate">Çikolata dükkanı</string>
<string name="poi_coffee">Kahve dükkanı</string>
@ -326,7 +326,7 @@
<string name="poi_recycling_low_energy_bulbs">Düşük enerji Ampüller</string>
<string name="poi_recycling_fluorescent_tubes">Floresan tüpler</string>
<string name="poi_recycling_metal">Metal</string>
<string name="poi_recycling_electrical_items">Elektrik öğeleri</string>
<string name="poi_recycling_electrical_items">Elektrik ögeleri</string>
<string name="poi_recycling_white_goods">Beyaz eşya</string>
<string name="poi_recycling_cooking_oil">Yemeklik yağ</string>
<string name="poi_recycling_engine_oil">Motor yağı</string>
@ -362,7 +362,7 @@
<string name="poi_recycling_diapers">Çocuk bezi</string>
<string name="poi_recycling_car_batteries">Araba aküsü</string>
<string name="poi_recycling_cars">Arabalar</string>
<string name="poi_recycling_bicycles">Bisiklet</string>
<string name="poi_recycling_bicycles">Bisikletler</string>
<string name="poi_landfill">Depolama</string>
<string name="poi_waste_disposal">Çöp bertaraf</string>
<string name="poi_waste_basket">Çöp tenekesi</string>
@ -766,7 +766,7 @@
<string name="poi_craft_agricultural_engines">Tarımsal motorlar</string>
<string name="poi_craft_blacksmith">Demirci</string>
<string name="poi_craft_brewery">Bira fabrikası</string>
<string name="poi_craft_boatbuilder">Boat builder</string>
<string name="poi_craft_boatbuilder">Gemi yapımcısı</string>
<string name="poi_craft_bookbinder">Ciltçi</string>
<string name="poi_craft_carpenter">Marangoz</string>
<string name="poi_craft_carpet_layer">Halı satıcısı</string>
@ -866,7 +866,7 @@
<string name="poi_daymark">Gün işareti</string>
<string name="poi_distance_mark">Mesafe işareti</string>
<string name="poi_dry_dock">Havuz</string>
<string name="poi_dyke">Lezbiyen</string>
<string name="poi_dyke">Su seti</string>
<string name="poi_landmark">Simgesel Yapı</string>
<string name="poi_seamark_light">Deniz işareti, ışık</string>
<string name="poi_seamark_light_major">Deniz işareti, büyük ışık</string>
@ -1740,8 +1740,8 @@
<string name="poi_seamark_clearance_width">ıklık genişliği</string>
<string name="poi_payment_coins_0_5">0.5$ madeni para</string>
<string name="poi_service_dealer">Satıcı</string>
<string name="poi_service_repair">Onarım</string>
<string name="poi_service_repair_no">Onarım yok</string>
<string name="poi_service_repair">Tamir</string>
<string name="poi_service_repair_no">Tamir yok</string>
<string name="poi_service_electrical">Elektrikli araçların tamiri</string>
<string name="poi_motorcycle_repair">Motosiklet tamiri</string>
<string name="poi_self_service_yes">Evet</string>
@ -2043,8 +2043,8 @@
<string name="poi_service_bicycle_rental_no">Bisiklet kiralama: hayır</string>
<string name="poi_service_bicycle_pump_yes">Pompa</string>
<string name="poi_service_bicycle_pump_no">Bisiklet pompası: hayır</string>
<string name="poi_service_bicycle_diy_yes">Kendin-Yap onarım için araçlar</string>
<string name="poi_service_bicycle_diy_no">Kendin-Yap onarım için bisiklet araçları: hayır</string>
<string name="poi_service_bicycle_diy_yes">Kendin-Yap tamir için araçlar</string>
<string name="poi_service_bicycle_diy_no">Kendin-Yap tamir için bisiklet araçları: hayır</string>
<string name="poi_service_bicycle_cleaning_yes">Temizleme</string>
<string name="poi_service_bicycle_cleaning_no">Bisiklet temizleme: hayır</string>
<string name="poi_service_bicycle_chaintool_yes">Zincir aleti</string>
@ -2148,7 +2148,7 @@
<string name="poi_clothes_costumes">Kostüm</string>
<string name="poi_clothes_traditional">Geleneksel</string>
<string name="poi_clothes_suits">Takım elbise</string>
<string name="poi_clothes_maternity">Hamile</string>
<string name="poi_clothes_maternity">Hamilelik</string>
<string name="poi_clothes_vintage">Nostalji</string>
<string name="poi_clothes_oversize">Büyük beden</string>
<string name="poi_clothes_schoolwear">Okul</string>
@ -2201,8 +2201,8 @@
<string name="poi_caravans_no">Karavan: hayır</string>
<string name="poi_impromptu_yes">Hazırlıksız: evet</string>
<string name="poi_impromptu_no">Hazırlıksız: hayır</string>
<string name="poi_sanitary_dump_station_yes">Tuvalet atığı istasyonu: evet</string>
<string name="poi_sanitary_dump_station_no">Tuvalet atığı istasyonu: hayır</string>
<string name="poi_sanitary_dump_station_yes">Sıhhi atık boşaltma istasyonu: evet</string>
<string name="poi_sanitary_dump_station_no">Sıhhi atık boşaltma istasyonu: hayır</string>
<string name="poi_power_supply_yes">Evet</string>
<string name="poi_power_supply_no">Güç kaynağı: hayır</string>
<string name="poi_power_supply_cee_17_blue">Güç kaynağı (soket): CEE 17 mavi</string>
@ -2443,4 +2443,476 @@
<string name="poi_historic_railway_station">Tarihi tren istasyonu</string>
<string name="poi_historic_farm">Tarihi çiftlik</string>
<string name="poi_pa">Pa (müstahkem maori yerleşimi)</string>
<string name="poi_futsal">Futsal (salon futbolu)</string>
<string name="poi_atm_no">ATM: hayır</string>
<string name="poi_atm_yes">ATM: evet</string>
<string name="poi_boxing">Boks</string>
<string name="poi_lacrosse">Lakros</string>
<string name="poi_shuffleboard">Disk iteleme oyunu</string>
<string name="poi_squash">Squash (duvar tenisi)</string>
<string name="poi_rc_car">Uzaktan kumandalı araba yarışı</string>
<string name="poi_disc_golf">Disk golf</string>
<string name="poi_judo">Judo</string>
<string name="poi_badminton">Badminton</string>
<string name="poi_karting">Karting</string>
<string name="poi_netball">Netbol</string>
<string name="poi_running">Koşma</string>
<string name="poi_gaelic_games">Gal oyunları</string>
<string name="poi_dojo">Dojo</string>
<string name="poi_official_name">Resmi adı</string>
<string name="poi_parking_carports">Araç park çatısı</string>
<string name="poi_parking_garage_boxes">Garaj bölmeleri</string>
<string name="poi_parking_surface">Tür: yüzey</string>
<string name="poi_water_heater_no">Su ısıtıcısı: hayır</string>
<string name="poi_water_heater_yes">Su ısıtıcısı: evet</string>
<string name="poi_microwave_oven_no">Mikrodalga fırın: hayır</string>
<string name="poi_microwave_oven_yes">Mikrodalga fırın: evet</string>
<string name="poi_billiards">Bilardo</string>
<string name="poi_bathing_no">Yüzme: hayır</string>
<string name="poi_bathing_yes">Yüzme: evet</string>
<string name="poi_boat_storage">Tekne depolama</string>
<string name="poi_ref">Referans numarası</string>
<string name="poi_tunnel_ref">Tünel numarası</string>
<string name="poi_bridge_ref">Köprü numarası</string>
<string name="poi_conveying_yes">Taşıma: evet</string>
<string name="poi_aerialway_length">Uzunluk</string>
<string name="poi_fireworks">Havai fişek mağazası</string>
<string name="poi_craft_electronics_repair">Elektronik tamiri</string>
<string name="poi_hackerspace">Hackerspace</string>
<string name="poi_fitness_station">Fitness istasyonu</string>
<string name="poi_building_type_pyramid">Bina türü: piramit</string>
<string name="poi_health_specialty_palliative_medicine_yes">Palyatif tıp</string>
<string name="poi_health_specialty_behavior_yes">Davranış</string>
<string name="poi_health_specialty_depth_psychology_yes">Derinlik psikolojisi</string>
<string name="poi_health_specialty_naturopathy_yes">Naturopati</string>
<string name="poi_health_specialty_chiropractic_yes">Kayropraktik</string>
<string name="poi_health_specialty_herbalism_yes">Bitkisel tıp</string>
<string name="poi_health_specialty_reiki_yes">Reiki</string>
<string name="poi_health_specialty_traditional_chinese_medicine_yes">Geleneksel Çin tıbbı</string>
<string name="poi_health_specialty_homeopathy_yes">Homeopati</string>
<string name="poi_health_specialty_acupuncture_yes">Akupunktur</string>
<string name="poi_health_specialty_adult_psychiatry_yes">Yetişkin psikiyatrisi</string>
<string name="poi_health_specialty_podology_yes">Podoloji</string>
<string name="poi_health_specialty_sports_medicine_yes">Spor hekimliği</string>
<string name="poi_health_specialty_manual_therapy_yes">Manuel terapi</string>
<string name="poi_health_specialty_speech_therapy_yes">Konuşma terapisi</string>
<string name="poi_health_specialty_clinical_pathology_yes">Klinik patoloji</string>
<string name="poi_health_specialty_optometry_yes">Optometri</string>
<string name="poi_health_specialty_addiction_medicine_yes">Bağımlılık tedavisi</string>
<string name="poi_health_specialty_obstetrics_caesarean_section_no">Sağlık uzmanlığı: obstetrik (sezaryen): hayır</string>
<string name="poi_health_specialty_obstetrics_caesarean_section_yes">Obstetrik (sezaryen)</string>
<string name="poi_health_specialty_social_paediatrics_no">Sağlık uzmanlığı: sosyal pediatri: hayır</string>
<string name="poi_health_specialty_social_paediatrics_yes">Sosyal pediatri</string>
<string name="poi_health_specialty_obstetrics_antenatal_no">Sağlık uzmanlığı: obstetrik (doğum öncesi): hayır</string>
<string name="poi_health_specialty_obstetrics_antenatal_yes">Obstetrik (doğum öncesi)</string>
<string name="poi_health_specialty_obstetrics_postnatal_no">Sağlık uzmanlığı: obstetrik (doğum sonrası): hayır</string>
<string name="poi_health_specialty_obstetrics_postnatal_yes">Obstetrik (doğum sonrası)</string>
<string name="poi_health_specialty_tropical_medicine_no">Sağlık uzmanlığı: tropikal tıp: hayır</string>
<string name="poi_health_specialty_tropical_medicine_yes">Tropikal tıp</string>
<string name="poi_health_specialty_oncology_yes">Onkoloji</string>
<string name="poi_health_specialty_pathology_yes">Patolojik anatomi</string>
<string name="poi_health_specialty_nuclear_medicine_yes">Nükleer tıp</string>
<string name="poi_health_specialty_endocrinology_yes">Endokrinoloji</string>
<string name="poi_health_specialty_neuropsychiatry_yes">Nöropsikiyatri</string>
<string name="poi_health_specialty_neurosurgery_yes">Beyin ve sinir cerrahisi</string>
<string name="poi_health_specialty_nephrology_yes">Nefroloji (böbrek hastalıkları)</string>
<string name="poi_health_specialty_dentistry_yes">Diş hekimliği</string>
<string name="poi_health_specialty_gastroenterology_yes">Gastroenteroloji</string>
<string name="poi_health_specialty_diagnostic_radiology_yes">Tıbbi görüntüleme</string>
<string name="poi_health_specialty_maxillofacial_surgery_yes">Çene-yüz cerrahisi</string>
<string name="poi_health_specialty_physiatry_yes">Fiziksel tıp ve rehabilitasyon</string>
<string name="poi_health_specialty_child_psychiatry_yes">Çocuk psikiyatrisi</string>
<string name="poi_health_specialty_occupational_yes">İş terapisi</string>
<string name="poi_health_specialty_biochemistry_yes">Biyokimya</string>
<string name="poi_health_specialty_physiotherapy_yes">Fizyoterapi</string>
<string name="poi_health_specialty_orthodontics_yes">Ortodonti</string>
<string name="poi_health_specialty_plastic_surgery_yes">Plastik cerrahi</string>
<string name="poi_health_specialty_emergency_medicine_no">Sağlık uzmanlığı: kaza ve acil tıp: hayır</string>
<string name="poi_health_specialty_emergency_medicine_yes">Kaza ve acil tıp</string>
<string name="poi_health_specialty_maternity_yes">Hamilelik</string>
<string name="poi_health_specialty_dental_oral_maxillo_facial_surgery_yes">Diş, ağız ve çene-yüz cerrahisi</string>
<string name="poi_health_specialty_pulmonology_yes">Göğüs hastalıkları</string>
<string name="poi_health_specialty_anaesthetics_yes">Anesteziyoloji</string>
<string name="poi_health_specialty_osteopathy_yes">Osteopati</string>
<string name="poi_health_specialty_biology_yes">Klinik biyoloji</string>
<string name="poi_health_specialty_trauma_yes">Travmatoloji</string>
<string name="poi_health_specialty_cardiology_yes">Kardiyoloji</string>
<string name="poi_health_specialty_dermatovenereology_yes">Dermato-venereoloji</string>
<string name="poi_health_specialty_neurology_yes">Nöroloji</string>
<string name="poi_health_specialty_psychiatry_yes">Psikiyatri</string>
<string name="poi_health_specialty_radiotherapy_yes">Radyoterapi</string>
<string name="poi_health_specialty_radiology_yes">Radyoloji</string>
<string name="poi_health_specialty_surgery_yes">Genel cerrahi</string>
<string name="poi_health_specialty_urology_yes">Üroloji</string>
<string name="poi_health_specialty_dermatology_yes">Dermatoloji</string>
<string name="poi_health_specialty_paediatrics_no">Sağlık uzmanlığı: pediatri: hayır</string>
<string name="poi_health_specialty_paediatrics_yes">Pediatri</string>
<string name="poi_health_specialty_otolaryngology_yes">Kulak burun boğaz</string>
<string name="poi_health_specialty_orthopaedics_yes">Ortopedi</string>
<string name="poi_health_specialty_internal_medicine_yes">İç hastalıkları</string>
<string name="poi_health_specialty_gynaecology_yes">Jinekoloji</string>
<string name="poi_health_specialty_ophthalmology_yes">Oftalmoloji</string>
<string name="poi_health_specialty_general_yes">Pratisyen doktor</string>
<string name="poi_cargo_hgv">ır yük araçları</string>
<string name="poi_cargo_bicycle">Bisikletler</string>
<string name="poi_cargo_container">Konteynerler</string>
<string name="poi_cargo_vehicle">Araçlar</string>
<string name="poi_cargo_passengers">Yolcular</string>
<string name="poi_elevator">Apartman</string>
<string name="poi_traffic_signals_arrow_no">Ok: hayır</string>
<string name="poi_traffic_signals_arrow_yes">Evet</string>
<string name="poi_traffic_signals_vibration_yes">Evet</string>
<string name="poi_traffic_signals_vibration_no">Titreşim: hayır</string>
<string name="poi_video_yes">Evet</string>
<string name="poi_sms_yes">Evet</string>
<string name="poi_bath_open_air_no">Hayır</string>
<string name="poi_bath_open_air_yes">Evet</string>
<string name="poi_bath_type_lake">Göl</string>
<string name="poi_bath_type_river">Irmak</string>
<string name="poi_bath_type_hammam">Hamam</string>
<string name="poi_defibrillator_location">Konum</string>
<string name="poi_park_ride_ferry">Feribot</string>
<string name="poi_park_ride_tram">Tramvay</string>
<string name="poi_park_ride_bus">Otobüs</string>
<string name="poi_park_ride_train">Tren</string>
<string name="poi_park_ride_yes">Evet</string>
<string name="poi_books_children">Çocuk</string>
<string name="poi_books_academic">Akademik</string>
<string name="poi_books_religion">Din</string>
<string name="poi_blood_donation">Kan bağışı</string>
<string name="poi_shop_wholesale">Toptancı</string>
<string name="poi_bulk_purchase_only">Yalnızca</string>
<string name="poi_bulk_purchase_yes">Evet</string>
<string name="poi_shoe_repair">Ayakkabı tamiri</string>
<string name="poi_rock">Kaya</string>
<string name="poi_service_vehicle_wheels_yes">Tekerlek</string>
<string name="poi_service_vehicle_car_repair_yes">Araba tamiri</string>
<string name="poi_meadow_agricultural">Tür: tarım</string>
<string name="poi_ref_post">Posta kodu</string>
<string name="poi_post_housenumber">Ev numarası</string>
<string name="poi_letter_box">Posta kutusu</string>
<string name="poi_parking_fee">Park ücreti</string>
<string name="poi_parking_fee_no">Park ücreti: hayır</string>
<string name="poi_parking_fee_yes">Park ücreti: evet</string>
<string name="poi_truck_no">Tır: hayır</string>
<string name="poi_truck_yes">Tır: evet</string>
<string name="poi_bicycle_no">Bisiklet: hayır</string>
<string name="poi_bicycle_yes">Bisiklet: evet</string>
<string name="poi_car_no">Araba: hayır</string>
<string name="poi_car_yes">Araba: evet</string>
<string name="poi_operational_status_restricted">Kısıtlı</string>
<string name="poi_operational_status_closed">Kapalı</string>
<string name="poi_operational_status_open">ık</string>
<string name="poi_visibility_street">Görünürlük: sokak</string>
<string name="poi_visibility_house">Görünürlük: ev</string>
<string name="poi_location_wall">Konum: duvar</string>
<string name="poi_location_overground">Konum: yerüstü</string>
<string name="poi_location_underwater">Konum: sualtı</string>
<string name="poi_location_underground">Konum: yeraltı</string>
<string name="poi_surface_metal_grid">Metal ızgara</string>
<string name="poi_surface_artificial_turf">Yapay çimen</string>
<string name="poi_surface_clay">Kil</string>
<string name="poi_government_treasury">Hazine</string>
<string name="poi_government_public_service">Kamu hizmeti</string>
<string name="poi_government_ministry">Bakanlık</string>
<string name="poi_government_archive">Arşiv</string>
<string name="poi_network"></string>
<string name="poi_beds">Yatak</string>
<string name="poi_direction_all">Yön: her</string>
<string name="poi_direction_exit">Yön: çıkış</string>
<string name="poi_direction_entrance">Yön: giriş</string>
<string name="poi_direction_down">Yön: aşağı</string>
<string name="poi_direction_up">Yön: yukarı</string>
<string name="poi_direction_anticlockwise">Yön: saat yönünün tersi</string>
<string name="poi_direction_clockwise">Yön: saat yönü</string>
<string name="poi_direction_backward">Yön: geri</string>
<string name="poi_direction_forward">Yön: ileri</string>
<string name="poi_direction_nnw">Yön: kuzey-kuzeybatı</string>
<string name="poi_direction_nw">Yön: kuzeybatı</string>
<string name="poi_direction_wnw">Yön: batı-kuzeybatı</string>
<string name="poi_direction_w">Yön: batı</string>
<string name="poi_direction_wsw">Yön: batı-güneybatı</string>
<string name="poi_direction_sw">Yön: güneybatı</string>
<string name="poi_direction_ssw">Yön: güney-güneybatı</string>
<string name="poi_direction_s">Gün: güney</string>
<string name="poi_direction_sse">Yön güney-güneydoğu</string>
<string name="poi_direction_se">Yön: güneydoğu</string>
<string name="poi_direction_ese">Yön: doğu-güneydoğu</string>
<string name="poi_direction_e">Yön: doğu</string>
<string name="poi_direction_ene">Yön: doğu-kuzeydoğu</string>
<string name="poi_direction_ne">Yön: kuzeydoğu</string>
<string name="poi_direction_nne">Yön: kuzey-kuzeydoğu</string>
<string name="poi_direction_n">Yön: kuzey</string>
<string name="poi_zoo_reptile">Sürüngen</string>
<string name="poi_zoo_aviary">Kuşhane</string>
<string name="poi_zoo_birds">Kuşlar</string>
<string name="poi_electronics_repair_tv">Elektronik tamir: televizyon</string>
<string name="poi_electronics_repair_phone">Elektronik tamir: telefon</string>
<string name="poi_electronics_repair_computer">Elektronik tamir: bilgisayar</string>
<string name="poi_drink_wine_retail">Şarap: perakende</string>
<string name="poi_drink_wine_yes">Şarap: evet</string>
<string name="poi_fast_food_cafeteria">Evet</string>
<string name="poi_locksmith">Çilingir</string>
<string name="poi_electrical">Elektrik mağazası</string>
<string name="poi_cuisine_tibetan">Tibet</string>
<string name="poi_cuisine_bulgarian">Bulgar</string>
<string name="poi_cuisine_jewish">Yahudi</string>
<string name="poi_cuisine_senegalese">Senegal</string>
<string name="poi_cuisine_egyptian">Mısır</string>
<string name="poi_cuisine_australian">Avustralya</string>
<string name="poi_cuisine_syrian">Suriye</string>
<string name="poi_cuisine_dutch">Hollanda</string>
<string name="poi_cuisine_taiwanese">Tayvan</string>
<string name="poi_cuisine_pakistani">Pakistan</string>
<string name="poi_cuisine_english">İngiliz</string>
<string name="poi_cuisine_hawaiian">Hawaii</string>
<string name="poi_cuisine_armenian">Ermeni</string>
<string name="poi_cuisine_jamaican">Jamaika</string>
<string name="poi_cuisine_swedish">İsveç</string>
<string name="poi_cuisine_cantonese">Kanton</string>
<string name="poi_cuisine_swiss">İsviçre</string>
<string name="poi_cuisine_basque">Bask</string>
<string name="poi_cuisine_belgian">Belçika</string>
<string name="poi_cuisine_afghan">Afgan</string>
<string name="poi_cuisine_ukrainian">Ukrayna</string>
<string name="poi_cuisine_middle_eastern">Orta Doğu</string>
<string name="poi_cuisine_mongolian">Moğol</string>
<string name="poi_cuisine_nepalese">Nepal</string>
<string name="poi_cuisine_latin_american">Latin Amerika</string>
<string name="poi_cuisine_british">Britanya</string>
<string name="poi_cuisine_cuban">Küba</string>
<string name="poi_cuisine_czech">Çek</string>
<string name="poi_cuisine_uzbek">Özbek</string>
<string name="poi_cuisine_european">Avrupa</string>
<string name="poi_cuisine_lao">Lao</string>
<string name="poi_cuisine_hungarian">Macar</string>
<string name="poi_cuisine_ethiopian">Etiyopya</string>
<string name="poi_cuisine_irish">İrlanda</string>
<string name="poi_cuisine_malaysian">Malezya</string>
<string name="poi_cuisine_austrian">Avusturya</string>
<string name="poi_cuisine_moroccan">Fas</string>
<string name="poi_cuisine_malagasy">Madagaskar</string>
<string name="poi_cuisine_persian">Fars</string>
<string name="poi_cuisine_bolivian">Bolivya</string>
<string name="poi_cuisine_croatian">Hırvat</string>
<string name="poi_cuisine_peruvian">Peru</string>
<string name="poi_cuisine_balkan">Balkan</string>
<string name="poi_cuisine_argentinian">Arjantin</string>
<string name="poi_cuisine_caribbean">Karayip</string>
<string name="poi_cuisine_african">Afrika</string>
<string name="poi_cuisine_indonesian">Endonez</string>
<string name="poi_cuisine_danish">Dan</string>
<string name="poi_cuisine_arab">Arap</string>
<string name="poi_cuisine_brazilian">Brezilya</string>
<string name="poi_cuisine_polish">Leh</string>
<string name="poi_cuisine_georgian">Gürcü</string>
<string name="poi_cuisine_portuguese">Portekiz</string>
<string name="poi_cuisine_filipino">Filipin</string>
<string name="poi_cuisine_russian">Rus</string>
<string name="poi_cuisine_lebanese">Lübnan</string>
<string name="poi_cuisine_bavarian">Bavyera</string>
<string name="poi_cuisine_mediterranean">Akdeniz</string>
<string name="poi_cuisine_korean">Kore</string>
<string name="poi_cuisine_vietnamese">Vietnam</string>
<string name="poi_cuisine_spanish">İspanyol</string>
<string name="poi_cuisine_turkish">Türk</string>
<string name="poi_cuisine_international">Uluslararası</string>
<string name="poi_cuisine_thai">Tay</string>
<string name="poi_cuisine_greek">Yunan</string>
<string name="poi_cuisine_french">Fransız</string>
<string name="poi_cuisine_asian">Asya</string>
<string name="poi_cuisine_american">Amerikan</string>
<string name="poi_cuisine_indian">Hint</string>
<string name="poi_cuisine_german">Alman</string>
<string name="poi_cuisine_japanese">Japon</string>
<string name="poi_cuisine_mexican">Meksika</string>
<string name="poi_cuisine_chinese">Çin</string>
<string name="poi_cuisine_italian">İtalyan</string>
<string name="poi_cuisine_regional">Bölgesel</string>
<string name="poi_cuisine_potato">Patates</string>
<string name="poi_cuisine_wine">Şarap</string>
<string name="poi_cuisine_chocolate">Çikolata</string>
<string name="poi_cuisine_wings">Kanat</string>
<string name="poi_cuisine_meat">Et</string>
<string name="poi_cuisine_yogurt">Yoğurt</string>
<string name="poi_cuisine_dessert">Tatlı</string>
<string name="poi_cuisine_salad">Salata</string>
<string name="poi_cuisine_soup">Çorba</string>
<string name="poi_cuisine_tea">Çay</string>
<string name="poi_cuisine_pasta">Makarna</string>
<string name="poi_cuisine_steak">Biftek</string>
<string name="poi_cuisine_breakfast">Kahvaltı</string>
<string name="poi_cuisine_barbecue">Mangal</string>
<string name="poi_cuisine_sushi">Suşi</string>
<string name="poi_cuisine_ice_cream">Dondurma</string>
<string name="poi_cuisine_chicken">Tavuk</string>
<string name="poi_cuisine_doner">Döner</string>
<string name="poi_cuisine_kebab">Kebap</string>
<string name="poi_cuisine_sandwich">Sandviç</string>
<string name="poi_cuisine_pizza">Pizza</string>
<string name="poi_cuisine_burger">Hamburger</string>
<string name="poi_cuisine_coffee">Kahve</string>
<string name="poi_xmas_tree">Noel ağacı</string>
<string name="poi_xmas">Noel</string>
<string name="poi_wiki_link">Vikipedi</string>
<string name="poi_length">Uzunluk</string>
<string name="poi_water_tank">Su deposu</string>
<string name="poi_diplomatic_delegation">Delegasyon</string>
<string name="poi_diplomatic_consulate_general">Başkonsolosluk</string>
<string name="poi_diplomatic_consulate">Konsolosluk</string>
<string name="poi_organic_only">Yalnızca</string>
<string name="poi_organic_yes">Evet</string>
<string name="poi_aquaculture_mussels">Su kültürü: midye</string>
<string name="poi_aquaculture_fish">Su kültürü: balık</string>
<string name="poi_aquaculture_shrimp">Su kültürü: karides</string>
<string name="poi_aquaculture">Su kültürü</string>
<string name="poi_thermometer_no">Termometre: hayır</string>
<string name="poi_thermometer_yes">Termometre</string>
<string name="poi_barometer_no">Barometre: hayır</string>
<string name="poi_barometer_yes">Barometre</string>
<string name="poi_telescope">Teleskop</string>
<string name="poi_aerodrome_type_private">Özel</string>
<string name="poi_aerodrome_type_military_public">Askeri/kamusal</string>
<string name="poi_aerodrome_type_military">Askeri</string>
<string name="poi_aerodrome_type_public">Kamusal</string>
<string name="poi_aerodrome_type_regional">Bölgesel</string>
<string name="poi_aerodrome_type_international">Uluslararası</string>
<string name="poi_summer_camp">Yaz kampı</string>
<string name="poi_salt_no">Tuz: hayır</string>
<string name="poi_salt_yes">Tuz</string>
<string name="poi_depth">Derinlik</string>
<string name="poi_disease_autism_no">Otizm: hayır</string>
<string name="poi_disease_autism_yes">Otizm: evet</string>
<string name="poi_disease_ebola_no">Ebola: hayır</string>
<string name="poi_disease_ebola_yes">Ebola: evet</string>
<string name="poi_disease_malaria_no">Sıtma: hayır</string>
<string name="poi_disease_malaria_yes">Sıtma: evet</string>
<string name="poi_home_visit_yes">Evet</string>
<string name="poi_emergency_no">Acil: hayır</string>
<string name="poi_emergency_yes">Acil: evet</string>
<string name="poi_counselling_no">Danışma: hayır</string>
<string name="poi_counselling_yes">Danışma: evet</string>
<string name="poi_capacity_beds">Kapasite (yatak)</string>
<string name="poi_counselling_type_homeless_no">Danışma (evsiz): hayır</string>
<string name="poi_counselling_type_homeless_yes">Danışma (evsiz): evet</string>
<string name="poi_counselling_type_family_no">Danışma (aile): hayır</string>
<string name="poi_counselling_type_family_yes">Danışma (aile): evet</string>
<string name="poi_counselling_type_drugs_no">Danışma (uyuşturucu): hayır</string>
<string name="poi_counselling_type_drugs_yes">Danışma (uyuşturucu): evet</string>
<string name="poi_counselling_type_addiction_no">Danışma (bağımlılık): evet</string>
<string name="poi_counselling_type_addiction_yes">Danışma (bağımlılık): evet</string>
<string name="poi_health_person_type_psychologist">Sağlık çalışanının işi: psikolog</string>
<string name="poi_health_amenity_type_first_aid_kit">İlk yardım çantası</string>
<string name="poi_fire_hydrant_type_wall">Duvar</string>
<string name="poi_fire_hydrant_type_underground">Yeraltı</string>
<string name="poi_health_facility_type_field_hospital">Sağlık merkezi türü: sahra hastanesi</string>
<string name="poi_health_facility_type_laboratory">Sağlık merkezi türü: laboratuvar</string>
<string name="poi_health_service_prevention_vaccination_no">Sağlık hizmeti: aşılama: hayır</string>
<string name="poi_health_service_prevention_vaccination_yes">Sağlık hizmeti: aşılama: evet</string>
<string name="poi_health_service_counselling_no">Sağlık hizmeti: danışma: hayır</string>
<string name="poi_health_service_counselling_yes">Sağlık hizmeti: danışma: evet</string>
<string name="poi_health_service_nursing_no">Sağlık hizmeti: hasta bakıcılık: hayır</string>
<string name="poi_health_service_nursing_yes">Sağlık hizmeti: hasta bakıcılık: evet</string>
<string name="poi_medical_system_tibetan_yes">Geleneksel Tibet</string>
<string name="poi_medical_system_mongolian_yes">Geleneksel Moğol</string>
<string name="poi_medical_system_chinese_yes">Geleneksel Çin</string>
<string name="poi_medical_system_western_yes">Batılı</string>
<string name="poi_tanning_salon">Solaryum</string>
<string name="poi_water_tap">Çeşme</string>
<string name="poi_vacuum_cleaner_no">Elektrikli süpürtge: hayır</string>
<string name="poi_amenity_vacuum_cleaner">Elektrikli süpürge</string>
<string name="poi_vacuum_cleaner_yes">Evet</string>
<string name="poi_car_wash_yes">Evet</string>
<string name="poi_compressed_air_yes">Evet</string>
<string name="poi_addr_housename">Ev adı</string>
<string name="poi_nuclear_explosion_time_utc">Patlama zamanı (UTC)</string>
<string name="poi_nuclear_explosion_date_utc">Patlama tarihi (UTC)</string>
<string name="poi_nuclear_explosion_type_underground">Patlama türü: yeraltı</string>
<string name="poi_nuclear_explosion_type_underground_tunnel">Patlama türü: yeraltı, tünel</string>
<string name="poi_nuclear_explosion_country">Patlama: ülke</string>
<string name="poi_protection_object_water">Korunan nesne: su</string>
<string name="poi_protection_object_habitat">Korunan nesne: yaşam alanı</string>
<string name="poi_protection_object_nature">Korunan nesne: doğa</string>
<string name="poi_protection_object_historic">Korunan nesne: tarihi</string>
<string name="poi_protected_area">Koruma alanı</string>
<string name="poi_construction_yes">Yapım aşamasında</string>
<string name="poi_cuisine_fast_food">Fast food</string>
<string name="poi_cuisine_pancake">Pankek</string>
<string name="poi_cuisine_cake">Pasta</string>
<string name="poi_cuisine_grill">Izgara</string>
<string name="poi_cuisine_sausage">Sosis</string>
<string name="poi_cuisine_hotdog">Sosisli sandviç</string>
<string name="poi_cuisine_curry">Köri</string>
<string name="poi_cuisine_crepe">Krep</string>
<string name="poi_cuisine_ramen">Erişte (ramen)</string>
<string name="poi_cuisine_donut">Çörek (donut)</string>
<string name="poi_cuisine_noodle">Erişte (noodle)</string>
<string name="poi_cuisine_seafood">Deniz ürünleri</string>
<string name="poi_cuisine_fish_and_chips">Balık ve patates kızartması</string>
<string name="poi_xmas_url">Noel: web sitesi</string>
<string name="poi_xmas_location">Noel: konum</string>
<string name="poi_xmas_opening_hours">Noel: çalışma saatleri</string>
<string name="poi_xmas_note">Noel: not</string>
<string name="poi_xmas_day_date">Noel: etkinlik dönemi</string>
<string name="poi_xmas_shop_christmas_tree">Ağaç dükkanı</string>
<string name="poi_xmas_shop">Noel dükkanı</string>
<string name="poi_xmas_pyramid">Noel piramidi</string>
<string name="poi_xmas_market">Noel marketi</string>
<string name="poi_xmas_event">Noel etkinliği</string>
<string name="poi_passenger_information_display_no">Yolcu bilgilendirme ekranı: hayır</string>
<string name="poi_passenger_information_display_yes">Yolcu bilgilendirme ekranı: evet</string>
<string name="poi_hygrometer_no">Higrometre: hayır</string>
<string name="poi_hygrometer_yes">Higrometre</string>
<string name="poi_observatory_type_espionage">Kullanım: casusluk</string>
<string name="poi_telescope_usage_research">Kullanım: araştırma</string>
<string name="poi_telescope_usage_espionage">Kullanım: casusluk</string>
<string name="poi_telescope_usage_education">Kullanım: eğitim</string>
<string name="poi_home_visit_no">Ev ziyareti: hayır</string>
<string name="poi_medical_system_unani_yes">Yunani</string>
<string name="poi_medical_system_sidda_yes">Sidda</string>
<string name="poi_medical_system_kampo_yes">Kampo</string>
<string name="poi_medical_system_ayurveeda_yes">Ayurveda</string>
<string name="poi_sanitary_dump_station">Sıhhi atık boşaltma istasyonu</string>
<string name="poi_fair_trade_only">Yalnızca adil ticaret ürünleri</string>
<string name="poi_fair_trade_no">Adil ticaret: hayır</string>
<string name="poi_fair_trade_yes">Adil ticaret: evet</string>
<string name="poi_compressed_air_no">Basınçlı hava: hayır</string>
<string name="poi_plant_nursery">Bitki fidanlığı</string>
<string name="poi_boat_motorboat_rental_no">Motorlu tekneler: hayır</string>
<string name="poi_boat_motorboat_rental_yes">Motorlu tekneler: evet</string>
<string name="poi_boat_rental">Tekne kiralama</string>
<string name="poi_location_entrance">Konum: giriş</string>
<string name="poi_forestry_allotment">Yön tabelası: orman tahsisi</string>
<string name="poi_forestry_compartment">Yön tabelası: orman bölmesi</string>
<string name="poi_motorcycle_clothes_no">Motosiklet giysileri: hayır</string>
<string name="poi_motorcycle_clothes_yes">Motosiklet giysileri</string>
<string name="poi_motorcycle_tyres_no">Lastik: hayır</string>
<string name="poi_motorcycle_tyres_yes">Lastik</string>
<string name="poi_motorcycle_parts_no">Yedek parça: hayır</string>
<string name="poi_motorcycle_parts_yes">Yedek parça</string>
<string name="poi_motorcycle_repair_no">Tamir: hayır</string>
<string name="poi_motorcycle_repair_yes">Tamir</string>
<string name="poi_motorcycle_rental_no">Kiralama: hayır</string>
<string name="poi_motorcycle_rental_yes">Kiralama</string>
<string name="poi_music_school">Müzik okulu</string>
<string name="poi_drink_wine_served">Şarap: servis</string>
<string name="poi_party">Parti malzemeleri</string>
<string name="poi_cuisine_cajun">Cajun</string>
<string name="poi_cuisine_tex_mex">Tex-mex</string>
<string name="poi_cuisine_baguette">Baget</string>
<string name="poi_cuisine_waffle">Waffle</string>
<string name="poi_cuisine_crepes">Krep</string>
<string name="poi_cuisine_falafel">Falafel</string>
<string name="poi_cuisine_tacos">Taco</string>
<string name="poi_cuisine_canteen">Kantin</string>
<string name="poi_cuisine_savory_pancakes">Tuzlu krep</string>
<string name="poi_cuisine_fried_chicken">Kızarmış tavuk</string>
<string name="poi_cuisine_couscous">Kuskus</string>
<string name="poi_cuisine_bakery">Fırın</string>
<string name="poi_cuisine_bistro">Bistro</string>
<string name="poi_cuisine_fried_food">Kızarmış yiyecekler</string>
<string name="poi_cuisine_frozen_yogurt">Dondurulmuş yoğurt</string>
<string name="poi_cuisine_deli">Şarküteri</string>
<string name="poi_cuisine_pie">Turta</string>
<string name="poi_cuisine_tea_shop">Çay dükkanı</string>
</resources>

View file

@ -892,7 +892,7 @@
<string name="only_show">Güzergahı göster</string>
<string name="follow">Yönlendirmeyi başlatın</string>
<string name="mark_final_location_first">Lütfen önce hedefi ayarlayın</string>
<string name="opening_hours">ılış saatleri</string>
<string name="opening_hours">Çalışma saatleri</string>
<string name="auth_failed">Yetkilendirme başarısız</string>
<string name="loading_streets_buildings">Sokaklar/binalar yükleniyor…</string>
<string name="loading_streets">Sokaklar yükleniyor…</string>
@ -1374,7 +1374,7 @@
<string name="opening_at">ılış</string>
<string name="closing_at">Kapanış</string>
<string name="contact_info">İletişim Bilgileri</string>
<string name="add_opening_hours">ılış saatleri ekle</string>
<string name="add_opening_hours">Çalışma saatleri ekle</string>
<string name="poi_dialog_poi_type">POI Türü</string>
<string name="number_of_rows_in_dash">Dash %1$s satır sayısı</string>
<string name="please_specify_poi_type">POI türü belirtiniz.</string>
@ -3859,4 +3859,6 @@
<string name="sort_last_modified">Son değiştirme</string>
<string name="sort_name_descending">İsim: Z A</string>
<string name="sort_name_ascending">İsim: A Z</string>
<string name="start_finish_icons">Başlangıç/bitiş simgeleri</string>
<string name="contour_lines_thanks">\'Eş yükselti eğrileri\'ni satın aldığınız için teşekkürler</string>
</resources>

View file

@ -3832,4 +3832,5 @@
<string name="poi_recycling_small_electrical_appliances">Невеликі електроприлади</string>
<string name="poi_beehive">Вулик</string>
<string name="poi_nuts">Насіннєвий магазин</string>
<string name="poi_fuel_lng">СПГ</string>
</resources>

View file

@ -42,7 +42,7 @@
\nБудь яка з цих мап може використовуватись як основна мапа в OsmAnd, або як покриття чи підкладка до іншої основної мапи (наприклад усталена безмережева мапа OsmAnd). Для того, щоб зробити більш помітною будь-яку мапу-підкладку, певні елементи векторної мапи OsmAnd можна легко сховати через меню „Налаштування мапи“ за бажанням, щоб зробити будь-яку підкладку мапи помітнішою..
\n
\nКвадрати мап можна отримувати безпосередньо з мережевих джерел або підготувати їх для безмережевого використання (та вручну скопіювати в теку даних OsmAnd) у вигляді бази даних SQLite, яку можна створити за допомогою різноманітних сторонніх знаряддь підготовки мап.</string>
<string name="osmand_background_plugin_description">Показує налаштування для увімкнення фонового трекінгу та навігації шляхом періодичного пробудження GPS-передавача (з вимкненим екраном).</string>
<string name="osmand_background_plugin_description">Показує налаштування для увімкнення відстеження у тлі та навігації шляхом періодичного пробудження GPS-передавача (з вимкненим екраном).</string>
<string name="osmand_accessibility_description">Робить спеціальні можливості пристрою доступними безпосередньо в OsmAnd. Це полегшує, наприклад, налаштування частоти мовлення для голосу синтезу мовлення, настроювання D-Pad навігації, за допомогою трекбола для контролю масштабу або зворотного зв\'язку синтезу мовлення, наприклад, щоб автоматично оголосити свою позицію.</string>
<string name="osmand_development_plugin_description">Налаштування функцій розробки та налагодження, як-от навігаційне моделювання, дієвість відмальовування чи голосові підказки. Призначений для розробників, не потрібний для звичайного використання застосунку.</string>
<string name="plugins_screen">Втулки</string>
@ -158,7 +158,7 @@
<string name="fav_export_confirmation">Файл з раніше імпортованими Закладками вже існує. Замінити його?</string>
<string name="profile_settings">Налаштування профілю</string>
<string name="settings_preset">Усталений профіль</string>
<string name="settings_preset_descr">Вид мапи й налаштування навігації зберігаються для кожного окремого профілю. Встановіть ваш типовий профіль.</string>
<string name="settings_preset_descr">Вид мапи й налаштування навігації зберігаються для кожного окремого профілю. Встановіть ваш усталений профіль.</string>
<string name="routing_settings">Навігація</string>
<string name="routing_settings_descr">Визначити налаштування навігації.</string>
<string name="global_settings">Загальні налаштування</string>
@ -169,8 +169,8 @@
<string name="user_name">Ім\'я користувача OSM</string>
<string name="open_street_map_login_descr">Потрібно для входу на openstreetmap.org.</string>
<string name="user_password">Пароль</string>
<string name="osmand_service">Фоновий режим</string>
<string name="osmand_service_descr">OsmAnd працює у фоновому режимі з вимкненим екраном.</string>
<string name="osmand_service">Режим тла</string>
<string name="osmand_service_descr">OsmAnd працює у режимі тла з вимкненим екраном.</string>
<string name="download_files_not_enough_space">Не вистачає місця на диску для завантаження %1$s MB (вільно: %2$s).</string>
<string name="download_files_question_space">Завантажити {0} файл(ів)\?
\n{1} МБ (із {2} МБ) буде використано.</string>
@ -281,8 +281,8 @@
<string name="overlay_transparency">Прозорість</string>
<string name="map_transparency_descr">Змінити прозорість основної мапи.</string>
<string name="map_transparency">Прозорість мапи</string>
<string name="layer_underlay">Фонова мапа</string>
<string name="map_underlay">Фонова мапа</string>
<string name="layer_underlay">Мапа підкладки</string>
<string name="map_underlay">Мапа підкладки</string>
<string name="map_underlay_descr">Виберіть тлову мапу</string>
<string name="layer_overlay">Верхній шар…</string>
<string name="shared_string_none">Нема</string>
@ -428,7 +428,7 @@
<string name="no_fav_to_save">Відсутні точки Закладок для збереження</string>
<string name="shared_string_import">Імпортувати</string>
<string name="error_occurred_loading_gpx">Не вдалося завантажити GPX.</string>
<string name="send_report">Відправити звіт</string>
<string name="send_report">Надіслати звіт</string>
<string name="none_region_found">Не знайдено завантаженої мапи на карті пам\'яті.</string>
<string name="poi_namefinder_query_empty">Почніть вводити текст для пошуку POI</string>
<string name="any_poi">Всі</string>
@ -456,7 +456,7 @@
<string name="background_service_provider_descr">Виберіть метод позиціонування, що використовується тловою службою:</string>
<string name="background_service_provider">Джерело позиціювання</string>
<string name="background_router_service_descr">Відслідковує Ваше місцерозташування, поки екран вимкнено.</string>
<string name="background_router_service">Запустити OsmAnd у фоні</string>
<string name="background_router_service">Запустити OsmAnd у тлі</string>
<string name="off_router_service_no_gps_available">Службі навігації у тлі необхідно, аби постачальник позиціювання був активним.</string>
<string name="hide_poi_filter">Сховати фільтр</string>
<string name="show_poi_filter">Показати фільтр</string>
@ -759,8 +759,9 @@
<string name="screen_is_locked">Торкніться значка блокування, щоб розблокувати</string>
<string name="bg_service_screen_unlock">Розблокувати</string>
<string name="bg_service_sleep_mode_off">Запустити
\n застосунок у фоновому режимі</string>
<string name="bg_service_sleep_mode_on">Вимкнути\nфоновий режим</string>
\n застосунок у режимі тла</string>
<string name="bg_service_sleep_mode_on">Вимкнути
\nрежим тла</string>
<string name="access_arrival_time">Час прибуття</string>
<string name="item_unchecked">не відмічено</string>
<string name="shared_string_map">Мапа</string>
@ -846,7 +847,7 @@
<string name="safe_mode">Безпечний режим</string>
<string name="native_library_not_running">Програму запущено в безпечному режимі (вимкніть його в \'Налаштуваннях\').</string>
<string name="audionotes_location_not_defined">Оберіть \"Використати місцезнаходження...\" для прив\'язки нотатки до даного місцезнаходження.</string>
<string name="background_service_is_enabled_question">Фоновий режим OsmAnd досі запущений. Зупинити його роботу також?</string>
<string name="background_service_is_enabled_question">Службу OsmAnd у тлі досі запущено. Зупинити її роботу також\?</string>
<string name="close_changeset">Закрити набір змін</string>
<string name="zxing_barcode_scanner_not_found">Програма \'ZXing Barcode Scanner\' не встановлена. Шукати в Google Play?</string>
<string name="rendering_attr_roadColors_description">Виберіть кольорову схему доріг:</string>
@ -1078,9 +1079,9 @@
<string name="osmo_edit_color">Колір</string>
<string name="keep_navigation_service">Продовжувати</string>
<string name="stop_navigation_service">Зупинити</string>
<string name="enable_sleep_mode">Ввімкнути фоновий режим GPS</string>
<string name="enable_sleep_mode">Увімкнути режим GPS у тлі</string>
<string name="gps_wake_up_timer">Інтервал вмикання GPS</string>
<string name="sleep_mode_stop_dialog">Зупинити фоновий режим GPS?</string>
<string name="sleep_mode_stop_dialog">Зупинити режим GPS у тлі\?</string>
<string name="map_preferred_locale_descr">Бажана мова для підписів на мапі (якщо вона недоступна, будуть використані англійська чи місцева мови).</string>
<string name="map_preferred_locale">Бажана мова мапи</string>
<string name="local_map_names">Назви місцевою мовою</string>
@ -1686,7 +1687,7 @@
<string name="m_s">м/с</string>
<string name="shared_string_trip_recording">Запис подорожі</string>
<string name="shared_string_navigation">Навігація</string>
<string name="osmand_running_in_background">Працює у фоновому режимі</string>
<string name="osmand_running_in_background">Працює у тлі</string>
<string name="favourites_edit_dialog_title">Відомості про закладки</string>
<string name="simulate_your_location_stop_descr">Зупинити симуляцію Вашої позиції.</string>
<string name="looking_up_address">Пошук адреси</string>
@ -2394,7 +2395,7 @@
\n• Звітуйте про помилки в даних
\n• Вивантажуйте GPX-треки в OSM безпосередньо з програми
\n• Додавайте POI (цікаві точки) та безпосередньо вивантажуйте їх в OSM (чи пізніше, якщо зараз Ви в офлайні)
\n• Опція запису подорожі також і у фоновому режимі (в той час як пристрій знаходиться в сплячому режимі)
\n• Опція запису подорожі також і в режимі тла (в той час як пристрій знаходиться в сплячому режимі)
\nOsmAnd — вільне й відкрите програмне забезпечення, що активно розвивається. Кожен може внести свій вклад, звітуючи про помилки, поліпшуючи переклад чи розробляючи нові функції. Також проєкт покладається на фінансові внески для оплати розробки та тестування нових функціональних можливостей.
\n</string>
<string name="osmand_plus_extended_description_part8">Приблизне охоплення мап та якість:
@ -3043,7 +3044,7 @@
<string name="base_profile_descr_ski">Лижі</string>
<string name="show_compass_ruler">Показати компас-лінійку</string>
<string name="hide_compass_ruler">Приховати компас-лінійку</string>
<string name="select_icon_profile_dialog_title">Оберіть піктограму</string>
<string name="select_icon_profile_dialog_title">Оберіть значок</string>
<string name="settings_routing_mode_string">Режим: %s</string>
<string name="settings_derived_routing_mode_string">Користувацький режим, похідний від: %s</string>
<string name="routing_profile_ski">Лижі</string>
@ -3068,16 +3069,16 @@
<string name="press_again_to_change_the_map_orientation">Натисніть ще раз для зміни орієнтації мапи</string>
<string name="shared_string_min_speed">Мінімальна швидкість</string>
<string name="shared_string_max_speed">Максимальна швидкість</string>
<string name="default_speed_setting_title">Типова швидкість</string>
<string name="default_speed_setting_title">Усталена швидкість</string>
<string name="default_speed_setting_descr">Змінити налаштування усталеної швидкості</string>
<string name="minmax_speed_dialog_title">Встановити мінімальну/максимальну швидкість</string>
<string name="new_profile">Новий профіль</string>
<string name="shared_string_crash">Збій</string>
<string name="last_launch_crashed">Під час останнього запуску OsmAnd сталася помилка. Допоможіть нам покращити OsmAnd - надішліть повідомлення про помилку.</string>
<string name="app_mode_ufo">НЛО</string>
<string name="release_3_4">• Профілі застосунку: створюйте власний профіль з довільною піктограмою та кольором для ваших особистих потреб
<string name="release_3_4">• Профілі застосунку: створюйте власний профіль з довільним значком та кольором для ваших особистих потреб
\n
\n• Налаштуйте типову мінімальну/максимальну швидкості профілю
\n• Налаштуйте усталену найменшу/найбільшу швидкості профілю
\n
\n• Додано віджет з поточними координатами
\n
@ -3430,7 +3431,7 @@
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Значок відображається під час навігації чи переміщення.</string>
<string name="select_map_icon_descr">Значок показано в спокої.</string>
<string name="logcat_buffer_descr">Перевіряти та обмінюватися докладними журналами застосунку</string>
<string name="logcat_buffer_descr">Переглянути та надіслати докладний журнал застосунку</string>
<string name="search_offline_geo_error">Не вдалося розібрати метод \'%s\'.</string>
<string name="permission_is_required">Для використання цього параметра потрібен дозвіл.</string>
<string name="monitoring_min_speed_descr">Це низькошвидкісний відсічний фільтр, щоб не записувати точки нижче певної швидкості. Це може призвести до плавнішого вигляду записаних треків при перегляді на мапі.</string>
@ -3670,7 +3671,7 @@
<string name="navigation_profiles_item">Профілі навігації</string>
<string name="release_3_7">• Нові автономні мапи схилів
\n
\n• Налаштування вибраних та GPX шляхових точок - спеціальні кольори, піктограми, форми
\n• Налаштування вибраних та GPX шляхових точок - спеціальні кольори, значки, форми
\n
\n• Налаштування порядку елементів меню \"Контекстне меню\", \"Налаштувати мапу\" та \"Скринька\"
\n
@ -3694,7 +3695,7 @@
<string name="quick_action_transport_descr">Кнопка показу або приховування громадського транспорту на мапі.</string>
<string name="create_edit_poi">Створити / змінити POI</string>
<string name="add_edit_favorite">Додати / правити вибране</string>
<string name="reset_deafult_order">Відновити типовий порядок елементів</string>
<string name="reset_deafult_order">Відновити усталене впорядкування</string>
<string name="back_to_editing">Повернутися до редагування</string>
<string name="additional_actions_descr">Ви можете отримати доступ до цих дій, торкнувшись кнопки “%1$s”.</string>
<string name="shared_string_resume">Продовжити</string>
@ -3741,7 +3742,7 @@
\nОдин тиждень - 10 080 хвилин.
\nОдин місяць - 43 829 хвилин.</string>
<string name="tiles_storage_descr">Виберіть спосіб зберігання завантажених плиток.</string>
<string name="default_screen_timeout">Типовий час до вимкнення екрану</string>
<string name="default_screen_timeout">Усталений час до вимкнення екрану</string>
<string name="export_import_quick_actions_with_profiles_promo">Ви можете експортувати або імпортувати швидкі дії з профілями застосунку.</string>
<string name="shared_string_delete_all_q">Видалити все\?</string>
<string name="delete_all_actions_message_q">Ви дійсно бажаєте безповоротно видалити %d швидких дій\?</string>
@ -3805,7 +3806,7 @@
<string name="route_between_points">Маршрут між точками</string>
<string name="plan_a_route">Планування маршруту</string>
<string name="add_to_a_track">Додати до треку</string>
<string name="track_show_start_finish_icons">Показувати піктограми старт та фініш</string>
<string name="track_show_start_finish_icons">Показувати значки початку та завершення</string>
<string name="select_track_width">Встановити ширину</string>
<string name="gpx_split_interval_descr">Виберіть інтервал показу міток часу або відстані для показу поверх треку.</string>
<string name="gpx_split_interval_none_descr">Виберіть власний варіант поділу: за часом чи відстанню.</string>
@ -3863,7 +3864,7 @@
<string name="plan_route_change_route_type_before">Змінити вид маршруту раніше</string>
<string name="plan_route_change_route_type_after">Змінити вид маршруту після</string>
<string name="save_global_track_interval_descr">Вкажіть інтервал для загального запису поїздки (включається через віджет запису подорожі на мапі).</string>
<string name="system_default_theme">Типова системи</string>
<string name="system_default_theme">Усталена системна</string>
<string name="all_next_segments">Всі наступні сегменти</string>
<string name="previous_segment">Попередній сегмент</string>
<string name="all_previous_segments">Усі попередні сегменти</string>
@ -3876,14 +3877,14 @@
<string name="open_saved_track">Відкрити збережений трек</string>
<string name="shared_string_is_saved">збережено</string>
<string name="one_point_error">Додайте принаймні дві точки.</string>
<string name="disable_recording_once_app_killed_descrp">Запис треку буде зупинено після припинення роботи застосунку через меню з переліком нещодавно запущених застосунків. (Індикатор, який інформує про роботу OsmAnd у фоні зникне з панелі сповіщень Android)</string>
<string name="disable_recording_once_app_killed_descrp">Запис треку буде зупинено після припинення роботи застосунку через меню з переліком нещодавно запущених застосунків. (Індикатор, що повідомляє про роботу OsmAnd у тлі зникне з панелі сповіщень Android)</string>
<string name="simplified_track">Спрощений трек</string>
<string name="simplified_track_description">Буде збережено лише лінію маршруту, а проміжні точки буде видалено.</string>
<string name="shared_string_file_name">Назва файлу</string>
<string name="shared_string_redo">Повторити</string>
<string name="release_3_8">• Оновлено функції планування маршруту: дозволено застосувати різні типи переходів для кожного сегмента і прив\'язати будь-який трек до доріг
\n
\n• Нове меню вигляду треків: вибір кольору, товщина, вигляд стрілки напрямку, піктограми початку/завершення
\n• Нове меню вигляду треків: вибір кольору, товщина, вигляд стрілки напрямку, значки початку/завершення
\n
\n• Покращено оглядовість велосипедних вузлів
\n
@ -3899,4 +3900,6 @@
<string name="sort_last_modified">Востаннє змінено</string>
<string name="sort_name_descending">За назвою: Я — А</string>
<string name="sort_name_ascending">За назвою: А — Я</string>
<string name="start_finish_icons">Значки початку/завершення</string>
<string name="contour_lines_thanks">Дякуємо за придбання «Горизонталей»</string>
</resources>

View file

@ -3843,4 +3843,5 @@
<string name="poi_recycling_small_electrical_appliances">小電器</string>
<string name="poi_beehive">蜂箱</string>
<string name="poi_nuts">堅果店</string>
<string name="poi_fuel_lng">LNG</string>
</resources>

View file

@ -3425,7 +3425,7 @@
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">在導航或移動時顯示的圖示。</string>
<string name="select_map_icon_descr">靜止時顯示的圖示。</string>
<string name="logcat_buffer_descr">視及分享應用程式的紀錄檔</string>
<string name="logcat_buffer_descr">查及分享應用程式的詳細紀錄</string>
<string name="search_offline_geo_error">無法解析地理含義「%s」。</string>
<string name="tracks_view_descr">您已紀錄的軌跡位於 %1$s或是 OsmAnd 資料夾。</string>
<string name="multimedia_notes_view_descr">您的 OSM 註記位於 %1$s。</string>
@ -3899,4 +3899,6 @@
<string name="sort_last_modified">最後修改時間</string>
<string name="sort_name_descending">名稱Z A</string>
<string name="sort_name_ascending">名稱A Z</string>
<string name="start_finish_icons">開始/結束圖示</string>
<string name="contour_lines_thanks">感謝您購買 \'Contour lines\'</string>
</resources>

View file

@ -4257,5 +4257,7 @@
<string name="poi_nuts">Nut store</string>
<string name="poi_fuel_lng">LNG</string>
</resources>

View file

@ -15,6 +15,12 @@
<string name="clear_osm_token">Clear OpenStreetMap OAuth token</string>
<string name="perform_oauth_authorization">Log in via OAuth</string>
<string name="perform_oauth_authorization_description">Perform an OAuth Login to use osmedit features</string>
<string name="routing_attr_avoid_footways_name">Avoid footways</string>
<string name="routing_attr_avoid_footways_description">Avoid footways</string>
<string name="osm_live_payment_subscription_management_hw">Payment will be charged to your AppGallery account at the confirmation of purchase.\n\nSubscription automatically renews unless it is canceled before the renewal date. Your account will be charged for renewal period(month/three month/year) only on the renewal date.\n\nYou can manage and cancel your subscriptions by going to your AppGallery settings.</string>
<string name="osm_live_payment_desc_hw">Subscription charged per selected period. Cancel it on AppGallery at any time.</string>
<string name="contour_lines_thanks">Thank you for purchasing \'Contour lines\'</string>
<string name="start_finish_icons">Start/finish icons</string>
<string name="sort_name_ascending">Name: A Z</string>
<string name="sort_name_descending">Name: Z A</string>
<string name="sort_last_modified">Last modified</string>

View file

@ -0,0 +1,583 @@
package net.osmand.plus.inapp;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingResult;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.SkuDetails;
import com.android.billingclient.api.SkuDetailsResponseListener;
import net.osmand.AndroidUtils;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.inapp.InAppPurchases.InAppPurchase;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription;
import net.osmand.plus.inapp.util.BillingManager;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.srtmplugin.SRTMPlugin;
import net.osmand.util.Algorithms;
import java.lang.ref.WeakReference;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
// The helper object
private BillingManager billingManager;
private List<SkuDetails> skuDetailsList;
/* base64EncodedPublicKey should be YOUR APPLICATION'S PUBLIC KEY
* (that you got from the Google Play developer console). This is not your
* developer public key, it's the *app-specific* public key.
*
* Instead of just storing the entire literal string here embedded in the
* program, construct the key at runtime from pieces or
* use bit manipulation (for example, XOR with some other string) to hide
* the actual key. The key itself is not secret information, but we don't
* want to make it easy for an attacker to replace the public key with one
* of their own and then fake messages from the server.
*/
private static final String BASE64_ENCODED_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgk8cEx" +
"UO4mfEwWFLkQnX1Tkzehr4SnXLXcm2Osxs5FTJPEgyTckTh0POKVMrxeGLn0KoTY2NTgp1U/inp" +
"wccWisPhVPEmw9bAVvWsOkzlyg1kv03fJdnAXRBSqDDPV6X8Z3MtkPVqZkupBsxyIllEILKHK06" +
"OCw49JLTsMR3oTRifGzma79I71X0spw0fM+cIRlkS2tsXN8GPbdkJwHofZKPOXS51pgC1zU8uWX" +
"I+ftJO46a1XkNh1dO2anUiQ8P/H4yOTqnMsXF7biyYuiwjXPOcy0OMhEHi54Dq6Mr3u5ZALOAkc" +
"YTjh1H/ZgqIHy5ZluahINuDE76qdLYMXrDMQIDAQAB";
public InAppPurchaseHelperImpl(OsmandApplication ctx) {
super(ctx);
purchases = new InAppPurchasesImpl(ctx);
}
@Override
public void isInAppPurchaseSupported(@NonNull final Activity activity, @Nullable final InAppPurchaseInitCallback callback) {
if (callback != null) {
callback.onSuccess();
}
}
private BillingManager getBillingManager() {
return billingManager;
}
protected void execImpl(@NonNull final InAppPurchaseTaskType taskType, @NonNull final InAppCommand runnable) {
billingManager = new BillingManager(ctx, BASE64_ENCODED_PUBLIC_KEY, new BillingManager.BillingUpdatesListener() {
@Override
public void onBillingClientSetupFinished() {
logDebug("Setup finished.");
BillingManager billingManager = getBillingManager();
// Have we been disposed of in the meantime? If so, quit.
if (billingManager == null) {
stop(true);
return;
}
if (!billingManager.isServiceConnected()) {
// Oh noes, there was a problem.
//complain("Problem setting up in-app billing: " + result);
notifyError(taskType, billingManager.getBillingClientResponseMessage());
stop(true);
return;
}
runnable.run(InAppPurchaseHelperImpl.this);
}
@Override
public void onConsumeFinished(String token, BillingResult billingResult) {
}
@Override
public void onPurchasesUpdated(final List<Purchase> purchases) {
BillingManager billingManager = getBillingManager();
// Have we been disposed of in the meantime? If so, quit.
if (billingManager == null) {
stop(true);
return;
}
if (activeTask == InAppPurchaseTaskType.REQUEST_INVENTORY) {
List<String> skuInApps = new ArrayList<>();
for (InAppPurchase purchase : getInAppPurchases().getAllInAppPurchases(false)) {
skuInApps.add(purchase.getSku());
}
for (Purchase p : purchases) {
skuInApps.add(p.getSku());
}
billingManager.querySkuDetailsAsync(BillingClient.SkuType.INAPP, skuInApps, new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, final List<SkuDetails> skuDetailsListInApps) {
// Is it a failure?
if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK) {
logError("Failed to query inapps sku details: " + billingResult.getResponseCode());
notifyError(InAppPurchaseTaskType.REQUEST_INVENTORY, billingResult.getDebugMessage());
stop(true);
return;
}
List<String> skuSubscriptions = new ArrayList<>();
for (InAppSubscription subscription : getInAppPurchases().getAllInAppSubscriptions()) {
skuSubscriptions.add(subscription.getSku());
}
for (Purchase p : purchases) {
skuSubscriptions.add(p.getSku());
}
BillingManager billingManager = getBillingManager();
// Have we been disposed of in the meantime? If so, quit.
if (billingManager == null) {
stop(true);
return;
}
billingManager.querySkuDetailsAsync(BillingClient.SkuType.SUBS, skuSubscriptions, new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, final List<SkuDetails> skuDetailsListSubscriptions) {
// Is it a failure?
if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK) {
logError("Failed to query subscriptipons sku details: " + billingResult.getResponseCode());
notifyError(InAppPurchaseTaskType.REQUEST_INVENTORY, billingResult.getDebugMessage());
stop(true);
return;
}
List<SkuDetails> skuDetailsList = new ArrayList<>(skuDetailsListInApps);
skuDetailsList.addAll(skuDetailsListSubscriptions);
InAppPurchaseHelperImpl.this.skuDetailsList = skuDetailsList;
mSkuDetailsResponseListener.onSkuDetailsResponse(billingResult, skuDetailsList);
}
});
}
});
}
for (Purchase purchase : purchases) {
if (!purchase.isAcknowledged()) {
onPurchaseFinished(purchase);
}
}
}
@Override
public void onPurchaseCanceled() {
stop(true);
}
});
}
@Override
public void purchaseFullVersion(@NonNull final Activity activity) {
notifyShowProgress(InAppPurchaseTaskType.PURCHASE_FULL_VERSION);
exec(InAppPurchaseTaskType.PURCHASE_FULL_VERSION, new InAppCommand() {
@Override
public void run(InAppPurchaseHelper helper) {
try {
SkuDetails skuDetails = getSkuDetails(getFullVersion().getSku());
if (skuDetails == null) {
throw new IllegalArgumentException("Cannot find sku details");
}
BillingManager billingManager = getBillingManager();
if (billingManager != null) {
billingManager.initiatePurchaseFlow(activity, skuDetails);
} else {
throw new IllegalStateException("BillingManager disposed");
}
commandDone();
} catch (Exception e) {
complain("Cannot launch full version purchase!");
logError("purchaseFullVersion Error", e);
stop(true);
}
}
});
}
@Override
public void purchaseDepthContours(@NonNull final Activity activity) {
notifyShowProgress(InAppPurchaseTaskType.PURCHASE_DEPTH_CONTOURS);
exec(InAppPurchaseTaskType.PURCHASE_DEPTH_CONTOURS, new InAppCommand() {
@Override
public void run(InAppPurchaseHelper helper) {
try {
SkuDetails skuDetails = getSkuDetails(getDepthContours().getSku());
if (skuDetails == null) {
throw new IllegalArgumentException("Cannot find sku details");
}
BillingManager billingManager = getBillingManager();
if (billingManager != null) {
billingManager.initiatePurchaseFlow(activity, skuDetails);
} else {
throw new IllegalStateException("BillingManager disposed");
}
commandDone();
} catch (Exception e) {
complain("Cannot launch depth contours purchase!");
logError("purchaseDepthContours Error", e);
stop(true);
}
}
});
}
@Override
public void purchaseContourLines(@NonNull Activity activity) throws UnsupportedOperationException {
OsmandPlugin plugin = OsmandPlugin.getPlugin(SRTMPlugin.class);
if(plugin == null || plugin.getInstallURL() == null) {
Toast.makeText(activity.getApplicationContext(),
activity.getString(R.string.activate_srtm_plugin), Toast.LENGTH_LONG).show();
} else {
activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(plugin.getInstallURL())));
}
}
@Override
public void manageSubscription(@NonNull Context ctx, @Nullable String sku) {
String url = "https://play.google.com/store/account/subscriptions?package=" + ctx.getPackageName();
if (!Algorithms.isEmpty(sku)) {
url += "&sku=" + sku;
}
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
ctx.startActivity(intent);
}
@Nullable
private SkuDetails getSkuDetails(@NonNull String sku) {
List<SkuDetails> skuDetailsList = this.skuDetailsList;
if (skuDetailsList != null) {
for (SkuDetails details : skuDetailsList) {
if (details.getSku().equals(sku)) {
return details;
}
}
}
return null;
}
private boolean hasDetails(@NonNull String sku) {
return getSkuDetails(sku) != null;
}
@Nullable
private Purchase getPurchase(@NonNull String sku) {
BillingManager billingManager = getBillingManager();
if (billingManager != null) {
List<Purchase> purchases = billingManager.getPurchases();
if (purchases != null) {
for (Purchase p : purchases) {
if (p.getSku().equals(sku)) {
return p;
}
}
}
}
return null;
}
// Listener that's called when we finish querying the items and subscriptions we own
private SkuDetailsResponseListener mSkuDetailsResponseListener = new SkuDetailsResponseListener() {
@NonNull
private List<String> getAllOwnedSubscriptionSkus() {
List<String> result = new ArrayList<>();
BillingManager billingManager = getBillingManager();
if (billingManager != null) {
for (Purchase p : billingManager.getPurchases()) {
if (getInAppPurchases().getInAppSubscriptionBySku(p.getSku()) != null) {
result.add(p.getSku());
}
}
}
return result;
}
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
logDebug("Query sku details finished.");
// Have we been disposed of in the meantime? If so, quit.
if (getBillingManager() == null) {
stop(true);
return;
}
// Is it a failure?
if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK) {
logError("Failed to query inventory: " + billingResult.getResponseCode());
notifyError(InAppPurchaseTaskType.REQUEST_INVENTORY, billingResult.getDebugMessage());
stop(true);
return;
}
logDebug("Query sku details was successful.");
/*
* Check for items we own. Notice that for each purchase, we check
* the developer payload to see if it's correct! See
* verifyDeveloperPayload().
*/
List<String> allOwnedSubscriptionSkus = getAllOwnedSubscriptionSkus();
for (InAppSubscription s : getLiveUpdates().getAllSubscriptions()) {
if (hasDetails(s.getSku())) {
Purchase purchase = getPurchase(s.getSku());
SkuDetails liveUpdatesDetails = getSkuDetails(s.getSku());
if (liveUpdatesDetails != null) {
fetchInAppPurchase(s, liveUpdatesDetails, purchase);
}
allOwnedSubscriptionSkus.remove(s.getSku());
}
}
for (String sku : allOwnedSubscriptionSkus) {
Purchase purchase = getPurchase(sku);
SkuDetails liveUpdatesDetails = getSkuDetails(sku);
if (liveUpdatesDetails != null) {
InAppSubscription s = getLiveUpdates().upgradeSubscription(sku);
if (s == null) {
s = new InAppPurchaseLiveUpdatesOldSubscription(liveUpdatesDetails);
}
fetchInAppPurchase(s, liveUpdatesDetails, purchase);
}
}
InAppPurchase fullVersion = getFullVersion();
if (hasDetails(fullVersion.getSku())) {
Purchase purchase = getPurchase(fullVersion.getSku());
SkuDetails fullPriceDetails = getSkuDetails(fullVersion.getSku());
if (fullPriceDetails != null) {
fetchInAppPurchase(fullVersion, fullPriceDetails, purchase);
}
}
InAppPurchase depthContours = getDepthContours();
if (hasDetails(depthContours.getSku())) {
Purchase purchase = getPurchase(depthContours.getSku());
SkuDetails depthContoursDetails = getSkuDetails(depthContours.getSku());
if (depthContoursDetails != null) {
fetchInAppPurchase(depthContours, depthContoursDetails, purchase);
}
}
InAppPurchase contourLines = getContourLines();
if (hasDetails(contourLines.getSku())) {
Purchase purchase = getPurchase(contourLines.getSku());
SkuDetails contourLinesDetails = getSkuDetails(contourLines.getSku());
if (contourLinesDetails != null) {
fetchInAppPurchase(contourLines, contourLinesDetails, purchase);
}
}
Purchase fullVersionPurchase = getPurchase(fullVersion.getSku());
boolean fullVersionPurchased = fullVersionPurchase != null;
if (fullVersionPurchased) {
ctx.getSettings().FULL_VERSION_PURCHASED.set(true);
}
Purchase depthContoursPurchase = getPurchase(depthContours.getSku());
boolean depthContoursPurchased = depthContoursPurchase != null;
if (depthContoursPurchased) {
ctx.getSettings().DEPTH_CONTOURS_PURCHASED.set(true);
}
// Do we have the live updates?
boolean subscribedToLiveUpdates = false;
List<Purchase> liveUpdatesPurchases = new ArrayList<>();
for (InAppPurchase p : getLiveUpdates().getAllSubscriptions()) {
Purchase purchase = getPurchase(p.getSku());
if (purchase != null) {
liveUpdatesPurchases.add(purchase);
if (!subscribedToLiveUpdates) {
subscribedToLiveUpdates = true;
}
}
}
OsmandSettings.OsmandPreference<Long> subscriptionCancelledTime = ctx.getSettings().LIVE_UPDATES_PURCHASE_CANCELLED_TIME;
if (!subscribedToLiveUpdates && ctx.getSettings().LIVE_UPDATES_PURCHASED.get()) {
if (subscriptionCancelledTime.get() == 0) {
subscriptionCancelledTime.set(System.currentTimeMillis());
ctx.getSettings().LIVE_UPDATES_PURCHASE_CANCELLED_FIRST_DLG_SHOWN.set(false);
ctx.getSettings().LIVE_UPDATES_PURCHASE_CANCELLED_SECOND_DLG_SHOWN.set(false);
} else if (System.currentTimeMillis() - subscriptionCancelledTime.get() > SUBSCRIPTION_HOLDING_TIME_MSEC) {
ctx.getSettings().LIVE_UPDATES_PURCHASED.set(false);
if (!isDepthContoursPurchased(ctx)) {
ctx.getSettings().getCustomRenderBooleanProperty("depthContours").set(false);
}
}
} else if (subscribedToLiveUpdates) {
subscriptionCancelledTime.set(0L);
ctx.getSettings().LIVE_UPDATES_PURCHASED.set(true);
}
lastValidationCheckTime = System.currentTimeMillis();
logDebug("User " + (subscribedToLiveUpdates ? "HAS" : "DOES NOT HAVE")
+ " live updates purchased.");
OsmandSettings settings = ctx.getSettings();
settings.INAPPS_READ.set(true);
List<Purchase> tokensToSend = new ArrayList<>();
if (liveUpdatesPurchases.size() > 0) {
List<String> tokensSent = Arrays.asList(settings.BILLING_PURCHASE_TOKENS_SENT.get().split(";"));
for (Purchase purchase : liveUpdatesPurchases) {
if ((Algorithms.isEmpty(settings.BILLING_USER_ID.get()) || Algorithms.isEmpty(settings.BILLING_USER_TOKEN.get()))
&& !Algorithms.isEmpty(purchase.getDeveloperPayload())) {
String payload = purchase.getDeveloperPayload();
if (!Algorithms.isEmpty(payload)) {
String[] arr = payload.split(" ");
if (arr.length > 0) {
settings.BILLING_USER_ID.set(arr[0]);
}
if (arr.length > 1) {
token = arr[1];
settings.BILLING_USER_TOKEN.set(token);
}
}
}
if (!tokensSent.contains(purchase.getSku())) {
tokensToSend.add(purchase);
}
}
}
List<PurchaseInfo> purchaseInfoList = new ArrayList<>();
for (Purchase purchase : tokensToSend) {
purchaseInfoList.add(getPurchaseInfo(purchase));
}
onSkuDetailsResponseDone(purchaseInfoList);
}
};
private PurchaseInfo getPurchaseInfo(Purchase purchase) {
return new PurchaseInfo(purchase.getSku(), purchase.getOrderId(), purchase.getPurchaseToken());
}
private void fetchInAppPurchase(@NonNull InAppPurchase inAppPurchase, @NonNull SkuDetails skuDetails, @Nullable Purchase purchase) {
if (purchase != null) {
inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.PURCHASED);
inAppPurchase.setPurchaseTime(purchase.getPurchaseTime());
} else {
inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.NOT_PURCHASED);
}
inAppPurchase.setPrice(skuDetails.getPrice());
inAppPurchase.setPriceCurrencyCode(skuDetails.getPriceCurrencyCode());
if (skuDetails.getPriceAmountMicros() > 0) {
inAppPurchase.setPriceValue(skuDetails.getPriceAmountMicros() / 1000000d);
}
String subscriptionPeriod = skuDetails.getSubscriptionPeriod();
if (!Algorithms.isEmpty(subscriptionPeriod)) {
if (inAppPurchase instanceof InAppSubscription) {
try {
((InAppSubscription) inAppPurchase).setSubscriptionPeriodString(subscriptionPeriod);
} catch (ParseException e) {
LOG.error(e);
}
}
}
if (inAppPurchase instanceof InAppSubscription) {
String introductoryPrice = skuDetails.getIntroductoryPrice();
String introductoryPricePeriod = skuDetails.getIntroductoryPricePeriod();
String introductoryPriceCycles = skuDetails.getIntroductoryPriceCycles();
long introductoryPriceAmountMicros = skuDetails.getIntroductoryPriceAmountMicros();
if (!Algorithms.isEmpty(introductoryPrice)) {
InAppSubscription s = (InAppSubscription) inAppPurchase;
try {
s.setIntroductoryInfo(new InAppPurchases.InAppSubscriptionIntroductoryInfo(s, introductoryPrice,
introductoryPriceAmountMicros, introductoryPricePeriod, introductoryPriceCycles));
} catch (ParseException e) {
LOG.error(e);
}
}
}
}
protected InAppCommand getPurchaseLiveUpdatesCommand(final WeakReference<Activity> activity, final String sku, final String payload) {
return new InAppCommand() {
@Override
public void run(InAppPurchaseHelper helper) {
try {
Activity a = activity.get();
SkuDetails skuDetails = getSkuDetails(sku);
if (AndroidUtils.isActivityNotDestroyed(a) && skuDetails != null) {
BillingManager billingManager = getBillingManager();
if (billingManager != null) {
billingManager.setPayload(payload);
billingManager.initiatePurchaseFlow(a, skuDetails);
} else {
throw new IllegalStateException("BillingManager disposed");
}
commandDone();
} else {
stop(true);
}
} catch (Exception e) {
logError("launchPurchaseFlow Error", e);
stop(true);
}
}
};
}
protected InAppCommand getRequestInventoryCommand() {
return new InAppCommand() {
@Override
public void run(InAppPurchaseHelper helper) {
logDebug("Setup successful. Querying inventory.");
try {
BillingManager billingManager = getBillingManager();
if (billingManager != null) {
billingManager.queryPurchases();
} else {
throw new IllegalStateException("BillingManager disposed");
}
commandDone();
} catch (Exception e) {
logError("queryInventoryAsync Error", e);
notifyDismissProgress(InAppPurchaseTaskType.REQUEST_INVENTORY);
stop(true);
}
}
};
}
// Call when a purchase is finished
private void onPurchaseFinished(Purchase purchase) {
logDebug("Purchase finished: " + purchase);
// if we were disposed of in the meantime, quit.
if (getBillingManager() == null) {
stop(true);
return;
}
onPurchaseDone(getPurchaseInfo(purchase));
}
@Override
protected boolean isBillingManagerExists() {
return getBillingManager() != null;
}
@Override
protected void destroyBillingManager() {
BillingManager billingManager = getBillingManager();
if (billingManager != null) {
billingManager.destroy();
this.billingManager = null;
}
}
}

View file

@ -0,0 +1,323 @@
package net.osmand.plus.inapp;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.billingclient.api.SkuDetails;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.Version;
public class InAppPurchasesImpl extends InAppPurchases {
private static final InAppPurchase FULL_VERSION = new InAppPurchaseFullVersion();
private static final InAppPurchaseDepthContoursFull DEPTH_CONTOURS_FULL = new InAppPurchaseDepthContoursFull();
private static final InAppPurchaseDepthContoursFree DEPTH_CONTOURS_FREE = new InAppPurchaseDepthContoursFree();
private static final InAppPurchaseContourLinesFull CONTOUR_LINES_FULL = new InAppPurchaseContourLinesFull();
private static final InAppPurchaseContourLinesFree CONTOUR_LINES_FREE = new InAppPurchaseContourLinesFree();
private static final InAppSubscription[] LIVE_UPDATES_FULL = new InAppSubscription[]{
new InAppPurchaseLiveUpdatesOldMonthlyFull(),
new InAppPurchaseLiveUpdatesMonthlyFull(),
new InAppPurchaseLiveUpdates3MonthsFull(),
new InAppPurchaseLiveUpdatesAnnualFull()
};
private static final InAppSubscription[] LIVE_UPDATES_FREE = new InAppSubscription[]{
new InAppPurchaseLiveUpdatesOldMonthlyFree(),
new InAppPurchaseLiveUpdatesMonthlyFree(),
new InAppPurchaseLiveUpdates3MonthsFree(),
new InAppPurchaseLiveUpdatesAnnualFree()
};
public InAppPurchasesImpl(OsmandApplication ctx) {
super(ctx);
fullVersion = FULL_VERSION;
if (Version.isFreeVersion(ctx)) {
liveUpdates = new LiveUpdatesInAppPurchasesFree();
} else {
liveUpdates = new LiveUpdatesInAppPurchasesFull();
}
for (InAppSubscription s : liveUpdates.getAllSubscriptions()) {
if (s instanceof InAppPurchaseLiveUpdatesMonthly) {
if (s.isDiscounted()) {
discountedMonthlyLiveUpdates = s;
} else {
monthlyLiveUpdates = s;
}
}
}
if (Version.isFreeVersion(ctx)) {
depthContours = DEPTH_CONTOURS_FREE;
} else {
depthContours = DEPTH_CONTOURS_FULL;
}
if (Version.isFreeVersion(ctx)) {
contourLines = CONTOUR_LINES_FREE;
} else {
contourLines = CONTOUR_LINES_FULL;
}
inAppPurchases = new InAppPurchase[] { fullVersion, depthContours, contourLines };
}
@Override
public boolean isFullVersion(String sku) {
return FULL_VERSION.getSku().equals(sku);
}
@Override
public boolean isDepthContours(String sku) {
return DEPTH_CONTOURS_FULL.getSku().equals(sku) || DEPTH_CONTOURS_FREE.getSku().equals(sku);
}
@Override
public boolean isContourLines(String sku) {
return CONTOUR_LINES_FULL.getSku().equals(sku) || CONTOUR_LINES_FREE.getSku().equals(sku);
}
@Override
public boolean isLiveUpdates(String sku) {
for (InAppPurchase p : LIVE_UPDATES_FULL) {
if (p.getSku().equals(sku)) {
return true;
}
}
for (InAppPurchase p : LIVE_UPDATES_FREE) {
if (p.getSku().equals(sku)) {
return true;
}
}
return false;
}
private static class InAppPurchaseFullVersion extends InAppPurchase {
private static final String SKU_FULL_VERSION_PRICE = "osmand_full_version_price";
InAppPurchaseFullVersion() {
super(SKU_FULL_VERSION_PRICE);
}
@Override
public String getDefaultPrice(Context ctx) {
return ctx.getString(R.string.full_version_price);
}
}
private static class InAppPurchaseDepthContoursFull extends InAppPurchaseDepthContours {
private static final String SKU_DEPTH_CONTOURS_FULL = "net.osmand.seadepth_plus";
InAppPurchaseDepthContoursFull() {
super(SKU_DEPTH_CONTOURS_FULL);
}
}
private static class InAppPurchaseDepthContoursFree extends InAppPurchaseDepthContours {
private static final String SKU_DEPTH_CONTOURS_FREE = "net.osmand.seadepth";
InAppPurchaseDepthContoursFree() {
super(SKU_DEPTH_CONTOURS_FREE);
}
}
private static class InAppPurchaseContourLinesFull extends InAppPurchaseContourLines {
private static final String SKU_CONTOUR_LINES_FULL = "net.osmand.contourlines_plus";
InAppPurchaseContourLinesFull() {
super(SKU_CONTOUR_LINES_FULL);
}
}
private static class InAppPurchaseContourLinesFree extends InAppPurchaseContourLines {
private static final String SKU_CONTOUR_LINES_FREE = "net.osmand.contourlines";
InAppPurchaseContourLinesFree() {
super(SKU_CONTOUR_LINES_FREE);
}
}
private static class InAppPurchaseLiveUpdatesMonthlyFull extends InAppPurchaseLiveUpdatesMonthly {
private static final String SKU_LIVE_UPDATES_MONTHLY_FULL = "osm_live_subscription_monthly_full";
InAppPurchaseLiveUpdatesMonthlyFull() {
super(SKU_LIVE_UPDATES_MONTHLY_FULL, 1);
}
private InAppPurchaseLiveUpdatesMonthlyFull(@NonNull String sku) {
super(sku);
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return sku.startsWith(getSkuNoVersion()) ? new InAppPurchaseLiveUpdatesMonthlyFull(sku) : null;
}
}
private static class InAppPurchaseLiveUpdatesMonthlyFree extends InAppPurchaseLiveUpdatesMonthly {
private static final String SKU_LIVE_UPDATES_MONTHLY_FREE = "osm_live_subscription_monthly_free";
InAppPurchaseLiveUpdatesMonthlyFree() {
super(SKU_LIVE_UPDATES_MONTHLY_FREE, 1);
}
private InAppPurchaseLiveUpdatesMonthlyFree(@NonNull String sku) {
super(sku);
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return sku.startsWith(getSkuNoVersion()) ? new InAppPurchaseLiveUpdatesMonthlyFree(sku) : null;
}
}
private static class InAppPurchaseLiveUpdates3MonthsFull extends InAppPurchaseLiveUpdates3Months {
private static final String SKU_LIVE_UPDATES_3_MONTHS_FULL = "osm_live_subscription_3_months_full";
InAppPurchaseLiveUpdates3MonthsFull() {
super(SKU_LIVE_UPDATES_3_MONTHS_FULL, 1);
}
private InAppPurchaseLiveUpdates3MonthsFull(@NonNull String sku) {
super(sku);
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return sku.startsWith(getSkuNoVersion()) ? new InAppPurchaseLiveUpdates3MonthsFull(sku) : null;
}
}
private static class InAppPurchaseLiveUpdates3MonthsFree extends InAppPurchaseLiveUpdates3Months {
private static final String SKU_LIVE_UPDATES_3_MONTHS_FREE = "osm_live_subscription_3_months_free";
InAppPurchaseLiveUpdates3MonthsFree() {
super(SKU_LIVE_UPDATES_3_MONTHS_FREE, 1);
}
private InAppPurchaseLiveUpdates3MonthsFree(@NonNull String sku) {
super(sku);
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return sku.startsWith(getSkuNoVersion()) ? new InAppPurchaseLiveUpdates3MonthsFree(sku) : null;
}
}
private static class InAppPurchaseLiveUpdatesAnnualFull extends InAppPurchaseLiveUpdatesAnnual {
private static final String SKU_LIVE_UPDATES_ANNUAL_FULL = "osm_live_subscription_annual_full";
InAppPurchaseLiveUpdatesAnnualFull() {
super(SKU_LIVE_UPDATES_ANNUAL_FULL, 1);
}
private InAppPurchaseLiveUpdatesAnnualFull(@NonNull String sku) {
super(sku);
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return sku.startsWith(getSkuNoVersion()) ? new InAppPurchaseLiveUpdatesAnnualFull(sku) : null;
}
}
private static class InAppPurchaseLiveUpdatesAnnualFree extends InAppPurchaseLiveUpdatesAnnual {
private static final String SKU_LIVE_UPDATES_ANNUAL_FREE = "osm_live_subscription_annual_free";
InAppPurchaseLiveUpdatesAnnualFree() {
super(SKU_LIVE_UPDATES_ANNUAL_FREE, 1);
}
private InAppPurchaseLiveUpdatesAnnualFree(@NonNull String sku) {
super(sku);
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return sku.startsWith(getSkuNoVersion()) ? new InAppPurchaseLiveUpdatesAnnualFree(sku) : null;
}
}
private static class InAppPurchaseLiveUpdatesOldMonthlyFull extends InAppPurchaseLiveUpdatesOldMonthly {
private static final String SKU_LIVE_UPDATES_OLD_MONTHLY_FULL = "osm_live_subscription_2";
InAppPurchaseLiveUpdatesOldMonthlyFull() {
super(SKU_LIVE_UPDATES_OLD_MONTHLY_FULL);
}
}
private static class InAppPurchaseLiveUpdatesOldMonthlyFree extends InAppPurchaseLiveUpdatesOldMonthly {
private static final String SKU_LIVE_UPDATES_OLD_MONTHLY_FREE = "osm_free_live_subscription_2";
InAppPurchaseLiveUpdatesOldMonthlyFree() {
super(SKU_LIVE_UPDATES_OLD_MONTHLY_FREE);
}
}
public static class InAppPurchaseLiveUpdatesOldSubscription extends InAppSubscription {
private SkuDetails details;
InAppPurchaseLiveUpdatesOldSubscription(@NonNull SkuDetails details) {
super(details.getSku(), true);
this.details = details;
}
@Override
public String getDefaultPrice(Context ctx) {
return "";
}
@Override
public CharSequence getTitle(Context ctx) {
return details.getTitle();
}
@Override
public CharSequence getDescription(@NonNull Context ctx) {
return details.getDescription();
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return null;
}
}
private static class LiveUpdatesInAppPurchasesFree extends InAppSubscriptionList {
public LiveUpdatesInAppPurchasesFree() {
super(LIVE_UPDATES_FREE);
}
}
private static class LiveUpdatesInAppPurchasesFull extends InAppSubscriptionList {
public LiveUpdatesInAppPurchasesFull() {
super(LIVE_UPDATES_FULL);
}
}
}

View file

@ -0,0 +1,96 @@
/**
* Copyright 2020. Huawei Technologies Co., Ltd. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.osmand.plus.inapp;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
/**
* Signature related tools.
*
* @since 2019/12/9
*/
public class CipherUtil {
private static final String TAG = "CipherUtil";
private static final String SIGN_ALGORITHMS = "SHA256WithRSA";
private static final String PUBLIC_KEY = "MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAsB+oH8rYQncwpTqGa0kS/5E725HJrq2sW1ThAZtmorYVi52Yt9PmZvNDz7284ol9C2skrKQR34eIer8Tr7Qqq3mlNo+/LVUpq9sa++kB2glaG6jj5NNjM3w4nVYHFIYkd5AQhodJgmqFvnp2s7r7YmyQVXZSehei5bA1G70Bs+El9cSv9shNNGTCaU3ARUu2hy3Ltkc/ov7/ZYYpiwjbyD3cmoMh9jO1++zztXb2phjv1h9zeJOp1i6HsotZll+c9J4jjV3GhrF+ZJm5WrSzGLDLtwSldRpMZFxrSvAJJstjzhDz3LpUM+nPV3HZ5VQ/xosmwWYmiibo89E1gw8p73NTBXHzuQMJcTJ6vTjD8LeMskpXHZUAGhifmFLGN1LbNP9662ulCV12kIbXuzWCwwi/h0DWqmnjKmLvzc88e4BrGrp2zZUnHz7m15voPG+4cQ3z9+cwS4gEI3SUTiFyQGE539SO/11VkkQAJ8P7du1JFNqQw5ZEW3AoE1iUsp5XAgMBAAE=";
/**
* the method to check the signature for the data returned from the interface
* @param content Unsigned data
* @param sign the signature for content
* @param publicKey the public of the application
* @return boolean
*/
public static boolean doCheck(String content, String sign, String publicKey) {
if (TextUtils.isEmpty(publicKey)) {
Log.e(TAG, "publicKey is null");
return false;
}
if (TextUtils.isEmpty(content) || TextUtils.isEmpty(sign)) {
Log.e(TAG, "data is error");
return false;
}
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] encodedKey = Base64.decode(publicKey, Base64.DEFAULT);
PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
signature.initVerify(pubKey);
signature.update(content.getBytes("UTF-8"));
boolean bverify = signature.verify(Base64.decode(sign, Base64.DEFAULT));
return bverify;
} catch (NoSuchAlgorithmException e) {
Log.e(TAG, "doCheck NoSuchAlgorithmException" + e);
} catch (InvalidKeySpecException e) {
Log.e(TAG, "doCheck InvalidKeySpecException" + e);
} catch (InvalidKeyException e) {
Log.e(TAG, "doCheck InvalidKeyException" + e);
} catch (SignatureException e) {
Log.e(TAG, "doCheck SignatureException" + e);
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "doCheck UnsupportedEncodingException" + e);
}
return false;
}
/**
* get the publicKey of the application
* During the encoding process, avoid storing the public key in clear text.
* @return publickey
*/
public static String getPublicKey(){
return PUBLIC_KEY;
}
}

View file

@ -0,0 +1,33 @@
/**
* Copyright 2020. Huawei Technologies Co., Ltd. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.osmand.plus.inapp;
/**
* Constants Class.
*
* @since 2019/12/9
*/
public class Constants {
/** requestCode for pull up the pmsPay page */
public static final int REQ_CODE_BUY_SUB = 4002;
public static final int REQ_CODE_BUY_INAPP = 4003;
/** requestCode for pull up the login page for isEnvReady interface */
public static final int REQ_CODE_LOGIN = 2001;
}

View file

@ -0,0 +1,103 @@
/**
* Copyright 2020. Huawei Technologies Co., Ltd. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.osmand.plus.inapp;
import android.app.Activity;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.huawei.hms.iap.IapApiException;
import com.huawei.hms.iap.entity.OrderStatusCode;
import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
/**
* Handles the exception returned from the iap api.
*
* @since 2019/12/9
*/
public class ExceptionHandle {
protected static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(ExceptionHandle.class);
/**
* The exception is solved.
*/
public static final int SOLVED = 0;
/**
* Handles the exception returned from the iap api.
* @param activity The Activity to call the iap api.
* @param e The exception returned from the iap api.
* @return int
*/
public static int handle(@Nullable Activity activity, Exception e) {
if (e instanceof IapApiException) {
IapApiException iapApiException = (IapApiException) e;
LOG.info("returnCode: " + iapApiException.getStatusCode());
switch (iapApiException.getStatusCode()) {
case OrderStatusCode.ORDER_STATE_CANCEL:
showToast(activity, "Order has been canceled!");
return SOLVED;
case OrderStatusCode.ORDER_STATE_PARAM_ERROR:
showToast(activity, "Order state param error!");
return SOLVED;
case OrderStatusCode.ORDER_STATE_NET_ERROR:
showToast(activity, "Order state net error!");
return SOLVED;
case OrderStatusCode.ORDER_VR_UNINSTALL_ERROR:
showToast(activity, "Order vr uninstall error!");
return SOLVED;
case OrderStatusCode.ORDER_HWID_NOT_LOGIN:
IapRequestHelper.startResolutionForResult(activity, iapApiException.getStatus(), Constants.REQ_CODE_LOGIN);
return SOLVED;
case OrderStatusCode.ORDER_PRODUCT_OWNED:
showToast(activity, "Product already owned error!");
return OrderStatusCode.ORDER_PRODUCT_OWNED;
case OrderStatusCode.ORDER_PRODUCT_NOT_OWNED:
showToast(activity, "Product not owned error!");
return SOLVED;
case OrderStatusCode.ORDER_PRODUCT_CONSUMED:
showToast(activity, "Product consumed error!");
return SOLVED;
case OrderStatusCode.ORDER_ACCOUNT_AREA_NOT_SUPPORTED:
showToast(activity, "Order account area not supported error!");
return SOLVED;
case OrderStatusCode.ORDER_NOT_ACCEPT_AGREEMENT:
showToast(activity, "User does not agree the agreement");
return SOLVED;
default:
// handle other error scenarios
showToast(activity, "Order unknown error (" + iapApiException.getStatusCode() + ")");
return SOLVED;
}
} else {
showToast(activity, "External error");
LOG.error(e.getMessage(), e);
return SOLVED;
}
}
private static void showToast(@Nullable Activity activity, String s) {
if (AndroidUtils.isActivityNotDestroyed(activity)) {
Toast.makeText(activity, s, Toast.LENGTH_SHORT).show();
}
}
}

View file

@ -0,0 +1,37 @@
/**
* Copyright 2020. Huawei Technologies Co., Ltd. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.osmand.plus.inapp;
/**
* Used to callback the result from iap api.
*
* @since 2019/12/9
*/
public interface IapApiCallback<T> {
/**
* The request is successful.
* @param result The result of a successful response.
*/
void onSuccess(T result);
/**
* Callback fail.
* @param e An Exception from IAPSDK.
*/
void onFail(Exception e);
}

View file

@ -0,0 +1,351 @@
/**
* Copyright 2020. Huawei Technologies Co., Ltd. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.osmand.plus.inapp;
import android.app.Activity;
import android.content.IntentSender;
import android.text.TextUtils;
import android.util.Log;
import com.huawei.hmf.tasks.OnFailureListener;
import com.huawei.hmf.tasks.OnSuccessListener;
import com.huawei.hmf.tasks.Task;
import com.huawei.hms.iap.Iap;
import com.huawei.hms.iap.IapApiException;
import com.huawei.hms.iap.IapClient;
import com.huawei.hms.iap.entity.ConsumeOwnedPurchaseReq;
import com.huawei.hms.iap.entity.ConsumeOwnedPurchaseResult;
import com.huawei.hms.iap.entity.IsEnvReadyResult;
import com.huawei.hms.iap.entity.OwnedPurchasesReq;
import com.huawei.hms.iap.entity.OwnedPurchasesResult;
import com.huawei.hms.iap.entity.ProductInfoReq;
import com.huawei.hms.iap.entity.ProductInfoResult;
import com.huawei.hms.iap.entity.PurchaseIntentReq;
import com.huawei.hms.iap.entity.PurchaseIntentResult;
import com.huawei.hms.iap.entity.StartIapActivityReq;
import com.huawei.hms.iap.entity.StartIapActivityResult;
import com.huawei.hms.support.api.client.Status;
import java.util.List;
/**
* The tool class of Iap interface.
*
* @since 2019/12/9
*/
public class IapRequestHelper {
private final static String TAG = "IapRequestHelper";
/**
* Create a PurchaseIntentReq object.
* @param type In-app product type.
* The value contains: 0: consumable 1: non-consumable 2 auto-renewable subscription
* @param productId ID of the in-app product to be paid.
* The in-app product ID is the product ID you set during in-app product configuration in AppGallery Connect.
* @return PurchaseIntentReq
*/
private static PurchaseIntentReq createPurchaseIntentReq(int type, String productId) {
PurchaseIntentReq req = new PurchaseIntentReq();
req.setPriceType(type);
req.setProductId(productId);
req.setDeveloperPayload("testPurchase");
return req;
}
/**
* Create a ConsumeOwnedPurchaseReq object.
* @param purchaseToken which is generated by the Huawei payment server during product payment and returned to the app through InAppPurchaseData.
* The app transfers this parameter for the Huawei payment server to update the order status and then deliver the in-app product.
* @return ConsumeOwnedPurchaseReq
*/
private static ConsumeOwnedPurchaseReq createConsumeOwnedPurchaseReq(String purchaseToken) {
ConsumeOwnedPurchaseReq req = new ConsumeOwnedPurchaseReq();
req.setPurchaseToken(purchaseToken);
req.setDeveloperChallenge("testConsume");
return req;
}
/**
* Create a OwnedPurchasesReq object.
* @param type type In-app product type.
* The value contains: 0: consumable 1: non-consumable 2 auto-renewable subscription
* @param continuationToken A data location flag which returns from obtainOwnedPurchases api or obtainOwnedPurchaseRecord api.
* @return OwnedPurchasesReq
*/
private static OwnedPurchasesReq createOwnedPurchasesReq(int type, String continuationToken) {
OwnedPurchasesReq req = new OwnedPurchasesReq();
req.setPriceType(type);
req.setContinuationToken(continuationToken);
return req;
}
/**
* Create a ProductInfoReq object.
* @param type In-app product type.
* The value contains: 0: consumable 1: non-consumable 2 auto-renewable subscription
* @param productIds ID list of products to be queried. Each product ID must exist and be unique in the current app.
* @return ProductInfoReq
*/
private static ProductInfoReq createProductInfoReq(int type, List<String> productIds) {
ProductInfoReq req = new ProductInfoReq();
req.setPriceType(type);
req.setProductIds(productIds);
return req;
}
/**
* To check whether the country or region of the logged in HUAWEI ID is included in the countries or regions supported by HUAWEI IAP.
* @param mClient IapClient instance to call the isEnvReady API.
* @param callback IapApiCallback.
*/
public static void isEnvReady(IapClient mClient, final IapApiCallback callback) {
Log.i(TAG, "call isEnvReady");
Task<IsEnvReadyResult> task = mClient.isEnvReady();
task.addOnSuccessListener(new OnSuccessListener<IsEnvReadyResult>() {
@Override
public void onSuccess(IsEnvReadyResult result) {
Log.i(TAG, "isEnvReady, success");
callback.onSuccess(result);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.e(TAG, "isEnvReady, fail");
callback.onFail(e);
}
});
}
/**
* Obtain in-app product details configured in AppGallery Connect.
* @param iapClient IapClient instance to call the obtainProductInfo API.
* @param productIds ID list of products to be queried. Each product ID must exist and be unique in the current app.
* @param type In-app product type.
* The value contains: 0: consumable 1: non-consumable 2 auto-renewable subscription
* @param callback IapApiCallback
*/
public static void obtainProductInfo(IapClient iapClient, final List<String> productIds, int type, final IapApiCallback callback) {
Log.i(TAG, "call obtainProductInfo");
Task<ProductInfoResult> task = iapClient.obtainProductInfo(createProductInfoReq(type, productIds));
task.addOnSuccessListener(new OnSuccessListener<ProductInfoResult>() {
@Override
public void onSuccess(ProductInfoResult result) {
Log.i(TAG, "obtainProductInfo, success");
callback.onSuccess(result);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.e(TAG, "obtainProductInfo, fail");
callback.onFail(e);
}
});
}
/**
* create orders for in-app products in the PMS
* @param iapClient IapClient instance to call the createPurchaseIntent API.
* @param productId ID of the in-app product to be paid.
* The in-app product ID is the product ID you set during in-app product configuration in AppGallery Connect.
* @param type In-app product type.
* The value contains: 0: consumable 1: non-consumable 2 auto-renewable subscription
* @param callback IapApiCallback
*/
public static void createPurchaseIntent(final IapClient iapClient, String productId, int type, final IapApiCallback callback) {
Log.i(TAG, "call createPurchaseIntent");
Task<PurchaseIntentResult> task = iapClient.createPurchaseIntent(createPurchaseIntentReq(type, productId));
task.addOnSuccessListener(new OnSuccessListener<PurchaseIntentResult>() {
@Override
public void onSuccess(PurchaseIntentResult result) {
Log.i(TAG, "createPurchaseIntent, success");
callback.onSuccess(result);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.e(TAG, "createPurchaseIntent, fail");
callback.onFail(e);
}
});
}
public static void createPurchaseIntent(final IapClient iapClient, String productId, int type, String payload, final IapApiCallback callback) {
Log.i(TAG, "call createPurchaseIntent");
PurchaseIntentReq req = createPurchaseIntentReq(type, productId);
req.setDeveloperPayload(payload);
Task<PurchaseIntentResult> task = iapClient.createPurchaseIntent(req);
task.addOnSuccessListener(new OnSuccessListener<PurchaseIntentResult>() {
@Override
public void onSuccess(PurchaseIntentResult result) {
Log.i(TAG, "createPurchaseIntent, success");
callback.onSuccess(result);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.e(TAG, "createPurchaseIntent, fail");
callback.onFail(e);
}
});
}
/**
* to start an activity.
* @param activity the activity to launch a new page.
* @param status This parameter contains the pendingIntent object of the payment page.
* @param reqCode Result code.
*/
public static void startResolutionForResult(Activity activity, Status status, int reqCode) {
if (status == null) {
Log.e(TAG, "status is null");
return;
}
if (status.hasResolution()) {
try {
status.startResolutionForResult(activity, reqCode);
} catch (IntentSender.SendIntentException exp) {
Log.e(TAG, exp.getMessage());
}
} else {
Log.e(TAG, "intent is null");
}
}
/**
* query information about all subscribed in-app products, including consumables, non-consumables, and auto-renewable subscriptions.</br>
* If consumables are returned, the system needs to deliver them and calls the consumeOwnedPurchase API to consume the products.
* If non-consumables are returned, the in-app products do not need to be consumed.
* If subscriptions are returned, all existing subscription relationships of the user under the app are returned.
* @param mClient IapClient instance to call the obtainOwnedPurchases API.
* @param type In-app product type.
* The value contains: 0: consumable 1: non-consumable 2 auto-renewable subscription
* @param callback IapApiCallback
*/
public static void obtainOwnedPurchases(IapClient mClient, final int type, String continuationToken, final IapApiCallback callback) {
Log.i(TAG, "call obtainOwnedPurchases");
Task<OwnedPurchasesResult> task = mClient.obtainOwnedPurchases(IapRequestHelper.createOwnedPurchasesReq(type, continuationToken));
task.addOnSuccessListener(new OnSuccessListener<OwnedPurchasesResult>() {
@Override
public void onSuccess(OwnedPurchasesResult result) {
Log.i(TAG, "obtainOwnedPurchases, success");
callback.onSuccess(result);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.e(TAG, "obtainOwnedPurchases, fail");
callback.onFail(e);
}
});
}
/**
* obtain the historical consumption information about a consumable in-app product or all subscription receipts of a subscription.
* @param iapClient IapClient instance to call the obtainOwnedPurchaseRecord API.
* @param priceType In-app product type.
* The value contains: 0: consumable 1: non-consumable 2 auto-renewable subscription.
* @param continuationToken Data locating flag for supporting query in pagination mode.
* @param callback IapApiCallback
*/
public static void obtainOwnedPurchaseRecord(IapClient iapClient, int priceType, String continuationToken, final IapApiCallback callback) {
Log.i(TAG, "call obtainOwnedPurchaseRecord");
Task<OwnedPurchasesResult> task = iapClient.obtainOwnedPurchaseRecord(createOwnedPurchasesReq(priceType, continuationToken));
task.addOnSuccessListener(new OnSuccessListener<OwnedPurchasesResult>() {
@Override
public void onSuccess(OwnedPurchasesResult result) {
Log.i(TAG, "obtainOwnedPurchaseRecord, success");
callback.onSuccess(result);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.e(TAG, "obtainOwnedPurchaseRecord, fail");
callback.onFail(e);
}
});
}
/**
* Consume all the unconsumed purchases with priceType 0.
* @param iapClient IapClient instance to call the consumeOwnedPurchase API.
* @param purchaseToken which is generated by the Huawei payment server during product payment and returned to the app through InAppPurchaseData.
*/
public static void consumeOwnedPurchase(IapClient iapClient, String purchaseToken) {
Log.i(TAG, "call consumeOwnedPurchase");
Task<ConsumeOwnedPurchaseResult> task = iapClient.consumeOwnedPurchase(createConsumeOwnedPurchaseReq(purchaseToken));
task.addOnSuccessListener(new OnSuccessListener<ConsumeOwnedPurchaseResult>() {
@Override
public void onSuccess(ConsumeOwnedPurchaseResult result) {
// Consume success.
Log.i(TAG, "consumeOwnedPurchase success");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
if (e instanceof IapApiException) {
IapApiException apiException = (IapApiException)e;
int returnCode = apiException.getStatusCode();
Log.e(TAG, "consumeOwnedPurchase fail, IapApiException returnCode: " + returnCode);
} else {
// Other external errors
Log.e(TAG, e.getMessage());
}
}
});
}
/**
* link to subscription manager page
* @param activity activity
* @param productId the productId of the subscription product
*/
public static void showSubscription(final Activity activity, String productId) {
StartIapActivityReq req = new StartIapActivityReq();
if (TextUtils.isEmpty(productId)) {
req.setType(StartIapActivityReq.TYPE_SUBSCRIBE_MANAGER_ACTIVITY);
} else {
req.setType(StartIapActivityReq.TYPE_SUBSCRIBE_EDIT_ACTIVITY);
req.setSubscribeProductId(productId);
}
IapClient iapClient = Iap.getIapClient(activity);
Task<StartIapActivityResult> task = iapClient.startIapActivity(req);
task.addOnSuccessListener(new OnSuccessListener<StartIapActivityResult>() {
@Override
public void onSuccess(StartIapActivityResult result) {
if(result != null) {
result.startActivity(activity);
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
ExceptionHandle.handle(activity, e);
}
});
}
}

View file

@ -0,0 +1,703 @@
package net.osmand.plus.inapp;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.huawei.hmf.tasks.OnFailureListener;
import com.huawei.hmf.tasks.OnSuccessListener;
import com.huawei.hmf.tasks.Task;
import com.huawei.hms.iap.Iap;
import com.huawei.hms.iap.IapClient;
import com.huawei.hms.iap.entity.InAppPurchaseData;
import com.huawei.hms.iap.entity.IsEnvReadyResult;
import com.huawei.hms.iap.entity.OrderStatusCode;
import com.huawei.hms.iap.entity.OwnedPurchasesResult;
import com.huawei.hms.iap.entity.ProductInfo;
import com.huawei.hms.iap.entity.ProductInfoResult;
import com.huawei.hms.iap.entity.PurchaseIntentResult;
import com.huawei.hms.iap.entity.PurchaseResultInfo;
import com.huawei.hms.iap.entity.StartIapActivityReq;
import com.huawei.hms.iap.entity.StartIapActivityResult;
import net.osmand.AndroidUtils;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.inapp.InAppPurchases.InAppPurchase;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscriptionIntroductoryInfo;
import net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.OsmandSettings.OsmandPreference;
import net.osmand.util.Algorithms;
import java.lang.ref.WeakReference;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
private boolean envReady = false;
private boolean purchaseSupported = false;
private List<ProductInfo> productInfos;
private OwnedPurchasesResult ownedSubscriptions;
private List<OwnedPurchasesResult> ownedInApps = new ArrayList<>();
public InAppPurchaseHelperImpl(OsmandApplication ctx) {
super(ctx);
purchases = new InAppPurchasesImpl(ctx);
}
@Override
public void isInAppPurchaseSupported(@NonNull final Activity activity, @Nullable final InAppPurchaseInitCallback callback) {
if (envReady) {
if (callback != null) {
if (purchaseSupported) {
callback.onSuccess();
} else {
callback.onFail();
}
}
} else {
// Initiating an isEnvReady request when entering the app.
// Check if the account service country supports IAP.
IapClient mClient = Iap.getIapClient(activity);
final WeakReference<Activity> activityRef = new WeakReference<>(activity);
IapRequestHelper.isEnvReady(mClient, new IapApiCallback<IsEnvReadyResult>() {
private void onReady(boolean succeed) {
logDebug("Setup finished.");
envReady = true;
purchaseSupported = succeed;
if (callback != null) {
if (succeed) {
callback.onSuccess();
} else {
callback.onFail();
}
}
}
@Override
public void onSuccess(IsEnvReadyResult result) {
onReady(true);
}
@Override
public void onFail(Exception e) {
onReady(false);
LOG.error("isEnvReady fail, " + e.getMessage(), e);
ExceptionHandle.handle(activityRef.get(), e);
}
});
}
}
protected void execImpl(@NonNull final InAppPurchaseTaskType taskType, @NonNull final InAppCommand command) {
if (envReady) {
command.run(this);
} else {
command.commandDone();
}
}
private InAppCommand getPurchaseInAppCommand(@NonNull final Activity activity, @NonNull final String productId) throws UnsupportedOperationException {
return new InAppCommand() {
@Override
public void run(InAppPurchaseHelper helper) {
try {
ProductInfo productInfo = getProductInfo(productId);
if (productInfo != null) {
IapRequestHelper.createPurchaseIntent(getIapClient(), productInfo.getProductId(),
IapClient.PriceType.IN_APP_NONCONSUMABLE, new IapApiCallback<PurchaseIntentResult>() {
@Override
public void onSuccess(PurchaseIntentResult result) {
if (result == null) {
logError("result is null");
} else {
// you should pull up the page to complete the payment process
IapRequestHelper.startResolutionForResult(activity, result.getStatus(), Constants.REQ_CODE_BUY_INAPP);
}
commandDone();
}
@Override
public void onFail(Exception e) {
int errorCode = ExceptionHandle.handle(activity, e);
if (errorCode != ExceptionHandle.SOLVED) {
logDebug("createPurchaseIntent, returnCode: " + errorCode);
if (OrderStatusCode.ORDER_PRODUCT_OWNED == errorCode) {
logError("already own this product");
} else {
logError("unknown error");
}
}
commandDone();
}
});
} else {
commandDone();
}
} catch (Exception e) {
complain("Cannot launch full version purchase!");
logError("purchaseFullVersion Error", e);
stop(true);
}
}
};
}
@Override
public void purchaseFullVersion(@NonNull final Activity activity) throws UnsupportedOperationException {
notifyShowProgress(InAppPurchaseTaskType.PURCHASE_FULL_VERSION);
exec(InAppPurchaseTaskType.PURCHASE_FULL_VERSION, getPurchaseInAppCommand(activity, purchases.getFullVersion().getSku()));
}
@Override
public void purchaseDepthContours(@NonNull final Activity activity) throws UnsupportedOperationException {
notifyShowProgress(InAppPurchaseTaskType.PURCHASE_DEPTH_CONTOURS);
exec(InAppPurchaseTaskType.PURCHASE_DEPTH_CONTOURS, getPurchaseInAppCommand(activity, purchases.getDepthContours().getSku()));
}
@Override
public void purchaseContourLines(@NonNull Activity activity) throws UnsupportedOperationException {
notifyShowProgress(InAppPurchaseTaskType.PURCHASE_CONTOUR_LINES);
exec(InAppPurchaseTaskType.PURCHASE_CONTOUR_LINES, getPurchaseInAppCommand(activity, purchases.getContourLines().getSku()));
}
@Override
public void manageSubscription(@NonNull Context ctx, @Nullable String sku) {
if (uiActivity != null) {
StartIapActivityReq req = new StartIapActivityReq();
if (!Algorithms.isEmpty(sku)) {
req.setSubscribeProductId(sku);
req.setType(StartIapActivityReq.TYPE_SUBSCRIBE_EDIT_ACTIVITY);
} else {
req.setType(StartIapActivityReq.TYPE_SUBSCRIBE_MANAGER_ACTIVITY);
}
Task<StartIapActivityResult> task = getIapClient().startIapActivity(req);
task.addOnSuccessListener(new OnSuccessListener<StartIapActivityResult>() {
@Override
public void onSuccess(StartIapActivityResult result) {
logDebug("startIapActivity: onSuccess");
Activity activity = (Activity) uiActivity;
if (result != null && AndroidUtils.isActivityNotDestroyed(activity)) {
result.startActivity(activity);
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
logDebug("startIapActivity: onFailure");
}
});
}
}
@Nullable
private ProductInfo getProductInfo(@NonNull String productId) {
List<ProductInfo> productInfos = this.productInfos;
if (productInfos != null) {
for (ProductInfo info : productInfos) {
if (info.getProductId().equals(productId)) {
return info;
}
}
}
return null;
}
private boolean hasDetails(@NonNull String productId) {
return getProductInfo(productId) != null;
}
@Nullable
private InAppPurchaseData getPurchaseData(@NonNull String productId) {
InAppPurchaseData data = SubscriptionUtils.getPurchaseData(ownedSubscriptions, productId);
if (data == null) {
for (OwnedPurchasesResult result : ownedInApps) {
data = InAppUtils.getPurchaseData(result, productId);
if (data != null) {
break;
}
}
}
return data;
}
private PurchaseInfo getPurchaseInfo(InAppPurchaseData purchase) {
return new PurchaseInfo(purchase.getProductId(), purchase.getOrderID(), purchase.getPurchaseToken());
}
private void fetchInAppPurchase(@NonNull InAppPurchase inAppPurchase, @NonNull ProductInfo productInfo, @Nullable InAppPurchaseData purchaseData) {
if (purchaseData != null) {
inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.PURCHASED);
inAppPurchase.setPurchaseTime(purchaseData.getPurchaseTime());
} else {
inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.NOT_PURCHASED);
}
inAppPurchase.setPrice(productInfo.getPrice());
inAppPurchase.setPriceCurrencyCode(productInfo.getCurrency());
if (productInfo.getMicrosPrice() > 0) {
inAppPurchase.setPriceValue(productInfo.getMicrosPrice() / 1000000d);
}
String subscriptionPeriod = productInfo.getSubPeriod();
if (!Algorithms.isEmpty(subscriptionPeriod)) {
if (inAppPurchase instanceof InAppSubscription) {
try {
((InAppSubscription) inAppPurchase).setSubscriptionPeriodString(subscriptionPeriod);
} catch (ParseException e) {
LOG.error(e);
}
}
}
if (inAppPurchase instanceof InAppSubscription) {
String introductoryPrice = productInfo.getSubSpecialPrice();
String introductoryPricePeriod = productInfo.getSubPeriod();
int introductoryPriceCycles = productInfo.getSubSpecialPeriodCycles();
long introductoryPriceAmountMicros = productInfo.getSubSpecialPriceMicros();
if (!Algorithms.isEmpty(introductoryPrice)) {
InAppSubscription s = (InAppSubscription) inAppPurchase;
try {
s.setIntroductoryInfo(new InAppSubscriptionIntroductoryInfo(s, introductoryPrice,
introductoryPriceAmountMicros, introductoryPricePeriod, String.valueOf(introductoryPriceCycles)));
} catch (ParseException e) {
LOG.error(e);
}
}
}
}
protected InAppCommand getPurchaseLiveUpdatesCommand(final WeakReference<Activity> activity, final String sku, final String payload) {
return new InAppCommand() {
@Override
public void run(InAppPurchaseHelper helper) {
try {
Activity a = activity.get();
ProductInfo productInfo = getProductInfo(sku);
if (AndroidUtils.isActivityNotDestroyed(a) && productInfo != null) {
IapRequestHelper.createPurchaseIntent(getIapClient(), sku,
IapClient.PriceType.IN_APP_SUBSCRIPTION, payload, new IapApiCallback<PurchaseIntentResult>() {
@Override
public void onSuccess(PurchaseIntentResult result) {
if (result == null) {
logError("GetBuyIntentResult is null");
} else {
Activity a = activity.get();
if (AndroidUtils.isActivityNotDestroyed(a)) {
IapRequestHelper.startResolutionForResult(a, result.getStatus(), Constants.REQ_CODE_BUY_SUB);
} else {
logError("startResolutionForResult on destroyed activity");
}
}
commandDone();
}
@Override
public void onFail(Exception e) {
int errorCode = ExceptionHandle.handle(activity.get(), e);
if (ExceptionHandle.SOLVED != errorCode) {
logError("createPurchaseIntent, returnCode: " + errorCode);
if (OrderStatusCode.ORDER_PRODUCT_OWNED == errorCode) {
logError("already own this product");
} else {
logError("unknown error");
}
}
commandDone();
}
});
} else {
stop(true);
}
} catch (Exception e) {
logError("launchPurchaseFlow Error", e);
stop(true);
}
}
};
}
@Override
protected InAppCommand getRequestInventoryCommand() {
return new InAppCommand() {
@Override
protected void commandDone() {
super.commandDone();
inventoryRequested = false;
}
@Override
public void run(InAppPurchaseHelper helper) {
logDebug("Setup successful. Querying inventory.");
try {
productInfos = new ArrayList<>();
obtainOwnedSubscriptions();
} catch (Exception e) {
logError("queryInventoryAsync Error", e);
notifyDismissProgress(InAppPurchaseTaskType.REQUEST_INVENTORY);
stop(true);
commandDone();
}
}
private void obtainOwnedSubscriptions() {
if (uiActivity != null) {
IapRequestHelper.obtainOwnedPurchases(getIapClient(), IapClient.PriceType.IN_APP_SUBSCRIPTION,
null, new IapApiCallback<OwnedPurchasesResult>() {
@Override
public void onSuccess(OwnedPurchasesResult result) {
ownedSubscriptions = result;
obtainOwnedInApps(null);
}
@Override
public void onFail(Exception e) {
logError("obtainOwnedSubscriptions exception", e);
ExceptionHandle.handle((Activity) uiActivity, e);
commandDone();
}
});
} else {
commandDone();
}
}
private void obtainOwnedInApps(final String continuationToken) {
if (uiActivity != null) {
// Query users' purchased non-consumable products.
IapRequestHelper.obtainOwnedPurchases(getIapClient(), IapClient.PriceType.IN_APP_NONCONSUMABLE,
continuationToken, new IapApiCallback<OwnedPurchasesResult>() {
@Override
public void onSuccess(OwnedPurchasesResult result) {
ownedInApps.add(result);
if (result != null && !TextUtils.isEmpty(result.getContinuationToken())) {
obtainOwnedInApps(result.getContinuationToken());
} else {
obtainSubscriptionsInfo();
}
}
@Override
public void onFail(Exception e) {
logError("obtainOwnedInApps exception", e);
ExceptionHandle.handle((Activity) uiActivity, e);
commandDone();
}
});
} else {
commandDone();
}
}
private void obtainSubscriptionsInfo() {
if (uiActivity != null) {
Set<String> productIds = new HashSet<>();
List<InAppSubscription> subscriptions = purchases.getLiveUpdates().getAllSubscriptions();
for (InAppSubscription s : subscriptions) {
productIds.add(s.getSku());
}
productIds.addAll(ownedSubscriptions.getItemList());
IapRequestHelper.obtainProductInfo(getIapClient(), new ArrayList<>(productIds),
IapClient.PriceType.IN_APP_SUBSCRIPTION, new IapApiCallback<ProductInfoResult>() {
@Override
public void onSuccess(final ProductInfoResult result) {
if (result != null && result.getProductInfoList() != null) {
productInfos.addAll(result.getProductInfoList());
}
obtainInAppsInfo();
}
@Override
public void onFail(Exception e) {
int errorCode = ExceptionHandle.handle((Activity) uiActivity, e);
if (ExceptionHandle.SOLVED != errorCode) {
LOG.error("Unknown error");
}
commandDone();
}
});
} else {
commandDone();
}
}
private void obtainInAppsInfo() {
if (uiActivity != null) {
Set<String> productIds = new HashSet<>();
for (InAppPurchase purchase : getInAppPurchases().getAllInAppPurchases(false)) {
productIds.add(purchase.getSku());
}
for (OwnedPurchasesResult result : ownedInApps) {
productIds.addAll(result.getItemList());
}
IapRequestHelper.obtainProductInfo(getIapClient(), new ArrayList<>(productIds),
IapClient.PriceType.IN_APP_NONCONSUMABLE, new IapApiCallback<ProductInfoResult>() {
@Override
public void onSuccess(ProductInfoResult result) {
if (result != null && result.getProductInfoList() != null) {
productInfos.addAll(result.getProductInfoList());
}
processInventory();
}
@Override
public void onFail(Exception e) {
int errorCode = ExceptionHandle.handle((Activity) uiActivity, e);
if (ExceptionHandle.SOLVED != errorCode) {
LOG.error("Unknown error");
}
commandDone();
}
});
} else {
commandDone();
}
}
private void processInventory() {
logDebug("Query sku details was successful.");
/*
* Check for items we own. Notice that for each purchase, we check
* the developer payload to see if it's correct!
*/
List<String> allOwnedSubscriptionSkus = ownedSubscriptions.getItemList();
for (InAppSubscription s : getLiveUpdates().getAllSubscriptions()) {
if (hasDetails(s.getSku())) {
InAppPurchaseData purchaseData = getPurchaseData(s.getSku());
ProductInfo liveUpdatesInfo = getProductInfo(s.getSku());
if (liveUpdatesInfo != null) {
fetchInAppPurchase(s, liveUpdatesInfo, purchaseData);
}
allOwnedSubscriptionSkus.remove(s.getSku());
}
}
for (String sku : allOwnedSubscriptionSkus) {
InAppPurchaseData purchaseData = getPurchaseData(sku);
ProductInfo liveUpdatesInfo = getProductInfo(sku);
if (liveUpdatesInfo != null) {
InAppSubscription s = getLiveUpdates().upgradeSubscription(sku);
if (s == null) {
s = new InAppPurchaseLiveUpdatesOldSubscription(liveUpdatesInfo);
}
fetchInAppPurchase(s, liveUpdatesInfo, purchaseData);
}
}
InAppPurchase fullVersion = getFullVersion();
if (hasDetails(fullVersion.getSku())) {
InAppPurchaseData purchaseData = getPurchaseData(fullVersion.getSku());
ProductInfo fullPriceDetails = getProductInfo(fullVersion.getSku());
if (fullPriceDetails != null) {
fetchInAppPurchase(fullVersion, fullPriceDetails, purchaseData);
}
}
InAppPurchase depthContours = getDepthContours();
if (hasDetails(depthContours.getSku())) {
InAppPurchaseData purchaseData = getPurchaseData(depthContours.getSku());
ProductInfo depthContoursDetails = getProductInfo(depthContours.getSku());
if (depthContoursDetails != null) {
fetchInAppPurchase(depthContours, depthContoursDetails, purchaseData);
}
}
InAppPurchase contourLines = getContourLines();
if (hasDetails(contourLines.getSku())) {
InAppPurchaseData purchaseData = getPurchaseData(contourLines.getSku());
ProductInfo contourLinesDetails = getProductInfo(contourLines.getSku());
if (contourLinesDetails != null) {
fetchInAppPurchase(contourLines, contourLinesDetails, purchaseData);
}
}
if (getPurchaseData(fullVersion.getSku()) != null) {
ctx.getSettings().FULL_VERSION_PURCHASED.set(true);
}
if (getPurchaseData(depthContours.getSku()) != null) {
ctx.getSettings().DEPTH_CONTOURS_PURCHASED.set(true);
}
if (getPurchaseData(contourLines.getSku()) != null) {
ctx.getSettings().CONTOUR_LINES_PURCHASED.set(true);
}
// Do we have the live updates?
boolean subscribedToLiveUpdates = false;
List<InAppPurchaseData> liveUpdatesPurchases = new ArrayList<>();
for (InAppPurchase p : getLiveUpdates().getAllSubscriptions()) {
InAppPurchaseData purchaseData = getPurchaseData(p.getSku());
if (purchaseData != null) {
liveUpdatesPurchases.add(purchaseData);
if (!subscribedToLiveUpdates) {
subscribedToLiveUpdates = true;
}
}
}
OsmandPreference<Long> subscriptionCancelledTime = ctx.getSettings().LIVE_UPDATES_PURCHASE_CANCELLED_TIME;
if (!subscribedToLiveUpdates && ctx.getSettings().LIVE_UPDATES_PURCHASED.get()) {
if (subscriptionCancelledTime.get() == 0) {
subscriptionCancelledTime.set(System.currentTimeMillis());
ctx.getSettings().LIVE_UPDATES_PURCHASE_CANCELLED_FIRST_DLG_SHOWN.set(false);
ctx.getSettings().LIVE_UPDATES_PURCHASE_CANCELLED_SECOND_DLG_SHOWN.set(false);
} else if (System.currentTimeMillis() - subscriptionCancelledTime.get() > SUBSCRIPTION_HOLDING_TIME_MSEC) {
ctx.getSettings().LIVE_UPDATES_PURCHASED.set(false);
if (!isDepthContoursPurchased(ctx)) {
ctx.getSettings().getCustomRenderBooleanProperty("depthContours").set(false);
}
}
} else if (subscribedToLiveUpdates) {
subscriptionCancelledTime.set(0L);
ctx.getSettings().LIVE_UPDATES_PURCHASED.set(true);
}
lastValidationCheckTime = System.currentTimeMillis();
logDebug("User " + (subscribedToLiveUpdates ? "HAS" : "DOES NOT HAVE")
+ " live updates purchased.");
OsmandSettings settings = ctx.getSettings();
settings.INAPPS_READ.set(true);
List<InAppPurchaseData> tokensToSend = new ArrayList<>();
if (liveUpdatesPurchases.size() > 0) {
List<String> tokensSent = Arrays.asList(settings.BILLING_PURCHASE_TOKENS_SENT.get().split(";"));
for (InAppPurchaseData purchase : liveUpdatesPurchases) {
if ((Algorithms.isEmpty(settings.BILLING_USER_ID.get()) || Algorithms.isEmpty(settings.BILLING_USER_TOKEN.get()))
&& !Algorithms.isEmpty(purchase.getDeveloperPayload())) {
String payload = purchase.getDeveloperPayload();
if (!Algorithms.isEmpty(payload)) {
String[] arr = payload.split(" ");
if (arr.length > 0) {
settings.BILLING_USER_ID.set(arr[0]);
}
if (arr.length > 1) {
token = arr[1];
settings.BILLING_USER_TOKEN.set(token);
}
}
}
if (!tokensSent.contains(purchase.getProductId())) {
tokensToSend.add(purchase);
}
}
}
List<PurchaseInfo> purchaseInfoList = new ArrayList<>();
for (InAppPurchaseData purchase : tokensToSend) {
purchaseInfoList.add(getPurchaseInfo(purchase));
}
onSkuDetailsResponseDone(purchaseInfoList);
}
};
}
private IapClient getIapClient() {
return Iap.getIapClient((Activity) uiActivity);
}
// Call when a purchase is finished
private void onPurchaseFinished(InAppPurchaseData purchase) {
logDebug("Purchase finished: " + purchase.getProductId());
onPurchaseDone(getPurchaseInfo(purchase));
}
@Override
protected boolean isBillingManagerExists() {
return false;
}
@Override
protected void destroyBillingManager() {
// non implemented
}
@Override
public boolean onActivityResult(@NonNull Activity activity, int requestCode, int resultCode, Intent data) {
if (requestCode == Constants.REQ_CODE_BUY_SUB) {
boolean succeed = false;
if (resultCode == Activity.RESULT_OK) {
PurchaseResultInfo result = SubscriptionUtils.getPurchaseResult(activity, data);
if (result != null) {
switch (result.getReturnCode()) {
case OrderStatusCode.ORDER_STATE_CANCEL:
logDebug("Purchase cancelled");
break;
case OrderStatusCode.ORDER_STATE_FAILED:
inventoryRequestPending = true;
logDebug("Purchase failed");
break;
case OrderStatusCode.ORDER_PRODUCT_OWNED:
inventoryRequestPending = true;
logDebug("Product already owned");
break;
case OrderStatusCode.ORDER_STATE_SUCCESS:
inventoryRequestPending = true;
InAppPurchaseData purchaseData = SubscriptionUtils.getInAppPurchaseData(null,
result.getInAppPurchaseData(), result.getInAppDataSignature());
if (purchaseData != null) {
onPurchaseFinished(purchaseData);
succeed = true;
} else {
logDebug("Purchase failed");
}
break;
default:
break;
}
} else {
logDebug("Purchase failed");
}
} else {
logDebug("Purchase cancelled");
}
if (!succeed) {
stop(true);
}
return true;
} else if (requestCode == Constants.REQ_CODE_BUY_INAPP) {
boolean succeed = false;
if (data == null) {
logDebug("data is null");
} else {
PurchaseResultInfo buyResultInfo = Iap.getIapClient(activity).parsePurchaseResultInfoFromIntent(data);
switch (buyResultInfo.getReturnCode()) {
case OrderStatusCode.ORDER_STATE_CANCEL:
logDebug("Order has been canceled");
break;
case OrderStatusCode.ORDER_STATE_FAILED:
inventoryRequestPending = true;
logDebug("Order has been failed");
break;
case OrderStatusCode.ORDER_PRODUCT_OWNED:
inventoryRequestPending = true;
logDebug("Product already owned");
break;
case OrderStatusCode.ORDER_STATE_SUCCESS:
InAppPurchaseData purchaseData = InAppUtils.getInAppPurchaseData(null,
buyResultInfo.getInAppPurchaseData(), buyResultInfo.getInAppDataSignature());
if (purchaseData != null) {
onPurchaseFinished(purchaseData);
succeed = true;
} else {
logDebug("Purchase failed");
}
break;
default:
break;
}
}
if (!succeed) {
stop(true);
}
return true;
}
return false;
}
}

View file

@ -0,0 +1,196 @@
package net.osmand.plus.inapp;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.huawei.hms.iap.entity.ProductInfo;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
public class InAppPurchasesImpl extends InAppPurchases {
private static final InAppPurchase FULL_VERSION = new InAppPurchaseFullVersion();
private static final InAppPurchaseDepthContoursFree DEPTH_CONTOURS_FREE = new InAppPurchaseDepthContoursFree();
private static final InAppPurchaseContourLinesFree CONTOUR_LINES_FREE = new InAppPurchaseContourLinesFree();
private static final InAppSubscription[] LIVE_UPDATES_FREE = new InAppSubscription[]{
new InAppPurchaseLiveUpdatesMonthlyFree(),
new InAppPurchaseLiveUpdates3MonthsFree(),
new InAppPurchaseLiveUpdatesAnnualFree()
};
public InAppPurchasesImpl(OsmandApplication ctx) {
super(ctx);
fullVersion = FULL_VERSION;
depthContours = DEPTH_CONTOURS_FREE;
contourLines = CONTOUR_LINES_FREE;
inAppPurchases = new InAppPurchase[] { fullVersion, depthContours, contourLines };
liveUpdates = new LiveUpdatesInAppPurchasesFree();
for (InAppSubscription s : liveUpdates.getAllSubscriptions()) {
if (s instanceof InAppPurchaseLiveUpdatesMonthly) {
if (s.isDiscounted()) {
discountedMonthlyLiveUpdates = s;
} else {
monthlyLiveUpdates = s;
}
}
}
}
@Override
public boolean isFullVersion(String sku) {
return FULL_VERSION.getSku().equals(sku);
}
@Override
public boolean isDepthContours(String sku) {
return DEPTH_CONTOURS_FREE.getSku().equals(sku);
}
@Override
public boolean isContourLines(String sku) {
return CONTOUR_LINES_FREE.getSku().equals(sku);
}
@Override
public boolean isLiveUpdates(String sku) {
for (InAppPurchase p : LIVE_UPDATES_FREE) {
if (p.getSku().equals(sku)) {
return true;
}
}
return false;
}
private static class InAppPurchaseFullVersion extends InAppPurchase {
private static final String SKU_FULL_VERSION_PRICE = "net.osmand.huawei.full";
InAppPurchaseFullVersion() {
super(SKU_FULL_VERSION_PRICE);
}
@Override
public String getDefaultPrice(Context ctx) {
return ctx.getString(R.string.full_version_price);
}
}
private static class InAppPurchaseDepthContoursFree extends InAppPurchaseDepthContours {
private static final String SKU_DEPTH_CONTOURS_FREE = "net.osmand.huawei.seadepth";
InAppPurchaseDepthContoursFree() {
super(SKU_DEPTH_CONTOURS_FREE);
}
}
private static class InAppPurchaseContourLinesFree extends InAppPurchaseContourLines {
private static final String SKU_CONTOUR_LINES_FREE = "net.osmand.huawei.contourlines";
InAppPurchaseContourLinesFree() {
super(SKU_CONTOUR_LINES_FREE);
}
}
private static class InAppPurchaseLiveUpdatesMonthlyFree extends InAppPurchaseLiveUpdatesMonthly {
private static final String SKU_LIVE_UPDATES_MONTHLY_HW_FREE = "net.osmand.huawei.monthly";
InAppPurchaseLiveUpdatesMonthlyFree() {
super(SKU_LIVE_UPDATES_MONTHLY_HW_FREE, 1);
}
private InAppPurchaseLiveUpdatesMonthlyFree(@NonNull String sku) {
super(sku);
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return sku.startsWith(getSkuNoVersion()) ? new InAppPurchaseLiveUpdatesMonthlyFree(sku) : null;
}
}
private static class InAppPurchaseLiveUpdates3MonthsFree extends InAppPurchaseLiveUpdates3Months {
private static final String SKU_LIVE_UPDATES_3_MONTHS_HW_FREE = "net.osmand.huawei.3months";
InAppPurchaseLiveUpdates3MonthsFree() {
super(SKU_LIVE_UPDATES_3_MONTHS_HW_FREE, 1);
}
private InAppPurchaseLiveUpdates3MonthsFree(@NonNull String sku) {
super(sku);
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return sku.startsWith(getSkuNoVersion()) ? new InAppPurchaseLiveUpdates3MonthsFree(sku) : null;
}
}
private static class InAppPurchaseLiveUpdatesAnnualFree extends InAppPurchaseLiveUpdatesAnnual {
private static final String SKU_LIVE_UPDATES_ANNUAL_HW_FREE = "net.osmand.huawei.annual";
InAppPurchaseLiveUpdatesAnnualFree() {
super(SKU_LIVE_UPDATES_ANNUAL_HW_FREE, 1);
}
private InAppPurchaseLiveUpdatesAnnualFree(@NonNull String sku) {
super(sku);
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return sku.startsWith(getSkuNoVersion()) ? new InAppPurchaseLiveUpdatesAnnualFree(sku) : null;
}
}
public static class InAppPurchaseLiveUpdatesOldSubscription extends InAppSubscription {
private ProductInfo info;
InAppPurchaseLiveUpdatesOldSubscription(@NonNull ProductInfo info) {
super(info.getProductId(), true);
this.info = info;
}
@Override
public String getDefaultPrice(Context ctx) {
return "";
}
@Override
public CharSequence getTitle(Context ctx) {
return info.getProductName();
}
@Override
public CharSequence getDescription(@NonNull Context ctx) {
return info.getProductDesc();
}
@Nullable
@Override
protected InAppSubscription newInstance(@NonNull String sku) {
return null;
}
}
private static class LiveUpdatesInAppPurchasesFree extends InAppSubscriptionList {
public LiveUpdatesInAppPurchasesFree() {
super(LIVE_UPDATES_FREE);
}
}
}

View file

@ -0,0 +1,49 @@
package net.osmand.plus.inapp;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.huawei.hms.iap.entity.InAppPurchaseData;
import com.huawei.hms.iap.entity.OwnedPurchasesResult;
import org.json.JSONException;
public class InAppUtils {
private static final String TAG = "InAppUtils";
@Nullable
public static InAppPurchaseData getPurchaseData(OwnedPurchasesResult result, String productId) {
if (result == null || result.getInAppPurchaseDataList() == null) {
Log.i(TAG, "result is null");
return null;
}
int index = result.getItemList().indexOf(productId);
if (index != -1) {
String data = result.getInAppPurchaseDataList().get(index);
String signature = result.getInAppSignature().get(index);
return getInAppPurchaseData(productId, data, signature);
}
return null;
}
@Nullable
public static InAppPurchaseData getInAppPurchaseData(@Nullable String productId, @NonNull String data, @NonNull String signature) {
if (CipherUtil.doCheck(data, signature, CipherUtil.getPublicKey())) {
try {
InAppPurchaseData purchaseData = new InAppPurchaseData(data);
if (purchaseData.getPurchaseState() == InAppPurchaseData.PurchaseState.PURCHASED) {
if (productId == null || productId.equals(purchaseData.getProductId())) {
return purchaseData;
}
}
} catch (JSONException e) {
Log.e(TAG, "delivery: " + e.getMessage());
}
} else {
Log.e(TAG, "delivery: verify signature error");
}
return null;
}
}

View file

@ -0,0 +1,138 @@
/**
* Copyright 2020. Huawei Technologies Co., Ltd. All rights reserved.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.osmand.plus.inapp;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.huawei.hms.iap.Iap;
import com.huawei.hms.iap.entity.InAppPurchaseData;
import com.huawei.hms.iap.entity.OrderStatusCode;
import com.huawei.hms.iap.entity.OwnedPurchasesResult;
import com.huawei.hms.iap.entity.PurchaseResultInfo;
import org.json.JSONException;
import java.util.List;
/**
* Util for Subscription function.
*
* @since 2019/12/9
*/
public class SubscriptionUtils {
private static final String TAG = "SubscriptionUtils";
/**
* Decide whether to offer subscription service
*
* @param result the OwnedPurchasesResult from IapClient.obtainOwnedPurchases
* @param productId subscription product id
* @return decision result
*/
@Nullable
public static InAppPurchaseData getPurchaseData(OwnedPurchasesResult result, String productId) {
if (null == result) {
Log.e(TAG, "OwnedPurchasesResult is null");
return null;
}
List<String> dataList = result.getInAppPurchaseDataList();
List<String> signatureList = result.getInAppSignature();
for (int i = 0; i < dataList.size(); i++) {
String data = dataList.get(i);
String signature = signatureList.get(i);
InAppPurchaseData purchaseData = getInAppPurchaseData(productId, data, signature);
if (purchaseData != null) {
return purchaseData;
}
}
return null;
}
@Nullable
public static InAppPurchaseData getInAppPurchaseData(@Nullable String productId, @NonNull String data, @NonNull String signature) {
try {
InAppPurchaseData purchaseData = new InAppPurchaseData(data);
if (productId == null || productId.equals(purchaseData.getProductId())) {
boolean credible = CipherUtil.doCheck(data, signature, CipherUtil.getPublicKey());
if (credible) {
return purchaseData.isSubValid() ? purchaseData : null;
} else {
Log.e(TAG, "check the data signature fail");
return null;
}
}
} catch (JSONException e) {
Log.e(TAG, "parse InAppPurchaseData JSONException", e);
return null;
}
return null;
}
/**
* Parse PurchaseResult data from intent
*
* @param activity Activity
* @param data the intent from onActivityResult
* @return PurchaseResultInfo
*/
public static PurchaseResultInfo getPurchaseResult(Activity activity, Intent data) {
PurchaseResultInfo purchaseResultInfo = Iap.getIapClient(activity).parsePurchaseResultInfoFromIntent(data);
if (null == purchaseResultInfo) {
Log.e(TAG, "PurchaseResultInfo is null");
} else {
int returnCode = purchaseResultInfo.getReturnCode();
String errMsg = purchaseResultInfo.getErrMsg();
switch (returnCode) {
case OrderStatusCode.ORDER_PRODUCT_OWNED:
Log.w(TAG, "you have owned this product");
break;
case OrderStatusCode.ORDER_STATE_SUCCESS:
boolean credible = CipherUtil.doCheck(purchaseResultInfo.getInAppPurchaseData(), purchaseResultInfo.getInAppDataSignature(), CipherUtil
.getPublicKey());
if (credible) {
try {
InAppPurchaseData inAppPurchaseData = new InAppPurchaseData(purchaseResultInfo.getInAppPurchaseData());
if (!inAppPurchaseData.isSubValid()) {
return getFailedPurchaseResultInfo();
}
} catch (JSONException e) {
Log.e(TAG, "parse InAppPurchaseData JSONException", e);
return getFailedPurchaseResultInfo();
}
} else {
Log.e(TAG, "check the data signature fail");
return getFailedPurchaseResultInfo();
}
default:
Log.e(TAG, "returnCode: " + returnCode + " , errMsg: " + errMsg);
break;
}
}
return purchaseResultInfo;
}
private static PurchaseResultInfo getFailedPurchaseResultInfo() {
PurchaseResultInfo info = new PurchaseResultInfo();
info.setReturnCode(OrderStatusCode.ORDER_STATE_FAILED);
return info;
}
}

View file

@ -205,10 +205,7 @@ public class FileUtils {
if (!src.exists()) {
return null;
}
File tempDir = app.getAppPath(IndexConstants.TEMP_DIR);
if (!tempDir.exists()) {
tempDir.mkdirs();
}
File tempDir = getTempDir(app);
File dest = new File(tempDir, src.getName());
try {
Algorithms.fileCopy(src, dest);
@ -218,6 +215,14 @@ public class FileUtils {
return dest;
}
public static File getTempDir(OsmandApplication app) {
File tempDir = app.getAppPath(IndexConstants.TEMP_DIR);
if (!tempDir.exists()) {
tempDir.mkdirs();
}
return tempDir;
}
public interface RenameCallback {
void renamedTo(File file);
}

View file

@ -26,9 +26,11 @@ import com.google.gson.reflect.TypeToken;
import net.osmand.AndroidUtils;
import net.osmand.CallbackWithObject;
import net.osmand.FileUtils;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.IProgress;
import net.osmand.IndexConstants;
import net.osmand.Location;
import net.osmand.PlatformUtil;
@ -80,6 +82,7 @@ import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmAndAppCustomization;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.backend.SettingsHelper;
import net.osmand.plus.settings.backend.ExportSettingsType;
import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.layers.AidlMapLayer;
@ -129,11 +132,13 @@ import static net.osmand.aidlapi.OsmandAidlConstants.COPY_FILE_PART_SIZE_LIMIT_E
import static net.osmand.aidlapi.OsmandAidlConstants.COPY_FILE_UNSUPPORTED_FILE_TYPE_ERROR;
import static net.osmand.aidlapi.OsmandAidlConstants.COPY_FILE_WRITE_LOCK_ERROR;
import static net.osmand.aidlapi.OsmandAidlConstants.OK_RESPONSE;
import static net.osmand.plus.FavouritesDbHelper.FILE_TO_SAVE;
import static net.osmand.plus.helpers.ExternalApiHelper.PARAM_NT_DIRECTION_LANES;
import static net.osmand.plus.helpers.ExternalApiHelper.PARAM_NT_DIRECTION_NAME;
import static net.osmand.plus.helpers.ExternalApiHelper.PARAM_NT_DIRECTION_TURN;
import static net.osmand.plus.helpers.ExternalApiHelper.PARAM_NT_DISTANCE;
import static net.osmand.plus.helpers.ExternalApiHelper.PARAM_NT_IMMINENT;
import static net.osmand.plus.settings.backend.SettingsHelper.REPLACE_KEY;
public class OsmandAidlApi {
@ -204,7 +209,7 @@ public class OsmandAidlApi {
private static final ApplicationMode DEFAULT_PROFILE = ApplicationMode.CAR;
private static final ApplicationMode[] VALID_PROFILES = new ApplicationMode[] {
private static final ApplicationMode[] VALID_PROFILES = new ApplicationMode[]{
ApplicationMode.CAR,
ApplicationMode.BICYCLE,
ApplicationMode.PEDESTRIAN
@ -284,7 +289,7 @@ public class OsmandAidlApi {
}
private void initOsmandTelegram() {
String[] packages = new String[] {"net.osmand.telegram", "net.osmand.telegram.debug"};
String[] packages = new String[]{"net.osmand.telegram", "net.osmand.telegram.debug"};
Intent intent = new Intent("net.osmand.telegram.InitApp");
for (String pack : packages) {
intent.setComponent(new ComponentName(pack, "net.osmand.telegram.InitAppBroadcastReceiver"));
@ -1015,7 +1020,7 @@ public class OsmandAidlApi {
}
if (!newName.equals(f.getName()) || !newDescription.equals(f.getDescription()) ||
!newCategory.equals(f.getCategory()) || !newAddress.equals(f.getAddress())) {
favoritesHelper.editFavouriteName(f, newName, newCategory, newDescription,newAddress);
favoritesHelper.editFavouriteName(f, newName, newCategory, newDescription, newAddress);
}
refreshMap();
return true;
@ -2260,6 +2265,21 @@ public class OsmandAidlApi {
return false;
}
public boolean importProfileV2(final Uri profileUri, ArrayList<String> settingsTypeKeys, boolean replace,
String latestChanges, int version) {
if (profileUri != null) {
Bundle bundle = new Bundle();
bundle.putStringArrayList(SettingsHelper.SETTINGS_TYPE_LIST_KEY, settingsTypeKeys);
bundle.putBoolean(REPLACE_KEY, replace);
bundle.putString(SettingsHelper.SETTINGS_LATEST_CHANGES_KEY, latestChanges);
bundle.putInt(SettingsHelper.SETTINGS_VERSION_KEY, version);
MapActivity.launchMapActivityMoveToTop(app, null, profileUri, bundle);
return true;
}
return false;
}
public void registerLayerContextMenu(ContextMenuAdapter adapter, MapActivity mapActivity) {
for (ConnectedApp connectedApp : getConnectedApps()) {
if (!connectedApp.getLayers().isEmpty()) {
@ -2323,6 +2343,25 @@ public class OsmandAidlApi {
return true;
}
public boolean exportProfile(String appModeKey, List<String> settingsTypesKeys) {
ApplicationMode appMode = ApplicationMode.valueOfStringKey(appModeKey, null);
if (app != null && appMode != null) {
List<ExportSettingsType> settingsTypes = new ArrayList<>();
for (String key : settingsTypesKeys) {
settingsTypes.add(ExportSettingsType.valueOf(key));
}
List<SettingsHelper.SettingsItem> settingsItems = new ArrayList<>();
settingsItems.add(new SettingsHelper.ProfileSettingsItem(app, appMode));
File exportDir = app.getSettings().getExternalStorageDirectory();
String fileName = appMode.toHumanString();
SettingsHelper settingsHelper = app.getSettingsHelper();
settingsItems.addAll(settingsHelper.getFilteredSettingsItems(settingsHelper.getAdditionalData(), settingsTypes));
settingsHelper.exportSettings(exportDir, fileName, null, settingsItems, true);
return true;
}
return false;
}
private static class FileCopyInfo {
long startTime;
long lastAccessTime;
@ -2349,13 +2388,35 @@ public class OsmandAidlApi {
}
}
private int copyFileImpl(String fileName, byte[] filePartData, long startTime, boolean done, String destinationDir) {
File file = app.getAppPath(IndexConstants.TEMP_DIR + fileName);
File tempDir = app.getAppPath(IndexConstants.TEMP_DIR);
if (!tempDir.exists()) {
tempDir.mkdirs();
int copyFileV2(String destinationDir, String fileName, byte[] filePartData, long startTime, boolean done) {
if (Algorithms.isEmpty(fileName) || filePartData == null) {
return COPY_FILE_PARAMS_ERROR;
}
File destFile = app.getAppPath(destinationDir + fileName);
if (filePartData.length > COPY_FILE_PART_SIZE_LIMIT) {
return COPY_FILE_PART_SIZE_LIMIT_ERROR;
}
int result = copyFileImpl(fileName, filePartData, startTime, done, destinationDir);
if (done) {
if (fileName.endsWith(IndexConstants.BINARY_MAP_INDEX_EXT) && IndexConstants.MAPS_PATH.equals(destinationDir)) {
app.getResourceManager().reloadIndexes(IProgress.EMPTY_PROGRESS, new ArrayList<String>());
app.getDownloadThread().updateLoadedFiles();
} else if (fileName.endsWith(IndexConstants.GPX_FILE_EXT)) {
if (destinationDir.startsWith(IndexConstants.GPX_INDEX_DIR)
&& !FILE_TO_SAVE.equals(fileName)) {
destinationDir = destinationDir.replaceFirst(IndexConstants.GPX_INDEX_DIR, "");
showGpx(new File(destinationDir, fileName).getPath());
} else if (destinationDir.isEmpty() && FILE_TO_SAVE.equals(fileName)) {
app.getFavorites().loadFavorites();
}
}
}
return result;
}
private int copyFileImpl(String fileName, byte[] filePartData, long startTime, boolean done, String destinationDir) {
File tempDir = FileUtils.getTempDir(app);
File file = new File(tempDir, fileName);
File destFile = app.getAppPath(new File(destinationDir, fileName).getPath());
long currentTime = System.currentTimeMillis();
try {
FileCopyInfo info = copyFilesCache.get(fileName);

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