Compare commits

..

33 Commits

Author SHA1 Message Date
Mihail Mitrofanov
d8ddf5a0ae [android]: Backup geo tags and tracks to local folder
This commit adds backup of user data to a local folder on the device.

Features:
* Turn on/off regular backup
* Choose new or existing folder for saving backup
* Set how often backup runs
* Set how many backups to keep
* Create backup manually

Signed-off-by: Mihail Mitrofanov <mk.mitrofanov@outlook.com>
2025-06-27 23:55:49 +07:00
Harry Bond
1e32df193d [Android] fix speed limit indicator activating when driving exactly at speed limit
the displayed speed is rounded, but the speedLimitExceeded check isn't, resulting in what appears to be incorrect activations. Fixed by rounding in speedLimitExceeded also.
fixes #544

Signed-off-by: Harry Bond <me@hbond.xyz>
2025-06-27 23:54:30 +07:00
Eivind Samseth
fca61732b7 [styles] Regenerate
Signed-off-by: Eivind Samseth <eisa01@gmail.com>
2025-06-27 23:52:16 +07:00
Eivind Samseth
8053d2f4a5 [styles] Remove path designated bicycle on level z14 as requested by review
Signed-off-by: Eivind Samseth <eisa01@gmail.com>
2025-06-27 23:51:39 +07:00
Eivind Samseth
7bfe507e57 [styles] Regenerate
Signed-off-by: Eivind Samseth <eisa01@gmail.com>
2025-06-27 23:51:35 +07:00
Eivind Samseth
1e06e46344 [styles] Render paths and track at same level as footway and cycleway
Signed-off-by: Eivind Samseth <eisa01@gmail.com>
2025-06-27 23:51:02 +07:00
Yannik Bloscheck
f7f73f04b1 [styles] Regenerated files for made pedestrian areas slightly more distinct
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 18:44:09 +02:00
Yannik Bloscheck
eee299f6cd [styles] Made pedestrian areas slightly more distinct
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 18:44:09 +02:00
Codeberg Translate
5b43e4ec9b [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Priit Jõerüüt <jrtcdbrg@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: ZeljkoBG <zeljkobg@noreply.codeberg.org>
Co-authored-by: artnay <artnay@noreply.codeberg.org>
Co-authored-by: canadagoose <canadagoose@noreply.codeberg.org>
Co-authored-by: openfab <openfab@noreply.codeberg.org>
Co-authored-by: oster5 <oster5@noreply.codeberg.org>
Co-authored-by: oxisol <oxisol@noreply.codeberg.org>
Co-authored-by: projjalm <projjalm@noreply.codeberg.org>
Co-authored-by: sunsand <sunsand@noreply.codeberg.org>
Translate-URL: https://translate.codeberg.org/projects/comaps/android-typestrings/ca/
Translate-URL: https://translate.codeberg.org/projects/comaps/android-typestrings/he/
Translate-URL: https://translate.codeberg.org/projects/comaps/android-typestrings/sv/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ar/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ast/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/az/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/be/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/bg/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/bn/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/cs/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/es/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/et/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/fa/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/fi/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/he/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/hi/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/hr/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/hu/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ia/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ko/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/mr/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ru/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/sq/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/sr/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/sw/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/th/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/uk/
Translate-URL: https://translate.codeberg.org/projects/comaps/appstore-descriptions/eu/
Translate-URL: https://translate.codeberg.org/projects/comaps/google-play-descriptions/de/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios-typestrings/ca/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios-typestrings/he/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios-typestrings/sv/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ar/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ast/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/az/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/be/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/bg/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/bn/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/cs/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/et/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/eu/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/fa/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/he/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/hi/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/hr/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/hu/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ia/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ko/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/mr/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ru/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/sq/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/sr/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/sw/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/th/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/tr/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/uk/
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/Apple AppStore description
Translation: CoMaps/Google Play and Huawei AppGallery descriptions
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS UI Strings
2025-06-27 14:43:21 +00:00
Yannik Bloscheck
733c0ae8a8 [strings] Removed unsupported App Store languages
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
Yannik Bloscheck
30ee5c30e1 [strings] Added App Store keywords field
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
Yannik Bloscheck
d562f23256 [strings] Added copyright symbol to App Store copyright field
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
Yannik Bloscheck
ecb44b5ae9 [strings] Removed unused App Store fields
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
Yannik Bloscheck
c49cf48575 [strings] Adjusted German App Store subtitle
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
Yannik Bloscheck
4581907f00 [strings] Put App Store subtitles in actual subtitle field
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 16:42:53 +02:00
vipo
423d45a1bb Adding to CONTRIBUTORS 2025-06-27 10:41:23 +02:00
vipo
4d8e7c39fd [styles] Changed train station icons to look the same like normal train icons 2025-06-27 10:40:26 +02:00
Jean-Baptiste
273eeed9f3 [android] Migrate download item layouts to Material Components
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-06-27 08:08:43 +02:00
Jean-Baptiste
754748123c [android] Use Material components in settings layout
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-06-27 08:06:42 +02:00
Yannik Bloscheck
b58bacddf1 [ios] Matched translations
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 05:19:47 +02:00
Yannik Bloscheck
a985bf8349 [ios] Fixed issues with Panoramax button not working as intented
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 05:19:47 +02:00
Jean-Baptiste
b4f115a8fa [desktop] Add Panoramax link on the place page
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
Co-authored by: Harry Bond <me@hbond.xyz>
2025-06-27 05:19:47 +02:00
Jean-Baptiste
df89761eba [iOS] Add Panoramax link on the place page
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
Co-authored by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 05:19:47 +02:00
Jean-Baptiste
25e49b0fe1 [android] Add Panoramax link on the place page
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
2025-06-27 05:19:47 +02:00
Jean-Baptiste
6a10cffe51 [generator] Add support of Panoramax tag
Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
Co-authored by: Harry Bond <me@hbond.xyz>
2025-06-27 05:19:47 +02:00
Konstantin Pastbin
495167c11f [strings] Fix sights category search for ES
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
2025-06-27 05:17:41 +02:00
Yannik Bloscheck
d44d671550 [ios] Ending search when a route starts
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-27 05:13:40 +02:00
Harry Bond
d44d575368 [android] remove help button from settings menu
Signed-off-by: Harry Bond <me@hbond.xyz>
2025-06-27 05:06:31 +02:00
Harry Bond
fbddff009e [android] Rename "Help" ("About CoMaps") to "About & Help"
Signed-off-by: Harry Bond <me@hbond.xyz>
2025-06-27 05:06:31 +02:00
Harry Bond
58bab61890 [android] Hide currently active left button action from hamburger menu
fixes #549
And add "About CoMaps" option in burger menu when using custom buttons
Signed-off-by: Harry Bond <me@hbond.xyz>
2025-06-27 05:06:31 +02:00
Yannik Bloscheck
464b3cf59a [ios] Making sure the whole location button is visible during routing
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-06-26 15:48:26 +02:00
pastk
4a48d43240 Deleted translation using Weblate (Bengali) 2025-06-26 02:53:05 +00:00
Codeberg Translate
d68544de13 [strings] Update from Codeberg Translate
Co-authored-by: 19atlas <19atlas@noreply.codeberg.org>
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: Dirk <dirk@noreply.codeberg.org>
Co-authored-by: Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: jonas-bonas <jonas-bonas@noreply.codeberg.org>
Co-authored-by: oxisol <oxisol@noreply.codeberg.org>
Co-authored-by: phama <phama@noreply.codeberg.org>
Co-authored-by: projjalm <projjalm@noreply.codeberg.org>
Co-authored-by: yannikbloscheck <yannikbloscheck@noreply.codeberg.org>
Translate-URL: https://translate.codeberg.org/projects/comaps/android/ar/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/bn/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/de/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/fa/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/fi/
Translate-URL: https://translate.codeberg.org/projects/comaps/android/th/
Translate-URL: https://translate.codeberg.org/projects/comaps/appstore-descriptions/de/
Translate-URL: https://translate.codeberg.org/projects/comaps/appstore-descriptions/et/
Translate-URL: https://translate.codeberg.org/projects/comaps/appstore-descriptions/fi/
Translate-URL: https://translate.codeberg.org/projects/comaps/appstore-descriptions/tr/
Translate-URL: https://translate.codeberg.org/projects/comaps/fdroid-app-description/
Translate-URL: https://translate.codeberg.org/projects/comaps/fdroid-app-description/et/
Translate-URL: https://translate.codeberg.org/projects/comaps/google-play-descriptions/de/
Translate-URL: https://translate.codeberg.org/projects/comaps/google-play-descriptions/tr/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ar/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ast/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/bn/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/et/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/fa/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/fi/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/gl/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/he/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/ia/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/pt/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios/zh_Hant/
Translation: CoMaps/Android UI Strings
Translation: CoMaps/Apple AppStore description
Translation: CoMaps/F-Droid app description
Translation: CoMaps/Google Play and Huawei AppGallery descriptions
Translation: CoMaps/iOS UI Strings
2025-06-26 00:46:20 +00:00
250 changed files with 3091 additions and 1305 deletions

View File

@@ -8,6 +8,8 @@ CoMaps contributors:
--------------------------------------------------------------------------------
clover sage
Harry Bond <me@hbond.xyz>
vikiawv
--------------------------------------------------------------------------------
Organic Maps (formerly OMaps) contributors:

View File

@@ -0,0 +1,36 @@
OpenStreetMap verilerine dayanan ve şeffaflık, gizlilik ve kar amacı gütmeyen olma taahhüdüyle güçlendirilen, topluluk tarafından yönetilen ücretsiz ve açık kaynaklı bir harita uygulaması.
Topluluğa katılın ve en iyi harita uygulamasını oluşturmaya yardımcı olun
• Uygulamayı kullanın ve bunu herkese duyurun
• Geri bildirimde bulunun ve sorunları bildirin
• Harita verilerini uygulamada veya OpenStreetMap web sitesinde güncelleyin
<i>Geri bildirimleriniz ve 5 yıldızlı yorumlarınız bizim için en iyi destektir!</i>
‣ <b>Basit ve Cilalı</b>: sadece işe yarayan, kullanımı kolay temel özellikler.
‣ <b>Çevrim dışı odaklı</b>: Cep telefonu hizmetine ihtiyaç duymadan yurtdışı seyahatinizi planlayın ve gezinin, uzun bir yürüyüş sırasında rota noktalarını arayın, vb. Tüm uygulama işlevleri çevrimdışı çalışmak üzere tasarlanmıştır.
‣ <b>Gizliliğe Saygı</b>: Uygulama gizlilik düşünülerek tasarlanmıştır; kişileri tanımlamaz, takip etmez ve kişisel bilgi toplamaz. Reklamsız.
‣ <b>Pilinizden ve Alanınızdan Tasarruf Edin</b>: Diğer navigasyon uygulamaları gibi pilinizi tüketmez. Kompakt haritalar telefonunuzda değerli alan tasarrufu sağlar.
‣ <b>Ücretsiz ve Topluluk Tarafından Oluşturuldu</b>: Sizin gibi insanlar, OpenStreetMap'e yerler ekleyerek, özellikleri test ederek ve geri bildirimde bulunarak ve geliştirme becerilerinizi ve paranızı katkıda bulunarak uygulamanın oluşturulmasına yardımcı oldunuz..
‣ <b>Açık ve Şeffaf Karar Alma ve Finansman, Kar Amacı Gütmeyen ve Tamamen Açık Kaynak.</b>
<b>Ana Özellikleri</b>:
• Google Haritalar'da bulunmayan yerleri içeren indirilebilir detaylı haritalar
• Vurgulanan yürüyüş parkurları, kamp alanları, su kaynakları, zirveler, kontur çizgileriyle açık hava modu gibi
• Yürüyüş yolları ve bisiklet yolları
• Restoranlar, benzin istasyonları, oteller, mağazalar, turistik yerler gibi ilgi çekici noktalar ve daha fazlası
• İsme veya adrese göre veya ilgi noktası kategorisine göre arama yapın
• Yürüyerek, bisikletle veya araçla seyahat edenler için sesli duyurularla navigasyon
• Favori yerlerinizi tek bir dokunuşla yer imlerine ekleyin
• Çevrim dışı Wikipedia makaleleri
• Metro geçiş katmanı ve yönleri
• Rota kaydı
• Yer imlerini ve parkurları KML, KMZ, GPX formatlarında dışa ve içe aktarın
• Geceleri kullanmak için karanlık mod
• Temel bir yerleşik düzenleyici kullanarak herkes için harita verilerini iyileştirin
• Android Auto desteği
Lütfen uygulama sorunlarını bildirin, fikir önerin ve <b><i>comaps.app</i></b> web sitesinde topluluğumuza katılın.
<b>Özgürlük Burada</b>
Yolculuğunuzu keşfedin, gizlilik ve topluluk ön planda tutularak dünyayı keşfedin!

View File

@@ -44,6 +44,7 @@ import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.ViewModelProvider;
import app.organicmaps.api.Const;
import app.organicmaps.backup.PeriodicBackupRunner;
import app.organicmaps.base.BaseMwmFragmentActivity;
import app.organicmaps.base.OnBackPressListener;
import app.organicmaps.bookmarks.BookmarkCategoriesActivity;
@@ -139,6 +140,7 @@ import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_RECORD_TRACK_CODE;
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_SETTINGS_CODE;
import static app.organicmaps.util.PowerManagment.POWER_MANAGEMENT_TAG;
import static app.organicmaps.util.concurrency.UiThread.runLater;
public class MwmActivity extends BaseMwmFragmentActivity
implements PlacePageActivationListener,
@@ -253,6 +255,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
@NonNull
private DisplayManager mDisplayManager;
private PeriodicBackupRunner backupRunner;
ManageRouteBottomSheet mManageRouteBottomSheet;
private boolean mRemoveDisplayListener = true;
@@ -607,6 +611,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
*/
if (Map.isEngineCreated())
onRenderingInitializationFinished();
backupRunner = new PeriodicBackupRunner(this);
}
private void onSettingsResult(ActivityResult activityResult)
@@ -838,7 +844,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
@Override
public String getPrefsName()
{
return getString(R.string.help);
return getString(R.string.about_help);
}
@Override
@@ -1352,6 +1358,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
final String backUrl = Framework.nativeGetParsedBackUrl();
if (!TextUtils.isEmpty(backUrl))
Utils.openUri(this, Uri.parse(backUrl), null);
if (backupRunner != null && !backupRunner.isAlreadyChecked() && backupRunner.isTimeToBackup())
{
backupRunner.doBackup();
}
}
@CallSuper
@@ -2584,20 +2595,28 @@ public class MwmActivity extends BaseMwmFragmentActivity
{
if (id.equals(MAIN_MENU_ID))
{
final String activeLeftButton = buttonsHolder.getActiveButtonCode();
ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
items.add(new MenuBottomSheetItem(R.string.placepage_add_place_button, R.drawable.ic_plus, this::onAddPlaceOptionSelected));
items.add(new MenuBottomSheetItem(
R.string.download_maps,
R.drawable.ic_download,
getDownloadMapsCounter(),
this::onDownloadMapsOptionSelected
));
mDonatesUrl = Config.getDonateUrl(getApplicationContext());
if (!TextUtils.isEmpty(mDonatesUrl))
if (!BUTTON_ADD_PLACE_CODE.equals(activeLeftButton))
items.add(new MenuBottomSheetItem(R.string.placepage_add_place_button, R.drawable.ic_plus, this::onAddPlaceOptionSelected));
items.add(new MenuBottomSheetItem(R.string.download_maps, R.drawable.ic_download, getDownloadMapsCounter(), this::onDownloadMapsOptionSelected));
if (!Config.getDonateUrl(getApplicationContext()).isEmpty())
items.add(new MenuBottomSheetItem(R.string.donate, R.drawable.ic_donate, this::onDonateOptionSelected));
items.add(new MenuBottomSheetItem(R.string.settings, R.drawable.ic_settings, this::onSettingsOptionSelected));
items.add(new MenuBottomSheetItem(R.string.start_track_recording, R.drawable.ic_track_recording_off, -1, this::onTrackRecordingOptionSelected));
if (!BUTTON_SETTINGS_CODE.equals(activeLeftButton))
items.add(new MenuBottomSheetItem(R.string.settings, R.drawable.ic_settings, this::onSettingsOptionSelected));
if (!BUTTON_RECORD_TRACK_CODE.equals(activeLeftButton))
items.add(new MenuBottomSheetItem(R.string.start_track_recording, R.drawable.ic_track_recording_off, -1, this::onTrackRecordingOptionSelected));
items.add(new MenuBottomSheetItem(R.string.share_my_location, R.drawable.ic_share, this::onShareLocationOptionSelected));
if (!BUTTON_HELP_CODE.equals(activeLeftButton))
items.add(new MenuBottomSheetItem(R.string.about_help, R.drawable.ic_question_mark, this::showHelp));
return items;
}
return null;

View File

@@ -0,0 +1,114 @@
package app.organicmaps.backup;
import static app.organicmaps.settings.BackupSettingsFragment.MAX_BACKUPS_DEFAULT_COUNT;
import static app.organicmaps.settings.BackupSettingsFragment.MAX_BACKUPS_KEY;
import static app.organicmaps.util.StorageUtils.isFolderWritable;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.Uri;
import android.provider.DocumentsContract;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.AbsoluteSizeSpan;
import androidx.annotation.NonNull;
import androidx.documentfile.provider.DocumentFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.log.Logger;
public class BackupUtils
{
private static final String BACKUP_PREFIX = "backup_";
private static final String BACKUP_EXTENSION = ".kmz";
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss").withLocale(Locale.US);
private static final String TAG = BackupUtils.class.getSimpleName();
public static CharSequence formatReadableFolderPath(Context context, @NonNull Uri uri)
{
String docId = DocumentsContract.getTreeDocumentId(uri);
String volumeId;
String subPath = "";
int colonIndex = docId.indexOf(':');
if (colonIndex >= 0)
{
volumeId = docId.substring(0, colonIndex);
subPath = docId.substring(colonIndex + 1);
}
else
{
volumeId = docId;
}
String volumeName;
if ("primary".equalsIgnoreCase(volumeId))
volumeName = context.getString(R.string.maps_storage_shared);
else
volumeName = context.getString(R.string.maps_storage_removable);
SpannableStringBuilder sb = new SpannableStringBuilder();
sb.append(volumeName + ": \n", new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_3)), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.append("/" + subPath, new AbsoluteSizeSpan(UiUtils.dimen(context, R.dimen.text_size_body_4)), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return sb;
}
public static int getMaxBackups(SharedPreferences prefs)
{
String rawValue = prefs.getString(MAX_BACKUPS_KEY, String.valueOf(MAX_BACKUPS_DEFAULT_COUNT));
try
{
return Integer.parseInt(rawValue);
} catch (NumberFormatException e)
{
Logger.e(TAG, "Failed to parse max backups count, raw value: " + rawValue + " set to default: " + MAX_BACKUPS_DEFAULT_COUNT, e);
prefs.edit()
.putString(MAX_BACKUPS_KEY, String.valueOf(MAX_BACKUPS_DEFAULT_COUNT))
.apply();
return MAX_BACKUPS_DEFAULT_COUNT;
}
}
public static DocumentFile createUniqueBackupFolder(@NonNull DocumentFile parentDir, LocalDateTime backupTime)
{
String folderName = BACKUP_PREFIX + backupTime.format(DATE_FORMATTER);
return parentDir.createDirectory(folderName);
}
public static String getBackupName(LocalDateTime backupTime)
{
String formattedBackupTime = backupTime.format(DATE_FORMATTER);
return BACKUP_PREFIX + formattedBackupTime + BACKUP_EXTENSION;
}
public static DocumentFile[] getBackupFolders(DocumentFile parentDir)
{
List<DocumentFile> backupFolders = new ArrayList<>();
for (DocumentFile file : parentDir.listFiles())
{
if (file.isDirectory() && file.getName() != null && file.getName().startsWith(BACKUP_PREFIX))
backupFolders.add(file);
}
return backupFolders.toArray(new DocumentFile[0]);
}
public static boolean isBackupFolderAvailable(Context context, String storedFolderPath)
{
return !TextUtils.isEmpty(storedFolderPath) && isFolderWritable(context, storedFolderPath);
}
}

View File

@@ -0,0 +1,189 @@
package app.organicmaps.backup;
import static app.organicmaps.backup.BackupUtils.getBackupName;
import static app.organicmaps.backup.BackupUtils.getBackupFolders;
import static app.organicmaps.util.StorageUtils.copyFileToDocumentFile;
import static app.organicmaps.util.StorageUtils.deleteDirectoryRecursive;
import android.app.Activity;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.documentfile.provider.DocumentFile;
import java.io.File;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import app.organicmaps.bookmarks.data.BookmarkCategory;
import app.organicmaps.bookmarks.data.BookmarkManager;
import app.organicmaps.bookmarks.data.BookmarkSharingResult;
import app.organicmaps.bookmarks.data.KmlFileType;
import app.organicmaps.util.concurrency.ThreadPool;
import app.organicmaps.util.concurrency.UiThread;
import app.organicmaps.util.log.Logger;
public class LocalBackupManager implements BookmarkManager.BookmarksSharingListener
{
public static final String TAG = LocalBackupManager.class.getSimpleName();
private final Activity activity;
private final String backupFolderPath;
private final int maxBackups;
private Listener listener;
public LocalBackupManager(@NonNull Activity activity, @NonNull String backupFolderPath, int maxBackups)
{
this.activity = activity;
this.backupFolderPath = backupFolderPath;
this.maxBackups = maxBackups;
}
public void doBackup()
{
BookmarkManager.INSTANCE.addSharingListener(this);
prepareBookmarkCategoriesForSharing();
if (listener != null)
listener.onBackupStarted();
}
public void setListener(@NonNull Listener listener)
{
this.listener = listener;
}
@Override
public void onPreparedFileForSharing(@NonNull BookmarkSharingResult result)
{
BookmarkManager.INSTANCE.removeSharingListener(this);
ThreadPool.getWorker().execute(() -> {
ErrorCode errorCode = null;
switch (result.getCode())
{
case BookmarkSharingResult.SUCCESS ->
{
if (!saveBackup(result))
{
Logger.e(TAG, "Failed to save backup. See system log above");
errorCode = ErrorCode.FILE_ERROR;
}
else
{
Logger.i(TAG, "Backup was created and saved successfully");
}
}
case BookmarkSharingResult.EMPTY_CATEGORY ->
{
errorCode = ErrorCode.EMPTY_CATEGORY;
Logger.e(TAG, "Failed to create backup. Category is empty");
}
case BookmarkSharingResult.ARCHIVE_ERROR ->
{
errorCode = ErrorCode.ARCHIVE_ERROR;
Logger.e(TAG, "Failed to create archive of bookmarks");
}
case BookmarkSharingResult.FILE_ERROR ->
{
errorCode = ErrorCode.FILE_ERROR;
Logger.e(TAG, "Failed create file for archive");
}
default ->
{
errorCode = ErrorCode.UNSUPPORTED;
Logger.e(TAG, "Failed to create backup. Unknown error");
}
}
ErrorCode finalErrorCode = errorCode;
UiThread.run(() -> {
if (listener != null)
{
if (finalErrorCode == null)
listener.onBackupFinished();
else
listener.onBackupFailed(finalErrorCode);
}
});
});
}
private boolean saveBackup(@NonNull BookmarkSharingResult result)
{
boolean isSuccess = false;
Uri folderUri = Uri.parse(backupFolderPath);
try
{
DocumentFile parentFolder = DocumentFile.fromTreeUri(activity, folderUri);
if (parentFolder != null && parentFolder.canWrite())
{
LocalDateTime now = LocalDateTime.now();
DocumentFile backupFolder = BackupUtils.createUniqueBackupFolder(parentFolder, now);
if (backupFolder != null)
{
String backupName = getBackupName(now);
DocumentFile backupFile = backupFolder.createFile(result.getMimeType(), backupName);
if (backupFile != null && copyFileToDocumentFile(activity, new File(result.getSharingPath()), backupFile))
{
Logger.i(TAG, "Backup saved to " + backupFile.getUri());
isSuccess = true;
}
}
else
{
Logger.e(TAG, "Failed to create backup folder");
}
}
cleanOldBackups(parentFolder);
} catch (Exception e)
{
Logger.e(TAG, "Failed to save backup", e);
}
return isSuccess;
}
public void cleanOldBackups(DocumentFile parentDir)
{
DocumentFile[] backupFolders = getBackupFolders(parentDir);
if (backupFolders.length > maxBackups)
{
Arrays.sort(backupFolders, Comparator.comparing(DocumentFile::getName));
for (int i = 0; i < backupFolders.length - maxBackups; i++)
{
Logger.i(TAG, "Delete old backup " + backupFolders[i].getUri());
deleteDirectoryRecursive(backupFolders[i]);
}
}
}
private void prepareBookmarkCategoriesForSharing()
{
List<BookmarkCategory> categories = BookmarkManager.INSTANCE.getCategories();
long[] categoryIds = new long[categories.size()];
for (int i = 0; i < categories.size(); i++)
categoryIds[i] = categories.get(i).getId();
BookmarkManager.INSTANCE.prepareCategoriesForSharing(categoryIds, KmlFileType.Text);
}
public interface Listener
{
void onBackupStarted();
void onBackupFinished();
void onBackupFailed(ErrorCode errorCode);
}
public enum ErrorCode
{
EMPTY_CATEGORY,
ARCHIVE_ERROR,
FILE_ERROR,
UNSUPPORTED,
}
}

View File

@@ -0,0 +1,104 @@
package app.organicmaps.backup;
import static app.organicmaps.backup.BackupUtils.getMaxBackups;
import static app.organicmaps.backup.BackupUtils.isBackupFolderAvailable;
import static app.organicmaps.settings.BackupSettingsFragment.BACKUP_FOLDER_PATH_KEY;
import static app.organicmaps.settings.BackupSettingsFragment.BACKUP_INTERVAL_KEY;
import static app.organicmaps.settings.BackupSettingsFragment.LAST_BACKUP_TIME_KEY;
import static app.organicmaps.util.StorageUtils.isFolderWritable;
import android.app.Activity;
import android.content.SharedPreferences;
import androidx.preference.PreferenceManager;
import app.organicmaps.util.log.Logger;
public class PeriodicBackupRunner
{
private final Activity activity;
private static final String TAG = PeriodicBackupRunner.class.getSimpleName();
private final SharedPreferences prefs;
private boolean alreadyChecked = false;
public PeriodicBackupRunner(Activity activity)
{
this.activity = activity;
this.prefs = PreferenceManager.getDefaultSharedPreferences(activity);
}
public boolean isAlreadyChecked()
{
return alreadyChecked;
}
public boolean isTimeToBackup()
{
long intervalMs = getBackupIntervalMs();
if (intervalMs <= 0)
return false;
long lastBackupTime = prefs.getLong(LAST_BACKUP_TIME_KEY, 0);
long now = System.currentTimeMillis();
alreadyChecked = true;
return (now - lastBackupTime) >= intervalMs;
}
public void doBackup()
{
String storedFolderPath = prefs.getString(BACKUP_FOLDER_PATH_KEY, null);
if (isBackupFolderAvailable(activity, storedFolderPath))
{
Logger.i(TAG, "Performing periodic backup");
performBackup(storedFolderPath, getMaxBackups(prefs));
}
else
{
Logger.w(TAG, "Backup folder is not writable, passed path: " + storedFolderPath);
}
}
private long getBackupIntervalMs()
{
String defaultValue = "0";
try
{
return Long.parseLong(prefs.getString(BACKUP_INTERVAL_KEY, defaultValue));
} catch (NumberFormatException e)
{
return 0;
}
}
private void performBackup(String backupFolderPath, int maxBackups)
{
LocalBackupManager backupManager = new LocalBackupManager(activity, backupFolderPath, maxBackups);
backupManager.setListener(new LocalBackupManager.Listener()
{
@Override
public void onBackupStarted()
{
Logger.i(TAG, "Periodic backup started");
}
@Override
public void onBackupFinished()
{
prefs.edit().putLong(LAST_BACKUP_TIME_KEY, System.currentTimeMillis()).apply();
Logger.i(TAG, "Periodic backup finished");
}
@Override
public void onBackupFailed(LocalBackupManager.ErrorCode errorCode)
{
Logger.e(TAG, "Periodic backup was failed with code: " + errorCode);
}
});
backupManager.doBackup();
}
}

View File

@@ -69,7 +69,8 @@ public class Metadata implements Parcelable
FMD_OUTDOOR_SEATING(48),
FMD_NETWORK(49),
FMD_CONTACT_FEDIVERSE(50),
FMD_CONTACT_BLUESKY(51);
FMD_CONTACT_BLUESKY(51),
FMD_PANORAMAX(52);
private final int mMetaType;
MetadataType(int metadataType)

View File

@@ -41,7 +41,7 @@ public class HelpScreen extends BaseMapScreen
{
final Header.Builder builder = new Header.Builder();
builder.setStartHeaderAction(Action.BACK);
builder.setTitle(getCarContext().getString(R.string.help));
builder.setTitle(getCarContext().getString(R.string.about_help));
return builder.build();
}

View File

@@ -109,7 +109,7 @@ public class SettingsScreen extends BaseMapScreen
private Item createHelpItem()
{
final Row.Builder builder = new Row.Builder();
builder.setTitle(getCarContext().getString(R.string.help));
builder.setTitle(getCarContext().getString(R.string.about_help));
builder.setOnClickListener(() -> getScreenManager().push(new HelpScreen(getCarContext(), getSurfaceRenderer())));
builder.setBrowsable(true);
return builder.build();

View File

@@ -11,7 +11,6 @@ import android.text.style.StyleSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
@@ -28,6 +27,7 @@ import app.organicmaps.util.UiUtils;
import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList;
import java.util.Collection;
@@ -362,10 +362,10 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
private class ItemViewHolder extends BaseInnerViewHolder<CountryItem>
{
private final DownloaderStatusIcon mStatusIcon;
private final TextView mName;
private final TextView mSubtitle;
private final TextView mFoundName;
private final TextView mSize;
private final MaterialTextView mName;
private final MaterialTextView mSubtitle;
private final MaterialTextView mFoundName;
private final MaterialTextView mSize;
private void processClick(boolean clickOnStatus)
{
@@ -510,7 +510,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
static class HeaderViewHolder extends BaseInnerViewHolder<String>
{
@NonNull
private final TextView mTitle;
private final MaterialTextView mTitle;
HeaderViewHolder(@NonNull View frame)
{

View File

@@ -2,11 +2,12 @@ package app.organicmaps.downloader;
import android.util.SparseIntArray;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.AttrRes;
import androidx.annotation.DrawableRes;
import com.google.android.material.imageview.ShapeableImageView;
import app.organicmaps.R;
import app.organicmaps.widget.WheelProgressView;
import app.organicmaps.util.ThemeUtils;
@@ -15,7 +16,7 @@ import app.organicmaps.util.UiUtils;
public class DownloaderStatusIcon
{
private final View mFrame;
protected final ImageView mIcon;
protected final ShapeableImageView mIcon;
private final WheelProgressView mProgress;
private static final SparseIntArray sIconsCache = new SparseIntArray();

View File

@@ -43,7 +43,7 @@ public class CopyrightFragment extends BaseMwmFragment
{
if (!mDelegate.onBackPressed())
{
((HelpActivity) requireActivity()).stackFragment(HelpFragment.class, getString(R.string.help), null);
((HelpActivity) requireActivity()).stackFragment(HelpFragment.class, getString(R.string.about_help), null);
}
return true;

View File

@@ -43,15 +43,21 @@ public class LeftButtonsHolder
}
@Nullable
public LeftButton getActiveButton()
public String getActiveButtonCode()
{
String activeButtonCode = prefs.getString(leftButtonPreferenceKey, DEFAULT_BUTTON_CODE);
if (!TextUtils.isEmpty(activeButtonCode))
return availableButtons.get(activeButtonCode);
return activeButtonCode;
else
return null;
}
@Nullable
public LeftButton getActiveButton()
{
return availableButtons.get(getActiveButtonCode());
}
public Collection<LeftButton> getAllButtons()
{
return availableButtons.values();

View File

@@ -213,7 +213,7 @@ public class MapButtonsController extends Fragment
)
{
leftButtonView.setImageResource(R.drawable.ic_christmas_tree);
leftButtonView.setContentDescription(getString(R.string.help));
leftButtonView.setContentDescription(getString(R.string.about_help));
leftButtonView.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.help));
}
else

View File

@@ -266,7 +266,8 @@ public class NavigationController implements TrafficManager.TrafficCallback,
mSpeedLimit.setSpeedLimit(0, false);
return;
}
final boolean speedLimitExceeded = info.speedLimitMps < location.getSpeed();
mSpeedLimit.setSpeedLimit(StringUtils.nativeFormatSpeed(info.speedLimitMps), speedLimitExceeded);
final int fSpeedLimit = StringUtils.nativeFormatSpeed(info.speedLimitMps);
final boolean speedLimitExceeded = fSpeedLimit < StringUtils.nativeFormatSpeed(location.getSpeed());
mSpeedLimit.setSpeedLimit(fSpeedLimit, speedLimitExceeded);
}
}

View File

@@ -0,0 +1,384 @@
package app.organicmaps.settings;
import static app.organicmaps.backup.BackupUtils.formatReadableFolderPath;
import static app.organicmaps.backup.BackupUtils.getMaxBackups;
import static app.organicmaps.backup.BackupUtils.isBackupFolderAvailable;
import static app.organicmaps.util.StorageUtils.isFolderWritable;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.text.DateFormat;
import app.organicmaps.R;
import app.organicmaps.backup.LocalBackupManager;
import app.organicmaps.util.log.Logger;
public class BackupSettingsFragment
extends BaseXmlSettingsFragment
{
private ActivityResultLauncher<Intent> folderPickerLauncher;
private static final String TAG = LocalBackupManager.class.getSimpleName();
public static final String BACKUP_FOLDER_PATH_KEY = "backup_location";
public static final String LAST_BACKUP_TIME_KEY = "last_backup_time";
private static final String BACKUP_NOW_KEY = "backup_now";
public static final String BACKUP_INTERVAL_KEY = "backup_history_interval";
public static final String MAX_BACKUPS_KEY = "backup_history_count";
public static final int MAX_BACKUPS_DEFAULT_COUNT = 10;
public static final String DEFAULT_BACKUP_INTERVAL = "86400000"; // 24 hours in ms
private LocalBackupManager mBackupManager;
private SharedPreferences prefs;
@Override
protected int getXmlResources()
{
return R.xml.prefs_backup;
}
@NonNull
@SuppressWarnings("NotNullFieldNotInitialized")
Preference backupLocationOption;
@NonNull
@SuppressWarnings("NotNullFieldNotInitialized")
ListPreference backupIntervalOption;
@NonNull
@SuppressWarnings("NotNullFieldNotInitialized")
Preference maxBackupsOption;
@NonNull
@SuppressWarnings("NotNullFieldNotInitialized")
Preference backupNowOption;
@NonNull
@SuppressWarnings("NotNullFieldNotInitialized")
Preference advancedCategory;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
folderPickerLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
boolean isSuccess = false;
String lastFolderPath = prefs.getString(BACKUP_FOLDER_PATH_KEY, null);
if (result.getResultCode() == Activity.RESULT_OK)
{
Intent data = result.getData();
Logger.i(TAG, "Folder selection result: " + data);
if (data == null)
return;
Uri uri = data.getData();
if (uri != null)
{
takePersistableUriPermission(uri);
Logger.i(TAG, "Backup location changed to " + uri);
prefs.edit().putString(BACKUP_FOLDER_PATH_KEY, uri.toString()).apply();
setFormattedBackupPath(uri);
runBackup();
isSuccess = true;
}
else
{
Logger.w(TAG, "Folder selection result is null");
}
}
else if (result.getResultCode() == Activity.RESULT_CANCELED)
{
Logger.w(TAG, "User canceled folder selection");
if (TextUtils.isEmpty(lastFolderPath))
{
prefs.edit().putString(BACKUP_FOLDER_PATH_KEY, null).apply();
Logger.i(TAG, "Backup settings reset");
initBackupLocationOption();
}
else if (isFolderWritable(requireActivity(), lastFolderPath))
{
Logger.i(TAG, "Backup location not changed, using previous value " + lastFolderPath);
isSuccess = true;
}
else
{
Logger.e(TAG, "Backup location not changed, but last folder is not writable: " + lastFolderPath);
}
}
resetLastBackupTime();
updateStatusSummaryOption();
Logger.i(TAG, "Folder selection result: " + isSuccess);
applyAdvancedSettings(isSuccess);
}
);
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
{
super.onCreatePreferences(savedInstanceState, rootKey);
prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
backupLocationOption = findPreference(BACKUP_FOLDER_PATH_KEY);
backupIntervalOption = findPreference(BACKUP_INTERVAL_KEY);
maxBackupsOption = findPreference(MAX_BACKUPS_KEY);
backupNowOption = findPreference(BACKUP_NOW_KEY);
initBackupLocationOption();
initBackupIntervalOption();
initMaxBackupsOption();
initBackupNowOption();
}
private void initBackupLocationOption()
{
String storedFolderPath = prefs.getString(BACKUP_FOLDER_PATH_KEY, null);
boolean isEnabled = false;
if (!TextUtils.isEmpty(storedFolderPath))
{
if (isFolderWritable(requireContext(), storedFolderPath))
{
setFormattedBackupPath(Uri.parse(storedFolderPath));
isEnabled = true;
}
else
{
Logger.e(TAG, "Backup location is not available, path: " + storedFolderPath);
showBackupErrorAlertDialog(requireContext().getString(R.string.dialog_report_error_missing_folder));
backupLocationOption.setSummary(requireContext().getString(R.string.pref_backup_now_summary_folder_unavailable));
}
}
else
{
backupLocationOption.setSummary(requireContext().getString(R.string.pref_backup_location_summary_initial));
}
applyAdvancedSettings(isEnabled);
backupLocationOption.setOnPreferenceClickListener(preference -> {
launchFolderPicker();
return true;
});
}
private void setFormattedBackupPath(@NonNull Uri uri)
{
backupLocationOption.setSummary(formatReadableFolderPath(requireContext(), uri));
}
private void initBackupIntervalOption()
{
String backupInterval = prefs.getString(BACKUP_INTERVAL_KEY, DEFAULT_BACKUP_INTERVAL);
CharSequence entry = getEntryForValue(backupIntervalOption, backupInterval);
if (entry != null)
backupIntervalOption.setSummary(entry);
backupIntervalOption.setOnPreferenceChangeListener((preference, newValue) -> {
CharSequence newEntry = getEntryForValue(backupIntervalOption, newValue.toString());
Logger.i(TAG, "auto backup interval changed to " + newEntry);
if (newEntry != null)
backupIntervalOption.setSummary(newEntry);
return true;
});
}
private void initMaxBackupsOption()
{
maxBackupsOption.setSummary(String.valueOf(getMaxBackups(prefs)));
maxBackupsOption.setOnPreferenceChangeListener((preference, newValue) -> {
maxBackupsOption.setSummary(newValue.toString());
return true;
});
}
private void initBackupNowOption()
{
updateStatusSummaryOption();
backupNowOption.setOnPreferenceClickListener(preference -> {
runBackup();
return true;
});
}
private void updateStatusSummaryOption()
{
long lastBackupTime = prefs.getLong(LAST_BACKUP_TIME_KEY, 0L);
String summary;
if (lastBackupTime > 0)
{
String time = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(lastBackupTime);
summary = requireContext().getString(R.string.pref_backup_status_summary_success) + ": " + time;
}
else
{
summary = requireContext().getString(R.string.pref_backup_now_summary);
}
backupNowOption.setSummary(summary);
}
private void resetLastBackupTime()
{
prefs.edit().remove(LAST_BACKUP_TIME_KEY).apply();
}
private void applyAdvancedSettings(boolean isBackupEnabled)
{
backupIntervalOption.setVisible(isBackupEnabled);
maxBackupsOption.setVisible(isBackupEnabled);
backupNowOption.setVisible(isBackupEnabled);
}
private void runBackup()
{
String currentFolderPath = prefs.getString(BACKUP_FOLDER_PATH_KEY, null);
if (!TextUtils.isEmpty(currentFolderPath))
{
if (isFolderWritable(requireContext(), currentFolderPath))
{
mBackupManager = new LocalBackupManager(requireActivity(), currentFolderPath, getMaxBackups(prefs));
mBackupManager.setListener(new LocalBackupManager.Listener()
{
@Override
public void onBackupStarted()
{
Logger.i(TAG, "Manual backup started");
backupNowOption.setEnabled(false);
backupNowOption.setSummary(R.string.pref_backup_now_summary_progress);
}
@Override
public void onBackupFinished()
{
Logger.i(TAG, "Manual backup successful");
backupNowOption.setEnabled(true);
backupNowOption.setSummary(R.string.pref_backup_now_summary_ok);
prefs.edit().putLong(LAST_BACKUP_TIME_KEY, System.currentTimeMillis()).apply();
}
@Override
public void onBackupFailed(LocalBackupManager.ErrorCode errorCode)
{
String errorMessage = switch (errorCode)
{
case EMPTY_CATEGORY -> requireContext().getString(R.string.pref_backup_now_summary_empty_lists);
default -> requireContext().getString(R.string.pref_backup_now_summary_failed);
};
Logger.e(TAG, "Manual backup was failed with code: " + errorCode);
backupNowOption.setEnabled(true);
backupNowOption.setSummary(errorMessage);
showBackupErrorAlertDialog(requireContext().getString(R.string.dialog_report_error_with_logs));
}
});
mBackupManager.doBackup();
}
else
{
backupNowOption.setSummary(R.string.pref_backup_now_summary_folder_unavailable);
showBackupErrorAlertDialog(requireContext().getString(R.string.dialog_report_error_missing_folder));
Logger.e(TAG, "Manual backup error: folder " + currentFolderPath + " unavailable");
}
}
else
{
backupNowOption.setSummary(R.string.pref_backup_now_summary_folder_unavailable);
Logger.e(TAG, "Manual backup error: no folder selected");
}
}
private void launchFolderPicker()
{
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
PackageManager packageManager = requireActivity().getPackageManager();
if (intent.resolveActivity(packageManager) != null)
folderPickerLauncher.launch(intent);
else
showNoFileManagerError();
}
private void showNoFileManagerError()
{
new MaterialAlertDialogBuilder(requireActivity())
.setMessage(R.string.error_no_file_manager_app)
.setPositiveButton(android.R.string.ok, (dialog, which) -> dialog.dismiss())
.show();
}
private void showBackupErrorAlertDialog(String message)
{
requireActivity().runOnUiThread(() -> {
new MaterialAlertDialogBuilder(requireActivity())
.setTitle(R.string.pref_backup_now_summary_failed)
.setMessage(message)
.setPositiveButton(android.R.string.ok, (dialog, which) -> dialog.dismiss())
.show();
});
}
private void takePersistableUriPermission(Uri uri)
{
requireContext().getContentResolver().takePersistableUriPermission(
uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
);
}
@Nullable
public static CharSequence getEntryForValue(@NonNull ListPreference listPref, @NonNull CharSequence value)
{
CharSequence[] entryValues = listPref.getEntryValues();
CharSequence[] entries = listPref.getEntries();
if (entryValues == null || entries == null)
return null;
for (int i = 0; i < entryValues.length; i++)
{
if (entryValues[i].equals(value))
return entries[i];
}
return null;
}
}

