Compare commits

..

17 Commits

Author SHA1 Message Date
Jean-Baptiste
60b1ad232a [android] Clean background color in views
Signed-off-by: Jean-Baptiste <jeanbaptiste.charron@outlook.fr>
2025-12-18 21:31:25 +01:00
Jean-Baptiste
1bac0fd4fc [search] Improve search terms in french
Signed-off-by: Jean-Baptiste <jeanbaptiste.charron@outlook.fr>
2025-12-18 20:35:30 +01:00
Codeberg Translate
ed6dcc5cb2 [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: JanezPavelZebovec <janezpavelzebovec@noreply.codeberg.org>
Co-authored-by: N4ta <codeberg@n4ta.anonaddy.me>
Co-authored-by: Prefill add-on <noreply-addon-prefill@weblate.org>
Co-authored-by: Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
Co-authored-by: Stephan-P <stephan-p@noreply.codeberg.org>
Co-authored-by: Stzyxh <stzyxh@noreply.codeberg.org>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: aoxa <aoxa@noreply.codeberg.org>
Co-authored-by: dobridabar <dobridabar@noreply.codeberg.org>
Co-authored-by: map-per <map-per@noreply.codeberg.org>
Co-authored-by: metehan <metehan@noreply.codeberg.org>
Co-authored-by: ovl-005 <ovl-005@noreply.codeberg.org>
Co-authored-by: patepelo <patepelo@noreply.codeberg.org>
Co-authored-by: teletext <teletext@noreply.codeberg.org>
Translate-URL: https://translate.codeberg.org/projects/comaps/android-typestrings/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios-typestrings/
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/Apple AppStore description
Translation: CoMaps/Countries and regions names
Translation: CoMaps/Voice announcements for navigation (TTS)
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS UI Strings
2025-12-18 14:24:02 +00:00
Jean-Baptiste
33b440dd71 [android] Remove custom attrs fonts styles
Signed-off-by: Jean-Baptiste <jeanbaptiste.charron@outlook.fr>
2025-12-18 15:23:52 +01:00
map-per
6a20269819 [editor] Rename button to 'Discard changes'
Signed-off-by: map-per <map-per@gmx.de>
2025-12-18 11:52:47 +01:00
NoelClick
8cd1b41cd2 [android] Update connection failure dialog cancellation behavior
- Update the connection failure dialog in the world download view based on reviewers' feedback.

Signed-off-by: NoelClick <dev@noel.click>
2025-12-18 09:41:55 +01:00
NoelClick
2b630964d0 [android] Unify custom map server dialog logic and UI
- Add setting icon for custom map server download option.
- Extract shared custom map server dialog helper.
- Clean up based on reviewers' feedback.

Signed-off-by: NoelClick <dev@noel.click>
2025-12-18 09:41:55 +01:00
NoelClick
76ecd8209e [android] Improve custom map server dialog UX
Signed-off-by: NoelClick <dev@noel.click>
2025-12-18 09:41:55 +01:00
NoelClick
82d2932ba0 [android] Add validation for custom map download URL
- Add validation for custom map download URL.
- Re-enable advanced server button after failed or paused downloads.

Signed-off-by: NoelClick <dev@noel.click>
2025-12-18 09:41:55 +01:00
NoelClick
85540133b3 [android] Clarify custom map download URL strings
Signed-off-by: NoelClick <dev@noel.click>
2025-12-18 09:41:55 +01:00
NoelClick
6ded75de9c [core] Treat custom map download URL as CDN base, not meta server
- Update `MapFilesDownloader::LoadMetaConfig()` to skip the metaserver when a
  custom base URL is set and build MetaConfig with that URL as the only server.
- Keep the existing metaserver-based behavior when no custom base URL is set.

Signed-off-by: NoelClick <dev@noel.click>
2025-12-18 09:41:55 +01:00
NoelClick
08e8ebd434 [android] Add custom world map download URL option
- Allow setting a custom map download URL in the "world-download" screen.

Signed-off-by: NoelClick <dev@noel.click>
2025-12-18 09:41:55 +01:00
NoelClick
6c92264fb0 [android] Add custom map download URL setting
Signed-off-by: NoelClick <dev@noel.click>
2025-12-18 09:41:55 +01:00
NoelClick
4ba0fc51a5 [android] Make it possible to set a custom map download URL
Signed-off-by: NoelClick <dev@noel.click>
2025-12-18 09:41:55 +01:00
NoelClick
29c363a581 [core] Allow overriding map metaserver URL and reset downloader cache
- Add custom meta server API.
- Implement override.
- Add reset hook and implement reset.
- Expose reset from Storage.
- Let JNI set URL and reset cache.

Signed-off-by: NoelClick <dev@noel.click>
2025-12-18 09:41:55 +01:00
map-per
4973f4fed2 [editor] Lower priority for building in changeset comments
Signed-off-by: map-per <map-per@gmx.de>
2025-12-18 07:53:52 +01:00
map-per
8cffa508f3 [android] Use separate function to check for MapTooOldToEdit
Signed-off-by: map-per <map-per@gmx.de>
2025-12-17 21:07:12 +01:00
84 changed files with 741 additions and 192 deletions

View File

@@ -10,6 +10,7 @@ CoMaps contributors:
Bastian Greshake Tzovaras
clover sage
Harry Bond <me@hbond.xyz>
NoelClick
thesupertechie
vikiawv
Yannik Bloscheck

View File

@@ -18,6 +18,7 @@ import android.location.Location;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.CallSuper;
@@ -25,7 +26,15 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.view.ViewCompat;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.progressindicator.LinearProgressIndicator;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.base.BaseMwmFragmentActivity;
import app.organicmaps.dialog.CustomMapServerDialog;
import app.organicmaps.downloader.MapManagerHelper;
import app.organicmaps.intent.Factory;
import app.organicmaps.sdk.Framework;
@@ -38,11 +47,7 @@ import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.progressindicator.LinearProgressIndicator;
import com.google.android.material.textview.MaterialTextView;
import java.util.List;
import java.util.Objects;
@@ -54,6 +59,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
private MaterialTextView mTvMessage;
private LinearProgressIndicator mProgress;
private MaterialButton mBtnDownload;
private MaterialButton mBtnAdvanced;
private MaterialCheckBox mChbDownloadCountry;
private String mCurrentCountry;
@@ -267,6 +273,14 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
mProgress = findViewById(R.id.progressbar);
mBtnDownload = findViewById(R.id.btn_download_resources);
mChbDownloadCountry = findViewById(R.id.chb_download_country);
mBtnAdvanced = findViewById(R.id.btn_advanced);
mBtnAdvanced.setOnClickListener(v -> {
CustomMapServerDialog.show(this, url -> {
prepareFilesDownload(false);
});
});
mBtnAdvanced.setEnabled(true);
mBtnListeners = new View.OnClickListener[BTN_COUNT];
mBtnNames = new String[BTN_COUNT];
@@ -291,6 +305,11 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
{
mBtnDownload.setOnClickListener(mBtnListeners[action]);
mBtnDownload.setText(mBtnNames[action]);
// Allow changing server only when idle or after an error.
boolean advancedEnabled = (action == DOWNLOAD || action == TRY_AGAIN || action == RESUME);
mBtnAdvanced.setEnabled(advancedEnabled);
mBtnAdvanced.setAlpha(advancedEnabled ? 1f : 0.5f);
}
private void doDownload()
@@ -359,6 +378,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
private void finishFilesDownload(int result)
{
mBtnAdvanced.setEnabled(true);
mBtnAdvanced.setAlpha(1f);
if (result == ERR_NO_MORE_FILES)
{
// World and WorldCoasts has been downloaded, we should register maps again to correctly add them to the model.
@@ -428,12 +450,16 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
.setTitle(titleId)
.setMessage(messageId)
.setCancelable(true)
.setOnCancelListener((dialog) -> setAction(PAUSE))
.setOnCancelListener((dialog) -> setAction(RESUME))
.setPositiveButton(R.string.try_again,
(dialog, which) -> {
setAction(TRY_AGAIN);
onTryAgainClicked();
})
.setNegativeButton(R.string.cancel,
(dialog, which) -> {
setAction(RESUME);
})
.setOnDismissListener(dialog -> mAlertDialog = null)
.show();
}

View File

@@ -0,0 +1,86 @@
package app.organicmaps.dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.PreferenceManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import app.organicmaps.R;
import app.organicmaps.sdk.Framework;
public final class CustomMapServerDialog
{
public interface OnUrlAppliedListener
{
void onUrlApplied(@NonNull String url);
}
private CustomMapServerDialog() {}
public static void show(@NonNull Context context,
@Nullable OnUrlAppliedListener listener)
{
View dialogView = LayoutInflater.from(context)
.inflate(R.layout.dialog_custom_map_server, null);
TextInputLayout til = dialogView.findViewById(R.id.til_custom_map_server);
TextInputEditText edit = dialogView.findViewById(R.id.edit_custom_map_server);
SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(context);
String current = prefs.getString(context.getString(R.string.pref_custom_map_download_url), "");
edit.setText(current);
MaterialAlertDialogBuilder builder =
new MaterialAlertDialogBuilder(context, R.style.MwmTheme_AlertDialog)
.setTitle(R.string.download_resources_custom_url_title)
.setMessage(R.string.download_resources_custom_url_message)
.setView(dialogView)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.save, null);
AlertDialog dialog = builder.create();
dialog.setOnShowListener(dlg -> {
Button ok = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
ok.setOnClickListener(v -> {
String url = edit.getText() != null ? edit.getText().toString().trim() : "";
if (!url.isEmpty()
&& !url.startsWith("http://")
&& !url.startsWith("https://"))
{
til.setError(context.getString(R.string.download_resources_custom_url_error_scheme));
return;
}
til.setError(null);
String normalizedUrl = Framework.normalizeServerUrl(url);
prefs.edit()
.putString(context.getString(R.string.pref_custom_map_download_url), normalizedUrl)
.apply();
// Apply to native
Framework.applyCustomMapDownloadUrl(context, normalizedUrl);
if (listener != null)
listener.onUrlApplied(normalizedUrl);
dialog.dismiss();
});
});
dialog.show();
}
}

View File

@@ -4,16 +4,23 @@ import static app.organicmaps.leftbutton.LeftButtonsHolder.DISABLE_BUTTON_CODE;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceManager;
import androidx.preference.TwoStatePreference;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.dialog.CustomMapServerDialog;
import app.organicmaps.downloader.OnmapDownloader;
import app.organicmaps.editor.LanguagesFragment;
import app.organicmaps.editor.ProfileActivity;
@@ -35,7 +42,7 @@ import app.organicmaps.sdk.util.SharedPropertiesUtils;
import app.organicmaps.sdk.util.log.LogsManager;
import app.organicmaps.util.ThemeSwitcher;
import app.organicmaps.util.Utils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -73,6 +80,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
initScreenSleepEnabledPrefsCallbacks();
initShowOnLockScreenPrefsCallbacks();
initLeftButtonPrefs();
initCustomMapDownloadUrlPrefsCallbacks();
}
private void initLeftButtonPrefs()
@@ -535,6 +543,34 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
});
}
private void initCustomMapDownloadUrlPrefsCallbacks()
{
Preference customUrlPref = getPreference(getString(R.string.pref_custom_map_download_url));
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
String current = prefs.getString(getString(R.string.pref_custom_map_download_url), "");
String normalizedUrl = Framework.normalizeServerUrl(current);
// Initial summary
customUrlPref.setSummary(normalizedUrl.isEmpty()
? getString(R.string.download_resources_custom_url_summary_none)
: normalizedUrl);
// Sync native
Framework.applyCustomMapDownloadUrl(requireContext(), normalizedUrl);
// Show dialog
customUrlPref.setOnPreferenceClickListener(preference -> {
CustomMapServerDialog.show(requireContext(), url -> {
preference.setSummary(url.isEmpty()
? getString(R.string.download_resources_custom_url_summary_none)
: url);
});
return true;
});
}
private void removePreference(@NonNull String categoryKey, @NonNull Preference preference)
{
final PreferenceCategory category = getPreference(categoryKey);

View File

@@ -700,22 +700,27 @@ public class PlacePageView extends Fragment
if (shouldEnableEditPlace)
{
mTvEditPlace.setEnabled(true);
mTvAddPlace.setEnabled(true);
mTvEditPlace.setOnClickListener(this);
mTvAddPlace.setOnClickListener(this);
}
else
{
mTvEditPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
mTvAddPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
String countryId = MapManager.nativeGetSelectedCountry();
if (countryId != null)
if (countryId != null && MapManager.nativeIsMapTooOldToEdit(countryId))
{
// map editing is disabled because the map is too old
mTvEditPlace.setEnabled(true);
mTvAddPlace.setEnabled(true);
mTvEditPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
mTvAddPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
CountryItem map = CountryItem.fill(countryId);
if (map.status == CountryItem.STATUS_UPDATABLE || map.status == CountryItem.STATUS_DONE
@@ -740,6 +745,12 @@ public class PlacePageView extends Fragment
mapTooOldDescription.setText(R.string.place_page_app_too_old_description);
}
}
else
{
// map editing is disabled for other reasons
mTvEditPlace.setEnabled(false);
mTvAddPlace.setEnabled(false);
}
}
final int editButtonColor =

View File

@@ -2,6 +2,6 @@
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/bg_panel"/>
<solid android:color="@color/bg_window"/>
<corners android:radius="100dp"/>
</shape>

View File

@@ -2,5 +2,5 @@
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/bg_panel"/>
<solid android:color="@color/bg_window"/>
</shape>

View File

@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:tint="?colorControlNormal"
android:height="24dp"
android:width="24dp"
android:viewportHeight="960"
android:viewportWidth="960">
<path android:fillColor="@android:color/white"
android:pathData="M260,800Q169,800 104.5,737Q40,674 40,583Q40,505 87,444Q134,383 210,366Q227,294 295,229Q363,164 440,164Q473,164 496.5,187.5Q520,211 520,244L520,486L584,424L640,480L480,640L320,480L376,424L440,486L440,244Q364,258 322,317.5Q280,377 280,440L260,440Q202,440 161,481Q120,522 120,580Q120,638 161,679Q202,720 260,720L740,720Q782,720 811,691Q840,662 840,620Q840,578 811,549Q782,520 740,520L680,520L680,440Q680,392 658,350.5Q636,309 600,280L600,187Q674,222 717,290.5Q760,359 760,440L760,440L760,440Q829,448 874.5,499.5Q920,551 920,620Q920,695 867.5,747.5Q815,800 740,800L260,800ZM480,442Q480,442 480,442Q480,442 480,442L480,442Q480,442 480,442Q480,442 480,442L480,442Q480,442 480,442Q480,442 480,442L480,442Q480,442 480,442Q480,442 480,442Q480,442 480,442Q480,442 480,442L480,442Q480,442 480,442Q480,442 480,442Q480,442 480,442Q480,442 480,442L480,442L480,442Q480,442 480,442Q480,442 480,442Z"/>
</vector>

View File

@@ -11,6 +11,18 @@
android:layout_height="match_parent"
android:layout_above="@+id/button_container"
android:layout_gravity="center">
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_advanced"
style="@style/Widget.Material3.Button.IconButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:icon="@drawable/ic_settings"
app:iconTint="?iconTint"
android:contentDescription="@string/download_resources_custom_url_title"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_margin="@dimen/margin_half" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.textfield.TextInputLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/til_custom_map_server"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/margin_base"
android:paddingEnd="@dimen/margin_base"
android:paddingTop="@dimen/margin_base"
android:paddingBottom="@dimen/margin_half"
android:hint="@string/download_resources_custom_url_title"
app:placeholderText="@string/download_resources_custom_url_hint"
app:endIconMode="clear_text">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edit_custom_map_server"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textUri"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>

View File

@@ -24,7 +24,7 @@
android:id="@+id/items_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?panel">
android:background="?windowBackgroundForced">
<include
layout="@layout/item_missed_map"
android:layout_width="match_parent"

View File

@@ -26,7 +26,7 @@
android:id="@+id/items_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?panel"
android:background="?windowBackgroundForced"
android:listSelector="?clickableBackground"
android:drawSelectorOnTop="true"/>

View File

@@ -60,7 +60,7 @@
android:layout_below="@id/tv__bookmark_set_title"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/margin_quadruple"
android:background="?attr/selectableItemBackground"
android:background="?selectableItemBackground"
android:clickable="true"
android:paddingTop="@dimen/margin_quarter_plus"
android:paddingBottom="@dimen/margin_half_plus"

View File

@@ -2,7 +2,7 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="?attr/cardBackground"
android:background="?cardBackground"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -11,7 +11,6 @@
style="@style/MwmWidget.ToolbarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?colorPrimary"
android:gravity="end|center_vertical"
android:theme="@style/MwmWidget.ToolbarTheme">
</com.google.android.material.appbar.MaterialToolbar>

View File

@@ -18,7 +18,7 @@
app:srcCompat="@drawable/ic_done"
android:layout_width="?actionBarSize"
android:layout_height="?actionBarSize"
android:background="?attr/selectableItemBackgroundBorderless"
android:background="?selectableItemBackgroundBorderless"
android:layout_gravity="end|center_vertical"
android:scaleType="centerInside"
android:contentDescription="@string/save" />

View File

@@ -48,7 +48,6 @@
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?panel"/>
android:layout_height="match_parent" />
</LinearLayout>

View File

@@ -12,7 +12,6 @@
style="@style/MwmWidget.ToolbarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?colorPrimary"
android:gravity="end|center_vertical"
android:theme="@style/MwmWidget.ToolbarTheme">
<com.google.android.material.imageview.ShapeableImageView

View File

@@ -22,8 +22,7 @@
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?panel">
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"

View File

@@ -15,7 +15,7 @@
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:background="?colorPrimary"
android:elevation="@dimen/dp_0"
app:elevation="@dimen/dp_0">
<include

View File

@@ -45,7 +45,7 @@
android:paddingStart="0dp"
android:paddingEnd="@dimen/altitude_chart_container_padding_left">
<View
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="@dimen/divider_height"
android:background="?dividerHorizontal"/>

View File

@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?panel"
android:background="?windowBackgroundForced"
android:orientation="vertical">

View File

@@ -155,7 +155,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_half_plus"
android:layout_marginBottom="@dimen/margin_quarter"
android:background="?attr/selectableItemBackground"
android:background="?selectableItemBackground"
android:gravity="center"
android:orientation="horizontal"
android:paddingStart="@dimen/margin_quarter"

View File

@@ -29,7 +29,7 @@
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?panel"
android:background="?cardBackground"
android:padding="@dimen/margin_base"
android:text="@string/editor_focus_map_on_location"
app:layout_constraintTop_toBottomOf="@+id/toolbar_point_chooser" />

View File

@@ -4,7 +4,7 @@
android:id="@+id/pp_buttons_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?ppButtonsBackground"
android:background="?windowBackgroundForced"
android:orientation="horizontal"
android:layout_gravity="bottom">
<include layout="@layout/item_divider" />

View File

@@ -28,7 +28,7 @@
android:layout_width="?attr/actionBarSize"
android:layout_height="?attr/actionBarSize"
android:layout_alignParentStart="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:background="?selectableItemBackgroundBorderless"
app:srcCompat="?homeAsUpIndicator"
android:scaleType="center"
tools:src="@drawable/ic_expand_more" />
@@ -143,7 +143,7 @@
android:id="@+id/driving_options_btn_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/drivingOptionsViewBg"
android:background="?drivingOptionsViewBg"
android:foreground="@drawable/shadow_top"
android:visibility="gone"
tools:visibility="visible">
@@ -151,7 +151,7 @@
android:id="@+id/driving_options_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:background="?selectableItemBackgroundBorderless"
android:gravity="center"
android:minHeight="@dimen/height_block_base">
<LinearLayout

View File

@@ -14,7 +14,7 @@
android:id="@+id/back"
android:layout_width="?attr/actionBarSize"
android:layout_height="?attr/actionBarSize"
android:background="?attr/selectableItemBackgroundBorderless"
android:background="?selectableItemBackgroundBorderless"
app:srcCompat="?homeAsUpIndicator"
android:scaleType="center"
tools:src="@drawable/ic_expand_more"
@@ -52,7 +52,7 @@
android:layout_height="?actionBarSize"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:background="?attr/selectableItemBackgroundBorderless"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/clear_the_search"
android:scaleType="center"
app:srcCompat="@drawable/ic_close"/>
@@ -63,7 +63,7 @@
android:layout_height="?actionBarSize"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:background="?attr/selectableItemBackgroundBorderless"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@null"
android:scaleType="center"
app:srcCompat="@drawable/ic_mic_white"

View File

@@ -502,7 +502,7 @@
<string name="placepage_edit_bookmark_button">Lesezeichen bearbeiten</string>
<string name="placepage_personal_notes_hint">Persönliche Notizen (Text oder html)</string>
<string name="editor_reset_edits_message">Alle lokalen Änderungen verwerfen?</string>
<string name="editor_reset_edits_button">Verwerfen</string>
<string name="editor_reset_edits_button">Änderungen verwerfen</string>
<string name="editor_remove_place_message">Hinzugefügtes Objekt löschen?</string>
<string name="editor_remove_place_button">Löschen</string>
<string name="editor_place_doesnt_exist">Dieser Ort existiert nicht</string>
@@ -902,9 +902,17 @@
<item quantity="other">%d min</item>
</plurals>
<string name="editor_business_vacant_button">Geschäft steht leer</string>
<string name="editor_mark_business_vacant_title">Geschäft als leerstehend markieren</string>
<string name="editor_mark_business_vacant_title">Geschäft auf leerstehend setzen</string>
<string name="editor_submit">Absenden</string>
<string name="editor_mark_business_vacant_description">Wenn das Unternehmen ausgezogen ist und die Fläche leer und bereit für die nächste Miete ist.</string>
<string name="editor_mark_business_vacant_description">Verwenden Sie diese Option, wenn das Geschäft ausgezogen ist und ein neues Geschäft die leerstehenden Räume übernehmen könnte.</string>
<string name="charge_socket_schuko">Schuko</string>
<string name="power_management">Energiemanagement</string>
<string name="place_page_map_too_old_title">Kartendaten veraltet</string>
<string name="place_page_map_too_old_description">Die aktuellen Kartendaten sind sehr alt, bitte aktualisiere die Karte.</string>
<string name="place_page_app_too_old_description">Die aktuellen Kartendaten sind sehr alt, bitte aktualisiere die CoMaps-App.</string>
<string name="place_page_update_too_old_map">Kartenregion aktualisieren</string>
<string name="place_page_too_old_to_edit">OpenStreetMap-Bearbeitung ist deaktiviert, da die Kartendaten zu alt sind.</string>
<string name="prefs_speed_cameras_information">Blitzerwarnungen sind in Ländern deaktiviert, in denen Warnungen durch lokale Gesetze verboten sind.</string>
<string name="navigation_start_tts_message">"Navigation wird gestartet, Sprache der Sprachansagen: "</string>
<string name="navigation_start_tts_disabled_message">Sprachansagen deaktiviert: TTS-Engine nicht verfügbar</string>
</resources>

View File

@@ -42,15 +42,15 @@
<!-- Text in About screen -->
<string name="about_proposition_3">• آفلاین، چابک و جمع و جور</string>
<!-- Text in About screen -->
<string name="about_developed_by_enthusiasts">منبع کاملا باز، نه برای سود، تصمیم گیری شفاف و امور مالی شفاف.</string>
<string name="about_developed_by_enthusiasts">ویدابُن بُوَندگ، نه ازبرای سود، وزیریدن اود تیس‌های مالی رو راست.</string>
<!-- The button that opens system location settings -->
<string name="location_settings">پیکربندی‌های گیاگ</string>
<string name="close">بستن</string>
<string name="unsupported_phone">متأسفانه دستگاه شما از آن پشتیبانی نمی‌کندبرنامه برای اجرا به OpenGL نیازمند است.</string>
<string name="unsupported_phone">برنامه به OpenGL نیازمند است.شوربختانه، از دستگاه شما پشتیبانی نمی‌شود.</string>
<string name="download">بارگیری</string>
<!-- Used in DownloadResources startup screen -->
<string name="not_enough_free_space_on_sdcard">لطفا مقداری از فضای ذخیره‌سازی را آزاد نمایید</string>
<string name="download_resources">قبل از استفاده از اپلیکیشن, اجازه دهید تا ما نقشه جهانی را بر روی موبایل شما دانلود کنیم. \nمقدار %s از حافظه شما اشغال می شود.</string>
<string name="not_enough_free_space_on_sdcard">لطفا پیش از بکارگیری برنامه، نخست کمی جا در کارت SD/ویر USB آزاد کنید</string>
<string name="download_resources">پیش از بکارگیری برنامه, لطفا نقشه پیش‌نمایش جهانی را بر روی دستگاه خویش بارگیری کنید.\nاندازه %s از ویر شما را می‌گیرد.</string>
<string name="download_resources_continue">برو به نقشه</string>
<string name="downloading_country_can_proceed">بارگیری می‌شود %1$s (%2$s). شما اکنون می‌توانید\nبه نقشه بروید.</string>
<string name="download_country_ask">بارگیری %1$s؟ (%2$s)</string>
@@ -64,7 +64,7 @@
<!-- "Add new bookmark list" dialog title -->
<string name="add_new_set">افزودن پهرستی نو</string>
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
<string name="bookmarks">نشانهها</string>
<string name="bookmarks">نشانگها</string>
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
<string name="bookmarks_and_tracks">نشانه‌ها و مسیر ها</string>
<!-- Add bookmark dialog - bookmark name -->
@@ -138,7 +138,7 @@
<!-- Notes field in Bookmarks view -->
<string name="description">یادداشت‌ها</string>
<!-- message title of loading file -->
<string name="load_kmz_title">در حال بارگیری نشانهها</string>
<string name="load_kmz_title">بارگذاری نشانگها</string>
<!-- Kmz file successful loading -->
<string name="load_kmz_successful">نشانه‌ها با موفقیت بارگذاری شد!شما می توانید آنها را در نقشه یا بخش مدیریت نشانه‌ها بیابید.</string>
<!-- Kml file loading failed -->
@@ -784,4 +784,6 @@
<string name="backup_interval_every_week">هفتگی</string>
<string name="backup_interval_manual_only">خاموش (تنها به شیوه دستی)</string>
<string name="backup_interval_every_day">روزانه</string>
<string name="disconnect_usb_cable">برای بکارگیری CoMaps، لطفا USB را بگسلانید یا کارت‌ویر را اندرون گذارید.</string>
<string name="bookmark_set_name">نام پهرست نشانگ‌ها</string>
</resources>

View File

@@ -373,4 +373,6 @@
<string name="offline_explanation_title">Mappys Dhywarlinen</string>
<string name="category_shopping">Gwerthjiow</string>
<string name="edit">Golegi</string>
<string name="downloader_no_space_title">Nyns eus lowr dalghuster</string>
<string name="translated_om_site_url">https://comaps.app/</string>
</resources>

View File

@@ -503,7 +503,7 @@
<string name="placepage_edit_bookmark_button">Rediger bokmerke</string>
<string name="placepage_personal_notes_hint">Personlige notater (tekst eller html)</string>
<string name="editor_reset_edits_message">Forkaste alle lokale endringer?</string>
<string name="editor_reset_edits_button">Forkast</string>
<string name="editor_reset_edits_button">Forkast endringer</string>
<string name="editor_remove_place_message">Slette tillagt sted?</string>
<string name="editor_remove_place_button">Slett</string>
<string name="editor_place_doesnt_exist">Sted finnes ikke</string>
@@ -906,4 +906,10 @@
<string name="place_page_too_old_to_edit">OpenStreetMap-redigering er deaktivert fordi kartdataene er for gamle.</string>
<string name="osm_note_hint">Alternativt, så kan du legge til et notat i OpenStreetMap, slik at noen andre kan redigere eller legge til stedet.</string>
<string name="osm_note_toast">Notatet vil bli sendt til OpenStreetMap</string>
<string name="advanced">Avansert</string>
<string name="download_resources_custom_url_summary_none">Ikke angitt</string>
<string name="download_resources_custom_url_error_scheme">Angi en fullstendig nettadresse som starter med https:// og slutter med /</string>
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
<string name="download_resources_custom_url_message">Overstyr standardserveren som brukes til nedlasting av kart. La det stå tomt for å bruke CoMaps standardserver.</string>
<string name="download_resources_custom_url_title">Tilpasset kartserver</string>
</resources>

View File

@@ -88,19 +88,6 @@
<item name="android:textAppearanceSmall">@style/TextAppearance.Small</item>
<item name="android:textAppearanceMedium">@style/TextAppearance.Medium</item>
<item name="android:textAppearanceLarge">@style/TextAppearance.Large</item>
<item name="fontHeadline1">@style/TextAppearance.Headline1</item>
<item name="fontHeadline2">@style/TextAppearance.Headline2</item>
<item name="fontHeadline3">@style/TextAppearance.Headline3</item>
<item name="fontHeadline4">@style/TextAppearance.Headline4</item>
<item name="fontHeadline5">@style/TextAppearance.MaterialComponents.Headline5</item>
<item name="fontHeadline6">@style/TextAppearance.Headline6</item>
<item name="fontSubtitle1">@style/TextAppearance.Subtitle1</item>
<item name="fontSubtitle2">@style/TextAppearance.Subtitle2</item>
<item name="fontBody1">@style/TextAppearance.Body1</item>
<item name="fontBody2">@style/TextAppearance.Body2</item>
<item name="fontButton">@style/TextAppearance.Button</item>
<item name="fontCaption">@style/TextAppearance.Caption</item>
<item name="fontOverline">@style/TextAppearance.Overline</item>
<item name="drivingOptionsViewBg">@color/bg_primary_dark</item>
<item name="elevationProfilePropertyBg">@drawable/bg_rounded_rect</item>
<item name="elevationProfilePropIconTint">@color/white_secondary</item>

View File

@@ -909,4 +909,10 @@
<string name="prefs_speed_cameras_information">Avisos de câmaras de velocidade estão desativados em países onde alertas estão proibidos por lei.</string>
<string name="navigation_start_tts_message">"Iniciando Navegação, idioma das instruções por voz: "</string>
<string name="navigation_start_tts_disabled_message">Instruções por voz desativadas: nenhum motor de TTS disponível</string>
<string name="advanced">Avançadas</string>
<string name="download_resources_custom_url_title">Servidor de Mapa Personalizado</string>
<string name="download_resources_custom_url_message">Substitui o servidor de download de mapas normal. Deixe em branco para usar o servidor do CoMaps padrão.</string>
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
<string name="download_resources_custom_url_summary_none">Indefinido</string>
<string name="download_resources_custom_url_error_scheme">Por favor insira um URL inteiro começando com https:// e acabando com /</string>
</resources>

View File

@@ -277,7 +277,7 @@
<!-- Preference title -->
<string name="google_play_services">Serviciul de Localizare Fuzionat Google</string>
<!-- Preference text -->
<string name="pref_use_google_play">Un serviciu proprietar care combină GPS, Wi-Fi, rețelele celulare etc. pentru a-ți determina locația mai precisă. Se poate conecta la serverele Google.</string>
<string name="pref_use_google_play">Un serviciu proprietar care combină GPS, Wi-Fi, rețelele celulare etc. pentru a-ți determina locația mai precis. Se poate conecta la serverele Google.</string>
<!-- Preference title -->
<!-- Preference description -->
<!-- Text for routing error dialog -->
@@ -460,7 +460,7 @@
<string name="osm_presentation">Date OpenStreetMap create de comunitate la data de %s. Aflați mai multe despre cum să editați și să actualizați harta la OpenStreetMap.org</string>
<!-- OSM explanation on Android login screen -->
<string name="login_osm_presentation">OpenStreetMap.org (OSM) este un proiect comunitar pentru construirea unei hărți libere și deschise. Este principala sursă de date cartografice în CoMaps și funcționează similar cu Wikipedia. Puteți adăuga sau edita locuri, iar acestea devin disponibile pentru milioane de utilizatori din întreaga lume. \nAlăturați-vă comunității și ajutați la crearea unei hărți mai bune pentru toată lumea!</string>
<string name="login_to_make_edits_visible">Creați un cont OpenStreetMap sau conectați-vă pentru a vă publica edițiile de hartă în întreaga lume</string>
<string name="login_to_make_edits_visible">Creați un cont OpenStreetMap sau conectați-vă pentru a vă publica editările hărții pentru întreaga lume</string>
<!-- Downloaded 10 **of** 20 <- it is that "of" -->
<string name="downloader_of">%1$d din %2$d</string>
<string name="download_over_mobile_header">Vrei să descarci prin rețeaua de telefonie mobilă?</string>
@@ -475,7 +475,7 @@
<!-- Hint of the input field in the OSM note section of the editor -->
<string name="editor_note_hint">Descrieți erorile de pe hartă sau lucrurile care nu pot fi editate cu CoMaps</string>
<!-- Information about OSM at the top of the editing page -->
<string name="editor_about_osm">Edițiile dvs. sunt încărcate în baza de date publică <a href="https://wiki.openstreetmap.org/wiki/About_OpenStreetMap">OpenStreetMap</a>. Vă rugăm să nu adăugați informații personale sau protejate prin drepturi de autor.</string>
<string name="editor_about_osm">Editările dvs. sunt încărcate în baza de date publică <a href="https://wiki.openstreetmap.org/wiki/About_OpenStreetMap">OpenStreetMap</a>. Vă rugăm să nu adăugați informații personale sau protejate prin drepturi de autor.</string>
<string name="editor_more_about_osm">Mai multe despre OpenStreetMap</string>
<string name="editor_osm_history">Istoricul dvs. de editare</string>
<string name="editor_osm_notes">Note privind datele hărții dvs</string>
@@ -889,4 +889,13 @@
<string name="list_description_empty">Editează lista ca să adaugi o descriere</string>
<string name="charging_station_available_sockets">Conectori</string>
<string name="charge_socket_unknown_other">Alte tipuri necunoscute</string>
<string name="place_page_map_too_old_title">Harta este prea veche</string>
<string name="place_page_map_too_old_description">Harta dvs. este foarte veche, vă rugăm actualizați-o.</string>
<string name="place_page_app_too_old_description">Harta dvs. este foarte veche, vă rugăm actualizați CoMaps.</string>
<string name="place_page_update_too_old_map">Actualizează harta</string>
<string name="place_page_too_old_to_edit">Editarea OpenStreetMap este dezactivată pentru că harta descărcată este prea veche.</string>
<string name="prefs_speed_cameras_information">Avertizările pentru radare sunt dezactivate unde avertizarea este interzisă de legea locală.</string>
<string name="navigation_start_tts_disabled_message">Instrucțiuni vocale dezactivate: Nu este disponibil niciun sistem TTS</string>
<string name="charge_socket_count">Număr</string>
<string name="unknown_count">Necunoscut</string>
</resources>

View File

@@ -893,4 +893,5 @@
<string name="unknown_count">bilinmiyor</string>
<string name="error_value_must_be_positive">Değer pozitif olmalıdır</string>
<string name="error_invalid_number">Geçersiz sayı</string>
<string name="avoid_paved">Asfalt yollardan kaçın</string>
</resources>

View File

@@ -43,6 +43,8 @@
<string name="pref_backup" translatable="false">Backup</string>
<string name="pref_left_button" translatable="false">LeftButton</string>
<string name="pref_power" translatable="false">pref_power</string>
<string name="pref_custom_map_download_url" translatable="false">CustomMapDownloadUrl</string>
<string name="pref_advanced" translatable="false">pref_advanced</string>
<string name="notification_ticker_ltr" translatable="false">%1$s: %2$s</string>
<string name="notification_ticker_rtl" translatable="false">%2$s :%1$s</string>

View File

@@ -544,7 +544,7 @@
<string name="placepage_edit_bookmark_button">Edit Bookmark</string>
<string name="placepage_personal_notes_hint">Personal notes (text or html)</string>
<string name="editor_reset_edits_message">Discard all local changes?</string>
<string name="editor_reset_edits_button">Discard</string>
<string name="editor_reset_edits_button">Discard changes</string>
<string name="editor_remove_place_message">Delete added place?</string>
<string name="editor_remove_place_button">Delete</string>
<string name="editor_place_doesnt_exist">Place does not exist</string>
@@ -966,4 +966,12 @@
<string name="offline_explanation_title">Offline Maps</string>
<string name="offline_explanation_text">A map needs to be downloaded to view and navigate the area.\nDownload maps for areas you want to travel.</string>
<string name="list_description_empty">Edit the list to add a description</string>
<!-- Settings: Advanced group -->
<string name="advanced">Advanced</string>
<!-- Custom Download URL -->
<string name="download_resources_custom_url_title">Custom Map Server</string>
<string name="download_resources_custom_url_message">Override the default map download server used for map downloads. Leave empty to use CoMaps default server.</string>
<string name="download_resources_custom_url_hint">https://cdn-fi-1.comaps.app/</string>
<string name="download_resources_custom_url_summary_none">Not set</string>
<string name="download_resources_custom_url_error_scheme">Please enter a full URL starting with https:// and ending with /</string>
</resources>

View File

@@ -69,19 +69,4 @@
<attr name="elevationProfileSelectedPointTriangle" format="reference" />
<attr name="elevationProfileFloatingTriangle" format="reference" />
</declare-styleable>
<declare-styleable name="ThemeAttrs.Fonts">
<attr name="fontHeadline1" format="reference" />
<attr name="fontHeadline2" format="reference" />
<attr name="fontHeadline3" format="reference" />
<attr name="fontHeadline4" format="reference" />
<attr name="fontHeadline5" format="reference" />
<attr name="fontHeadline6" format="reference" />
<attr name="fontSubtitle1" format="reference" />
<attr name="fontSubtitle2" format="reference" />
<attr name="fontBody1" format="reference" />
<attr name="fontBody2" format="reference" />
<attr name="fontButton" format="reference" />
<attr name="fontCaption" format="reference" />
<attr name="fontOverline" format="reference" />
</declare-styleable>
</resources>

View File

@@ -93,19 +93,6 @@
<item name="android:textAppearanceSmallInverse">@style/TextAppearance.Small.Inverse</item>
<item name="android:textAppearanceMediumInverse">@style/TextAppearance.Medium.Inverse</item>
<item name="android:textAppearanceLargeInverse">@style/TextAppearance.Large.Inverse</item>
<item name="fontHeadline1">@style/TextAppearance.Headline1</item>
<item name="fontHeadline2">@style/TextAppearance.Headline2</item>
<item name="fontHeadline3">@style/TextAppearance.Headline3</item>
<item name="fontHeadline4">@style/TextAppearance.Headline4</item>
<item name="fontHeadline5">@style/TextAppearance.MaterialComponents.Headline5</item>
<item name="fontHeadline6">@style/TextAppearance.Headline6</item>
<item name="fontSubtitle1">@style/TextAppearance.Subtitle1</item>
<item name="fontSubtitle2">@style/TextAppearance.Subtitle2</item>
<item name="fontBody1">@style/TextAppearance.Body1</item>
<item name="fontBody2">@style/TextAppearance.Body2</item>
<item name="fontButton">@style/TextAppearance.Button</item>
<item name="fontCaption">@style/TextAppearance.Caption</item>
<item name="fontOverline">@style/TextAppearance.Overline</item>
<item name="drivingOptionsViewBg">@color/bg_primary_dark</item>
<item name="elevationProfilePropertyBg">@drawable/bg_rounded_rect</item>
<item name="elevationProfilePropIconTint">@color/black_secondary</item>

View File

@@ -144,7 +144,8 @@
</intent>
</PreferenceScreen>
</androidx.preference.PreferenceCategory>
<PreferenceCategory
<PreferenceCategory
android:key="@string/pref_power"
android:title="@string/power_management"
android:order="4">
@@ -190,7 +191,8 @@
android:defaultValue="true"
android:widgetLayout="@layout/preference_switch"
android:order="5"/>
</PreferenceCategory>
</PreferenceCategory>
<androidx.preference.PreferenceCategory
android:key="@string/pref_privacy"
android:title="@string/privacy"
@@ -212,5 +214,18 @@
android:defaultValue="true"
android:widgetLayout="@layout/preference_switch"
android:order="2"/>
</androidx.preference.PreferenceCategory>
<androidx.preference.PreferenceCategory
android:key="@string/pref_advanced"
android:title="@string/advanced"
android:order="6">
<Preference
android:key="@string/pref_custom_map_download_url"
android:title="@string/download_resources_custom_url_title"
app:icon="@drawable/ic_cloud_download"
android:order="1" />
</androidx.preference.PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -124,6 +124,7 @@ dependencies {
implementation libs.androidx.lifecycle.process
implementation libs.androidx.media
implementation libs.androidx.recyclerview
implementation libs.androidx.preference
implementation libs.android.material
testImplementation libs.junit

View File

@@ -42,12 +42,16 @@ using namespace std::placeholders;
namespace
{
std::unique_ptr<MapFilesDownloader> & LegacyDownloader()
{
static auto downloader = storage::GetDownloader();
return downloader;
}
static std::vector<platform::CountryFile> g_filesToDownload;
static int g_totalDownloadedBytes;
static int g_totalBytesToDownload;
static std::shared_ptr<HttpRequest> g_currentRequest;
} // namespace
extern "C"
@@ -152,11 +156,11 @@ JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_DownloadResourcesLegacyActivity_
return ERR_NO_MORE_FILES;
/// @todo One downloader instance with cached servers. All this routine will be refactored some time.
static auto downloader = storage::GetDownloader();
auto & downloader = LegacyDownloader();
storage::Storage const & storage = g_framework->GetStorage();
downloader->SetDataVersion(storage.GetCurrentDataVersion());
downloader->EnsureMetaConfigReady([&storage, ptr = jni::make_global_ref(listener)]()
downloader->EnsureMetaConfigReady([&storage, ptr = jni::make_global_ref(listener), &downloader]()
{
auto const & curFile = g_filesToDownload.back();
auto const fileName = curFile.GetFileName(MapFileType::Map);
@@ -177,4 +181,12 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_DownloadResourcesLegacyActivity_
LOG(LDEBUG, ("cancelCurrentFile, currentRequest=", g_currentRequest));
g_currentRequest.reset();
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_DownloadResourcesLegacyActivity_nativeResetMetaConfig(JNIEnv *,
jclass)
{
auto & downloader = LegacyDownloader();
if (downloader)
downloader->ResetMetaConfig();
}
}

View File

@@ -1505,6 +1505,22 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativeGet3dMode(JNIEnv
env->SetBooleanField(result, buildingsField, buildings);
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativeSetCustomMapDownloadUrl(JNIEnv * env, jclass,
jstring url)
{
std::string nativeUrl = jni::ToNativeString(env, url);
GetPlatform().SetCustomMapServerUrl(nativeUrl);
if (g_framework)
{
frm()->GetStorage().ResetMapDownloadMetaConfig();
}
else
{
LOG(LINFO, ("nativeSetCustomMapDownloadUrl: framework not created yet, skipping ResetMapDownloadMetaConfig"));
}
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativeSetAutoZoomEnabled(JNIEnv * env, jclass,
jboolean enabled)
{

View File

@@ -587,4 +587,11 @@ JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeG
storage::CountryId const & res = g_framework->GetPlacePageInfo().GetCountryId();
return (res == storage::kInvalidCountryId ? nullptr : jni::ToJavaString(env, res));
}
// static native boolean nativeIsMapTooOldToEdit(String countryId);
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_downloader_MapManager_nativeIsMapTooOldToEdit(JNIEnv *env, jclass clazz,
jstring country_id)
{
return GetStorage().IsMapTooOldToEdit(jni::ToNativeString(env, country_id));
}
} // extern "C"

View File

@@ -27,4 +27,5 @@ public class DownloadResourcesLegacyActivity
public static native int nativeGetBytesToDownload();
public static native int nativeStartNextFileDownload(Listener listener);
public static native void nativeCancelCurrentFile();
public static native void nativeResetMetaConfig();
}

View File

@@ -1,10 +1,13 @@
package app.organicmaps.sdk;
import android.content.Context;
import android.graphics.Bitmap;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Size;
import app.organicmaps.sdk.api.ParsedRoutingData;
import app.organicmaps.sdk.api.ParsedSearchRequest;
import app.organicmaps.sdk.api.RequestType;
@@ -23,6 +26,7 @@ import app.organicmaps.sdk.routing.RoutingRecommendationListener;
import app.organicmaps.sdk.routing.TransitRouteInfo;
import app.organicmaps.sdk.settings.SpeedCameraMode;
import app.organicmaps.sdk.util.Constants;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -348,4 +352,20 @@ public class Framework
public static native void nativeMemoryWarning();
public static native void nativeSaveRoute();
public static native void nativeSetCustomMapDownloadUrl(String url);
public static void applyCustomMapDownloadUrl(@NonNull Context context, @Nullable String url)
{
nativeSetCustomMapDownloadUrl(normalizeServerUrl(url));
// Reset the legacy downloader too (world/coasts).
app.organicmaps.sdk.DownloadResourcesLegacyActivity.nativeResetMetaConfig();
}
public static String normalizeServerUrl(@Nullable String url)
{
String out = url != null ? url.trim() : "";
if (!out.isEmpty() && !out.endsWith("/"))
out = out + "/";
return out;
}
}

View File

@@ -2,10 +2,13 @@ package app.organicmaps.sdk;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner;
import androidx.preference.PreferenceManager;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.Icon;
import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround;
@@ -25,6 +28,7 @@ import app.organicmaps.sdk.util.SharedPropertiesUtils;
import app.organicmaps.sdk.util.StorageUtils;
import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.sdk.util.log.LogsManager;
import java.io.IOException;
public final class OrganicMaps implements DefaultLifecycleObserver
@@ -167,6 +171,11 @@ public final class OrganicMaps implements DefaultLifecycleObserver
/* isTablet */ false);
Config.setStoragePath(writablePath);
// Use the same prefs as SettingsPrefsFragment
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
final String savedUrl = prefs.getString(mContext.getString(R.string.pref_custom_map_download_url), "");
Framework.nativeSetCustomMapDownloadUrl(savedUrl.trim());
mPlatformInitialized = true;
Logger.i(TAG, "Platform initialized");
}

View File

@@ -261,4 +261,9 @@ public final class MapManager
* Returns country ID which the current PP object points to, or {@code null}.
*/
public static native @Nullable String nativeGetSelectedCountry();
/**
* Returns true when the map exists and is too old for map editing.
*/
public static native boolean nativeIsMapTooOldToEdit(String countryId);
}