View File

@@ -184,15 +184,15 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
{
getSettingsActivity().stackFragment(VoiceInstructionsSettingsFragment.class, getString(R.string.pref_tts_enable_title), null);
}
else if (key.equals(getString(R.string.pref_help)))
{
startActivity(new Intent(requireActivity(), HelpActivity.class));
}
else if (key.equals(getString(R.string.pref_map_locale)))
{
LanguagesFragment langFragment = (LanguagesFragment)getSettingsActivity().stackFragment(LanguagesFragment.class, getString(R.string.change_map_locale), null);
langFragment.setListener(this);
}
else if (key.equals(getString(R.string.pref_backup)))
{
getSettingsActivity().stackFragment(BackupSettingsFragment.class, getString(R.string.pref_backup_title), null);
}
}
return super.onPreferenceTreeClick(preference);
}

View File

@@ -1,5 +1,6 @@
package app.organicmaps.util;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -10,10 +11,13 @@ import android.provider.DocumentsContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.FileProvider;
import androidx.documentfile.provider.DocumentFile;
import app.organicmaps.BuildConfig;
import app.organicmaps.util.log.Logger;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
@@ -323,4 +327,76 @@ public class StorageUtils
}
}
}
public static boolean copyFileToDocumentFile(
@NonNull Activity activity,
@NonNull File sourceFile,
@NonNull DocumentFile targetFile
)
{
try (
InputStream in = new FileInputStream(sourceFile);
OutputStream out = activity.getContentResolver().openOutputStream(targetFile.getUri())
)
{
if (out == null)
{
Logger.e(TAG, "Failed to open output stream for " + targetFile.getUri());
return false;
}
byte[] buffer = new byte[8192];
int length;
while ((length = in.read(buffer)) > 0)
out.write(buffer, 0, length);
out.flush();
return true;
} catch (IOException e)
{
Logger.e(TAG, "Failed to copy file from " + sourceFile.getAbsolutePath() + " to " + targetFile.getUri(), e);
return false;
}
}
public static void deleteDirectoryRecursive(@NonNull DocumentFile dir)
{
try
{
for (DocumentFile file : dir.listFiles())
{
if (file.isDirectory())
deleteDirectoryRecursive(file);
else
file.delete();
}
dir.delete();
} catch (Exception e)
{
Logger.e(TAG, "Failed to delete directory: " + dir.getUri(), e);
}
}
public static boolean isFolderWritable(Context context, String folderPath)
{
try
{
Uri folderUri = Uri.parse(folderPath);
DocumentFile folder = DocumentFile.fromTreeUri(context, folderUri);
if (folder != null && folder.canWrite())
{
DocumentFile tempFile = folder.createFile("application/octet-stream", "temp_file");
if (tempFile != null)
{
tempFile.delete();
return true;
}
}
} catch (Exception e)
{
Logger.e(TAG, "Failed to check if folder is writable: " + folderPath, e);
}
return false;
}
}