View File

@@ -707,7 +707,7 @@
<string name="type.natural.beach.sand">Playa de arena</string>
<string name="type.natural.beach.gravel">Playa de grava</string>
<string name="type.natural.cape">Cabo</string>
<string name="type.natural.cave_entrance">Cueva</string>
<string name="type.natural.cave_entrance">Entrada de cueva</string>
<string name="type.natural.cliff">Acantilado</string>
<string name="type.natural.earth_bank">Talud de tierra</string>
<string name="type.man_made.embankment">Terraplén</string>
@@ -743,7 +743,7 @@
<string name="type.natural.wetland.marsh">Ciénaga</string>
<string name="type.noexit">Sin salida</string>
<string name="type.office">Oficina</string>
<string name="type.office.company">Oficina</string>
<string name="type.office.company">Oficina de compañía</string>
<string name="type.office.estate_agent">Agente inmobiliario</string>
<string name="type.office.government">Oficina gubernamental</string>
<string name="type.office.insurance">Oficina de seguros</string>
@@ -784,13 +784,13 @@
<string name="type.place.state">Estado</string>
<string name="type.place.state.USA">Estado</string>
<!-- Named part of a city or town, bigger than place=quarter (Wiki: https://wiki.openstreetmap.org/wiki/Tag:place%3Dsuburb) -->
<string name="type.place.suburb">Barrio</string>
<string name="type.place.suburb">Suburbio</string>
<string name="type.place.town">Pueblo</string>
<string name="type.place.village">Pueblo</string>
<string name="type.power">Energía</string>
<string name="type.power.generator">Generador</string>
<string name="type.power.generator.solar">Generador solar</string>
<string name="type.power.generator.wind">Generador de viento</string>
<string name="type.power.generator.wind">Aerogenerador</string>
<string name="type.power.generator.gas">Planta termoeléctrica de gas</string>
<string name="type.power.generator.hydro">Planta hidroeléctrica</string>
<string name="type.power.line">Línea eléctrica</string>
@@ -849,10 +849,10 @@
<string name="type.railway.station">Estación de tren</string>
<string name="type.railway.station.funicular">Funicular</string>
<string name="type.railway.station.light_rail">Estación de tren</string>
<string name="type.railway.station.light_rail.berlin">Estación de tren</string>
<string name="type.railway.station.light_rail.berlin">Estación de tren (S-Bahn)</string>
<string name="type.railway.station.light_rail.london">Estación de tren</string>
<string name="type.railway.station.light_rail.porto">Estación de tren</string>
<string name="type.railway.station.monorail">Estación de tren</string>
<string name="type.railway.station.light_rail.porto">Estación de metro</string>
<string name="type.railway.station.monorail">Estación de monoriel</string>
<string name="type.railway.station.subway">Estación de metro</string>
<string name="type.railway.station.subway.adana">Estación de metro</string>
<string name="type.railway.station.subway.algiers">Estación de metro</string>
@@ -1207,7 +1207,7 @@
<string name="type.shop.tobacco">Tabaco</string>
<string name="type.shop.trade">Suministros comerciales</string>
<string name="type.shop.watches">Relojes</string>
<string name="type.shop.wholesale">Almacén al por mayor</string>
<string name="type.shop.wholesale">Tienda al por mayor</string>
<string name="type.sport">Deporte</string>
<string name="type.sport.american_football">Fútbol americano</string>
<string name="type.sport.archery">Tiro al arco</string>
@@ -1247,7 +1247,7 @@
<string name="type.tourism.aquarium">Acuario</string>
<!-- Typically serviced, staff is present and food is available (compared to wilderness_hut). -->
<string name="type.tourism.alpine_hut">Albergue de montaña</string>
<string name="type.tourism.apartment">Apartamento de vacaciones</string>
<string name="type.tourism.apartment">Apartamento vacacional</string>
<string name="type.tourism.artwork">Obra de arte</string>
<string name="type.tourism.artwork.architecture">Arte arquitectónico</string>
<string name="type.tourism.artwork.painting">Pintura</string>

View File

@@ -1494,4 +1494,5 @@
<string name="type.spherical_buoy.safe_water">Faarvaatri kerapoi</string>
<string name="type.man_made.mast.communication">Sidemast</string>
<string name="type.shop.beauty.nails">Küünestuudio</string>
<string name="type.amenity.hydrant">Kastmishüdrant</string>
</resources>

View File

@@ -1500,4 +1500,5 @@
<string name="type.shop.beauty.nails">Nagelsalon</string>
<string name="type.amenity.food_sharing">Voedsel delen</string>
<string name="type.amenity.give_box">Giftenkist</string>
<string name="type.amenity.hydrant">Watertappunt|waterkraan</string>
</resources>

View File

@@ -1501,4 +1501,5 @@
<string name="type.natural.tree">Árvore</string>
<string name="type.shop.beauty.nails">Salão de Unhas</string>
<string name="type.xmas.tree">Árvore de Natal</string>
<string name="type.amenity.hydrant">Boca de Rega</string>
</resources>

View File

@@ -369,4 +369,92 @@
<string name="type.cuisine.breakfast">Zajtrk</string>
<string name="type.cuisine.bubble_tea">Čaj s tapiokinimi kroglicami (\'Bubble Tea\')</string>
<string name="type.cuisine.chicken">Piščanec</string>
<string name="type.cuisine.greek">Grška kuhinja</string>
<string name="type.cuisine.hungarian">Madžarska kuhinja</string>
<string name="type.cuisine.ice_cream">Sladoled</string>
<string name="type.cuisine.indian">Indijska kuhinja</string>
<string name="type.cuisine.indonesian">Indonezijska kuhinja</string>
<string name="type.cuisine.international">Mednarodna kuhinja</string>
<string name="type.cuisine.irish">Irska kuhinja</string>
<string name="type.cuisine.italian">Italijanska kuhinja</string>
<string name="type.cuisine.italian_pizza">Italijanska kuhinja, pica</string>
<string name="type.cuisine.japanese">Japonska kuhinja</string>
<string name="type.cuisine.korean">Korejska kuhinja</string>
<string name="type.cuisine.lao">Laoška kuhinja</string>
<string name="type.cuisine.lebanese">Libanonska kuhinja</string>
<string name="type.cuisine.local">Krajevna kuhinja</string>
<string name="type.cuisine.malaysian">Malezijska kuhinja</string>
<string name="type.cuisine.mediterranean">Sredozemska kuhinja</string>
<string name="type.cuisine.mexican">Mehiška kuhinja</string>
<string name="type.cuisine.moroccan">Maroška kuhinja</string>
<string name="type.cuisine.oriental">Orientalska kuhinja</string>
<string name="type.cuisine.pancake">Palačinke</string>
<string name="type.cuisine.pasta">Testenine</string>
<string name="type.cuisine.persian">Perzijska kuhinja</string>
<string name="type.cuisine.peruvian">Perujska kuhinja</string>
<string name="type.cuisine.pizza">Pica</string>
<string name="type.cuisine.polish">Poljska kuhinja</string>
<string name="type.cuisine.portuguese">Portugalska kuhinja</string>
<string name="type.cuisine.russian">Ruska kuhinja</string>
<string name="type.cuisine.sandwich">Sendvič</string>
<string name="type.cuisine.sausage">Salama</string>
<string name="type.cuisine.savory_pancakes">Slane palačinke</string>
<string name="type.cuisine.seafood">Morska hrana</string>
<string name="type.cuisine.soba">Soba (ajdovi rezanci)</string>
<string name="type.cuisine.spanish">Španska kuhinja</string>
<string name="type.cuisine.steak_house">Zrezkarnica</string>
<string name="type.cuisine.sushi">Suši</string>
<string name="type.cuisine.tea">Čaj</string>
<string name="type.cuisine.turkish">Turška kuhinja</string>
<string name="type.cuisine.vegan">Veganska kuhinja</string>
<string name="type.cuisine.vegetarian">Vegetarijanska kuhinja</string>
<string name="type.cuisine.vietnamese">Vietnamska kuhinja</string>
<string name="type.emergency">V sili</string>
<string name="type.emergency.access_point">Reševalno mesto</string>
<string name="type.emergency.assembly_point">Zbirno mesto</string>
<string name="type.emergency.life_ring">Reševalni obroč</string>
<string name="type.emergency.defibrillator">Defibrilator</string>
<string name="type.emergency.fire_hydrant">Požarni hidrant</string>
<string name="type.amenity.hydrant">Namakalni hidrant</string>
<string name="type.emergency.phone">Telefon v sili</string>
<string name="type.emergency.lifeguard">Reševalec</string>
<string name="type.beacon.cardinal.east">Glavni usmerjevalni znak</string>
<string name="type.beacon.cardinal.north">Glavni usmerjevalni znak</string>
<string name="type.beacon.cardinal.south">Glavni usmerjevalni znak</string>
<string name="type.beacon.cardinal.west">Glavni usmerjevalni znak</string>
<string name="type.beacon.isolated_danger">Usmerjevalni znak ločene nevarnosti</string>
<string name="type.craft.caterer">Ponudnik cateringa</string>
<string name="type.cuisine.balkan">Balkanska kuhinja</string>
<string name="type.cuisine.barbecue">Jedi na žaru</string>
<string name="type.cuisine.bavarian">Bavarska kuhinja</string>
<string name="type.cuisine.brazilian">Brazilska kuhinja</string>
<string name="type.cuisine.burger">Burger</string>
<string name="type.cuisine.buschenschank">Vinotoč (Buschenschank)</string>
<string name="type.cuisine.deli">Delkatesa</string>
<string name="type.cuisine.regional">Regionalna kuhinja</string>
<string name="type.cuisine.tapas">Tapas (španski prigrizki)</string>
<string name="type.cuisine.thai">Tajska kuhinja</string>
<string name="type.beacon.lateral.port">Bočni usmerjevalni znak</string>
<string name="type.beacon.lateral.starboard">Bočni usmerjevalni znak</string>
<string name="type.beacon.safe_water">Znak varne plovne poti</string>
<string name="type.beacon.special_purpose">Usmerjevalni znak posebnega namena</string>
<string name="type.buoy.cardinal.east">Glavna boja</string>
<string name="type.buoy.cardinal.north">Glavna boja</string>
<string name="type.buoy.cardinal.south">Glavna boja</string>
<string name="type.buoy.cardinal.west">Glavna boja</string>
<string name="type.lateral.port">Pristanišče</string>
<string name="type.cardinal.east">Vzhod</string>
<string name="type.cardinal.north">Sever</string>
<string name="type.cardinal.south">Jug</string>
<string name="type.cardinal.west">Zahod</string>
<string name="type.emergency.mountain_rescue">Postaja gorskih reševalcev</string>
<string name="type.entrance">Vhod</string>
<string name="type.entrance.main">Glavni vhod</string>
<string name="type.entrance.house">Vhod hiše</string>
<string name="type.entrance.garage">Vhod garaže</string>
<string name="type.entrance.service">Servisni vhod</string>
<string name="type.entrance.entry">Vstop (samo)</string>
<string name="type.entrance.exit">Izhod (samo)</string>
<string name="type.healthcare.laboratory">Zdravstveni laboratorij</string>
<string name="type.healthcare.psychotherapist">Psihoterapevt</string>
</resources>

View File

@@ -1399,4 +1399,5 @@
<string name="type.amenity.ranger_station">Orman Bekçisi</string>
<string name="type.amenity.bench.backless">Sırtıık Bank</string>
<string name="type.amenity.charging_station.motorcar.small">Araç Şarj Noktası</string>
<string name="type.amenity.sailing_school">Denizcilik Okulu</string>
</resources>

View File

@@ -3,4 +3,5 @@
<string name="pref_file_name" translatable="false">OrganicMapsPrefs</string>
<string name="pref_enable_logging" translatable="false">EnableLogging</string>
<string name="pref_emulate_bad_external_storage" translatable="false">EmulateBadExternalStorage</string>
<string name="pref_custom_map_download_url" translatable="false">CustomMapDownloadUrl</string>
</resources>

View File

@@ -220,13 +220,13 @@
"tourism-motel|@category_hotel": "3Motel|auberge de jeunesse",
"tourism-alpine_hut|@category_hotel": "Refuge de montagne|auberge de jeunesse|cabane alpine",
"shop-hairdresser": "3Coiffeur|salon de coiffure",
"aeroway-aerodrome": "3Aéroport|3aérodrome|3avion",
"aeroway-aerodrome": "3Aéroport|3aérodrome|3avion|3aérogare",
"leisure-stadium": "4Stade|4sport",
"leisure-playground|@category_children": "Terrain de jeu|aire de jeu",
"leisure-sports_centre|leisure-sports_centre-sport-american_football|leisure-sports_centre-sport-archery|leisure-sports_centre-sport-athletics|leisure-sports_centre-sport-australian_football|leisure-sports_centre-sport-badminton|leisure-sports_centre-sport-baseball|leisure-sports_centre-sport-basketball|leisure-sports_centre-sport-beachvolleyball|leisure-sports_centre-sport-bowls|leisure-sports_centre-sport-climbing|leisure-sports_centre-sport-cricket|leisure-sports_centre-sport-curling|leisure-sports_centre-sport-equestrian|leisure-sports_centre-sport-field_hockey|leisure-sports_centre-sport-futsal|leisure-sports_centre-sport-golf|leisure-sports_centre-sport-gymnastics|leisure-sports_centre-sport-handball|leisure-sports_centre-sport-ice_hockey|leisure-sports_centre-sport-multi|leisure-sports_centre-sport-padel|leisure-sports_centre-sport-pelota|leisure-sports_centre-sport-scuba_diving|leisure-sports_centre-sport-shooting|leisure-sports_centre-sport-skateboard|leisure-sports_centre-sport-skiing|leisure-sports_centre-sport-soccer|leisure-sports_centre-sport-table_tennis|leisure-sports_centre-sport-tennis|leisure-sports_centre-sport-volleyball|leisure-sports_centre-sport-yoga": "Centre sportif|sport",
"leisure-playground|@category_children": "Terrain de jeu|aire de jeu|parc de jeux|espace de jeu",
"leisure-sports_centre|leisure-sports_centre-sport-american_football|leisure-sports_centre-sport-archery|leisure-sports_centre-sport-athletics|leisure-sports_centre-sport-australian_football|leisure-sports_centre-sport-badminton|leisure-sports_centre-sport-baseball|leisure-sports_centre-sport-basketball|leisure-sports_centre-sport-beachvolleyball|leisure-sports_centre-sport-bowls|leisure-sports_centre-sport-climbing|leisure-sports_centre-sport-cricket|leisure-sports_centre-sport-curling|leisure-sports_centre-sport-equestrian|leisure-sports_centre-sport-field_hockey|leisure-sports_centre-sport-futsal|leisure-sports_centre-sport-golf|leisure-sports_centre-sport-gymnastics|leisure-sports_centre-sport-handball|leisure-sports_centre-sport-ice_hockey|leisure-sports_centre-sport-multi|leisure-sports_centre-sport-padel|leisure-sports_centre-sport-pelota|leisure-sports_centre-sport-scuba_diving|leisure-sports_centre-sport-shooting|leisure-sports_centre-sport-skateboard|leisure-sports_centre-sport-skiing|leisure-sports_centre-sport-soccer|leisure-sports_centre-sport-table_tennis|leisure-sports_centre-sport-tennis|leisure-sports_centre-sport-volleyball|leisure-sports_centre-sport-yoga": "Centre sportif|salle omnisports|complexe sportif|sport",
"leisure-golf_course": "Terrain de golf|Parcours de golf",
"leisure-miniature_golf": "Minigolf",
"leisure-escape_game": "Salle d'évasion",
"leisure-escape_game": "Salle d'évasion|escape game",
"leisure-pitch": "Terrain de sport|sport",
"leisure-swimming_pool": "4Piscine|sport",
"sport-american_football": "Football américain",
@@ -245,12 +245,12 @@
"sport-gymnastics": "Gymnastique",
"sport-handball": "Handball",
"sport-scuba_diving": "Plongée sous-marine",
"sport-shooting": "Stand de tir|Centre de tir",
"sport-shooting": "Stand de tir|Centre de tir|champ de tir|salle de tir",
"sport-skateboard": "Skateboard",
"sport-skiing": "Ski",
"sport-soccer": "Football",
"sport-swimming": "Piscine|Natation",
"sport-table_tennis": "Tennis de table",
"sport-table_tennis": "Tennis de table|Ping Pong",
"sport-tennis": "Tennis",
"sport-padel": "Padel",
"sport-volleyball": "Volley-ball",
@@ -272,27 +272,27 @@
"natural-water-pond|@waterbody": "Étang|bassin",
"natural-water-lake|@waterbody": "Lac",
"natural-water-reservoir|landuse-reservoir|@waterbody": "5Réservoir",
"waterway-river|waterway-stream|natural-water-river": "Rivière|fleuve",
"waterway-river|waterway-stream|natural-water-river": "Rivière|fleuve|ruisseau|cours d'eau|torrent",
"waterway-canal": "Canal",
"shop-car_repair": "3Réparation d'automobiles|3garage|4station service|voiture|auto|garagiste|mécano|mécanicien automobile",
"tourism-camp_site|@category_hotel": "4Camping|terrain de camping",
"tourism-caravan_site|@category_rv||@category_hotel": "4Parc caravanier|VR|caravane|camping-car",
"office": "Bureau|compagnie",
"office-company": "Bureaux d'entreprise",
"office-government": "Administration publique",
"office-lawyer": "Cabinet d'avocat",
"office-government": "Administration publique|service public|fonction publique|service civil|services administratifs",
"office-lawyer": "Cabinet d'avocat|bureau d'avocat",
"office-telecommunication": "Opérateur mobile",
"craft-beekeeper": "Apiculteur",
"craft-blacksmith": "Forgeron",
"craft-brewery": "Brasserie artisanale|Brasseur",
"craft-brewery": "Brasserie artisanale|Brasseur|micro-brasserie",
"craft-caterer": "Traiteur",
"craft-carpenter": "Menuisier|charpentier",
"craft-confectionery": "Confiseur",
"craft-electrician": "4Électricien",
"craft-electronics_repair": "Réparation d'appareils électroniques",
"craft-gardener": "Paysagiste",
"craft-gardener": "Paysagiste|jardinier",
"craft-grinding_mill": "Moulin",
"craft-handicraft": "Artisanat",
"craft-handicraft": "Artisanat|fait-main|métiers d'art",
"craft-hvac": "Chauffage, ventilation et climatisation",
"craft-metal_construction": "5Métallo|métallurgiste",
"craft-key_cutter": "Reproduction de clé",
@@ -302,7 +302,7 @@
"craft-plumber": "Plombier",
"craft-sawmill": "Scierie",
"craft-shoemaker": "Cordonnier",
"craft-winery": "Chai",
"craft-winery": "Chai|établissement vinicole",
"craft-tailor": "5Tailleur",
"area:highway-footway|area:highway-pedestrian|area:highway-steps|place-square": "Place",
"place-sea": "Mer",
@@ -320,11 +320,11 @@
"shop-copyshop": "Boutique de photocopies|5Imprimerie",
"shop-photo|@shop": "5Matériel de photographie|5Photographie|Cadres",
"shop-camera|@shop": "Boutique d'appareils photo",
"shop-travel_agency": "Agence de voyages|Voyages organisés",
"shop-travel_agency": "Agence de voyages|Voyages organisés|agence de tourisme|voyagiste",
"shop-outdoor|@shop": "Matériel de loisirs de plein air|Randonnée|Escalade|Camping",
"shop-dry_cleaning": "Nettoyage à sec|Pressing|Lavage",
"shop-tyres|@shop": "Pneu|Pneus",
"amenity-car_wash": "Station de lavage|lavage-autp",
"amenity-car_wash": "Station de lavage|lavage-auto|lavage de voiture",
"amenity-veterinary": "Docteur vétérinaire|véto|Clinique vétérinaire",
"@charging_station": "Borne de recharge|station de recharge|4voiture électrique|4recharge|IRVE",
"amenity-charging_station-bicycle|@charging_station": "Chargement des vélos",
@@ -332,14 +332,14 @@
"amenity-bicycle_parking": "Parking à vélo|Stationnement vélo",
"amenity-waste_basket": "Poubelle",
"emergency-phone": "3Téléphone d'urgence",
"leisure-fitness_centre": "Centre fitness|salle de gym|salle de sport",
"leisure-fitness_centre": "Centre fitness|salle de gym|salle de sport|centre de remise en forme",
"leisure-sauna": "3Sauna",
"shop-car_repair-tyres|shop-car_repair": "Réparation de pneus",
"shop-chemist|@shop": "4Droguerie",
"shop-pet|@shop": "5Animalerie",
"tourism-zoo|@category_tourism|@category_children": "Zoo|Parc Animalier",
"shop-pet|@shop": "5Animalerie|magasin d'animaux",
"tourism-zoo|@category_tourism|@category_children": "Zoo|Parc Animalier|ménagerie|parc zoologique",
"attraction-animal": "Enclos pour animaux",
"tourism-information-office|amenity-ranger_station|@category_tourism": "Office de tourisme|syndicat d'initiative",
"tourism-information-office|amenity-ranger_station|@category_tourism": "Office de tourisme|syndicat d'initiative|bureau d'information touristique",
"tourism-information-visitor_centre|amenity-ranger_station|@category_tourism": "centre de visite",
"amenity-community_centre": "Centre communautaire|Salle polyvalente|Salle des fêtes",
"amenity-compressed_air": "Air comprimé",
@@ -350,14 +350,14 @@
"amenity-vending_machine-drinks": "Distributeur de boissons|cannettes",
"amenity-vending_machine-food|@category_food": "Distributeur d'aliments|Aliments",
"amenity-vending_machine-parking_tickets|@category_parking": "Horodateur|parcmètre",
"amenity-vending_machine-public_transport_tickets|@category_transport": "Distributeur de billets de transport en commun|ticket de bus",
"amenity-vending_machine-public_transport_tickets|@category_transport": "Distributeur de billets de transport en commun|ticket de bus|ticket de tram|ticket de métro",
"amenity-vending_machine-newspapers": "Distributeur de journaux|Journaux",
"amenity-vending_machine-sweets": "Distributeur de bonbons|Bonbons",
"amenity-vending_machine-excrement_bags": "5Distributeur de sacs à excréments",
"amenity-parcel_locker|@category_post": "Consigne automatique pour colis|3locker",
"shop-outpost": "Point de retrait",
"building-garage": "Garage",
"highway-rest_area|highway-services": "Aire de repos|Aire de service",
"highway-rest_area|highway-services": "Aire de repos|Aire de service|relais routier",
"man_made-chimney": "Cheminée",
"man_made-tower|man_made-flare": "Tour",
"shop-bookmaker|@gambling": "Bookmaker",
@@ -371,12 +371,12 @@
"tourism-information-board": "Panneau d'informations",
"tourism-information-map": "Carte touristique|Plan",
"aerialway-station": "Remontées mécaniques",
"aeroway-helipad": "Hélisurface",
"barrier-border_control": "Contrôle aux frontières",
"aeroway-helipad": "Hélisurface|zone d'atterrissage pour hélicoptères",
"barrier-border_control": "Contrôle aux frontières|contrôle frontalier",
"leisure-water_park|@category_tourism|@category_children": "Centre aquatique|Parc aquatique",
"man_made-water_tower": "Château d'eau",
"man_made-windmill": "Moulin",
"natural-cave_entrance": "4Grotte",
"natural-cave_entrance": "4Grotte|caverne",
"natural-volcano|@mountain": "4Volcan",
"office-estate_agent": "Agence immobilière|agent immobilier",
"waterway-lock_gate": "Écluse",
@@ -387,24 +387,24 @@
"leisure-resort|@category_hotel": "Complexe touristique",
"amenity-biergarten|@category_eat|@category_nightlife": "5Biergarten",
"amenity-driving_school": "4Auto-école|École de conduite",
"amenity-music_school": "École de musique",
"amenity-music_school": "École de musique|conservatoire de musique",
"amenity-language_school": "École de langue",
"amenity-ice_cream": "Stand de crème glacée|Marchand de glaces|Glacier",
"amenity-internet_cafe": "5Cybercafé",
"amenity-motorcycle_parking": "Parking moto|Stationnement moto",
"amenity-parking_space-disabled|@category_parking": "Place de stationnement handicapé|Stationnement PMR|Parking PMR",
"amenity-nursing_home": "Maison de retraite|résidence pour personnes âgées",
"amenity-nursing_home": "Maison de retraite|résidence pour personnes âgées|EHPAD",
"amenity-payment_terminal": "Terminal de paiement",
"amenity-public_bath": "Bain public",
"amenity-shower": "Douche",
"emergency-assembly_point": "Point de rassemblement d'urgence",
"emergency-defibrillator": "4Défibrillateur|DAE",
"emergency-fire_hydrant": "Bouche dincendie|bouche de incendie|borne dincendie|borne de incendie|Borne hydratante|Poteau dincendie|Hydrant|Hydrante",
"amenity-hydrant": "Bouche dpuisage|bouche de puisage|borne dpuisage|bourne de puisage|Hydrant|Hydrante",
"emergency-lifeguard": "Sauveteur durgence|Sauveteur",
"emergency-fire_hydrant": "Bouche dincendie|borne dincendie|Poteau dincendie|Hydrant",
"amenity-hydrant": "Bouche de puisage|borne de puisage|Hydrant",
"emergency-lifeguard": "Sauveteur durgence",
"emergency-mountain_rescue": "Sauveteurs en montagne durgence",
"leisure-fitness_station": "Station de fitness|Parcours de santé",
"office-insurance": "Bureau dassurance|assureur|Agent d'assurance",
"office-insurance": "Bureau dassurance|assureur|Agent d'assurance|courtier en assurance|compagnie d'assurance",
"office-ngo": "Bureau d'ONG|organisation non gouvernementale|Bureau ONG",
"shop-erotic|@shop": "Boutique érotique",
"shop-massage": "Salon de massage",
@@ -416,10 +416,10 @@
"shop-tattoo": "Salon de tatouage|tatoueur",
"shop-variety_store|@category_shopping|@shop": "Bazar",
"shop-video|@shop": "Boutique de vidéos|videostore",
"shop-video_games|@shop": "Boutique de jeux vidéo",
"shop-video_games|@shop": "Boutique de jeux vidéos",
"tourism-wilderness_hut|@category_hotel": "Refuge non gardé|Refuge-bivouac",
"tourism-gallery|@category_tourism": "3Galerie d'art|musée d'art",
"tourism-theme_park|@category_tourism|@category_children": "Parc d'attractions|Parc de loisirs",
"tourism-gallery|@category_tourism": "3Galerie d'art|musée d'art|galerie de peinture",
"tourism-theme_park|@category_tourism|@category_children": "Parc d'attractions|Parc de loisirs|parc à thèmes",
"boundary-national_park|@category_tourism": "Parc national",
"leisure-nature_reserve|@category_tourism": "Réserve naturelle",
"natural-cape": "Cap",
@@ -447,7 +447,7 @@
"shop-medical_supply|@shop": "Materiel médical",
"shop-nutrition_supplements|@shop": "Suppléments nutritionnels",
"shop-paint|@shop": "Magasin de peinture",
"shop-perfumery|@category_shopping|@shop": "Parfumerie",
"shop-perfumery|@category_shopping|@shop": "Parfumerie|boutique de parfum",
"shop-sewing|@shop": "Mercerie|Couture",
"shop-storage_rental": "Location de stockage",
"shop-tobacco|@shop": "Bureau de tabac",
@@ -462,19 +462,19 @@
"amenity-social_facility": "Établissement de services sociaux",
"leisure-sports_hall": "Salle de sport",
"amenity-arts_centre|@category_tourism": "Centre artistique",
"amenity-prison": "prison",
"amenity-prison": "prison|centre pénitentiaire|centre de détention",
"amenity-exhibition_centre": "Centre d'exposition",
"shop-bathroom_furnishing|@shop": "Mobilier de salle de bain",
"shop-bed|@shop": "Magasin de literie",
"shop-boutique|@shop": "Boutique",
"amenity-food_court": "Aire de restauration",
"amenity-food_court": "Aire de restauration|foodcourt",
"shop-curtain|@shop": "Magasin de rideaux",
"shop-gas|@shop": "Vente de gaz",
"shop-gas|@shop": "Vente de gaz|bouteille de gaz",
"shop-pet_grooming": "Salon de toilettage",
"shop-hifi|@shop": "Matériel Hi-Fi",
"amenity-conference_centre": "Centre de conférence",
"shop-herbalist|@shop": "Herboristerie",
"shop-appliance|@shop": "Magasin d'électroménager",
"shop-appliance|@shop": "Magasin d'électroménager|boutique d'électroménager",
"shop-agrarian|@shop": "Magasin d'agriculture",
"shop-fashion_accessories|@shop": "Boutique d'accessoires de mode",
"amenity-waste_transfer_station": "Station de transfert de déchets",
@@ -489,7 +489,7 @@
"amenity-charging_station-motorcar|amenity-charging_station-motorcar-small|@charging_station": "Chargeur automobile|Chargeur de voiture|Chargeur",
"shop-lighting|@shop": "4Lumières|Luminaires|4Lampes",
"office-security": "Bureau de sécurité",
"building-guardhouse": "Garde",
"building-guardhouse": "Garde|poste de sécurité|poste de gardiennage",
"leisure-dance|@category_entertainment": "4Danse|École de danse",
"shop-money_lender": "Prêteur d'argent",
"attraction-amusement_ride|attraction-carousel|attraction-roller_coaster|attraction-maze|attraction-historic|attraction-big_wheel|attraction-bumper_car|@category_children": "Attraction|Labyrinthe",

View File

@@ -550,7 +550,7 @@
"Italy_Emilia-Romagna_Forli-Cesena":"Покрајина Форли-Чезена",
"Italy_Emilia-Romagna_Modena":"Покрајина Модена",
"Italy_Emilia-Romagna_Parma":"Покрајина Парма",
"Italy_Emilia-Romagna_Piacenza":"Покрајина Пјаћенца",
"Italy_Emilia-Romagna_Piacenza":"Покрајина Пјаченца",
"Italy_Emilia-Romagna_Ravenna":"Покрајина Равена",
"Italy_Emilia-Romagna_Reggio Emilia":"Покрајина Ређо Емилија",
"Italy_Emilia-Romagna_Rimini":"Покрајина Римини",
@@ -1881,7 +1881,7 @@
"Italy_Veneto_Treviso Description":"Тревизо, Конелијано, Кастелфранко Венето",
"Italy_Veneto_Venezia Description":"Венеција, Местре, Кјоџа",
"Italy_Veneto_Verona Description":"Верона, Вилафранка ди Верона, Лењаго",
"Italy_Veneto_Vicenza Description":"Вићенца, Басано дел Грапа, Скио",
"Italy_Veneto_Vicenza Description":"Виченца, Басано дел Грапа, Скио",
"Jamaica Description":"Кингстон, Монтего Беј, Спениш Таун",
"Japan_Chubu Region_Aichi_Nagoya Description":"Нагоја, Цушима, Кијосу",
"Japan_Chubu Region_Aichi_Toyohashi Description":"Тахара, Гамагори, Нишио",

View File

@@ -28,7 +28,7 @@
"take_exit_number":"Nehmen Sie die Ausfahrt auf",
"take_exit_number_street_verb":"NULL",
"route_recalculating":"Neuberechnung der Route",
"destination":"Werden Sie ankommen.",
"destination":"erreichen Sie ihr Ziel.",
"you_have_reached_the_destination":"Sie haben Ihr Ziel erreicht.",
"in_50_meters":"In fünfzig Metern",
"in_100_meters":"In einhundert Metern",

View File

@@ -1,32 +1,32 @@
{
"make_a_slight_right_turn":"Rechts aanhouden.",
"make_a_slight_right_turn_street":"flauwe bocht naar rechts",
"make_a_slight_right_turn_street":"een flauwe bocht naar rechts",
"make_a_right_turn":"Sla rechtsaf.",
"make_a_right_turn_street":"Sla rechtsaf",
"make_a_sharp_right_turn":"Scherp rechtsaf.",
"make_a_sharp_right_turn_street":"scherp naar rechts afslaan",
"enter_the_roundabout":"Rij de rotonde op.",
"enter_the_roundabout_street":"de rotonde",
"enter_the_roundabout_street_verb":"Rijd",
"enter_the_roundabout_street":"de rotonde op",
"enter_the_roundabout_street_verb":"Rij",
"leave_the_roundabout":"Verlaat de rotonde.",
"leave_the_roundabout_street":"de rotonde",
"leave_the_roundabout_street_verb":"Verlaat",
"make_a_slight_left_turn":"Links aanhouden.",
"make_a_slight_left_turn_street":"de flauwe bocht naar links",
"make_a_slight_left_turn_street":"een flauwe bocht naar links",
"make_a_slight_left_turn_street_verb":"Neem",
"make_a_left_turn":"Sla linksaf.",
"make_a_left_turn_street":"naar links afslaan",
"make_a_left_turn_street":"Sla linksaf",
"make_a_sharp_left_turn":"Scherp linksaf.",
"make_a_sharp_left_turn_street":"scherp naar links afslaan",
"make_a_u_turn":"Keer om.",
"make_a_u_turn_street":"NULL",
"make_a_u_turn_street_verb":"NULL",
"make_a_u_turn_street":"om",
"make_a_u_turn_street_verb":"Keer",
"go_straight":"Rij rechtdoor.",
"exit":"Verlaat.",
"onto":"naar",
"take_exit_number":"Verlaat naar",
"take_exit_number_street_verb":"Neem",
"route_recalculating":"De route herberekenen",
"route_recalculating":"Route herberekenen",
"destination":"Arriveert u.",
"you_have_reached_the_destination":"Bestemming bereikt.",
"in_50_meters":"Over vijftig meter",
@@ -104,5 +104,5 @@
"in_1_5_miles":"Over anderhalve mijl",
"in_2_miles":"Over twee mijl",
"unknown_camera":"Camera in zicht",
"make_a_slight_right_turn_street_verb":"NULL"
"make_a_slight_right_turn_street_verb":"Neem"
}

View File

@@ -685,7 +685,7 @@
"editor_edits_sent_message" = "Ihre Notiz wird an OpenStreetMap gesendet";
"editor_comment_hint" = "Kommentar…";
"editor_reset_edits_message" = "Alle lokalen Korrekturen verwerfen?";
"editor_reset_edits_button" = "Verwerfen";
"editor_reset_edits_button" = "Änderungen verwerfen";
"editor_remove_place_message" = "Hinzugefügtes Objekt löschen?";
"editor_remove_place_button" = "Löschen";
"editor_place_doesnt_exist" = "Dieser Ort existiert nicht";

View File

@@ -730,7 +730,7 @@
"editor_edits_sent_message" = "Your note will be sent to OpenStreetMap";
"editor_comment_hint" = "Comment…";
"editor_reset_edits_message" = "Discard all local changes?";
"editor_reset_edits_button" = "Discard";
"editor_reset_edits_button" = "Discard changes";
"editor_remove_place_message" = "Delete added place?";
"editor_remove_place_button" = "Delete";
"editor_place_doesnt_exist" = "Place does not exist";

View File

@@ -779,7 +779,7 @@
"type.natural.beach.sand" = "Playa de arena";
"type.natural.beach.gravel" = "Playa de grava";
"type.natural.cape" = "Cabo";
"type.natural.cave_entrance" = "Cueva";
"type.natural.cave_entrance" = "Entrada de cueva";
"type.natural.cliff" = "Acantilado";
"type.natural.earth_bank" = "Talud de tierra";
"type.man_made.embankment" = "Terraplén";
@@ -815,7 +815,7 @@
"type.natural.wetland.marsh" = "Ciénaga";
"type.noexit" = "Sin salida";
"type.office" = "Oficina";
"type.office.company" = "Oficina";
"type.office.company" = "Oficina de compañía";
"type.office.estate_agent" = "Agente inmobiliario";
"type.office.government" = "Oficina gubernamental";
"type.office.insurance" = "Oficina de seguros";
@@ -859,13 +859,13 @@
"type.place.state.USA" = "Estado";
/* Named part of a city or town, bigger than place=quarter (Wiki: https://wiki.openstreetmap.org/wiki/Tag:place%3Dsuburb) */
"type.place.suburb" = "Barrio";
"type.place.suburb" = "Suburbio";
"type.place.town" = "Pueblo";
"type.place.village" = "Pueblo";
"type.power" = "Energía";
"type.power.generator" = "Generador";
"type.power.generator.solar" = "Generador solar";
"type.power.generator.wind" = "Generador de viento";
"type.power.generator.wind" = "Aerogenerador";
"type.power.generator.gas" = "Planta termoeléctrica de gas";
"type.power.generator.hydro" = "Planta hidroeléctrica";
"type.power.line" = "Línea eléctrica";
@@ -947,10 +947,10 @@
"type.railway.station" = "Estación de tren";
"type.railway.station.funicular" = "Funicular";
"type.railway.station.light_rail" = "Estación de tren";
"type.railway.station.light_rail.berlin" = "Estación de tren";
"type.railway.station.light_rail.berlin" = "Estación de tren (S-Bahn)";
"type.railway.station.light_rail.london" = "Estación de tren";
"type.railway.station.light_rail.porto" = "Estación de tren";
"type.railway.station.monorail" = "Estación de tren";
"type.railway.station.light_rail.porto" = "Estación de metro";
"type.railway.station.monorail" = "Estación de monoriel";
"type.railway.station.subway" = "Estación de metro";
"type.railway.station.subway.adana" = "Estación de metro";
"type.railway.station.subway.algiers" = "Estación de metro";
@@ -1306,7 +1306,7 @@
"type.shop.tobacco" = "Tabaco";
"type.shop.trade" = "Suministros comerciales";
"type.shop.watches" = "Relojes";
"type.shop.wholesale" = "Almacén al por mayor";
"type.shop.wholesale" = "Tienda al por mayor";
"type.sport" = "Deporte";
"type.sport.american_football" = "Fútbol americano";
"type.sport.archery" = "Tiro al arco";
@@ -1348,7 +1348,7 @@
/* Typically serviced, staff is present and food is available (compared to wilderness_hut). */
"type.tourism.alpine_hut" = "Albergue de montaña";
"type.tourism.apartment" = "Apartamento de vacaciones";
"type.tourism.apartment" = "Apartamento vacacional";
"type.tourism.artwork" = "Obra de arte";
"type.tourism.artwork.architecture" = "Arte arquitectónico";
"type.tourism.artwork.painting" = "Pintura";

View File

@@ -1585,3 +1585,4 @@
"type.spherical_buoy.safe_water" = "Faarvaatri kerapoi";
"type.man_made.mast.communication" = "Sidemast";
"type.shop.beauty.nails" = "Küünestuudio";
"type.amenity.hydrant" = "Kastmishüdrant";

View File

@@ -57,13 +57,13 @@
"add_new_set" = "افزودن پهرستی نو";
/* Add Bookmark list dialog - hint when the list name is empty */
"bookmark_set_name" = "Bookmark List Name";
"bookmark_set_name" = "نام پهرست نشانگ‌ها";
/* "Bookmark Lists" dialog title */
"bookmark_sets" = "Bookmark Lists";
/* Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. */
"bookmarks" = "نشانهها";
"bookmarks" = "نشانگها";
/* "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt */
"bookmarks_and_tracks" = "نشانه‌ها و مسیر ها";
@@ -151,7 +151,7 @@
"share_bookmarks_email_body" = "Hello!\n\nAttached are my bookmarks; please open them in CoMaps. If you don't have it installed you can download it here: https://www.comaps.app/download/\n\nEnjoy travelling with CoMaps!";
/* message title of loading file */
"load_kmz_title" = "در حال بارگیری نشانهها";
"load_kmz_title" = "بارگذاری نشانگها";
/* Kmz file successful loading */
"load_kmz_successful" = "نشانه‌ها با موفقیت بارگذاری شد!شما می توانید آنها را در نقشه یا بخش مدیریت نشانه‌ها بیابید.";

View File

@@ -680,7 +680,7 @@
"editor_edits_sent_message" = "Notatet ditt vil bli sendt til OpenStreetMap";
"editor_comment_hint" = "Kommentar…";
"editor_reset_edits_message" = "Forkaste alle lokale endringer?";
"editor_reset_edits_button" = "Forkast";
"editor_reset_edits_button" = "Forkast endringer";
"editor_remove_place_message" = "Slette tillagt sted?";
"editor_remove_place_button" = "Slett";
"editor_place_doesnt_exist" = "Sted finnes ikke";

View File

@@ -1591,3 +1591,4 @@
"type.shop.beauty.nails" = "Nagelsalon";
"type.amenity.food_sharing" = "Voedsel delen";
"type.amenity.give_box" = "Giftenkist";
"type.amenity.hydrant" = "Watertappunt|waterkraan";

View File

@@ -1591,3 +1591,4 @@
"type.natural.tree" = "Árvore";
"type.shop.beauty.nails" = "Salão de Unhas";
"type.xmas.tree" = "Árvore de Natal";
"type.amenity.hydrant" = "Boca de Rega";

View File

@@ -543,7 +543,7 @@
/* OpenStreetMap Profile */
"osm_profile" = "Profil OpenStreetMap";
"osm_profile_promt" = "Creați un cont OpenStreetMap sau conectați-vă pentru a vă publica edițiile de hartă în întreaga lume.";
"osm_profile_promt" = "Creați un cont OpenStreetMap sau conectați-vă pentru a vă publica editările hărții pentru întreaga lume.";
"osm_profile_explanation" = "[OpenStreetMap.org](https://openstreetmap.org) (OSM) este un proiect comunitar pentru construirea unei hărți libere și deschise. Este principala sursă de date cartografice în CoMaps și funcționează similar cu Wikipedia. Puteți adăuga sau edita locuri, iar acestea devin disponibile pentru milioane de utilizatori din întreaga lume. \nAlăturați-vă comunității și ajutați la crearea unei hărți mai bune pentru toată lumea!";
"osm_profile_login" = "Conectează-te la contul OpenStreetMap";
"osm_profile_reauthorize_promt" = "Contul OpenStreetMap a fost deconectat de la această aplicație";

View File

@@ -368,3 +368,91 @@
"type.cuisine.bubble_tea" = "Čaj s tapiokinimi kroglicami ('Bubble Tea')";
"type.cuisine.breakfast" = "Zajtrk";
"type.cuisine.chicken" = "Piščanec";
"type.amenity.hydrant" = "Namakalni hidrant";
"type.cuisine.greek" = "Grška kuhinja";
"type.cuisine.hungarian" = "Madžarska kuhinja";
"type.cuisine.ice_cream" = "Sladoled";
"type.cuisine.indian" = "Indijska kuhinja";
"type.cuisine.indonesian" = "Indonezijska kuhinja";
"type.cuisine.international" = "Mednarodna kuhinja";
"type.cuisine.irish" = "Irska kuhinja";
"type.cuisine.italian" = "Italijanska kuhinja";
"type.cuisine.italian_pizza" = "Italijanska kuhinja, pica";
"type.cuisine.japanese" = "Japonska kuhinja";
"type.cuisine.korean" = "Korejska kuhinja";
"type.cuisine.lao" = "Laoška kuhinja";
"type.cuisine.lebanese" = "Libanonska kuhinja";
"type.cuisine.local" = "Krajevna kuhinja";
"type.cuisine.malaysian" = "Malezijska kuhinja";
"type.cuisine.mediterranean" = "Sredozemska kuhinja";
"type.cuisine.mexican" = "Mehiška kuhinja";
"type.cuisine.moroccan" = "Maroška kuhinja";
"type.cuisine.oriental" = "Orientalska kuhinja";
"type.cuisine.pancake" = "Palačinke";
"type.cuisine.pasta" = "Testenine";
"type.cuisine.persian" = "Perzijska kuhinja";
"type.cuisine.peruvian" = "Perujska kuhinja";
"type.cuisine.pizza" = "Pica";
"type.cuisine.polish" = "Poljska kuhinja";
"type.cuisine.portuguese" = "Portugalska kuhinja";
"type.cuisine.russian" = "Ruska kuhinja";
"type.cuisine.sandwich" = "Sendvič";
"type.cuisine.sausage" = "Salama";
"type.cuisine.savory_pancakes" = "Slane palačinke";
"type.cuisine.seafood" = "Morska hrana";
"type.cuisine.soba" = "Soba (ajdovi rezanci)";
"type.cuisine.spanish" = "Španska kuhinja";
"type.cuisine.steak_house" = "Zrezkarnica";
"type.cuisine.sushi" = "Suši";
"type.cuisine.tea" = "Čaj";
"type.cuisine.turkish" = "Turška kuhinja";
"type.cuisine.vegan" = "Veganska kuhinja";
"type.cuisine.vegetarian" = "Vegetarijanska kuhinja";
"type.cuisine.vietnamese" = "Vietnamska kuhinja";
"type.emergency" = "V sili";
"type.emergency.access_point" = "Reševalno mesto";
"type.emergency.assembly_point" = "Zbirno mesto";
"type.emergency.life_ring" = "Reševalni obroč";
"type.emergency.defibrillator" = "Defibrilator";
"type.emergency.fire_hydrant" = "Požarni hidrant";
"type.emergency.phone" = "Telefon v sili";
"type.emergency.lifeguard" = "Reševalec";
"type.beacon.cardinal.east" = "Glavni usmerjevalni znak";
"type.beacon.cardinal.north" = "Glavni usmerjevalni znak";
"type.beacon.cardinal.south" = "Glavni usmerjevalni znak";
"type.beacon.cardinal.west" = "Glavni usmerjevalni znak";
"type.beacon.isolated_danger" = "Usmerjevalni znak ločene nevarnosti";
"type.cuisine.burger" = "Burger";
"type.craft.caterer" = "Ponudnik cateringa";
"type.cuisine.balkan" = "Balkanska kuhinja";
"type.cuisine.barbecue" = "Jedi na žaru";
"type.cuisine.bavarian" = "Bavarska kuhinja";
"type.cuisine.brazilian" = "Brazilska kuhinja";
"type.cuisine.buschenschank" = "Vinotoč (Buschenschank)";
"type.cuisine.deli" = "Delkatesa";
"type.cuisine.regional" = "Regionalna kuhinja";
"type.cuisine.tapas" = "Tapas (španski prigrizki)";
"type.cuisine.thai" = "Tajska kuhinja";
"type.beacon.lateral.port" = "Bočni usmerjevalni znak";
"type.beacon.lateral.starboard" = "Bočni usmerjevalni znak";
"type.beacon.safe_water" = "Znak varne plovne poti";
"type.beacon.special_purpose" = "Usmerjevalni znak posebnega namena";
"type.buoy.cardinal.east" = "Glavna boja";
"type.buoy.cardinal.north" = "Glavna boja";
"type.buoy.cardinal.south" = "Glavna boja";
"type.buoy.cardinal.west" = "Glavna boja";
"type.lateral.port" = "Pristanišče";
"type.cardinal.east" = "Vzhod";
"type.cardinal.north" = "Sever";
"type.cardinal.south" = "Jug";
"type.cardinal.west" = "Zahod";
"type.emergency.mountain_rescue" = "Postaja gorskih reševalcev";
"type.entrance" = "Vhod";
"type.entrance.main" = "Glavni vhod";
"type.entrance.house" = "Vhod hiše";
"type.entrance.garage" = "Vhod garaže";
"type.entrance.service" = "Servisni vhod";
"type.entrance.entry" = "Vstop (samo)";
"type.entrance.exit" = "Izhod (samo)";
"type.healthcare.laboratory" = "Zdravstveni laboratorij";
"type.healthcare.psychotherapist" = "Psihoterapevt";

View File

@@ -1101,3 +1101,4 @@
"offline_explanation_title" = "Çevrimdışı Haritalar";
"avoid_steps" = "Merdivenlerden kaçın";
"editor_place_doesnt_exist_description" = "OpeenStreetMap topluluğuna bir hata notu göndermek için şimdi mekanın nasıl gözüktüğünü tarif et";
"avoid_paved" = "Asfalt yollardan kaçın";

View File

@@ -1491,3 +1491,4 @@
"type.shop.lighting" = "Aydınlatma dükkanı";
"type.amenity.charging_station.motorcar.small" = "Araç Şarj Noktası";
"type.amenity.bench.backless" = "Sırtıık Bank";
"type.amenity.sailing_school" = "Denizcilik Okulu";

View File

@@ -2,7 +2,7 @@ Una aplicación de mapas gratuita y de código abierto, liderada por la comunida
‣ Simple y elegante: funciones esenciales, fáciles de usar y que simplemente funcionan.
‣ Funciona sin conexión: Planifica y navega tu viaje al extranjero sin necesidad de cobertura móvil, busca puntos de referencia durante una excursión, etc. Todas las funciones de la aplicación están diseñadas para funcionar sin conexión.
‣ Respeto a la privacidad: La aplicación está diseñada pensando en la privacidad: no identifica a las personas, no rastrea ni recopila información personal. Sin anuncios.
‣ Respeto a la privacidad: La aplicación está diseñada pensando en la privacidad, no identifica a las personas, no rastrea ni recopila información personal. Sin anuncios.
‣ Ahorra batería y espacio: No consume mucha batería como otras aplicaciones de navegación. Los mapas compactos ahorran el valioso espacio en tu teléfono.
‣ Gratuita y desarrollada por la comunidad: Personas como tú ayudaron a desarrollar la aplicación añadiendo lugares a OpenStreetMap, probando y compartiendo sus comentarios sobre las funciones, y aportando sus habilidades de desarrollo y su dinero.
‣ Toma de decisiones y finanzas abiertas y transparentes, sin fines de lucro y totalmente de código abierto.
@@ -25,4 +25,4 @@ Características principales:
• Compatibilidad con CarPlay
La libertad está aquí
¡Descubre tu camino y navega por el mundo priorizando la privacidad y la comunidad!
¡Descubre tu camino y navega por el mundo priorizando la privacidad y la comunidad!

View File

@@ -1 +1 @@
comaps,mapas,openstreetmap,osm,viajes,senderismo,bicicleta,conducción,sin conexión,privacidad,gps
comaps,mapas,openstreetmap,osm,viajes,senderismo,bicicleta,conducción,sin conexión,privacidad,gps

View File

@@ -1 +1 @@
https://comaps.app/es/
https://comaps.app/es/

View File

@@ -1 +1 @@
https://comaps.app/es/privacy
https://comaps.app/es/privacy

View File

@@ -1 +1 @@
Navega con privacidad
Navega con privacidad

View File

@@ -1 +1 @@
https://codeberg.org/comaps/comaps/issues
https://codeberg.org/comaps/comaps/issues

View File

@@ -34,7 +34,7 @@ std::string_view constexpr kVowels = "aeiouy";
std::string_view constexpr kMainTags[] = {"amenity", "shop", "tourism", "historic", "craft", "emergency",
"barrier", "highway", "office", "leisure", "waterway", "natural",
"place", "entrance", "building", "man_made", "healthcare", "attraction"};
"place", "entrance", "man_made", "healthcare", "attraction"};
std::string GetTypeForFeature(editor::XMLFeature const & node)
{
@@ -46,7 +46,7 @@ std::string GetTypeForFeature(editor::XMLFeature const & node)
std::string value = node.GetTagValue(key);
if (value == "yes")
return std::string{key};
else if (key == "shop" || key == "office" || key == "building" || key == "entrance" || key == "attraction")
else if (key == "shop" || key == "office" || key == "entrance" || key == "attraction")
return value.append(" ").append(key); // "convenience shop"
else if (!value.empty() && value.back() == 's')
// Remove 's' from the tail: "toilets" -> "toilet".
@@ -60,6 +60,12 @@ std::string GetTypeForFeature(editor::XMLFeature const & node)
if (node.HasTag("disused:shop") || node.HasTag("disused:amenity"))
return "vacant business";
if (node.HasTag("building"))
{
std::string value = node.GetTagValue("building");
return value == "yes" ? "building" : value.append(" building");
}
if (node.HasTag("addr:housenumber") || node.HasTag("addr:street") || node.HasTag("addr:postcode"))
return "address";

View File

@@ -150,6 +150,17 @@ std::string Platform::ReadPathForFile(std::string const & file, std::string sear
"\nr: ", m_resourcesDir, "\ns: ", m_settingsDir));
}
void Platform::SetCustomMapServerUrl(std::string & url)
{
strings::Trim(url);
m_customMapServerUrl = std::move(url);
}
std::string const & Platform::CustomMapServerUrl() const
{
return m_customMapServerUrl;
}
std::string Platform::MetaServerUrl() const
{
return METASERVER_URL;

View File

@@ -268,6 +268,10 @@ public:
/// @return integer version in yyMMdd format.
int32_t IntVersion() const;
/// Set custom map server url to allow user-defined download servers
void SetCustomMapServerUrl(std::string & url);
std::string const & CustomMapServerUrl() const;
/// @return url for clients to download maps
std::string MetaServerUrl() const;
@@ -339,6 +343,8 @@ private:
void ShutdownThreads();
void GetSystemFontNames(FilesList & res) const;
std::string m_customMapServerUrl;
};
std::string DebugPrint(Platform::EError err);