View File

@@ -56,6 +56,9 @@ public class PlacePageLinksFragment extends Fragment implements Observer<MapObje
private View mWikimedia;
private TextView mTvWikimedia;
private View mPanoramax;
private TextView mTvPanoramax;
private PlacePageViewModel mViewModel;
private MapObject mMapObject;
@@ -163,6 +166,11 @@ public class PlacePageLinksFragment extends Fragment implements Observer<MapObje
mTvLinePage = mFrame.findViewById(R.id.tv__place_line_page);
mLinePage.setOnClickListener((v) -> openUrl(Metadata.MetadataType.FMD_CONTACT_LINE));
mLinePage.setOnLongClickListener((v) -> copyUrl(mLinePage, Metadata.MetadataType.FMD_CONTACT_LINE));
mPanoramax = mFrame.findViewById(R.id.ll__place_panoramax);
mTvPanoramax = mFrame.findViewById(R.id.tv__place_panoramax);
mPanoramax.setOnClickListener((v) -> openUrl(Metadata.MetadataType.FMD_PANORAMAX));
mTvPanoramax.setOnLongClickListener((v) -> copyUrl(mPanoramax, Metadata.MetadataType.FMD_PANORAMAX));
}
private void openUrl(Metadata.MetadataType type)
@@ -226,6 +234,9 @@ public class PlacePageLinksFragment extends Fragment implements Observer<MapObje
final String line = mMapObject.getMetadata(Metadata.MetadataType.FMD_CONTACT_LINE);
refreshMetadataOrHide(line, mLinePage, mTvLinePage);
final String panoramax = mMapObject.getMetadata(Metadata.MetadataType.FMD_PANORAMAX);
refreshMetadataOrHide(panoramax, mPanoramax, mTvPanoramax);
}
@Override

File diff suppressed because one or more lines are too long

View File

@@ -8,7 +8,7 @@
<include
layout="@layout/toolbar_extended"/>
<androidx.cardview.widget.CardView
<com.google.android.material.card.MaterialCardView
android:layout_width="@dimen/settings_width"
android:layout_height="match_parent"
android:layout_marginTop="?actionBarSize"
@@ -18,6 +18,6 @@
style="@style/MwmWidget.FrameLayout.Elevation"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.cardview.widget.CardView>
</com.google.android.material.card.MaterialCardView>
</FrameLayout>

View File

@@ -18,7 +18,7 @@
android:layout_marginEnd="@dimen/margin_base"
android:layout_centerVertical="true"/>
<TextView
<com.google.android.material.textview.MaterialTextView
android:id="@+id/size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -37,7 +37,7 @@
android:layout_centerVertical="true"
android:layout_toEndOf="@id/downloader_status_frame"
android:layout_toStartOf="@id/size">
<TextView
<com.google.android.material.textview.MaterialTextView
android:id="@+id/found_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -46,7 +46,7 @@
tools:text="Крымск"
tools:background="#60FF00FF"/>
<TextView
<com.google.android.material.textview.MaterialTextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -54,7 +54,7 @@
tools:text="Донецкая область"
tools:background="#40FF0000"/>
<TextView
<com.google.android.material.textview.MaterialTextView
android:id="@+id/subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:background="#400000FF">
<TextView
<com.google.android.material.textview.MaterialTextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -15,7 +15,7 @@
wheel:wheelSecondaryColor="?dividerHorizontal"
wheel:wheelThickness="@dimen/margin_eighth"/>
<ImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/downloader_status"
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@@ -21,4 +21,5 @@
<include layout="@layout/place_page_line" />
<include layout="@layout/place_page_bluesky" />
<include layout="@layout/place_page_wikimedia" />
<include layout="@layout/place_page_panoramax" />
</LinearLayout>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ll__place_panoramax"
style="@style/PlacePageItemFrame"
android:tag="website"
tools:background="#20FF0000"
tools:visibility="visible">
<ImageView
android:id="@+id/iv__place_panoramax"
style="@style/PlacePageMetadataIcon"
app:srcCompat="@drawable/ic_panoramax"
app:tint="?colorAccent"/>
<TextView
android:id="@+id/tv__place_panoramax"
android:textAlignment="viewStart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/MwmTextAppearance.PlacePage.Accent"
tools:text="@string/panoramax"/>
</LinearLayout>

View File

@@ -503,7 +503,7 @@
<!-- Text in About and OSM Login screens. First %@ is replaced by a local, human readable date. -->
<string name="osm_presentation">بيانات OpenStreetMap التي أنشأها المجتمع اعتبارًا من %s. تعرف على المزيد حول كيفية تعديل الخريطة وتحديثها على OpenStreetMap.org</string>
<!-- OSM explanation on Android login screen -->
<string name="login_osm_presentation">OpenStreetMap.org (OSM) هو مشروع مجتمعي لبناء خريطة مجانية ومفتوحة. إنه المصدر الرئيسي لبيانات الخرائط في الخرائط العضوية ويعمل على غرار ويكيبيديا. يمكنك إضافة الأماكن أو تعديلها وتصبح متاحة لملايين المستخدمين في جميع أنحاء العالم. نضم إلى المجتمع وساعد في إنشاء خريطة أفضل للجميع!</string>
<string name="login_osm_presentation">OpenStreetMap.org (OSM) هو مشروع مجتمعي لبناء خريطة مجانية ومفتوحة. إنه المصدر الرئيسي لبيانات الخرائط في CoMaps ويعمل على غرار ويكيبيديا. يمكنك إضافة الأماكن أو تعديلها وتصبح متاحة لملايين المستخدمين في جميع أنحاء العالم.\nنضم إلى المجتمع وساعد في إنشاء خريطة أفضل للجميع!</string>
<string name="login_to_make_edits_visible">أنشئ حساباً على OpenStreetMap أو سجّل الدخول لنشر تعديلاتك على الخريطة للعالم.</string>
<!-- Downloaded 10 **of** 20 <- it is that "of" -->
<string name="downloader_of">%1$d من%2$d</string>
@@ -519,7 +519,7 @@
<!-- Title for OSM note section in the editor -->
<string name="editor_other_info">ملاحظة لمتطوعي OpenStreetMap (اختياري)</string>
<!-- Hint of the input field in the OSM note section of the editor -->
<string name="editor_note_hint">وصف الأخطاء على الخريطة أو الأشياء التي لا يمكن تحريرها باستخدام الخرائط العضوية</string>
<string name="editor_note_hint">وصف الأخطاء على الخريطة أو الأشياء التي لا يمكن تحريرها باستخدام CoMaps</string>
<!-- Information about OSM at the top of the editing page -->
<string name="editor_about_osm">يتم تحميل تعديلاتك على قاعدة البيانات العامة <a href="https://wiki.openstreetmap.org/wiki/Ar:About_OpenStreetMap">OpenStreetMap</a>. يرجى عدم إضافة معلومات شخصية أو محمية بحقوق الطبع والنشر.</string>
<string name="editor_more_about_osm">المزيد عن خريطة الشارع المفتوحة</string>
@@ -890,4 +890,5 @@
<string name="telegram_url">https://t.me/CoMapsApp</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">ويكيميديا كومنز</string>
</resources>

View File

@@ -181,4 +181,5 @@
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
</resources>

View File

@@ -671,7 +671,7 @@
<string name="power_managment_setting_never">Heç vaxt</string>
<string name="power_managment_setting_auto">Avtomatik</string>
<string name="power_managment_setting_manual_max">Maksimum enerji qənaəti</string>
<string name="enable_logging_warning_message">Yardım dialoq qutusunda “Problemi bildir” istifadə etməklə probleminizlə bağlı ətraflı diaqnostik jurnalları qeyd etmək və bizə göndərmək üçün bu seçimi müvəqqəti aktivləşdirin. Qeydlərə məkan məlumatı daxil ola bilər</string>
<string name="enable_logging_warning_message">Yardım dialoq qutusunda “Problemi bildir” istifadə etməklə probleminizlə bağlı ətraflı diaqnostik jurnalları qeyd etmək və bizə göndərmək üçün bu seçimi müvəqqəti aktivləşdirin. Qeydlərə məkan məlumatı daxil ola bilər.</string>
<string name="access_rules_author_only">Onlayn redaktə</string>
<string name="driving_options_title">Marşrutlaşdırma seçimləri</string>
<!-- Recommended length for CarPlay and Android Auto is around 25-27 characters -->
@@ -682,7 +682,7 @@
<string name="avoid_ferry">Bərə keçidlərindən çəkinin</string>
<string name="avoid_motorways">Magistral yoldan çəkinin</string>
<string name="unable_to_calc_alert_title">Marşrutu hesablamaq mümkün deyil</string>
<string name="unable_to_calc_alert_subtitle">Təəssüf ki, seçdiyiniz seçimlərə görə marşrut tapa bilmədik. Seçimləri dəyişdirin və yenidən cəhd edin</string>
<string name="unable_to_calc_alert_subtitle">Təəssüf ki, seçdiyiniz seçimlərə görə marşrut tapa bilmədik. Seçimləri dəyişdirin və yenidən cəhd edin.</string>
<string name="define_to_avoid_btn">Qarşısını almaq üçün yolları müəyyənləşdirin</string>
<string name="change_driving_options_btn">Sürmə seçimləri aktiv edildi</string>
<string name="toll_road">Ücrətli yol</string>
@@ -843,4 +843,5 @@
<string name="telegram_url">https://t.me/CoMapsApp/</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">Vikianbar</string>
</resources>

View File

@@ -880,7 +880,7 @@
<item quantity="other">Знойдзена %d файлаў. Вы можаце ўбачыць іх пасля пераўтварэння.</item>
</plurals>
<string name="error_enter_correct_vk_page">Увядзіце сапраўднае імя карыстальніка або спасылку VK</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
<string name="wikimedia_commons">Вікісховішча</string>
<string name="comma_separated_pair">%1$s, %2$s</string>
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/RU:О_проекте</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>

View File

@@ -838,4 +838,5 @@
<string name="trip_finished">Пристигнахте!</string>
<string name="instagram">Instagram</string>
<string name="downloader_loading_ios">Изтегляне</string>
<string name="wikimedia_commons">Общомедия</string>
</resources>

View File

@@ -10,7 +10,7 @@
<string name="search">অনুসন্ধান</string>
<string name="download_has_failed">ডাউনলোড ব্যর্থ। আবার চেষ্টা করতে টিপ দাও।</string>
<string name="mb">এমবি</string>
<string name="search_map">ানচিত্র অনুসন্ধান</string>
<string name="search_map">্যাপ অনুসন্ধান</string>
<string name="gb">জিবি</string>
<string name="kilometres">কিলোমিটার</string>
<string name="downloading">ডাউনলোডরত…</string>
@@ -19,4 +19,21 @@
<string name="translated_om_site_url">https://comaps.app/</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="app_site_url">https://comaps.app/</string>
<string name="location_is_disabled_long_text">আপনার ডিভাইস বা অ্যাপ এর সব লোকেশন পরিষেবা বন্ধ করা আছে। দয়া করে সেটিংস থেকে চালু করুন।</string>
<string name="close">বন্ধ</string>
<string name="download">ডাউনলোড</string>
<string name="limited_accuracy">সীমিত সঠিকতা</string>
<string name="precise_location_is_disabled_long_text">সঠিক ন্যাভিগেশনের জন্য সেটিংস থেকে নিখুঁত লোকেশন অন করুন।</string>
<string name="zoom_to_country">ম্যাপে দেখান</string>
<string name="country_status_download_failed">ডাউনলোড ব্যর্থ হল</string>
<string name="try_again">আবার চেষ্টা করুন</string>
<string name="about_menu_title">CoMaps এর ব্যাপারে</string>
<string name="about_headline">উন্মুক্ত প্রকল্প, তার সমাজ দ্বারা চলিত</string>
<string name="location_settings">লোকেশন সেটিংস</string>
<string name="about_proposition_1">• ব্যবহার করা সহজ এবং দেখতে সুন্দর</string>
<string name="about_proposition_2">• গোপনীয়তা বান্ধব এবং বিজ্ঞাপন মুক্ত</string>
<string name="about_proposition_3">• অফলাইন, দ্রুত এবং ছোট সাইজ</string>
<string name="about_developed_by_enthusiasts">পুরোপুরি ওপেন সোর্স, অলাভজনক, প্রকাশ্য সিদ্ধান্ত করণ এবং অর্থায়ন।</string>
<string name="wikimedia_commons">উইকিমিডিয়া কমন্স</string>
</resources>

View File

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

View File

@@ -960,4 +960,6 @@
<string name="type.place.suburb">Suburbi</string>
<string name="type.place.state.USA">Estat</string>
<string name="type.power.line">Línia elèctrica</string>
<string name="type.amenity.studio">Estudi</string>
<string name="type.barrier.guard_rail">Barrera de seguretat</string>
</resources>

View File

@@ -886,9 +886,11 @@
<string name="editor_level">Podlaží (0 je přízemí)</string>
<string name="route_type">Typ trasy</string>
<string name="vehicle">Vozidlo</string>
<string name="pedestrian">Pěší</string>
<string name="bicycle">Kolo</string>
<string name="ruler">Měření</string>
<string name="pedestrian">Pěší zóna</string>
<string name="bicycle">Jízdní kolo</string>
<string name="ruler">Pravítko</string>
<string name="bookmark_color">Barva záložky</string>
<string name="clear">Vymazat</string>
<string name="panoramax">Obrázek Panoramax</string>
<string name="about_help">O aplikaci a nápověda</string>
</resources>

View File

@@ -893,4 +893,11 @@
<string name="editor_building_levels">Etagen (inkl. Erdgeschoss, ohne Dach)</string>
<string name="error_enter_correct_level">Geben Sie eine gültige Etagen Nummer ein</string>
<string name="editor_level">Etage (0 ist Erdgeschoss)</string>
<string name="clear">Löschen</string>
<string name="vehicle">Fahrzeug</string>
<string name="bicycle">Fahrrad</string>
<string name="ruler">Lineal</string>
<string name="route_type">Routentyp</string>
<string name="pedestrian">Fußgänger</string>
<string name="bookmark_color">Lesezeichenfarbe</string>
</resources>

View File

@@ -888,8 +888,8 @@
<string name="saved">Guardado</string>
<string name="codeberg">Codeberg</string>
<string name="error_enter_correct_fediverse_page">Introduce un nombre de usuario o una dirección web de Mastodon válidos</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="app_site_url">https://comaps.app/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity/</string>
<string name="app_site_url">https://comaps.app/es/</string>
<string name="bluesky">Bluesky</string>
<string name="error_enter_correct_bluesky_page">Introduce un nombre de usuario o una dirección web de Bluesky válidos</string>
<string name="telegram_url">https://t.me/CoMapsApp/</string>
@@ -898,4 +898,8 @@
<string name="editor_level">Planta (0 es la planta baja)</string>
<string name="editor_building_levels">Plantas (incl. planta baja, excl. tejado)</string>
<string name="error_enter_correct_level">Introduce un número de planta válido</string>
<string name="route_type">Tipo de ruta</string>
<string name="vehicle">Vehículo</string>
<string name="pedestrian">Peatonal</string>
<string name="bicycle">Bicicleta</string>
</resources>

View File

@@ -895,4 +895,6 @@
<string name="pedestrian">Jalakäija</string>
<string name="ruler">Joonlaud</string>
<string name="bookmark_color">Järjehoidja värv</string>
<string name="panoramax">Panoramaxi pilt</string>
<string name="about_help">Rakenduse teave ja abiteave</string>
</resources>

View File