View File

@@ -156,6 +156,18 @@ std::string GetAcceptLanguage()
MetaConfig MapFilesDownloader::LoadMetaConfig()
{
Platform & pl = GetPlatform();
// If user sets a custom download server, skip metaserver entirely.
std::string const customServer = pl.CustomMapServerUrl();
if (!customServer.empty())
{
LOG(LINFO, ("Using custom map server URL:", customServer));
MetaConfig metaConfig;
metaConfig.m_serversList = {customServer};
return metaConfig;
}
std::string const metaServerUrl = pl.MetaServerUrl();
std::string httpResult;
@@ -170,7 +182,7 @@ MetaConfig MapFilesDownloader::LoadMetaConfig()
request.RunHttpRequest(httpResult);
}
std::optional<MetaConfig> metaConfig = downloader::ParseMetaConfig(httpResult);
auto metaConfig = downloader::ParseMetaConfig(httpResult);
if (!metaConfig)
{
metaConfig = downloader::ParseMetaConfig(pl.DefaultUrlsJSON());
@@ -181,6 +193,7 @@ MetaConfig MapFilesDownloader::LoadMetaConfig()
{
LOG(LINFO, ("Got servers list:", metaConfig->m_serversList));
}
CHECK(!metaConfig->m_serversList.empty(), ());
return *metaConfig;
}
@@ -190,4 +203,10 @@ void MapFilesDownloader::GetMetaConfig(MetaConfigCallback const & callback)
callback(LoadMetaConfig());
}
void MapFilesDownloader::ResetMetaConfig()
{
m_serversList.clear();
m_isMetaConfigRequested = false;
}
} // namespace storage

View File

@@ -66,6 +66,9 @@ public:
void SetDownloadingPolicy(DownloadingPolicy * policy);
void SetDataVersion(int64_t version) { m_dataVersion = version; }
/// Reset after changes, e.g. map download URL.
void ResetMetaConfig();
/// @name Legacy functions for Android resources downloading routine (initial World download).
/// @{
void EnsureMetaConfigReady(std::function<void()> && callback);

View File

@@ -1252,16 +1252,33 @@ bool Storage::IsAllowedToEditVersion(CountryId const & countryId) const
case Status::OnDiskOutOfDate:
{
auto const localFile = GetLatestLocalFile(countryId);
ASSERT(localFile, ("Local file shouldn't be nullptr."));
auto const currentVersionTime = base::YYMMDDToSecondsSinceEpoch(static_cast<uint32_t>(m_currentVersion));
auto const localVersionTime = base::YYMMDDToSecondsSinceEpoch(static_cast<uint32_t>(localFile->GetVersion()));
return currentVersionTime - localVersionTime < kMaxSecondsTillLastVersionUpdate &&
base::SecondsSinceEpoch() - localVersionTime < kMaxSecondsTillNoEdits;
return IsAllowedToEditFile(localFile);
}
default: return false;
}
}
bool Storage::IsMapTooOldToEdit(CountryId const & countryId) const
{
auto const status = CountryStatusEx(countryId);
if (status == Status::OnDiskOutOfDate)
{
LocalFilePtr const localFile = GetLatestLocalFile(countryId);
return !IsAllowedToEditFile(localFile);
}
return false;
}
bool Storage::IsAllowedToEditFile(LocalFilePtr const & localFile) const
{
ASSERT(localFile, ("Local file shouldn't be nullptr."));
auto const currentVersionTime = base::YYMMDDToSecondsSinceEpoch(static_cast<uint32_t>(m_currentVersion));
auto const localVersionTime = base::YYMMDDToSecondsSinceEpoch(static_cast<uint32_t>(localFile->GetVersion()));
return currentVersionTime - localVersionTime < kMaxSecondsTillLastVersionUpdate &&
base::SecondsSinceEpoch() - localVersionTime < kMaxSecondsTillNoEdits;
}
int64_t Storage::GetVersion(CountryId const & countryId) const
{
CHECK_THREAD_CHECKER(m_threadChecker, ());

View File

@@ -383,6 +383,9 @@ public:
/// \brief Returns true if the version of countryId can be used to update maps.
bool IsAllowedToEditVersion(CountryId const & countryId) const;
/// \brief Returns true when the map exists and is too old for map editing.
bool IsMapTooOldToEdit(CountryId const & countryId) const;
/// Returns version of downloaded mwm or zero.
int64_t GetVersion(CountryId const & countryId) const;
@@ -582,6 +585,12 @@ public:
void RestoreDownloadQueue();
void ResetMapDownloadMetaConfig()
{
if (m_downloader)
m_downloader->ResetMetaConfig();
}
protected:
void OnFinishDownloading();
@@ -619,6 +628,8 @@ private:
// Returns a path to a place on disk downloader can use for downloaded files.
std::string GetFileDownloadPath(CountryId const & countryId, MapFileType file) const;
bool IsAllowedToEditFile(LocalFilePtr const & localFile) const;
/// Fast version, doesn't check if country is out of date
Status CountryStatus(CountryId const & countryId) const;

View File

@@ -20,7 +20,7 @@ MAIN_OUT_PATH: /mnt/4tbexternal/osm-maps
# Path to the data/ folder in the repository:
USER_RESOURCE_PATH: ${Developer:OMIM_PATH}/data
# Features stage only parallelism level. Set to 0 for auto detection.
THREADS_COUNT_FEATURES_STAGE: 52
THREADS_COUNT_FEATURES_STAGE: 0
# Do not change it. This is determined automatically.
NODE_STORAGE: mem