@@ -395,7 +395,7 @@
<string name="editor_example_values">مقادیر پیش فرض</string>
<string name="editor_correct_mistake">تصحیح خطا</string>
<string name="editor_add_select_location">مکان را انتخاب کنید</string>
<string name="editor_report_problem_desription_1">لطفا مشکلتان را با جزئیات توضیح دهید بطوری که انجمن OSM بتوانند آن را برطرف کنند.</string>
<string name="editor_report_problem_desription_1">لطفا مشکلتان را با جزئیات توضیح دهید بطوری که انجمن OpenStreetMap بتوانند آن را برطرف کنند.</string>
<string name="editor_report_problem_desription_2">یا خودتان آن را انجام دهید در وبسایت https://www.openstreetmap.org/</string>
<string name="editor_report_problem_send_button">ارسال</string>
<string name="editor_report_problem_title">مشکل</string>
@@ -463,7 +463,7 @@
<!-- Text in About and OSM Login screens. First %@ is replaced by a local, human readable date. -->
<string name="osm_presentation">داده های OpenStreetMap ایجاد شده توسط انجمن از %s. درباره نحوه ویرایش و به روز رسانی نقشه در OpenStreetMap.org بیشتر بیاموزید</string>
<!-- OSM explanation on Android login screen -->
<string name="login_osm_presentation">OpenStreetMap.org (OSM) یک پروژه اجتماعی برای ساخت یک نقشه رایگان و باز است. این منبع اصلی داده های نقشه در نقشه های ارگانیک است و مشابه ویکی پدیا کار می کند. میu200cتوانید مکانu200cها را اضافه یا ویرایش کنید تا در دسترس میلیونu200cها کاربر در سراسر جهان قرار گیرند. \nبه انجمن بپیوندید و به ایجاد نقشه بهتر برای همه کمک کنید!</string>
<string name="login_osm_presentation">OpenStreetMap.org (OSM) یک پروژه اجتماعی برای ساخت یک نقشه رایگان و باز است. این منبع اصلی داده های نقشه در CoMaps است و مشابه ویکی پدیا کار می کند. می توانید مکان ها را اضافه یا ویرایش کنید تا در دسترس میلیون ها کاربر در سراسر جهان قرار گیرند. \nبه انجمن بپیوندید و به ایجاد نقشه بهتر برای همه کمک کنید!</string>
<string name="login_to_make_edits_visible">یک حساب OpenStreetMap ایجاد کنید یا وارد شوید تا ویرایش های نقشه خود را در جهان منتشر کنید.</string>
<!-- Downloaded 10 **of** 20 <- it is that "of" -->
<string name="downloader_of">%1$d از %2$d</string>
@@ -479,7 +479,7 @@
<!-- Title for OSM note section in the editor -->
<string name="editor_other_info">توجه به داوطلبان OpenStreetMap (اختیاری)</string>
<!-- Hint of the input field in the OSM note section of the editor -->
<string name="editor_note_hint">خطاهای موجود در نقشه یا مواردی که با استفاده از نقشه های ارگانیک قابل ویرایش نیستند را شرح دهید</string>
<string name="editor_note_hint">خطاهای موجود در نقشه یا مواردی که با استفاده از CoMaps قابل ویرایش نیستند را شرح دهید</string>
<!-- Information about OSM at the top of the editing page -->
<string name="editor_about_osm">ویرایش های شما در پایگاه داده عمومی <a href="https://wiki.openstreetmap.org/wiki/Fa:About_OpenStreetMap">OpenStreetMap</a> آپلود می شود. لطفا اطلاعات شخصی یا دارای حق چاپ را اضافه نکنید.</string>
<string name="editor_more_about_osm">در مورد OpenStreetMap بیشتر بدانید</string>
@@ -489,7 +489,7 @@
<!-- To indicate the operator of ATMs, bicycle rentals, electric vehicle charging stations... -->
<string name="operator">اپراتور: %s</string>
<string name="editor_category_unsuitable_title">آیا نمی توانید یک دسته بندی مناسب پیدا کنید؟</string>
<string name="editor_category_unsuitable_text">CoMaps اجازه میu200cدهد فقط دستهu200cهای نقطهu200cای ساده را اضافه کند، یعنی هیچ شهر، جاده، دریاچه، طرح کلی ساختمان و غیره وجود ندارد. لطفاً این دستهu200cها را مستقیماً به <a href="https://www.openstreetmap.org">OpenStreetMap.org</a> اضافه کنید. برای دستورالعملu200cهای گام به گام، <a href="https://www.comaps.app/support/advanced-map-editing/">راهنمای</a> ما را بررسی کنید.</string>
<string name="editor_category_unsuitable_text">CoMaps اجازه می دهد فقط دسته های نقطه ای ساده را اضافه کند، یعنی هیچ شهر، جاده، دریاچه، طرح کلی ساختمان و غیره وجود ندارد. لطفاً این دسته ها را مستقیماً به <a href="https://www.openstreetmap.org">OpenStreetMap.org</a> اضافه کنید. برای دستورالعمل های گام به گام، <a href="https://www.comaps.app/support/advanced-map-editing/">راهنمای</a> ما را بررسی کنید.</string>
<string name="downloader_no_downloaded_maps_title">شما هیچ نقشه دانلود شده ای ندارید</string>
<string name="downloader_no_downloaded_maps_message">برای جست وجو یک مکان و استفاده از قابلیت ناوبری، نقشه‌ها را دانلود کنید.</string>
<string name="current_location_unknown_error_title">مکان فعلیتان ناشناس است.</string>
@@ -551,7 +551,7 @@
<!-- Settings: "Send general feedback" button -->
<string name="feedback_general">\"تنظیمات: دکمه \"ارسال بازخورد کلی</string>
<string name="prefs_languages_information">ما از TTS سیستم برای دستورالعمل‌های صوتی استفاده می کنیم. بسیاری از دستگاه‌های Android از Google TTS استفاده می کنند، شما می توانید آن را از Google Play دانلود کنید (https://play.google.com/store/apps/details؟id=com.google.android.tts)</string>
<string name="prefs_languages_information_off">برای برخی از زبان‌ها، باید یک سینت سایزر گفتار یا بسته زبان دیگری را از فروشگاه برنامه (Google Play، Galaxy Store، AppGallery، F-Droid) نصب کنید.\nتنظیمات → زبان و ورودی → گفتار → خروجی متن به گفتار دستگاه خود را باز کنید.\nمیتوانید تنظیمات مربوط به سینت سایزر گفتار را مدیریت کنید (به عنوان مثال، بسته‌های زبانی را برای استفاده آفلاین دانلود کنید) و یک موتور متن به گفتار متفاوت انتخاب کنید.</string>
<string name="prefs_languages_information_off">برای بعضی از زبان‌ها، شما باید speech synthesizer یا یک بسته زبان دیگر را از فروشگاه برنامه (Google Play, Galaxy Store, App Gallery, FDroid) نصب کنید. \n تنظیمات دستگاه خود را باز کنید. → زبان و ورودی → گفتار → خروجی متن به گفتار. می توانید تنظیمات برای ترکیب گفتار (به عنوان مثال، بسته‌های زبان را برای استفاده آفلاین دانلود کنید) را مدیریت کنید و یک موتور دیگر متن به گفتار را انتخاب کنید.</string>
<string name="prefs_languages_information_off_link">برای اطلاعات بیشتر لطفا این راهنما را بررسی کنید.</string>
<string name="transliteration_title">ترجمه به لاتین</string>
<string name="learn_more">بیشتر بدانید</string>
@@ -582,7 +582,7 @@
</plurals>
<string name="bookmarks_create_new_group">ایجاد لیست جدید</string>
<!-- Bookmark categories screen, button that opens folder selection dialog to import KML/KMZ/GPX/KMB files -->
<string name="bookmarks_import">وارد کردن نشانکu200cها و آهنگu200cها</string>
<string name="bookmarks_import">وارد کردن نشانک ها و آهنگ ها</string>
<string name="bookmarks_error_message_share_general">با توجه به خطای برنامه، امکان اشتراک گذاری وجود ندارد</string>
<string name="bookmarks_error_title_share_empty">خطای اشتراک</string>
<string name="bookmarks_error_message_share_empty">یک لیست خالی را نمی توان به اشتراک گذاشت</string>
@@ -793,7 +793,7 @@
<!-- To indicate if restaurant or other place has outdoor seating -->
<string name="outdoor_seating">نشستن در فضای باز</string>
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
<string name="power_save_dialog_summary">برای دقیقu200cترین ناوبری، توصیه میu200cکنیم حالت صرفهu200cجویی در مصرف انرژی را در تنظیمات باتری گوشی غیرفعال کنید.</string>
<string name="power_save_dialog_summary">برای دقیق ترین ناوبری، توصیه می کنیم حالت صرفه جویی در مصرف انرژی را در تنظیمات باتری گوشی غیرفعال کنید.</string>
<!-- Prompt to start recording a track. -->
<string name="start_track_recording">ضبط مسیر</string>
<!-- Prompt for stopping a track recording. -->
@@ -817,4 +817,5 @@
<string name="translated_om_site_url">https://comaps.app</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">ویکی‌انبار</string>
</resources>

View File

@@ -893,4 +893,13 @@
<string name="error_enter_correct_level">Syötä kerrosnumero</string>
<string name="editor_building_levels">Kerrokset (sis. pohjakerroksen, jätä pois katto)</string>
<string name="editor_level">Kerros (0 on pohjakerros)</string>
<string name="clear">Tyhjennä</string>
<string name="route_type">Reitin tyyppi</string>
<string name="vehicle">Ajoneuvo</string>
<string name="pedestrian">Jalankulkija</string>
<string name="bicycle">Polkupyörä</string>
<string name="ruler">Viivoitin</string>
<string name="bookmark_color">Kirjanmerkin väri</string>
<string name="about_help">Tietoja ja ohje</string>
<string name="panoramax">Panoramax-kuva</string>
</resources>

View File

@@ -599,4 +599,5 @@
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
<string name="wikimedia_commons">विकिमीडिया कॉमन्स</string>
</resources>

View File

@@ -148,4 +148,5 @@
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">Zajednički poslužitelj</string>
</resources>

View File

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

View File

@@ -838,7 +838,7 @@
<string name="nav_auto">Automatikus navigáció</string>
<string name="telegram">Telegram</string>
<string name="instagram">Instagram</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
<string name="wikimedia_commons">Wikimédia Commons</string>
<string name="editor_line_social_network">LINE</string>
<string name="empty_street_name_error">Adjon meg egy utcanevet</string>
<string name="vk">VKontakte</string>

View File

@@ -4,4 +4,5 @@
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
</resources>

View File

@@ -862,4 +862,5 @@
<string name="translated_om_site_url">https://comaps.app</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">ויקישיתוף</string>
</resources>

View File

@@ -28,7 +28,7 @@
<string name="type.amenity.bicycle_parking">חניית אופניים</string>
<string name="type.amenity.bicycle_rental">השכרת אופניים</string>
<string name="type.amenity.bicycle_repair_station">תחנת תיקון אופניים</string>
<string name="type.amenity.biergarten">ביר גרדן</string>
<string name="type.amenity.biergarten">גן בירה</string>
<string name="type.amenity.brothel">בית בושת</string>
<string name="type.amenity.bureau_de_change">המרת מטבע חוץ</string>
<string name="type.amenity.bus_station">תחנת אוטובוס</string>

View File

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

View File

@@ -822,4 +822,5 @@
<string name="openstreetmap">OpenStreetMap</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">위키미디어 공용</string>
</resources>

View File

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

View File

@@ -837,4 +837,5 @@
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
<string name="wikimedia_commons">विकिमीडिया कॉमन्स</string>
</resources>

View File

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

View File

@@ -888,7 +888,7 @@
<string name="twitter">X (Twitter)</string>
<string name="openstreetmap">OpenStreetMap</string>
<string name="instagram">Instagram</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
<string name="wikimedia_commons">Викисклад</string>
<string name="editor_line_social_network">LINE</string>
<string name="vk">VK</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity/</string>
@@ -904,4 +904,29 @@
<string name="editor_building_levels">Этажей (вкл. подвалы искл. крышу)</string>
<string name="editor_level">Этаж (0 это первый этаж)</string>
<string name="error_enter_correct_level">Введите правильный номер этажа</string>
<!-- Settings "Backup" category: "Backup" title -->
<string name="pref_backup_title">Резервное копирование меток и треков</string>
<string name="pref_backup_summary">Автоматически сохранять в папку на устройстве</string>
<string name="pref_backup_now_title">Создать резервную копию</string>
<string name="pref_backup_now_summary">Запустить резервное копирование вручную</string>
<string name="pref_backup_now_summary_progress">Идёт резервное копирование…</string>
<string name="pref_backup_now_summary_ok">Копирование успешно завершено</string>
<string name="pref_backup_now_summary_empty_lists">Нет данных для копирования</string>
<string name="pref_backup_now_summary_failed">Ошибка при копировании</string>
<string name="pref_backup_now_summary_folder_unavailable">Папка для копий недоступна</string>
<string name="pref_backup_status_summary_success">Последнее успешное копирование</string>
<string name="pref_backup_location_title">Папка для резервных копий</string>
<string name="pref_backup_location_summary_initial">Сначала выберите папку и дайте доступ</string>
<string name="pref_backup_history_title">Хранить количество копий</string>
<string name="pref_backup_interval_title">Автозапуск</string>
<string name="backup_interval_every_day">Каждый день</string>
<string name="backup_interval_every_week">Каждую неделю</string>
<string name="backup_interval_manual_only">Выключено (только вручную)</string>
<string name="dialog_report_error_missing_folder">Выбранная папка для резервного копирования недоступна или нет права записи в неё. Пожалуйста, выберите другую папку</string>
<string name="dialog_report_error_with_logs">Пожалуйста, отправьте нам отчет об ошибке:\n
- Включите \"Запись логов\" в настройках\n
- воспроизведите проблему\n
- на экране \"Справка\" нажмите кнопку \"Сообщить о проблеме\" и отправьте нам отчет по почте или в чат\n
- отключите логирование
</string>
</resources>

View File

@@ -4,4 +4,5 @@
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="translated_om_site_url">https://comaps.app/</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
</resources>

View File

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

View File

@@ -27,7 +27,7 @@
<!-- Location services are disabled by user alert - message -->
<string name="location_is_disabled_long_text">Тренутно су сви локацијски сервиси на овом уређају или апликацији искључени. Потребно је да их укључите у Подешавањима.</string>
<!-- View and button titles for accessibility -->
<string name="zoom_to_country">Прикажи на мапи</string>
<string name="zoom_to_country">Прикажи мапу</string>
<!-- Message to display at the center of the screen when the country download has failed -->
<string name="country_status_download_failed">Преузимање није успело</string>
<!-- Button text for the button under the country_status_download_failed message -->

View File

@@ -8,7 +8,7 @@
<string name="type.aeroway.aerodrome">Flygplats</string>
<string name="type.aeroway.aerodrome.international">Flygplats</string>
<string name="type.aeroway.helipad">Helikopterplatta</string>
<string name="type.amenity">Infrastrukturen</string>
<string name="type.amenity">Infrastruktur</string>
<string name="type.amenity.arts_centre">Kulturcenter</string>
<string name="type.amenity.atm">Bankomat</string>
<string name="type.amenity.bbq">Grill för barbecue</string>
@@ -181,7 +181,7 @@
<string name="type.building.address">Adress</string>
<string name="type.building.has_parts">Byggnad</string>
<string name="type.building_part">Byggnad</string>
<string name="type.building.train_station">Stationsbyggnaden</string>
<string name="type.building.train_station">Stationsbyggnad</string>
<string name="type.cemetery.grave">Grav</string>
<string name="type.craft">Hantverk</string>
<string name="type.craft.beekeeper">Biodlare</string>
@@ -346,7 +346,7 @@
<string name="type.highway.living_street.bridge">Bro</string>
<!-- These translations are used for all type.highway.*.tunnel. -->
<string name="type.highway.living_street.tunnel">Tunnel</string>
<string name="type.highway.motorway">Gata</string>
<string name="type.highway.motorway">Motorväg</string>
<!-- These translations are used for all type.highway.*.bridge. -->
<string name="type.highway.motorway.bridge">Bro</string>
<!-- These translations are used for all type.highway.*.tunnel. -->
@@ -419,7 +419,7 @@
<!-- These translations are used for all type.highway.*.tunnel. -->
<string name="type.highway.service.tunnel">Tunnel</string>
<string name="type.highway.speed_camera">Hastighetskamera</string>
<string name="type.highway.steps">Gångväg</string>
<string name="type.highway.steps">Trappa</string>
<!-- These translations are used for all type.highway.*.bridge. -->
<string name="type.highway.steps.bridge">Bro</string>
<!-- These translations are used for all type.highway.*.tunnel. -->
@@ -469,7 +469,7 @@
<string name="type.area_highway.secondary">Gata</string>
<string name="type.area_highway.service">Gata</string>
<string name="type.area_highway.tertiary">Gata</string>
<string name="type.area_highway.steps">Gångväg</string>
<string name="type.area_highway.steps">Trappa</string>
<string name="type.area_highway.track">Gata</string>
<string name="type.area_highway.trunk">Gata</string>
<string name="type.area_highway.unclassified">Gata</string>
@@ -530,11 +530,11 @@
<string name="type.landuse.forest.coniferous">Skog</string>
<string name="type.landuse.forest.deciduous">Skog</string>
<string name="type.landuse.forest.mixed">Skog</string>
<string name="type.landuse.grass">Gräsmattan</string>
<string name="type.landuse.landfill">Soptippen</string>
<string name="type.landuse.grass">Gräsmatta</string>
<string name="type.landuse.landfill">Soptipp</string>
<string name="type.landuse.railway">Järnvägsfaciliteter</string>
<string name="type.landuse.reservoir">Vatten</string>
<string name="type.leisure.dog_park">Hundparken</string>
<string name="type.leisure.dog_park">Hundpark</string>
<string name="type.leisure.fitness_centre">Gym</string>
<string name="type.leisure.fitness_station">Fitnesstation</string>
<string name="type.leisure.dance">Danshall</string>
@@ -544,10 +544,10 @@
<string name="type.leisure.miniature_golf">Minigolf</string>
<string name="type.leisure.nature_reserve">Naturreservat</string>
<string name="type.leisure.outdoor_seating">Sittplatser utomhus</string>
<string name="type.leisure.park">Parken</string>
<string name="type.leisure.park.no.access">Parken</string>
<string name="type.leisure.park.permissive">Parken</string>
<string name="type.leisure.park.private">Parken</string>
<string name="type.leisure.park">Park</string>
<string name="type.leisure.park.no.access">Privat park</string>
<string name="type.leisure.park.permissive">Park</string>
<string name="type.leisure.park.private">Privat park</string>
<string name="type.leisure.picnic_table">Picknickbord</string>
<string name="type.leisure.pitch">Idrottsplats</string>
<string name="type.leisure.playground">Lekplats</string>
@@ -586,7 +586,7 @@
<string name="type.natural.scree">Stenig rasbrant</string>
<string name="type.natural.bay">Bukt</string>
<string name="type.natural.beach">Strand</string>
<string name="type.natural.beach.sand">Sandig strand</string>
<string name="type.natural.beach.sand">Sandstrand</string>
<string name="type.natural.beach.gravel">Grusstrand</string>
<string name="type.natural.cape">Udde</string>
<string name="type.natural.cave_entrance">Grotta</string>
@@ -611,7 +611,7 @@
<string name="type.natural.peak">Bergstopp</string>
<string name="type.natural.saddle">Fjällsadel</string>
<string name="type.natural.rock">Bergart</string>
<string name="type.natural.scrub">Ruggen</string>
<string name="type.natural.scrub">Rugge</string>
<string name="type.natural.spring">Vattenkälla</string>
<string name="type.natural.spring.drinking_water_no">Vattenkälla</string>
<string name="type.natural.strait">Sund</string>
@@ -1148,10 +1148,10 @@
<string name="type.wheelchair.limited">Delvis utrustad för handikappade</string>
<string name="type.wheelchair.no">Ej utrustad för handikappade</string>
<string name="type.wheelchair.yes">Utrustad för handikappade</string>
<string name="type.piste_type.snow_park">Snöparken</string>
<string name="type.piste_type.snow_park">Snöpark</string>
<string name="type.piste_type.hike">Vandringsled i snö</string>
<string name="type.piste_type.connection">Piste Anslutning</string>
<string name="type.piste_type.skitour">Skitourleden</string>
<string name="type.piste_type.skitour">Skitourled</string>
<string name="type.amenity.events_venue">Evenemangslokal</string>
<string name="type.shop.auction">Auktion</string>
<string name="type.shop.collector">Samlingsföremål</string>
@@ -1341,4 +1341,7 @@
<string name="type.leisure.hackerspace">Hackerspace</string>
<string name="type.shop.kiosk">Kiosk</string>
<string name="type.tourism.museum">Museum</string>
<string name="type.amenity.waste_transfer_station">Återvinningscentral</string>
<string name="type.barrier.guard_rail">Vägräcke</string>
<string name="type.highway.ladder">Stege</string>
</resources>

View File

@@ -219,7 +219,7 @@
<!-- Speed camera settings menu option - Never warn (about speedcams) -->
<string name="pref_tts_speedcams_never">Kamwe usionye</string>
<string name="power_managment_title">Mtindo wa kuokoa nishati</string>
<string name="power_managment_description">Pindi mtindo wa kiotomatiki unapochaguliwa programu tumizi inaanza kuzima sifa za kumaliza betri kulingana na kiwango cha chaji cha sasa cha betri</string>
<string name="power_managment_description">Pindi mtindo wa kiotomatiki unapochaguliwa programu tumizi inaanza kuzima sifa za kumaliza betri kulingana na kiwango cha chaji cha sasa cha betri.</string>
<string name="power_managment_setting_never">Kamwe</string>
<string name="power_managment_setting_auto">Kiotomatiki</string>
<string name="power_managment_setting_manual_max">Upeo wa kuhifadhi nishati</string>

View File

@@ -468,7 +468,7 @@
<!-- Text in About and OSM Login screens. First %@ is replaced by a local, human readable date. -->
<string name="osm_presentation">ข้อมูล OpenStreetMap ที่สร้างโดยชุมชน ณ %s เรียนรู้เพิ่มเติมเกี่ยวกับวิธีแก้ไขและอัปเดตแผนที่ได้ที่ OpenStreetMap.org</string>
<!-- OSM explanation on Android login screen -->
<string name="login_osm_presentation">OpenStreetMap.org (OSM) เป็นโครงการชุมชนเพื่อสร้างแผนที่แบบเปิดและเสรี เป็นแหล่งข้อมูลแผนที่หลักในแผนที่ทั่วไปและทำงานคล้ายกับวิกิพีเดีย คุณสามารถเพิ่มหรือแก้ไขสถานที่ได้ และสถานที่เหล่านั้นจะพร้อมให้บริการแก่ผู้ใช้หลายล้านคนทั่วโลก \nเข้าร่วมชุมชนและช่วยสร้างแผนที่ที่ดีขึ้นสำหรับทุกคน!</string>
<string name="login_osm_presentation">OpenStreetMap.org (OSM) เป็นโครงการชุมชนเพื่อสร้างแผนที่แบบเปิดและเสรี เป็นแหล่งข้อมูลแผนที่หลักในCoMapsและทำงานคล้ายกับวิกิพีเดีย คุณสามารถเพิ่มหรือแก้ไขสถานที่ได้ และสถานที่เหล่านั้นจะพร้อมให้บริการแก่ผู้ใช้หลายล้านคนทั่วโลก \nเข้าร่วมชุมชนและช่วยสร้างแผนที่ที่ดีขึ้นสำหรับทุกคน!</string>
<string name="login_to_make_edits_visible">สร้างบัญชี OpenStreetMap หรือเข้าสู่ระบบเพื่อเผยแพร่การแก้ไขแผนที่ของคุณไปทั่วโลก</string>
<!-- Downloaded 10 **of** 20 <- it is that "of" -->
<string name="downloader_of">%1$d จาก %2$d</string>
@@ -819,4 +819,5 @@
<string name="translated_om_site_url">https://comaps.app/</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="instagram_url">https://www.instagram.com/comapscommunity</string>
<string name="wikimedia_commons">วิกิมีเดียคอมมอนส์</string>
</resources>

View File

@@ -885,7 +885,7 @@
<string name="instagram">Instagram</string>
<string name="level_value_generic">Поверх: %s</string>
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
<string name="wikimedia_commons">Wikimedia Commons</string>
<string name="wikimedia_commons">Вікісховище</string>
<string name="editor_add_phone">Додати телефон</string>
<string name="comma_separated_pair">%1$s, %2$s</string>
<string name="telegram_url">https://t.me/CoMapsApp/</string>

View File

@@ -13,7 +13,6 @@
<string name="pref_enable_logging" translatable="false">EnableLogging</string>
<string name="pref_emulate_bad_external_storage" translatable="false">EmulateBadExternalStorage</string>
<string name="pref_about" translatable="false">AboutOrganicMaps</string>
<string name="pref_help" translatable="false">Help</string>
<string name="pref_file_name" translatable="false">OrganicMapsPrefs</string>
<string name="pref_map_style" translatable="false">MapStyle</string>
<string name="pref_tts_screen" translatable="false">TtsScreen</string>
@@ -41,6 +40,7 @@
<string name="pref_keep_screen_on" translatable="false">KeepScreenOn</string>
<string name="pref_show_on_lock_screen" translatable="false">ShowOnLockScreen</string>
<string name="pref_map_locale" translatable="false">MapLanguage</string>
<string name="pref_backup" translatable="false">Backup</string>
<string name="pref_left_button" translatable="false">LeftButton</string>
<string name="notification_ticker_ltr" translatable="false">%1$s: %2$s</string>

View File

@@ -23,7 +23,29 @@
<item>0</item>
<item>1</item>
</string-array>
<string-array name="backup_interval_entries">
<item>@string/backup_interval_every_day</item>
<item>@string/backup_interval_every_week</item>
<item>@string/backup_interval_manual_only</item>
</string-array>
<string-array name="backup_interval_values">
<item>86400000</item> <!-- Every day -->
<item>604800000</item> <!-- Every week -->
<item>0</item> <!-- Manual only -->
</string-array>
<string-array name="backup_history_entries">
<item>3</item>
<item>10</item>
</string-array>
<string-array name="backup_history_values">
<item>3</item>
<item>10</item>
</string-array>
<string-array name="map_style">
<item>@string/off</item>
<item>@string/on</item>

View File

@@ -291,6 +291,8 @@
<string name="vk">VK</string>
<!-- Text in menu -->
<string name="bluesky">Bluesky</string>
<!-- Text on the place page -->
<string name="panoramax">Panoramax Picture</string>
<!-- Text in the editor -->
<string name="editor_line_social_network">LINE</string>
<!-- Text in menu -->
@@ -934,6 +936,32 @@
<string name="codeberg">Codeberg</string>
<string name="pref_left_button_title">Left button setup</string>
<string name="pref_left_button_disable">Disable</string>
<!-- Settings "Backup" category: "Backup" title -->
<string name="pref_backup_title">Bookmarks and tracks backup</string>
<string name="pref_backup_summary">Automatically backup to a folder on your device</string>
<string name="pref_backup_now_title">Backup now</string>
<string name="pref_backup_now_summary">Create a backup immediately</string>
<string name="pref_backup_now_summary_progress">Backup in progress…</string>
<string name="pref_backup_now_summary_ok">Backup completed successfully</string>
<string name="pref_backup_now_summary_empty_lists">Nothing to back up</string>
<string name="pref_backup_now_summary_failed">Backup failed</string>
<string name="pref_backup_now_summary_folder_unavailable">The backup folder is not available</string>
<string name="pref_backup_status_summary_success">Last successful backup</string>
<string name="pref_backup_location_title">Backup location</string>
<string name="pref_backup_location_summary_initial">Please select a folder first and grant permission</string>
<string name="pref_backup_history_title">Number of backups to keep</string>
<string name="pref_backup_interval_title">Automatic backup</string>
<string name="backup_interval_every_day">Daily</string>
<string name="backup_interval_every_week">Weekly</string>
<string name="backup_interval_manual_only">Off (manual only)</string>
<string name="dialog_report_error_missing_folder">The selected backup location is not available or writable. Select a different location, please.</string>
<string name="dialog_report_error_with_logs">Please send us an error report:\n
- \"Enable logging\" in the settings\n
- reproduce the problem\n
- in the \"Help/About\" screen press a \"Report a bug\" button and send it to us via email or chat\n
- disable logging
</string>
<string name="clear">Clear</string>
<string name="route_type">Route type</string>
<string name="vehicle">Vehicle</string>
@@ -941,4 +969,5 @@
<string name="bicycle">Bicycle</string>
<string name="ruler">Ruler</string>
<string name="bookmark_color">Bookmark color</string>
<string name="about_help">About &amp; Help</string>
</resources>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
android:key="backup_location"
android:summary="@string/pref_backup_location_summary_initial"
android:title="@string/pref_backup_location_title" />
<Preference
android:key="backup_now"
android:summary="@string/pref_backup_now_summary"
android:title="@string/pref_backup_now_title" />
<ListPreference
android:defaultValue="86400000"
android:entries="@array/backup_interval_entries"
android:entryValues="@array/backup_interval_values"
android:key="backup_history_interval"
android:title="@string/pref_backup_interval_title" />
<ListPreference
android:defaultValue="10"
android:entries="@array/backup_history_entries"
android:entryValues="@array/backup_history_values"
android:key="backup_history_count"
android:title="@string/pref_backup_history_title" />
</PreferenceScreen>

View File

@@ -112,6 +112,13 @@
app:singleLineTitle="false"
android:persistent="false"
android:order="18"/>
<Preference
android:key="@string/pref_backup"
android:title="@string/pref_backup_title"
android:summary="@string/pref_backup_summary"
app:singleLineTitle="false"
android:persistent="false"
android:order="19"/>
</androidx.preference.PreferenceCategory>
<androidx.preference.PreferenceCategory
@@ -171,15 +178,4 @@
android:defaultValue="true"
android:order="2"/>
</androidx.preference.PreferenceCategory>
<androidx.preference.PreferenceCategory
android:key="@string/pref_information"
android:title="@string/prefs_group_information"
android:order="7">
<Preference
android:key="@string/pref_help"
android:title="@string/help"
app:singleLineTitle="false"
android:order="1">
</Preference>
</androidx.preference.PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -410,7 +410,7 @@ pl:4Atrakcje turystyczne|Osobliwości miasta|Turystyka|zwiedzanie
pt:4Atrações turísticas|3Turismo|Miradouros
pt-BR:4Atraçãos|3Turismo
ro:5Obiective turistice|4Turism
es:4Turismo
es:5Atracciones turísticas|4Turismo
et:Vaatamisväärsused
eu:4Turismoa
sr:5Туристичка атракција|5Атракција|5Атракције|6Знаменитости|5Туризам|5Turistička atrakcija|5Atrakcija|5Atrakcije|6Znamenitosti|5Turizam

View File

@@ -307,7 +307,6 @@
16119285
16169823
16173957
16248287
16372627
16391736
16431936
@@ -315,6 +314,7 @@
16440736
16445666
16557154
16577252
16579778
16579836
16728450
@@ -340,10 +340,15 @@
16777215
221978645
222898459
223036995
223300167
233867264
234004016
234879733
234881023
307054404
318765813
318767103
436602368
437326080
438572045
@@ -370,8 +375,6 @@
452983541
452984574
452984831
575358531
587201269
609045837
654706176
655629312

View File

@@ -275,6 +275,8 @@
<li>Code2000 Font<br>
&copy; 1998&ndash;2003 James Kass; Shareware</li>
</ul>
<li><a href="https://upload.wikimedia.org/wikipedia/commons/a/a9/Panoramax.svg">Panoramax</a><br>
&copy; 2023 Adrien Pavie; <a href="license" class="license">CC BY 4.0 License</a></li>
<p id="icons">We also use these icons on the map:</p>

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -23166,7 +23166,7 @@ cont {
scale: 15
lines {
width: 1.5
color: 575358531
color: 441140803
dashdot {
dd: 5.0
dd: 1.5
@@ -23187,7 +23187,7 @@ cont {
scale: 16
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23207,7 +23207,7 @@ cont {
scale: 17
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -23297,7 +23297,7 @@ cont {
scale: 15
lines {
width: 1.5
color: 575358531
color: 441140803
dashdot {
dd: 5.0
dd: 1.5
@@ -23322,7 +23322,7 @@ cont {
scale: 16
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23346,7 +23346,7 @@ cont {
scale: 17
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -23606,7 +23606,7 @@ cont {
}
lines {
width: 1.5
color: 575358531
color: 441140803
dashdot {
dd: 5.0
dd: 1.5
@@ -23633,7 +23633,7 @@ cont {
}
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23665,7 +23665,7 @@ cont {
}
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -23784,7 +23784,7 @@ cont {
scale: 16
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23796,7 +23796,7 @@ cont {
scale: 17
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -23847,7 +23847,7 @@ cont {
scale: 16
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23859,7 +23859,7 @@ cont {
scale: 17
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -23910,7 +23910,7 @@ cont {
scale: 15
lines {
width: 1.5
color: 575358531
color: 441140803
dashdot {
dd: 5.0
dd: 1.5
@@ -23931,7 +23931,7 @@ cont {
scale: 16
lines {
width: 2.0
color: 575358531
color: 223036995
dashdot {
dd: 5.0
dd: 1.5
@@ -23951,7 +23951,7 @@ cont {
scale: 17
lines {
width: 2.4
color: 575358531
color: 223036995
dashdot {
dd: 6.0
dd: 1.8
@@ -24137,7 +24137,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -24161,7 +24161,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -26904,19 +26904,6 @@ cont {
}
cont {
name: "highway-path"
element {
scale: 14
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 3.5
dd: 2.0
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -27049,16 +27036,6 @@ cont {
priority: 219
cap: BUTTCAP
}
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 3.5
dd: 2.7
}
priority: 220
cap: BUTTCAP
}
}
element {
scale: 15
@@ -27215,19 +27192,6 @@ cont {
}
cont {
name: "highway-path-bridge"
element {
scale: 14
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 3.5
dd: 2.0
}
priority: 155
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -27412,19 +27376,6 @@ cont {
}
cont {
name: "highway-path-difficult"
element {
scale: 14
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 1.0
dd: 2.0
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -27549,19 +27500,6 @@ cont {
}
cont {
name: "highway-path-expert"
element {
scale: 14
lines {
width: 0.9
color: 1716665907
dashdot {
dd: 1.0
dd: 4.0
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -27686,19 +27624,6 @@ cont {
}
cont {
name: "highway-path-horse"
element {
scale: 14
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 3.5
dd: 2.0
}
priority: 155
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -27823,19 +27748,6 @@ cont {
}
cont {
name: "highway-path-tunnel"
element {
scale: 14
lines {
width: 0.9
color: 1720994322
dashdot {
dd: 3.5
dd: 2.0
}
priority: 155
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -28083,7 +27995,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -28103,7 +28015,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -28249,7 +28161,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -28273,7 +28185,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -28469,7 +28381,7 @@ cont {
}
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -28501,7 +28413,7 @@ cont {
}
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -34329,7 +34241,7 @@ cont {
scale: 15
lines {
width: 2.4
color: 441140803
color: 4933187
dashdot {
dd: 1.5
dd: 1.3
@@ -34342,7 +34254,7 @@ cont {
scale: 16
lines {
width: 4.0
color: 441140803
color: 4933187
dashdot {
dd: 1.8
dd: 1.6
@@ -34451,7 +34363,7 @@ cont {
}
lines {
width: 2.4
color: 441140803
color: 4933187
dashdot {
dd: 1.5
dd: 1.3
@@ -34470,7 +34382,7 @@ cont {
}
lines {
width: 4.0
color: 441140803
color: 4933187
dashdot {
dd: 1.8
dd: 1.6
@@ -34621,7 +34533,7 @@ cont {
scale: 15
lines {
width: 2.4
color: 441140803
color: 4933187
dashdot {
dd: 1.5
dd: 1.3
@@ -34634,7 +34546,7 @@ cont {
scale: 16
lines {
width: 4.0
color: 441140803
color: 4933187
dashdot {
dd: 1.8
dd: 1.6
@@ -35974,19 +35886,6 @@ cont {
}
cont {
name: "highway-track"
element {
scale: 14
lines {
width: 1.1
color: 1717523245
dashdot {
dd: 6.0
dd: 2.5
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -36111,19 +36010,6 @@ cont {
}
cont {
name: "highway-track-area"
element {
scale: 14
lines {
width: 1.1
color: 1717523245
dashdot {
dd: 6.0
dd: 2.5
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -36248,19 +36134,6 @@ cont {
}
cont {
name: "highway-track-bridge"
element {
scale: 14
lines {
width: 1.1
color: 1717523245
dashdot {
dd: 6.0
dd: 2.5
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -36445,19 +36318,6 @@ cont {
}
cont {
name: "highway-track-no-access"
element {
scale: 14
lines {
width: 1.1
color: 1717523245
dashdot {
dd: 6.0
dd: 2.5
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -36582,19 +36442,6 @@ cont {
}
cont {
name: "highway-track-tunnel"
element {
scale: 14
lines {
width: 1.1
color: 1717523245
dashdot {
dd: 6.0
dd: 2.5
}
priority: 180
cap: BUTTCAP
}
}
element {
scale: 15
lines {
@@ -63404,19 +63251,6 @@ cont {
}
cont {
name: "piste:type-hike"
element {
scale: 14
lines {
width: 0.9
color: 2573352319
dashdot {
dd: 3.5
dd: 2.0
}
priority: 120
cap: BUTTCAP
}
}
element {
scale: 15
lines {

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -25613,7 +25613,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -25637,7 +25637,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -29978,7 +29978,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -29998,7 +29998,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -30144,7 +30144,7 @@ cont {
scale: 16
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -30168,7 +30168,7 @@ cont {
scale: 17
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8
@@ -30364,7 +30364,7 @@ cont {
}
lines {
width: 2.4
color: 441272132
color: 307054404
dashdot {
dd: 8.0
dd: 1.5
@@ -30396,7 +30396,7 @@ cont {
}
lines {
width: 3.0
color: 441272132
color: 307054404
dashdot {
dd: 9.0
dd: 1.8

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,55 @@
<svg version="1.1" viewBox="0 0 24 24" width="18" height="18" xmlns="http://www.w3.org/2000/svg">
<title>train-m</title>
<g id="Page-2:-Night" fill="none" fill-rule="evenodd" opacity="1">
<g id="train-m" fill-rule="nonzero">
<rect id="Rectangle" width="24" height="24" rx="2.5" fill="#000" opacity=".6"/>
<rect id="Rectangle" x="1" y="1" width="22" height="22" rx="2" fill="#2F6499"/>
<path id="Shape" d="m11.895 5c-2.9474 0-5.8947 0.36842-5.8947 2.9474v7c0 1.4221 1.1568 2.5789 2.5789 2.5789l-1.1053 1.1053v0.36842h1.6432l1.4737-1.4737h2.7779l1.4737 1.4737h1.4737v-0.36842l-1.1053-1.1053c1.4221 0 2.5789-1.1568 2.5789-2.5789v-7c0-2.5789-2.6379-2.9474-5.8947-2.9474zm-3.3158 11.053c-0.61158 0-1.1053-0.49368-1.1053-1.1053 0-0.61158 0.49368-1.1053 1.1053-1.1053s1.1053 0.49368 1.1053 1.1053c0 0.61158-0.49368 1.1053-1.1053 1.1053zm2.5789-5.1579h-3.6842v-2.9474h3.6842v2.9474zm1.4737 0v-2.9474h3.6842v2.9474h-3.6842zm2.5789 5.1579c-0.61158 0-1.1053-0.49368-1.1053-1.1053 0-0.61158 0.49368-1.1053 1.1053-1.1053 0.61158 0 1.1053 0.49368 1.1053 1.1053 0 0.61158-0.49368 1.1053-1.1053 1.1053z" fill="#000"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="0 0 24 24"
width="18"
height="18"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1" />
<title
id="title1">train-m</title>
<g
id="Page-2:-Night"
fill="none"
fill-rule="evenodd"
opacity="1">
<g
id="train-m"
fill-rule="nonzero">
<rect
id="Rectangle"
width="24"
height="24"
rx="2.5"
fill="#000"
opacity=".6" />
<rect
id="rect1"
x="1"
y="1"
width="22"
height="22"
rx="2"
fill="#2F6499" />
<path
id="train-m-a"
d="m 9.033318,18 0.66667,-1 h -1.7 l -2,3 h 0.62963 c 0.66871,0 1.2932,-0.3342 1.6641,-0.8906 L 8.366652,19 h 7.2667 l 0.07293,0.1094 c 0.37093,0.5564 0.99539,0.8906 1.6641,0.8906 h 0.62963 l -2,-3 h -1.7 l 0.66667,1 h -5.9333 z m 0.3535,-14 h 5.2263 c 1.612,0 2.9358,1.2739 2.9978,2.8847 l 0.30917,8.0384 c 0.04245,1.1038 -0.8179,2.0329 -1.9217,2.0754 C 15.972778,16.999485 15.947148,17 15.921518,17 h -7.8432 c -1.1046,0 -2,-0.89543 -2,-2 0,-0.02563 4.926e-4,-0.05126 0.00148,-0.07687 l 0.30917,-8.0384003 c 0.061954,-1.6108 1.3858,-2.8847 2.9978,-2.8847 z m -0.46364,2.5 c -0.52136,0 -0.95524,0.40055 -0.99682,0.92025 l -0.24,3 c -0.00212,0.02653 -0.00318,0.05313 -0.00318,0.07975 0,0.55228 0.44772,1 1,1 h 6.6336 c 0.02661,0 0.05322,-0.0011 0.07974,-0.0032 0.55053,-0.04404 0.96111,-0.52603 0.91707,-1.0766 l -0.24,-3 c -0.04158,-0.5197 -0.47545,-0.92025 -0.99682,-0.92025 h -6.1536 z M 8.999983,15 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m 6,0 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m -4.75,-10 c -0.13807,0 -0.25,0.11193 -0.25,0.25 0,0.13807 0.11193,0.25 0.25,0.25 h 3.5 c 0.13807,0 0.25,-0.11193 0.25,-0.25 0,-0.13807 -0.11193,-0.25 -0.25,-0.25 z"
style="fill:#000000;fill-opacity:1" />
</g>
</g>
</g>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>train-m</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1,10 +1,55 @@
<svg version="1.1" viewBox="0 0 16 16" width="12" height="12" xmlns="http://www.w3.org/2000/svg">
<title>train-s</title>
<g id="Page-2:-Night" fill="none" fill-rule="evenodd" opacity="1">
<g id="train-s" fill-rule="nonzero">
<rect id="Rectangle" width="16" height="16" rx="2.5" fill="#000" opacity=".6"/>
<rect id="Rectangle" x=".66667" y=".66667" width="14.667" height="14.667" rx="2" fill="#2F6499"/>
<path id="Shape" d="m7.9298 3.3333c-1.9649 0-3.9298 0.24561-3.9298 1.9649v4.6667c0 0.94807 0.77123 1.7193 1.7193 1.7193l-0.73684 0.73684v0.24561h1.0954l0.98246-0.98246h1.8519l0.98246 0.98246h0.98246v-0.24561l-0.73684-0.73684c0.94807 0 1.7193-0.77123 1.7193-1.7193v-4.6667c0-1.7193-1.7586-1.9649-3.9298-1.9649zm-2.2105 7.3684c-0.40772 0-0.73684-0.32912-0.73684-0.73684 0-0.40772 0.32912-0.73684 0.73684-0.73684 0.40772 0 0.73684 0.32912 0.73684 0.73684 0 0.40772-0.32912 0.73684-0.73684 0.73684zm1.7193-3.4386h-2.4561v-1.9649h2.4561v1.9649zm0.98246 0v-1.9649h2.4561v1.9649h-2.4561zm1.7193 3.4386c-0.40772 0-0.73684-0.32912-0.73684-0.73684 0-0.40772 0.32912-0.73684 0.73684-0.73684 0.40772 0 0.73684 0.32912 0.73684 0.73684 0 0.40772-0.32912 0.73684-0.73684 0.73684z" fill="#000"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="0 0 16 16"
width="12"
height="12"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1" />
<title
id="title1">train-s</title>
<g
id="Page-2:-Night"
fill="none"
fill-rule="evenodd"
opacity="1">
<g
id="train-s"
fill-rule="nonzero">
<rect
id="Rectangle"
width="16"
height="16"
rx="2.5"
fill="#000"
opacity=".6" />
<rect
id="rect1"
x=".66667"
y=".66667"
width="14.667"
height="14.667"
rx="2"
fill="#2F6499" />
<path
id="train-m-a"
d="M 6.0222132,12 6.4666598,11.333333 H 5.3333265 l -1.333333,2 h 0.419753 c 0.445807,0 0.862133,-0.2228 1.1094,-0.593733 l 0.04862,-0.07293 h 4.8444665 l 0.04862,0.07293 c 0.247287,0.370933 0.663593,0.593733 1.1094,0.593733 h 0.419753 l -1.333333,-2 H 9.5333398 L 9.9777865,12 H 6.0222532 Z M 6.2578798,2.6666669 h 3.4842001 c 1.0746661,0 1.9572001,0.8492666 1.9985331,1.9231332 l 0.206113,5.3589334 C 11.975026,10.6846 11.40146,11.304 10.665593,11.332333 c -0.01707,6.57e-4 -0.03416,10e-4 -0.05125,10e-4 H 5.3855465 c -0.7364,0 -1.333333,-0.596953 -1.333333,-1.333333 0,-0.017087 3.28e-4,-0.034173 0.001,-0.051247 l 0.206113,-5.3589336 c 0.0413,-1.0738667 0.923867,-1.9231333 1.998533,-1.9231333 z M 5.9487865,4.3333334 c -0.347573,0 -0.636827,0.2670334 -0.664547,0.6135 l -0.16,2 c -0.0014,0.017687 -0.0021,0.03542 -0.0021,0.053167 0,0.3681867 0.29848,0.6666667 0.666667,0.6666667 h 4.4223995 c 0.01774,0 0.03548,-7.334e-4 0.05316,-0.00213 0.36702,-0.02936 0.64074,-0.3506866 0.61138,-0.7177333 l -0.16,-2 c -0.02775,-0.3464704 -0.317,-0.6135037 -0.66458,-0.6135037 H 5.9487665 Z M 5.9999935,10 c 0.3681863,0 0.6666663,-0.2984798 0.6666663,-0.6666665 0,-0.3681866 -0.29848,-0.6666666 -0.6666663,-0.6666666 -0.368187,0 -0.666667,0.29848 -0.666667,0.6666666 C 5.3333265,9.7015202 5.6318065,10 5.9999935,10 Z m 3.9999997,0 C 10.36818,10 10.66666,9.7015202 10.66666,9.3333335 c 0,-0.3681866 -0.29848,-0.6666666 -0.6666668,-0.6666666 -0.3681868,0 -0.6666667,0.29848 -0.6666667,0.6666666 C 9.3333265,9.7015202 9.6318064,10 9.9999932,10 Z M 6.8333265,3.3333334 c -0.092047,0 -0.1666667,0.07462 -0.1666667,0.1666667 0,0.092047 0.07462,0.1666667 0.1666667,0.1666667 h 2.3333333 c 0.092047,0 0.1666667,-0.07462 0.1666667,-0.1666667 0,-0.092047 -0.07462,-0.1666667 -0.1666667,-0.1666667 z"
style="fill:#000000;fill-opacity:1;stroke-width:0.666667" />
</g>
</g>
</g>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>train-s</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -683,6 +683,9 @@ line|z19-[highway=busway],
line|z13-[highway=pedestrian],
line|z13-[highway=ford]
{color: @pedestrian;opacity: 0.9;}
line|z16-[highway=pedestrian],
line|z16-[highway=ford],
{opacity: 0.93;}
line|z13-[highway=cycleway],
line|z14-[highway=path][bicycle=designated]::cycleline,
@@ -711,7 +714,7 @@ line|z17-[highway=steps][bridge?]::bridgeblack,
line|z16-[highway=road][bridge?]::bridgeblack,
line|z16-[highway=service][bridge?]::bridgeblack
{casing-linecap: butt;casing-color:@bridge_casing;casing-opacity: 0.7;}
line|z14-[highway=track],
line|z15-[highway=track],
{color: @track;opacity: 0.6;}
line|z14-[highway=raceway],
{color: @track;opacity: 0.7;}
@@ -720,14 +723,16 @@ line|z15-[leisure=track][!area],
line|z14-[highway=bridleway]
{color: @bridleway;opacity: 0.6;}
line|z15-[highway=footway],
{color: @footway;opacity: 0.87;}
line|z15-[highway=steps],
{color: @footway;opacity: 0.9;}
line|z14-[highway=path],
line|z16-[highway=footway],
{opacity: 0.95;}
line|z15-[highway=steps],
{color: @residential;opacity: 1;}
line|z15-[highway=path],
{color: @path;opacity: 0.6;}
line|z14-[highway=path][_path_grade=expert],
line|z15-[highway=path][_path_grade=expert],
{color: @path_expert; opacity: 0.6;}
line|z14-[piste:type=hike],
line|z15-[piste:type=hike],
{color: @piste; opacity: 0.4;}
line|z17-[highway=footway][tunnel?]::tunnelBackground,
line|z17-[highway=cycleway][tunnel?]::tunnelBackground,
@@ -911,8 +916,6 @@ line|z19-[highway=raceway],
line|z19-[leisure=track][!area]
{width:4; opacity: 0.8;}
line|z14[highway=track],
{width: 1.1; dashes: 6,2.5;}
line|z15[highway=track],
{width: 1.4; dashes: 6,2.5;}
line|z16[highway=track],
@@ -924,9 +927,6 @@ line|z18[highway=track],
line|z19-[highway=track],
{width: 4.2; dashes: 12,3.5; opacity: 0.8;}
line|z14[highway=path],
line|z14[piste:type=hike],
{width: 0.9; dashes: 3.5,2;}
line|z15[highway=path],
line|z15[piste:type=hike],
{width: 1.1; dashes: 3.5,2;}
@@ -941,8 +941,6 @@ line|z18[highway=path],
line|z19-[highway=path],
{width: 3.7; dashes: 8,4.5; opacity: 0.8;}
line|z14[highway=path][bicycle=designated],
{width: 0.9; dashes: 3.5,2.7;}
line|z15[highway=path][bicycle=designated],
{width: 1.1; dashes: 3.5,2.7;}
line|z16[highway=path][bicycle=designated],
@@ -954,8 +952,6 @@ line|z18[highway=path][bicycle=designated],
line|z19-[highway=path][bicycle=designated],
{width: 3.7; dashes: 8,6.2; opacity: 0.8;}
line|z14[highway=path][_path_grade=difficult],
{width: 0.9; dashes: 1,2;}
line|z15[highway=path][_path_grade=difficult],
{width: 1.1; dashes: 1,2;}
line|z16[highway=path][_path_grade=difficult],
@@ -965,8 +961,6 @@ line|z17[highway=path][_path_grade=difficult],
line|z18-[highway=path][_path_grade=difficult],
{width: 2.8; dashes: 2.8,3.5;}
line|z14[highway=path][_path_grade=expert],
{width: 0.9; dashes: 1,4;}
line|z15[highway=path][_path_grade=expert],
{width: 1.1; dashes: 1,4;}
line|z16[highway=path][_path_grade=expert],

View File

@@ -224,11 +224,11 @@ railway-subway-bridge::dash # line::dash z16- (also has
=== 221
highway-footway-bicycle # line z15- (also has line::cycleline z15-, pathtext z15-)
highway-path-bicycle # line z14- (also has line::cycleline z14-, pathtext z15-)
highway-path-bicycle # line z15- (also has line::cycleline z14-, pathtext z15-)
=== 220
highway-footway-bicycle::cycleline # line::cycleline z15- (also has line z15-, pathtext z15-)
highway-path-bicycle::cycleline # line::cycleline z14- (also has line z14-, pathtext z15-)
highway-path-bicycle::cycleline # line::cycleline z14- (also has line z15-, pathtext z15-)
=== 219
highway-cycleway # line z13- (also has pathtext z15-)
@@ -276,15 +276,15 @@ highway-bridleway-tunnel # line z14- (also has line::
highway-footway # line z15- (also has pathtext z15-)
highway-footway-area # line z15- and area z14- (also has pathtext z15-)
highway-footway-crossing # line z16-
highway-path # line z14- (also has pathtext z15-)
highway-path-difficult # line z14- (also has pathtext z15-)
highway-path-expert # line z14- (also has pathtext z15-)
highway-path # line z15- (also has pathtext z15-)
highway-path-difficult # line z15- (also has pathtext z15-)
highway-path-expert # line z15- (also has pathtext z15-)
highway-raceway # line z14- (also has pathtext z16-)
highway-track # line z14- (also has pathtext z15-)
highway-track-area # line z14- (also has pathtext z15-)
highway-track-bridge # line z14- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
highway-track-no-access # line z14- (also has pathtext z15-)
highway-track-tunnel # line z14- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
highway-track # line z15- (also has pathtext z15-)
highway-track-area # line z15- (also has pathtext z15-)
highway-track-bridge # line z15- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
highway-track-no-access # line z15- (also has pathtext z15-)
highway-track-tunnel # line z15- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
=== 180
highway-construction # line z13- (also has pathtext z15-)
@@ -302,25 +302,25 @@ railway-preserved-tunnel # line z15-
highway-footway-bridge # line z15- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
highway-footway-sidewalk # line z16-
highway-footway-tunnel # line z15- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
highway-path-bridge # line z14- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
highway-path-horse # line z14- (also has pathtext z15-)
highway-path-tunnel # line z14- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
highway-path-bridge # line z15- (also has line::bridgeblack z17-, line::bridgewhite z15-, pathtext z15-)
highway-path-horse # line z15- (also has pathtext z15-)
highway-path-tunnel # line z15- (also has line::tunnelBackground z17-, line::tunnelCasing z17-, pathtext z15-)
=== 155
highway-bridleway-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z14-, line::tunnelCasing z17-, pathtext z15-)
highway-cycleway-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z13-, line::tunnelCasing z17-, pathtext z15-)
highway-footway-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z15-, line::tunnelCasing z17-, pathtext z15-)
highway-path-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z14-, line::tunnelCasing z17-, pathtext z15-)
highway-path-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z15-, line::tunnelCasing z17-, pathtext z15-)
highway-steps-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z15-, line::tunnelCasing z17-, pathtext z16-)
highway-track-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z14-, line::tunnelCasing z17-, pathtext z15-)
highway-track-tunnel::tunnelBackground # line::tunnelBackground z17- (also has line z15-, line::tunnelCasing z17-, pathtext z15-)
=== 154
highway-bridleway-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z14-, line::tunnelBackground z17-, pathtext z15-)
highway-cycleway-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z13-, line::tunnelBackground z17-, pathtext z15-)
highway-footway-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z15-, line::tunnelBackground z17-, pathtext z15-)
highway-path-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z14-, line::tunnelBackground z17-, pathtext z15-)
highway-path-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z15-, line::tunnelBackground z17-, pathtext z15-)
highway-steps-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z15-, line::tunnelBackground z17-, pathtext z16-)
highway-track-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z14-, line::tunnelBackground z17-, pathtext z15-)
highway-track-tunnel::tunnelCasing # line::tunnelCasing z17- (also has line z15-, line::tunnelBackground z17-, pathtext z15-)
=== 153
highway-bridleway-bridge::bridgewhite # line::bridgewhite z15- (also has line z14-, line::bridgeblack z17-, pathtext z15-)
@@ -328,7 +328,7 @@ highway-cycleway-bridge::bridgewhite # line::bridgewhite z15- (al
highway-footway-bridge::bridgewhite # line::bridgewhite z15- (also has line z15-, line::bridgeblack z17-, pathtext z15-)
highway-motorway-bridge::bridgewhite # line::bridgewhite z13- (also has line z6-, line::bridgeblack z13-, pathtext z10-, shield::shield z10-)
highway-motorway_link-bridge::bridgewhite # line::bridgewhite z14- (also has line z10-, line::bridgeblack z14-, pathtext z10-, shield::shield z10-)
highway-path-bridge::bridgewhite # line::bridgewhite z15- (also has line z14-, line::bridgeblack z17-, pathtext z15-)
highway-path-bridge::bridgewhite # line::bridgewhite z15- (also has line z15-, line::bridgeblack z17-, pathtext z15-)
highway-pedestrian-bridge::bridgewhite # line::bridgewhite z13- (also has line z13-, line::bridgeblack z14-, pathtext z14-)
highway-primary-bridge::bridgewhite # line::bridgewhite z14- (also has line z8-, line::bridgeblack z14-, pathtext z10-, shield::shield z10-)
highway-primary_link-bridge::bridgewhite # line::bridgewhite z14- (also has line z11-, line::bridgeblack z14-, pathtext z11-, shield::shield z11-)
@@ -340,7 +340,7 @@ highway-service-bridge::bridgewhite # line::bridgewhite z16- (al
highway-steps-bridge::bridgewhite # line::bridgewhite z15- (also has line z15-, line::bridgeblack z17-, pathtext z16-)
highway-tertiary-bridge::bridgewhite # line::bridgewhite z14- (also has line z11-, line::bridgeblack z14-, pathtext z12-, shield::shield z13-)
highway-tertiary_link-bridge::bridgewhite # line::bridgewhite z14- (also has line z14-, line::bridgeblack z14-, pathtext z18-)
highway-track-bridge::bridgewhite # line::bridgewhite z15- (also has line z14-, line::bridgeblack z17-, pathtext z15-)
highway-track-bridge::bridgewhite # line::bridgewhite z15- (also has line z15-, line::bridgeblack z17-, pathtext z15-)
highway-trunk-bridge::bridgewhite # line::bridgewhite z13- (also has line z6-, line::bridgeblack z13-, pathtext z10-, shield::shield z10-)
highway-trunk_link-bridge::bridgewhite # line::bridgewhite z14- (also has line z10-, line::bridgeblack z14-, pathtext z10-, shield::shield z10-)
highway-unclassified-bridge::bridgewhite # line::bridgewhite z14- (also has line z11-, line::bridgeblack z14-, pathtext z13-)
@@ -363,7 +363,7 @@ highway-cycleway-bridge::bridgeblack # line::bridgeblack z17- (al
highway-footway-bridge::bridgeblack # line::bridgeblack z17- (also has line z15-, line::bridgewhite z15-, pathtext z15-)
highway-motorway-bridge::bridgeblack # line::bridgeblack z13- (also has line z6-, line::bridgewhite z13-, pathtext z10-, shield::shield z10-)
highway-motorway_link-bridge::bridgeblack # line::bridgeblack z14- (also has line z10-, line::bridgewhite z14-, pathtext z10-, shield::shield z10-)
highway-path-bridge::bridgeblack # line::bridgeblack z17- (also has line z14-, line::bridgewhite z15-, pathtext z15-)
highway-path-bridge::bridgeblack # line::bridgeblack z17- (also has line z15-, line::bridgewhite z15-, pathtext z15-)
highway-pedestrian-bridge::bridgeblack # line::bridgeblack z14- (also has line z13-, line::bridgewhite z13-, pathtext z14-)
highway-primary-bridge::bridgeblack # line::bridgeblack z14- (also has line z8-, line::bridgewhite z14-, pathtext z10-, shield::shield z10-)
highway-primary_link-bridge::bridgeblack # line::bridgeblack z14- (also has line z11-, line::bridgewhite z14-, pathtext z11-, shield::shield z11-)
@@ -375,7 +375,7 @@ highway-service-bridge::bridgeblack # line::bridgeblack z16- (al
highway-steps-bridge::bridgeblack # line::bridgeblack z17- (also has line z15-, line::bridgewhite z15-, pathtext z16-)
highway-tertiary-bridge::bridgeblack # line::bridgeblack z14- (also has line z11-, line::bridgewhite z14-, pathtext z12-, shield::shield z13-)
highway-tertiary_link-bridge::bridgeblack # line::bridgeblack z14- (also has line z14-, line::bridgewhite z14-, pathtext z18-)
highway-track-bridge::bridgeblack # line::bridgeblack z17- (also has line z14-, line::bridgewhite z15-, pathtext z15-)
highway-track-bridge::bridgeblack # line::bridgeblack z17- (also has line z15-, line::bridgewhite z15-, pathtext z15-)
highway-trunk-bridge::bridgeblack # line::bridgeblack z13- (also has line z6-, line::bridgewhite z13-, pathtext z10-, shield::shield z10-)
highway-trunk_link-bridge::bridgeblack # line::bridgeblack z14- (also has line z10-, line::bridgewhite z14-, pathtext z10-, shield::shield z10-)
highway-unclassified-bridge::bridgeblack # line::bridgeblack z14- (also has line z11-, line::bridgewhite z14-, pathtext z13-)
@@ -407,7 +407,7 @@ piste:type-downhill-expert # line z14- (also has pathte
piste:type-downhill-freeride # line z14- (also has pathtext z15-)
piste:type-downhill-intermediate # line z14- (also has pathtext z15-)
piste:type-downhill-novice # line z14- (also has pathtext z15-)
piste:type-hike # line z14- (also has pathtext z15-)
piste:type-hike # line z15- (also has pathtext z15-)
piste:type-nordic # line z14- (also has pathtext z15-)
piste:type-skitour # line z14- (also has pathtext z15-)
piste:type-sled # line z14- (also has pathtext z15-)

View File

@@ -705,13 +705,13 @@ natural-rock # icon z17- (also has captio
highway-bridleway # pathtext z15- (also has line z14-)
highway-bridleway-bridge # pathtext z15- (also has line z14-, line::bridgeblack z17-, line::bridgewhite z15-)
highway-bridleway-tunnel # pathtext z15- (also has line z14-, line::tunnelBackground z17-, line::tunnelCasing z17-)
highway-path # pathtext z15- (also has line z14-)
highway-path-bicycle # pathtext z15- (also has line z14-, line::cycleline z14-)
highway-path-bridge # pathtext z15- (also has line z14-, line::bridgeblack z17-, line::bridgewhite z15-)
highway-path-difficult # pathtext z15- (also has line z14-)
highway-path-expert # pathtext z15- (also has line z14-)
highway-path-horse # pathtext z15- (also has line z14-)
highway-path-tunnel # pathtext z15- (also has line z14-, line::tunnelBackground z17-, line::tunnelCasing z17-)
highway-path # pathtext z15- (also has line z15-)
highway-path-bicycle # pathtext z15- (also has line z15-, line::cycleline z14-)
highway-path-bridge # pathtext z15- (also has line z15-, line::bridgeblack z17-, line::bridgewhite z15-)
highway-path-difficult # pathtext z15- (also has line z15-)
highway-path-expert # pathtext z15- (also has line z15-)
highway-path-horse # pathtext z15- (also has line z15-)
highway-path-tunnel # pathtext z15- (also has line z15-, line::tunnelBackground z17-, line::tunnelCasing z17-)
=== 2820
highway-steps # pathtext z16- (also has line z15-)
@@ -719,11 +719,11 @@ highway-steps-bridge # pathtext z16- (also has li
highway-steps-tunnel # pathtext z16- (also has line z15-, line::tunnelBackground z17-, line::tunnelCasing z17-)
=== 2810
highway-track # pathtext z15- (also has line z14-)
highway-track-area # pathtext z15- (also has line z14-)
highway-track-bridge # pathtext z15- (also has line z14-, line::bridgeblack z17-, line::bridgewhite z15-)
highway-track-no-access # pathtext z15- (also has line z14-)
highway-track-tunnel # pathtext z15- (also has line z14-, line::tunnelBackground z17-, line::tunnelCasing z17-)
highway-track # pathtext z15- (also has line z15-)
highway-track-area # pathtext z15- (also has line z15-)
highway-track-bridge # pathtext z15- (also has line z15-, line::bridgeblack z17-, line::bridgewhite z15-)
highway-track-no-access # pathtext z15- (also has line z15-)
highway-track-tunnel # pathtext z15- (also has line z15-, line::tunnelBackground z17-, line::tunnelCasing z17-)
=== 2780
highway-service # pathtext z16- (also has line z15-)
@@ -739,7 +739,7 @@ piste:type-downhill-expert # pathtext z15- (also has li
piste:type-downhill-freeride # pathtext z15- (also has line z14-)
piste:type-downhill-intermediate # pathtext z15- (also has line z14-)
piste:type-downhill-novice # pathtext z15- (also has line z14-)
piste:type-hike # pathtext z15- (also has line z14-)
piste:type-hike # pathtext z15- (also has line z15-)
piste:type-nordic # pathtext z15- (also has line z14-)
piste:type-skitour # pathtext z15- (also has line z14-)
piste:type-sled # pathtext z15- (also has line z14-)

View File

@@ -65,8 +65,8 @@
/* 4.LANDUSE */
/*4.1 Main landuse*/
@pedestrian_area: #F7EDDF;
@pedestrian_area_light: #FAF0E2;
@pedestrian_area: #FAF0E2;
@pedestrian_area_light: #FCF2E4;
@railway_platform: #ECE3D6;
@university: #F5DFBC;
@hospital: #FFDAD6;

View File

@@ -1,10 +1,58 @@
<svg version="1.1" viewBox="0 0 24 24" width="18" height="18" xmlns="http://www.w3.org/2000/svg">
<title>train-m</title>
<g fill="none" fill-rule="evenodd">
<g id="train-m" fill-rule="nonzero">
<rect id="Rectangle" width="24" height="24" rx="2.5" fill="#fff" opacity=".6"/>
<rect id="Rectangle" x="1" y="1" width="22" height="22" rx="2" fill="#2F6499"/>
<path id="Shape" d="m11.895 5c-2.9474 0-5.8947 0.36842-5.8947 2.9474v7c0 1.4221 1.1568 2.5789 2.5789 2.5789l-1.1053 1.1053v0.36842h1.6432l1.4737-1.4737h2.7779l1.4737 1.4737h1.4737v-0.36842l-1.1053-1.1053c1.4221 0 2.5789-1.1568 2.5789-2.5789v-7c0-2.5789-2.6379-2.9474-5.8947-2.9474zm-3.3158 11.053c-0.61158 0-1.1053-0.49368-1.1053-1.1053 0-0.61158 0.49368-1.1053 1.1053-1.1053s1.1053 0.49368 1.1053 1.1053c0 0.61158-0.49368 1.1053-1.1053 1.1053zm2.5789-5.1579h-3.6842v-2.9474h3.6842v2.9474zm1.4737 0v-2.9474h3.6842v2.9474h-3.6842zm2.5789 5.1579c-0.61158 0-1.1053-0.49368-1.1053-1.1053 0-0.61158 0.49368-1.1053 1.1053-1.1053 0.61158 0 1.1053 0.49368 1.1053 1.1053 0 0.61158-0.49368 1.1053-1.1053 1.1053z" fill="#fff"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="0 0 24 24"
width="18"
height="18"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1" />
<title
id="title1">train-m</title>
<g
fill="none"
fill-rule="evenodd"
id="g1"
transform="matrix(-1,0,0,1,24,0)">
<g
id="train-m"
fill-rule="nonzero">
<rect
id="Rectangle"
width="24"
height="24"
rx="2.5"
fill="#ffffff"
opacity="0.6"
x="0"
y="0" />
<rect
id="rect1"
x="1"
y="1"
width="22"
height="22"
rx="2"
fill="#2f6499" />
<path
id="train-m-a"
d="m 3.0333,14 0.66667,-1 h -1.7 l -2,3 H 0.6296 c 0.66871,0 1.2932,-0.3342 1.6641,-0.8906 L 2.366634,15 h 7.2667 l 0.072934,0.1094 c 0.37093,0.5564 0.99539,0.8906 1.6641,0.8906 h 0.62963 l -2,-3 h -1.7 l 0.66667,1 h -5.9333 z M 3.3868,0 h 5.2263 c 1.612,0 2.9358,1.2739 2.9978,2.8847 l 0.30917,8.0384 c 0.04245,1.1038 -0.8179,2.0329 -1.9217,2.0754 C 9.97276,12.999485 9.947133,13 9.921504,13 h -7.8432 c -1.1046,0 -2,-0.89543 -2,-2 0,-0.02563 4.9264e-4,-0.05126 0.0014777,-0.07687 l 0.30917,-8.0384003 c 0.061954,-1.6108 1.3858,-2.8847 2.9978,-2.8847 z M 2.92316,2.5 C 2.4018,2.5 1.96792,2.90055 1.92634,3.42025 l -0.24,3 C 1.68422,6.446779 1.68316,6.473382 1.68316,6.499995 c 0,0.55228 0.44772,1 1,1 h 6.6336 c 0.026614,0 0.053216,-0.00106 0.079745,-0.00318 0.55053,-0.044042 0.96111,-0.52603 0.91707,-1.0766 l -0.24,-3 c -0.04158,-0.5197 -0.47545,-0.92025 -0.99682,-0.92025 h -6.1536 z M 2.999965,11 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m 6,0 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m -4.75,-10 c -0.13807,0 -0.25,0.11193 -0.25,0.25 0,0.13807 0.11193,0.25 0.25,0.25 h 3.5 c 0.13807,0 0.25,-0.11193 0.25,-0.25 0,-0.13807 -0.11193,-0.25 -0.25,-0.25 z"
transform="matrix(-1,0,0,1,17.999984,4)"
style="fill:#ffffff;fill-opacity:1" />
</g>
</g>
</g>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>train-m</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,10 +1,55 @@
<svg version="1.1" viewBox="0 0 16 16" width="12" height="12" xmlns="http://www.w3.org/2000/svg">
<title>train-s</title>
<g fill="none" fill-rule="evenodd">
<g id="train-s" fill-rule="nonzero">
<rect id="Rectangle" width="16" height="16" rx="2.5" fill="#fff" opacity=".6"/>
<rect id="Rectangle" x=".66667" y=".66667" width="14.667" height="14.667" rx="2" fill="#2F6499"/>
<path id="Shape" d="m7.9298 3.3333c-1.9649 0-3.9298 0.24561-3.9298 1.9649v4.6667c0 0.94807 0.77123 1.7193 1.7193 1.7193l-0.73684 0.73684v0.24561h1.0954l0.98246-0.98246h1.8519l0.98246 0.98246h0.98246v-0.24561l-0.73684-0.73684c0.94807 0 1.7193-0.77123 1.7193-1.7193v-4.6667c0-1.7193-1.7586-1.9649-3.9298-1.9649zm-2.2105 7.3684c-0.40772 0-0.73684-0.32912-0.73684-0.73684 0-0.40772 0.32912-0.73684 0.73684-0.73684 0.40772 0 0.73684 0.32912 0.73684 0.73684 0 0.40772-0.32912 0.73684-0.73684 0.73684zm1.7193-3.4386h-2.4561v-1.9649h2.4561v1.9649zm0.98246 0v-1.9649h2.4561v1.9649h-2.4561zm1.7193 3.4386c-0.40772 0-0.73684-0.32912-0.73684-0.73684 0-0.40772 0.32912-0.73684 0.73684-0.73684 0.40772 0 0.73684 0.32912 0.73684 0.73684 0 0.40772-0.32912 0.73684-0.73684 0.73684z" fill="#fff"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
viewBox="0 0 16 16"
width="12"
height="12"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs1" />
<title
id="title1">train-s</title>
<g
fill="none"
fill-rule="evenodd"
id="g1">
<g
id="train-s"
fill-rule="nonzero">
<rect
id="Rectangle"
width="16"
height="16"
rx="2.5"
fill="#fff"
opacity=".6" />
<rect
id="rect1"
x=".66667"
y=".66667"
width="14.667"
height="14.667"
rx="2"
fill="#2F6499" />
<path
id="train-m-a-8"
d="m 3.0333,14 0.66667,-1 h -1.7 l -2,3 H 0.6296 c 0.66871,0 1.2932,-0.3342 1.6641,-0.8906 L 2.366634,15 h 7.2667 l 0.072934,0.1094 c 0.37093,0.5564 0.99539,0.8906 1.6641,0.8906 h 0.62963 l -2,-3 h -1.7 l 0.66667,1 h -5.9333 z M 3.3868,0 h 5.2263 c 1.612,0 2.9358,1.2739 2.9978,2.8847 l 0.30917,8.0384 c 0.04245,1.1038 -0.8179,2.0329 -1.9217,2.0754 C 9.97276,12.999485 9.947133,13 9.921504,13 h -7.8432 c -1.1046,0 -2,-0.89543 -2,-2 0,-0.02563 4.9264e-4,-0.05126 0.0014777,-0.07687 l 0.30917,-8.0384003 c 0.061954,-1.6108 1.3858,-2.8847 2.9978,-2.8847 z M 2.92316,2.5 C 2.4018,2.5 1.96792,2.90055 1.92634,3.42025 l -0.24,3 C 1.68422,6.446779 1.68316,6.473382 1.68316,6.499995 c 0,0.55228 0.44772,1 1,1 h 6.6336 c 0.026614,0 0.053216,-0.00106 0.079745,-0.00318 0.55053,-0.044042 0.96111,-0.52603 0.91707,-1.0766 l -0.24,-3 c -0.04158,-0.5197 -0.47545,-0.92025 -0.99682,-0.92025 h -6.1536 z M 2.999965,11 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m 6,0 c 0.55228,0 1,-0.44772 1,-1 0,-0.55228 -0.44772,-1 -1,-1 -0.55228,0 -1,0.44772 -1,1 0,0.55228 0.44772,1 1,1 z m -4.75,-10 c -0.13807,0 -0.25,0.11193 -0.25,0.25 0,0.13807 0.11193,0.25 0.25,0.25 h 3.5 c 0.13807,0 0.25,-0.11193 0.25,-0.25 0,-0.13807 -0.11193,-0.25 -0.25,-0.25 z"
transform="matrix(0.66666667,0,0,0.66666667,4.0001807,2.6668367)"
style="fill:#ffffff;fill-opacity:1" />
</g>
</g>
</g>
<metadata
id="metadata1">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>train-s</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -270,6 +270,7 @@ public:
string const opening_hours(meta.Get(feature::Metadata::FMD_OPEN_HOURS));
string const wikipedia(meta.Get(feature::Metadata::FMD_WIKIPEDIA));
string const wikimedia_commons(meta.Get(feature::Metadata::FMD_WIKIMEDIA_COMMONS));
string const panoramax(meta.Get(feature::Metadata::FMD_PANORAMAX));
string const floor(meta.Get(feature::Metadata::FMD_LEVEL));
string const fee = category.ends_with("-fee") ? "yes" : "";
string const atm = HasAtm(f) ? "yes" : "";
@@ -278,7 +279,7 @@ public:
osmId, uid, lat, lon, mwmName, category, name, std::string(city),
addrStreet, addrHouse, phone, website, stars, std::string(metaOperator), internet,
denomination, wheelchair, opening_hours, wikipedia, floor, fee, atm, contact_facebook,
contact_instagram, contact_twitter, contact_vk, contact_line, contact_fediverse, contact_bluesky, wikimedia_commons};
contact_instagram, contact_twitter, contact_vk, contact_line, contact_fediverse, contact_bluesky, wikimedia_commons, panoramax};
AppendNames(f, columns);
PrintAsCSV(columns, ';', cout);
@@ -292,7 +293,7 @@ void PrintHeader()
"phone", "website", "cuisines", "stars", "operator",
"internet", "denomination", "wheelchair", "opening_hours", "wikipedia",
"floor", "fee", "atm", "contact_facebook", "contact_instagram",
"contact_twitter", "contact_vk", "contact_line", "contact_fediverse", "contact_bluesky", "wikimedia_commons"};
"contact_twitter", "contact_vk", "contact_line", "contact_fediverse", "contact_bluesky", "wikimedia_commons", "panoramax"};
// Append all supported name languages in order.
for (uint8_t idx = 1; idx < kLangCount; idx++)
columns.push_back("name_" + string(StringUtf8Multilang::GetLangByCode(idx)));

View File

@@ -17,6 +17,7 @@
#include <cmath>
#include <cstdlib>
#include <optional>
#include <regex>
#include <unordered_map>
#include <unordered_set>
@@ -309,6 +310,22 @@ std::string MetadataTagProcessorImpl::ValidateAndFormat_wikimedia_commons(std::s
return {};
}
std::string MetadataTagProcessorImpl::ValidateAndFormat_panoramax(std::string v)
{
static auto const s_panoramaxRegex = std::regex(R"(^([a-z0-9]{8}(-[a-z0-9]{4}){3}-[a-z0-9]{12})$)");
if (std::regex_match(v, s_panoramaxRegex))
return v;
url::Url const parsedUrl = url::Url::FromString(v);
if (const std::string* paramValue = parsedUrl.GetParamValue("pic"))
{
if (std::regex_match(*paramValue, s_panoramaxRegex))
return v;
}
LOG(LDEBUG, ("Invalid Panoramax tag value:", v));
return {};
}
std::string MetadataTagProcessorImpl::ValidateAndFormat_airport_iata(std::string const & v) const
{
if (!ftypes::IsAirportChecker::Instance()(m_params.m_types))
@@ -548,6 +565,7 @@ void MetadataTagProcessor::operator()(std::string const & k, std::string const &
case Metadata::FMD_POSTCODE: valid = ValidateAndFormat_postcode(v); break;
case Metadata::FMD_WIKIPEDIA: valid = ValidateAndFormat_wikipedia(v); break;
case Metadata::FMD_WIKIMEDIA_COMMONS: valid = ValidateAndFormat_wikimedia_commons(v); break;
case Metadata::FMD_PANORAMAX: valid = ValidateAndFormat_panoramax(v); break;
case Metadata::FMD_FLATS: valid = ValidateAndFormat_flats(v); break;
case Metadata::FMD_MIN_HEIGHT: // The same validator as for height.
case Metadata::FMD_HEIGHT: valid = ValidateAndFormat_height(v); break;

View File

@@ -33,6 +33,7 @@ struct MetadataTagProcessorImpl
static std::string ValidateAndFormat_denomination(std::string const & v) ;
static std::string ValidateAndFormat_wikipedia(std::string v) ;
static std::string ValidateAndFormat_wikimedia_commons(std::string v) ;
static std::string ValidateAndFormat_panoramax(std::string v) ;
std::string ValidateAndFormat_airport_iata(std::string const & v) const;
static std::string ValidateAndFormat_brand(std::string const & v);
std::string ValidateAndFormat_duration(std::string const & v) const;

View File

@@ -124,6 +124,8 @@ bool Metadata::TypeFromString(string_view k, Metadata::EType & outType)
outType = Metadata::FMD_WIKIPEDIA;
else if (k == "wikimedia_commons")
outType = Metadata::FMD_WIKIMEDIA_COMMONS;
else if (k == "panoramax")
outType = Metadata::FMD_PANORAMAX;
else if (k == "addr:flats")
outType = Metadata::FMD_FLATS;
else if (k == "height")
@@ -275,6 +277,7 @@ string ToString(Metadata::EType type)
case Metadata::FMD_JUNCTION_REF: return "junction:ref";
case Metadata::FMD_BUILDING_MIN_LEVEL: return "building:min_level";
case Metadata::FMD_WIKIMEDIA_COMMONS: return "wikimedia_commons";
case Metadata::FMD_PANORAMAX: return "panoramax";
case Metadata::FMD_CAPACITY: return "capacity";
case Metadata::FMD_WHEELCHAIR: return "wheelchair";
case Metadata::FMD_LOCAL_REF: return "local_ref";

View File

@@ -157,6 +157,7 @@ public:
FMD_NETWORK = 49,
FMD_CONTACT_FEDIVERSE = 50,
FMD_CONTACT_BLUESKY = 51,
FMD_PANORAMAX = 52,
FMD_COUNT
};

View File

@@ -54,6 +54,7 @@ constexpr string_view kUrlTwitter{"https://twitter.com/"};
constexpr string_view kUrlVk{"https://vk.com/"};
constexpr string_view kUrlLine{"https://line.me/R/ti/p/@"};
constexpr string_view kUrlBluesky{"https://bsky.app/profile/"};
constexpr string_view kUrlPanoramax{"https://api.panoramax.xyz/?pic="};
constexpr string_view kHttp{"http://"};
constexpr string_view kHttps{"https://"};
@@ -673,6 +674,8 @@ string socialContactToURL(MapObject::MetadataID metaID, string_view value)
return string{kUrlLine}.append(value);
else // 'value' is an URL.
return string{kHttps}.append(value);
case MapObject::MetadataID::FMD_PANORAMAX:
return string{kUrlPanoramax}.append(value);
default:
return string{value};
}

View File

@@ -20,6 +20,7 @@ NS_ASSUME_NONNULL_BEGIN
@property(nonatomic, readonly, nullable) NSString *vk;
@property(nonatomic, readonly, nullable) NSString *line;
@property(nonatomic, readonly, nullable) NSString *bluesky;
@property(nonatomic, readonly, nullable) NSString *panoramax;
@property(nonatomic, readonly, nullable) NSString *email;
@property(nonatomic, readonly, nullable) NSURL *emailUrl;
@property(nonatomic, readonly, nullable) NSString *cuisine;

View File

@@ -75,6 +75,7 @@ NSString * GetLocalizedMetadataValueString(MapObject::MetadataID metaID, std::st
case MetadataID::FMD_CONTACT_VK: _vk = ToNSString(value); break;
case MetadataID::FMD_CONTACT_LINE: _line = ToNSString(value); break;
case MetadataID::FMD_CONTACT_BLUESKY: _bluesky = ToNSString(value); break;
case MetadataID::FMD_PANORAMAX: _panoramax = ToNSString(value); break;
case MetadataID::FMD_OPERATOR: _ppOperator = [NSString stringWithFormat:NSLocalizedString(@"operator", nil), ToNSString(value)]; break;
case MetadataID::FMD_INTERNET:
_wifiAvailable = (rawData.GetInternet() == feature::Internet::No)

View File

@@ -1,5 +1,6 @@
#import "MWMSideButtonsView.h"
#import "MWMButton.h"
#import "MWMRouter.h"
#import "MWMMapViewControlsCommon.h"
#include "base/math.hpp"
@@ -32,6 +33,10 @@ CGFloat const kButtonsBottomOffset = 6;
CGFloat spacing = self.availableHeight - self.zoomOut.maxY - self.location.height;
spacing = base::Clamp(spacing, kLocationButtonSpacingMin, kLocationButtonSpacingMax);
if (!IPAD && (UIDevice.currentDevice.orientation == UIDeviceOrientationLandscapeLeft || UIDevice.currentDevice.orientation == UIDeviceOrientationLandscapeRight) && [MWMRouter isRoutingActive]) {
spacing = spacing - 36;
}
self.location.minY = self.zoomOut.maxY + spacing;
self.bounds = {{}, {self.zoomOut.width, self.location.maxY}};
if (self.zoomHidden)
@@ -62,6 +67,9 @@ CGFloat const kButtonsBottomOffset = 6;
[UIView animateWithDuration:kDefaultAnimationDuration
animations:^{
self.midY = centerShift + self.superview.height / 2;
if ([MWMRouter isRoutingActive]) {
self.midY = self.midY - 18;
}
if (self.maxY > self.bottomBound)
self.maxY = self.bottomBound;
}];

View File

@@ -200,6 +200,8 @@ NSString *const kNavigationControlViewXibName = @"NavigationControlView";
}
- (void)onRouteStart {
[MWMSearch clear];
[self.searchManager close];
self.state = MWMNavigationDashboardStateNavigation;
}
- (void)onRouteStop {

View File

@@ -0,0 +1,16 @@
{
"images" : [
{
"filename" : "ic_panoramax.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true,
"template-rendering-intent" : "template"
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -276,6 +276,12 @@
/* Text in the editor */
"bluesky" = "Bluesky";
/* Text in menu */
"panoramax" = "Panoramax";
/* Text in menu */
"panoramax_picture" = "Panoramax Picture";
/* Text in menu */
"rate_the_app" = "Gradeer die toep";

View File

@@ -276,6 +276,12 @@
/* Text in the editor */
"bluesky" = "Bluesky";
/* Text in menu */
"panoramax" = "Panoramax";
/* Text in menu */
"panoramax_picture" = "Panoramax Picture";
/* Text in menu */
"rate_the_app" = "قيّم التطبيق";
@@ -476,7 +482,7 @@
"read_in_wikipedia" = "ويكيبيديا";
/* Place Page link to Wikimedia Commons. */
"wikimedia_commons" = "Wikimedia Commons";
"wikimedia_commons" = "ويكيميديا كومنز";
"p2p_your_location" = "موقعك";
"p2p_start" = "ابدأ";
"p2p_from_here" = "الطريق من هنا";
@@ -928,10 +934,10 @@
"telegram_url" = "https://t.me/CoMapsApp";
/* Instagram account url for the "?" About page */
"instagram_url" = "https://www.instagram.com/comapscommunity/";
"instagram_url" = "https://www.instagram.com/comapscommunity";
/* Translated CoMaps site, add new translations here: https://github.com/organicmaps/organicmaps.github.io/tree/master/content */
"translated_om_site_url" = "https://www.comaps.app/";
"translated_om_site_url" = "https://www.comaps.app/ar";
/* Link to OSM wiki for Editor, Profile and About pages */
"osm_wiki_about_url" = "https://wiki.openstreetmap.org/wiki/Ar:About_OpenStreetMap";

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