diff --git a/android/app/src/fdroid/play/listings/cs-CZ/release-notes.txt b/android/app/src/fdroid/play/listings/cs-CZ/release-notes.txt new file mode 100644 index 000000000..c5ff496f2 --- /dev/null +++ b/android/app/src/fdroid/play/listings/cs-CZ/release-notes.txt @@ -0,0 +1,9 @@ +• Vylepšena viditelnost a uživatelské rozhraní pokynů v navigaci +• Přidána možnost vynechat kroky +• Vylepšeno vyhledávání ve více jazycích +• Přidána specifická ikona pro autobusové zastávky +• Opraveny problémy s Android Auto (prostřednictvím projektu OM) +• Vylepšen editor a opraveny drobné problémy +• Vylepšeny styly map (prostřednictvím projektu OM) +• Vylepšeny překlady aplikace +Další změny najdete v našich poznámkách k vydání Codeberg! diff --git a/android/app/src/fdroid/play/listings/de-DE/release-notes.txt b/android/app/src/fdroid/play/listings/de-DE/release-notes.txt index b6a8eb5ca..0edfcaed7 100644 --- a/android/app/src/fdroid/play/listings/de-DE/release-notes.txt +++ b/android/app/src/fdroid/play/listings/de-DE/release-notes.txt @@ -1,10 +1,9 @@ -• Karten-Daten vom 6. September -• Zeitstrafen für Radrouting -• Farbige POI-Beschriftungen in Autonavigation -• POI-Suche nach Filialnamen -• Abspannportale, Sicherheitskabinen & Büros hinzugefügt -• Aktualisierte Symbole für Türme, Nachtclubs, Apotheken und Fahnenmasten -• Lesezeichen-Farbe in GPX-Exporten -• Farbfüllung von Fußgängerbereiche auf Plätzen -• Android Auto: Anzeige Ausfahrtsnummern in Kreisverkehren -Weitere Änderungen in Codeberg-Versionshinweisen! +• Verbesserte Sichtbarkeit & Benutzeroberfläche für Navigationsanweisungen +• Option um Treppen zu vermeiden +• Verbesserte Suche in mehreren Sprachen +• Spezifisches Symbol für Busbahnöfe hinzugefügt +• Probleme mit Android Auto behoben (via OM) +• Verbesserter Editor mit kleinere Bugfixes +• Kartenstile verbessert (via OM) +• Verbesserte Übersetzungen +Für weitere Änderungen siehe Codeberg-Versionshinweise diff --git a/android/app/src/fdroid/play/listings/en-US/release-notes.txt b/android/app/src/fdroid/play/listings/en-US/release-notes.txt index 23f46be4a..fbb82a324 100644 --- a/android/app/src/fdroid/play/listings/en-US/release-notes.txt +++ b/android/app/src/fdroid/play/listings/en-US/release-notes.txt @@ -1,10 +1,9 @@ -• OpenStreetMap data as of September 6 -• Turn penalties for bicycle routing -• Colored POI labels for car navigation map style -• Search POIs by branch name -• Added power portals, security booths and offices -• Update icons for towers, nightclubs, chemists, flagpoles -• Save bookmark color to GPX exports -• Color fill pedestrian parts of squares -• Android Auto: display roundabout exit numbers +• Improved visibility and UI of instructions in navigation +• Added option to avoid steps +• Improved search in multiple languages +• Added specific icon for bus stations +• Fixed Android Auto issues (via OM project) +• Improved editor and fix minor issues +• Improved map styles (via OM project) +• Improved app translations Check our Codeberg release notes for more changes! diff --git a/android/app/src/fdroid/play/listings/es-ES/release-notes.txt b/android/app/src/fdroid/play/listings/es-ES/release-notes.txt index 6ca7f2a6e..b4f6caf6a 100644 --- a/android/app/src/fdroid/play/listings/es-ES/release-notes.txt +++ b/android/app/src/fdroid/play/listings/es-ES/release-notes.txt @@ -1,10 +1,8 @@ -• Datos a 6 de septiembre -• Penalizaciones de giros en rutas de bici -• Etiquetas de puntos de interés en color en navegación -• Buscar por nombre de sucursal -• Añadir portales de energía, cabinas de seguridad y oficinas -• Nuevos iconos: torres, discotecas, parafarmacias y mástiles -• Guardar color en exportaciones GPX -• Colorear áreas peatonales de plazas -• Android Auto: mostrar números de salida de rotondas +• Mejora de la visibilidad y la interfaz de usuario de las instrucciones de navegación +• Se ha añadido la opción de evitar escaleras +• Mejora de la búsqueda en varios idiomas como ES +• Se ha añadido un icono específico para las estaciones de autobús +• Se han solucionado los problemas de Android Auto (a través del proyecto OM) +• Se ha mejorado el editor y se han solucionado pequeños problemas +• Se han mejorado los estilos de los mapas (a través del proyecto OM) Más detalles en Codeberg diff --git a/android/app/src/fdroid/play/listings/fr-FR/release-notes.txt b/android/app/src/fdroid/play/listings/fr-FR/release-notes.txt index aafc42bc1..657153cef 100644 --- a/android/app/src/fdroid/play/listings/fr-FR/release-notes.txt +++ b/android/app/src/fdroid/play/listings/fr-FR/release-notes.txt @@ -1,9 +1,9 @@ -• Données OSM du 06 septembre -• Pénalités dans les calculs d'itinéraires vélos -• Ajout de labels colorés en mode navigation -• Support du tag branch dans la recherche -• Ajout des portiques électriques, postes de sécurité -• Mise à jour des icônes de tours, boîtes de nuits, chimiste et mat -• Enregistrement de la couleur des signets dans les exports GPX -• Android Auto: Affichage du numéro de sortie des ronds-points +• Interface utilisateur et visibilité des instructions en navigation améliorée +• Option pour éviter les escaliers ajoutée +• Recherche améliorée dans différents languages +• Icône pour les gares routières ajoutée +• Corrections de bugs liées à Android Auto (via OM) +• Editeur amélioré et corrections de bugs +• Style de la carte amélioré (via OM) +• Traductions améliorées Plus d'informations sur notre Codeberg diff --git a/android/app/src/fdroid/play/listings/id/full-description.txt b/android/app/src/fdroid/play/listings/id/full-description.txt new file mode 100644 index 000000000..86962c2ab --- /dev/null +++ b/android/app/src/fdroid/play/listings/id/full-description.txt @@ -0,0 +1,32 @@ +Aplikasi peta gratis & sumber terbuka yang dipimpin komunitas, berbasis data OpenStreetMap dan diperkuat dengan komitmen terhadap transparansi, privasi, serta non-profit. CoMaps adalah turunan dari Organic Maps, yang merupakan turunan dari Maps.ME. + +Baca lebih lanjut tentang alasan proyek ini dan arahnya di codeberg.org/comaps. +Bergabunglah dengan komunitas dan bantu menjadikan aplikasi peta terbaik +• Gunakan aplikasi ini dan sebarkan +• Beri masukan dan laporkan masalah +• Perbarui data peta di aplikasi atau di situs OpenStreetMap + +‣ Fokus Offline: Rencanakan dan navigasikan perjalananmu di luar negeri tanpa perlu layanan seluler, cari titik saat hiking jauh, dll. Semua fungsi aplikasi dirancang untuk bekerja offline. +‣ Menghormati Privasi: Aplikasi ini dirancang dengan privasi sebagai prioritas – tidak mengidentifikasi orang, tidak melacak, dan tidak mengumpulkan informasi pribadi. Bebas iklan. +‣ Sederhana dan Rapi: fitur penting yang mudah digunakan dan langsung berfungsi. +‣ Hemat Baterai dan Ruang: Tidak menguras baterai seperti aplikasi navigasi lain. Peta ringkas menghemat ruang berharga di ponselmu. +‣ Gratis dan Dibangun oleh Komunitas: Orang seperti kamu membantu membangun aplikasi ini dengan menambahkan tempat ke OpenStreetMap, menguji serta memberi masukan fitur, dan menyumbangkan keterampilan pengembangan maupun dana. +‣ Terbuka dan Transparan: Pengambilan keputusan dan keuangan transparan, non-profit, dan sepenuhnya sumber terbuka. + +Fitur Utama: +• Peta detail yang bisa diunduh, dengan tempat yang tidak ada di Google Maps +• Mode outdoor dengan sorotan jalur hiking, area berkemah, sumber air, puncak, garis kontur, dll +• Jalur pejalan kaki dan jalur sepeda +• Titik menarik seperti restoran, SPBU, hotel, toko, tempat wisata, dan banyak lagi +• Pencarian berdasarkan nama, alamat, atau kategori titik menarik +• Navigasi dengan suara untuk berjalan, bersepeda, atau berkendara +• Tandai tempat favoritmu dengan sekali tap +• Artikel Wikipedia offline +• Layer dan rute transportasi subway +• Rekaman jejak +• Ekspor dan impor bookmark serta jejak dalam format KML, KMZ, GPX +• Mode gelap untuk digunakan saat malam +• Tingkatkan data peta untuk semua orang dengan editor bawaan sederhana + +Kebebasan Ada di Sini +Temukan perjalananmu, jelajahi dunia dengan privasi dan komunitas di garis depan! diff --git a/android/app/src/fdroid/play/listings/id/short-description.txt b/android/app/src/fdroid/play/listings/id/short-description.txt new file mode 100644 index 000000000..438a9cae8 --- /dev/null +++ b/android/app/src/fdroid/play/listings/id/short-description.txt @@ -0,0 +1 @@ +Navigasi peta mudah – Temukan lebih banyak – Didukung oleh komunitas diff --git a/android/app/src/fdroid/play/listings/it-IT/release-notes.txt b/android/app/src/fdroid/play/listings/it-IT/release-notes.txt index cdd21014f..e69de29bb 100644 --- a/android/app/src/fdroid/play/listings/it-IT/release-notes.txt +++ b/android/app/src/fdroid/play/listings/it-IT/release-notes.txt @@ -1,10 +0,0 @@ -• OpenStreetMap aggiornato al 6 Settembre -• Bici: miglior stima del tempo di percorrenza -• Auto: punti d'interesse colorati -• Cerca i punti d'interesse tramite filiale -• Aggiunte strutture alta tensione, cabine di sicurezza e uffici -• Aggiornate le icone per torri, discoteche, farmacie e aste per bandiere -• Salva il colore dei Preferiti nel GPX -• Evidenziate le aree pedonali nelle piazze -• AndroidAuto: aggiunto il numero dell'uscita nelle rotonde -Visita Codeberg per ulteriori dettagli diff --git a/android/app/src/fdroid/play/listings/no-NO/short-description.txt b/android/app/src/fdroid/play/listings/no-NO/short-description.txt index 8bee04c06..1360353a9 100644 --- a/android/app/src/fdroid/play/listings/no-NO/short-description.txt +++ b/android/app/src/fdroid/play/listings/no-NO/short-description.txt @@ -1 +1 @@ -Lett kart navigasjon - Opplev mere på din reise - Drevet av felleskapet +Enkel kartnavigering - Opplev mere på din reise - Drevet av felleskapet diff --git a/android/app/src/fdroid/play/listings/no-NO/title.txt b/android/app/src/fdroid/play/listings/no-NO/title.txt index 60a12f1b1..bf1a14e5f 100644 --- a/android/app/src/fdroid/play/listings/no-NO/title.txt +++ b/android/app/src/fdroid/play/listings/no-NO/title.txt @@ -1 +1 @@ -CoMaps - Gå tur, sykkel, kjør - med personvern +CoMaps - Gå, sykle, kjøre offline med personvern diff --git a/android/app/src/fdroid/play/listings/pl-PL/short-description.txt b/android/app/src/fdroid/play/listings/pl-PL/short-description.txt index 0f76a8bef..8471873b0 100644 --- a/android/app/src/fdroid/play/listings/pl-PL/short-description.txt +++ b/android/app/src/fdroid/play/listings/pl-PL/short-description.txt @@ -1 +1 @@ -Łatwa nawigacja – Odkryj więcej ze swojej podróży – Wspierane przez społeczność +Łatwa nawigacja po mapie - Odkryj więcej z podróży - Wspierane przez społeczność diff --git a/android/app/src/fdroid/play/listings/pt-BR/release-notes.txt b/android/app/src/fdroid/play/listings/pt-BR/release-notes.txt index a88a99915..cf0733503 100644 --- a/android/app/src/fdroid/play/listings/pt-BR/release-notes.txt +++ b/android/app/src/fdroid/play/listings/pt-BR/release-notes.txt @@ -1,10 +1,9 @@ -• Dados OSM de 6/09 -• Penalidades de conversão para bicicleta -• Etiquetas de POI coloridas para o estilo do mapa de navegação de carros -• Busca de POIs por nome de filial -• Adição de portais de energia, guaritas e escritórios -• Atualização de ícones para torres, discotecas, farmácias e mastros -• Salva a cor dos favoritos nas exportações GPX -• Preenchimento de praças pavimentadas -• Android Auto: exibe números de saída de rotatória -Confira nossas notas de lançamento do Codeberg para mais mudanças +• Visibilidade e interface do usuário aprimoradas para instruções na navegação +• Opção adicionada para evitar degraus +• Busca aprimorada em vários idiomas +• Adição de ícone específico para rodoviárias +• Problemas corrigidos no Android Auto (via projeto OM) +• Editor aprimorado e correção de problemas menores +• Estilos de mapa aprimorados (via projeto OM) +• Traduções aprimoradas +Confira nossas notas de lançamento do Codeberg para mais mudanças! diff --git a/android/app/src/fdroid/play/listings/ru-RU/release-notes.txt b/android/app/src/fdroid/play/listings/ru-RU/release-notes.txt index 2be8010c2..a63b7da4e 100644 --- a/android/app/src/fdroid/play/listings/ru-RU/release-notes.txt +++ b/android/app/src/fdroid/play/listings/ru-RU/release-notes.txt @@ -1,10 +1,9 @@ -• Данные на 6 сентября -• Предупреждения на веломаршруте -• Цветные метки POI при автонавигации -• Поиск POI по названию ветки -• Добавлены высоковольтные опоры, помещения охраны и офисы -• Обновлены значки башен,вышек,мачт,ночных клубов,аптек -• Сохранение цвета закладок при экспорте в GPX (через OM) -• Отображение цветом пешеходных зон -• Android Auto: отображение номеров съездов на кольцевых развязках -Посмотрите примечания к выпуску Codeberg, чтобы узнать о других изменениях! +• Лучшая видимость и интерфейс при навигации +• Добавлена возможность пропускать шаги +• Улучшен поиск на нескольких языках +• Новый значок автостанций +• Исправлены проблемы с Android Auto (через OM) +• Улучшен редактор и исправлены мелкие недочёты +• Улучшены стили карт (через OM) +• Улучшены переводы приложения +Ознакомьтесь с примечаниями к выпуску Codeberg, чтобы узнать изменениях! diff --git a/android/app/src/google/play/listings/id/short-description.txt b/android/app/src/google/play/listings/id/short-description.txt new file mode 100644 index 000000000..438a9cae8 --- /dev/null +++ b/android/app/src/google/play/listings/id/short-description.txt @@ -0,0 +1 @@ +Navigasi peta mudah – Temukan lebih banyak – Didukung oleh komunitas diff --git a/android/app/src/google/play/listings/id/title.txt b/android/app/src/google/play/listings/id/title.txt new file mode 100644 index 000000000..9e5a4bc8c --- /dev/null +++ b/android/app/src/google/play/listings/id/title.txt @@ -0,0 +1 @@ +CoMaps - Jelajah dengan Privat diff --git a/android/app/src/google/play/listings/no-NO/short-description.txt b/android/app/src/google/play/listings/no-NO/short-description.txt new file mode 100644 index 000000000..1360353a9 --- /dev/null +++ b/android/app/src/google/play/listings/no-NO/short-description.txt @@ -0,0 +1 @@ +Enkel kartnavigering - Opplev mere på din reise - Drevet av felleskapet diff --git a/android/app/src/google/play/listings/no-NO/title.txt b/android/app/src/google/play/listings/no-NO/title.txt new file mode 100644 index 000000000..51031ffd0 --- /dev/null +++ b/android/app/src/google/play/listings/no-NO/title.txt @@ -0,0 +1 @@ +CoMaps -Naviger med personvern diff --git a/android/app/src/google/play/listings/pl-PL/short-description.txt b/android/app/src/google/play/listings/pl-PL/short-description.txt new file mode 100644 index 000000000..8471873b0 --- /dev/null +++ b/android/app/src/google/play/listings/pl-PL/short-description.txt @@ -0,0 +1 @@ +Łatwa nawigacja po mapie - Odkryj więcej z podróży - Wspierane przez społeczność diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index dc9ed266e..8618d6cdc 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -104,6 +104,7 @@ @@ -364,6 +365,7 @@ @@ -380,6 +382,7 @@ mAlertDialog = null) .show(); } - - @Override - @StyleRes - public int getThemeResourceId(@NonNull String theme) - { - return R.style.MwmTheme_DownloadResourcesLegacy; - } } diff --git a/android/app/src/main/java/app/organicmaps/MapFragment.java b/android/app/src/main/java/app/organicmaps/MapFragment.java deleted file mode 100644 index 7bfa884d5..000000000 --- a/android/app/src/main/java/app/organicmaps/MapFragment.java +++ /dev/null @@ -1,210 +0,0 @@ -package app.organicmaps; - -import android.content.Context; -import android.os.Build; -import android.os.Bundle; -import android.util.DisplayMetrics; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.view.View; -import android.view.ViewGroup; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.res.ConfigurationHelper; -import app.organicmaps.base.BaseMwmFragment; -import app.organicmaps.sdk.Map; -import app.organicmaps.sdk.MapRenderingListener; -import app.organicmaps.sdk.display.DisplayType; -import app.organicmaps.sdk.util.log.Logger; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; - -public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, SurfaceHolder.Callback -{ - private static final String TAG = MapFragment.class.getSimpleName(); - - @NonNull - private final Map mMap = new Map(DisplayType.Device); - - public void updateCompassOffset(int offsetX, int offsetY) - { - mMap.updateCompassOffset(requireContext(), offsetX, offsetY, true); - } - - public void updateBottomWidgetsOffset(int offsetX, int offsetY) - { - mMap.updateBottomWidgetsOffset(requireContext(), offsetX, offsetY); - } - - public void updateMyPositionRoutingOffset(int offsetY) - { - mMap.updateMyPositionRoutingOffset(offsetY); - } - - public void destroySurface(boolean activityIsChangingConfigurations) - { - mMap.onSurfaceDestroyed(activityIsChangingConfigurations, isAdded()); - } - - public boolean isContextCreated() - { - return mMap.isContextCreated(); - } - - @Override - public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) - { - Logger.d(TAG); - int densityDpi; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) - densityDpi = ConfigurationHelper.getDensityDpi(requireContext().getResources()); - else - densityDpi = getDensityDpiOld(); - - mMap.onSurfaceCreated(requireContext(), surfaceHolder.getSurface(), surfaceHolder.getSurfaceFrame(), densityDpi); - } - - @Override - public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) - { - Logger.d(TAG); - mMap.onSurfaceChanged(requireContext(), surfaceHolder.getSurface(), surfaceHolder.getSurfaceFrame(), - surfaceHolder.isCreating()); - } - - @Override - public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) - { - Logger.d(TAG); - mMap.onSurfaceDestroyed(requireActivity().isChangingConfigurations(), true); - } - - @Override - public void onAttach(Context context) - { - Logger.d(TAG); - super.onAttach(context); - - mMap.setLocationHelper(MwmApplication.from(requireContext()).getLocationHelper()); - mMap.setMapRenderingListener((MapRenderingListener) context); - mMap.setCallbackUnsupported(this::reportUnsupported); - } - - @Override - public void onDetach() - { - Logger.d(TAG); - super.onDetach(); - mMap.setMapRenderingListener(null); - mMap.setCallbackUnsupported(null); - } - - @Override - public void onCreate(Bundle b) - { - Logger.d(TAG); - super.onCreate(b); - setRetainInstance(true); - boolean launchByDeepLink = false; - Bundle args = getArguments(); - if (args != null) - launchByDeepLink = args.getBoolean(Map.ARG_LAUNCH_BY_DEEP_LINK); - mMap.onCreate(launchByDeepLink); - } - - @Override - public void onStart() - { - Logger.d(TAG); - super.onStart(); - mMap.onStart(); - } - - @Override - public void onStop() - { - Logger.d(TAG); - super.onStop(); - mMap.onStop(); - } - - @Override - public void onPause() - { - Logger.d(TAG); - super.onPause(); - mMap.onPause(requireContext()); - } - - @Override - public void onResume() - { - Logger.d(TAG); - super.onResume(); - mMap.onResume(); - } - - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) - { - Logger.d(TAG); - final View view = inflater.inflate(R.layout.fragment_map, container, false); - final SurfaceView mSurfaceView = view.findViewById(R.id.map_surfaceview); - mSurfaceView.getHolder().addCallback(this); - return view; - } - - @Override - public boolean onTouch(View view, MotionEvent event) - { - int action = event.getActionMasked(); - int pointerIndex = event.getActionIndex(); - switch (action) - { - case MotionEvent.ACTION_POINTER_UP -> action = Map.NATIVE_ACTION_UP; - case MotionEvent.ACTION_UP -> - { - action = Map.NATIVE_ACTION_UP; - pointerIndex = 0; - } - case MotionEvent.ACTION_POINTER_DOWN -> action = Map.NATIVE_ACTION_DOWN; - case MotionEvent.ACTION_DOWN -> - { - action = Map.NATIVE_ACTION_DOWN; - pointerIndex = 0; - } - case MotionEvent.ACTION_MOVE -> - { - action = Map.NATIVE_ACTION_MOVE; - pointerIndex = Map.INVALID_POINTER_MASK; - } - case MotionEvent.ACTION_CANCEL -> action = Map.NATIVE_ACTION_CANCEL; - } - Map.onTouch(action, event, pointerIndex); - return true; - } - - public void notifyOnSurfaceDestroyed(@NonNull Runnable task) - { - mMap.onSurfaceDestroyed(false, true); - task.run(); - } - - private void reportUnsupported() - { - new MaterialAlertDialogBuilder(requireContext(), R.style.MwmTheme_AlertDialog) - .setMessage(R.string.unsupported_phone) - .setCancelable(false) - .setPositiveButton(R.string.close, (dlg, which) -> requireActivity().moveTaskToBack(true)) - .show(); - } - - private int getDensityDpiOld() - { - final DisplayMetrics metrics = new DisplayMetrics(); - requireActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); - return metrics.densityDpi; - } -} diff --git a/android/app/src/main/java/app/organicmaps/MwmActivity.java b/android/app/src/main/java/app/organicmaps/MwmActivity.java index d10c7cc20..c101917cb 100644 --- a/android/app/src/main/java/app/organicmaps/MwmActivity.java +++ b/android/app/src/main/java/app/organicmaps/MwmActivity.java @@ -42,7 +42,6 @@ import androidx.annotation.CallSuper; import androidx.annotation.Keep; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.StyleRes; import androidx.annotation.UiThread; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; @@ -85,6 +84,7 @@ import app.organicmaps.routing.RoutingPlanInplaceController; import app.organicmaps.sdk.ChoosePositionMode; import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Map; +import app.organicmaps.sdk.MapController; import app.organicmaps.sdk.MapRenderingListener; import app.organicmaps.sdk.PlacePageActivationListener; import app.organicmaps.sdk.Router; @@ -138,10 +138,10 @@ import java.util.ArrayList; import java.util.Objects; public class MwmActivity extends BaseMwmFragmentActivity - implements PlacePageActivationListener, View.OnTouchListener, MapRenderingListener, RoutingController.Container, - LocationListener, SensorListener, LocationState.ModeChangeListener, - RoutingPlanInplaceController.RoutingPlanListener, RoutingBottomMenuListener, - BookmarkManager.BookmarksLoadingListener, FloatingSearchToolbarController.SearchToolbarListener, + implements PlacePageActivationListener, MapRenderingListener, RoutingController.Container, LocationListener, + SensorListener, LocationState.ModeChangeListener, RoutingPlanInplaceController.RoutingPlanListener, + RoutingBottomMenuListener, BookmarkManager.BookmarksLoadingListener, + FloatingSearchToolbarController.SearchToolbarListener, MenuBottomSheetFragment.MenuBottomSheetInterfaceWithHeader, PlacePageController.PlacePageRouteSettingsListener, MapButtonsController.MapButtonClickListener, DisplayChangedListener @@ -171,8 +171,9 @@ public class MwmActivity extends BaseMwmFragmentActivity private static final String POWER_SAVE_DISCLAIMER_SHOWN = "POWER_SAVE_DISCLAIMER_SHOWN"; - @Nullable - private MapFragment mMapFragment; + @SuppressWarnings("NotNullFieldNotInitialized") + @NonNull + private MapController mMapController; private View mPointChooser; private MaterialToolbar mPointChooserToolbar; @@ -245,7 +246,7 @@ public class MwmActivity extends BaseMwmFragmentActivity ManageRouteBottomSheet mManageRouteBottomSheet; private boolean mRemoveDisplayListener = true; - private int mLastUiMode = Configuration.UI_MODE_TYPE_UNDEFINED; + private static int mLastUiMode = Configuration.UI_MODE_TYPE_UNDEFINED; public interface LeftAnimationTrackListener { @@ -455,25 +456,12 @@ public class MwmActivity extends BaseMwmFragmentActivity } } - @Override - @StyleRes - protected int getThemeResourceId(@NonNull String theme) - { - if (Config.UiTheme.isDefault(theme)) - return R.style.MwmTheme_MainActivity; - - if (Config.UiTheme.isNight(theme)) - return R.style.MwmTheme_Night_MainActivity; - - return super.getThemeResourceId(theme); - } - @Override public void onDisplayChangedToCar(@NonNull Runnable onTaskFinishedCallback) { mRemoveDisplayListener = false; startActivity(new Intent(this, MapPlaceholderActivity.class)); - Objects.requireNonNull(mMapFragment).notifyOnSurfaceDestroyed(onTaskFinishedCallback); + mMapController.setOnDestroyListener(onTaskFinishedCallback); finish(); } @@ -482,13 +470,15 @@ public class MwmActivity extends BaseMwmFragmentActivity { super.onConfigurationChanged(newConfig); - final int newUiMode = newConfig.uiMode & Configuration.UI_MODE_TYPE_MASK; - final boolean newUiModeIsCarConnected = newUiMode == Configuration.UI_MODE_TYPE_CAR; - final boolean newUiModeIsCarDisconnected = - mLastUiMode == Configuration.UI_MODE_TYPE_CAR && newUiMode == Configuration.UI_MODE_TYPE_NORMAL; - mLastUiMode = newUiMode; + final int newType = newConfig.uiMode & Configuration.UI_MODE_TYPE_MASK; + final int oldType = mLastUiMode & Configuration.UI_MODE_TYPE_MASK; - if (newUiModeIsCarConnected || newUiModeIsCarDisconnected) + mLastUiMode = newConfig.uiMode; + + final boolean carModeChanged = + newType != oldType && (newType == Configuration.UI_MODE_TYPE_CAR || oldType == Configuration.UI_MODE_TYPE_CAR); + + if (carModeChanged) return; makeNavigationBarTransparentInLightMode(); @@ -550,7 +540,7 @@ public class MwmActivity extends BaseMwmFragmentActivity updateViewsInsets(); if (getIntent().getBooleanExtra(EXTRA_UPDATE_THEME, false)) - ThemeSwitcher.INSTANCE.restart(isMapRendererActive()); + ThemeSwitcher.INSTANCE.restart(mMapController.isRenderingActive()); /* * onRenderingInitializationFinished() hook is not called when MwmActivity is recreated with the already @@ -618,7 +608,10 @@ public class MwmActivity extends BaseMwmFragmentActivity private void initViews(boolean isLaunchByDeeplink) { - initMap(isLaunchByDeeplink); + mMapController = new MapController(findViewById(R.id.map), MwmApplication.from(this).getLocationHelper(), this, + this::reportUnsupported, isLaunchByDeeplink); + getLifecycle().addObserver(mMapController); + initNavigationButtons(); if (!mIsTabletLayout) @@ -732,16 +725,7 @@ public class MwmActivity extends BaseMwmFragmentActivity private void showPositionChooser(ChoosePositionMode mode, boolean isBusiness, boolean applyPosition) { closeFloatingToolbarsAndPanels(false); - if (mMapFragment != null) - { - final View mapView = mMapFragment.getView(); - if (mapView != null) - { - int width = mapView.getWidth(); - int height = mapView.getHeight(); - Framework.nativeSetVisibleRect(0, 0, width, height); - } - } + UiUtils.show(mPointChooser); mMapButtonsViewModel.setButtonsHidden(true); ChoosePositionMode.set(mode, isBusiness, applyPosition); @@ -760,29 +744,6 @@ public class MwmActivity extends BaseMwmFragmentActivity finish(); } - private void initMap(boolean isLaunchByDeepLink) - { - final FragmentManager manager = getSupportFragmentManager(); - mMapFragment = (MapFragment) manager.findFragmentByTag(MapFragment.class.getName()); - if (mMapFragment == null) - { - Bundle args = new Bundle(); - args.putBoolean(Map.ARG_LAUNCH_BY_DEEP_LINK, isLaunchByDeepLink); - final FragmentFactory factory = manager.getFragmentFactory(); - mMapFragment = (MapFragment) factory.instantiate(getClassLoader(), MapFragment.class.getName()); - mMapFragment.setArguments(args); - manager.beginTransaction() - .replace(R.id.map_fragment_container, mMapFragment, MapFragment.class.getName()) - .commit(); - } - - View container = findViewById(R.id.map_fragment_container); - if (container != null) - { - container.setOnTouchListener(this); - } - } - private void initNavigationButtons() { prepareNavigationButtons(); @@ -1211,7 +1172,7 @@ public class MwmActivity extends BaseMwmFragmentActivity { setIntent(intent); super.onNewIntent(intent); - if (isMapRendererActive()) + if (mMapController.isRenderingActive()) processIntent(); if (intent.getAction() != null && intent.getAction().equals(TrackRecordingService.STOP_TRACK_RECORDING)) { @@ -1221,17 +1182,12 @@ public class MwmActivity extends BaseMwmFragmentActivity } } - private boolean isMapRendererActive() - { - return mMapFragment != null && Map.isEngineCreated() && mMapFragment.isContextCreated(); - } - @CallSuper @Override protected void onResume() { super.onResume(); - ThemeSwitcher.INSTANCE.restart(isMapRendererActive()); + ThemeSwitcher.INSTANCE.restart(mMapController.isRenderingActive()); refreshSearchToolbar(); setFullscreen(isFullscreen()); makeNavigationBarTransparentInLightMode(); @@ -1249,15 +1205,6 @@ public class MwmActivity extends BaseMwmFragmentActivity MwmApplication.from(this).getSensorHelper().addListener(this); } - @Override - public void recreate() - { - // Explicitly destroy surface before activity recreation. - if (mMapFragment != null) - mMapFragment.destroySurface(true); - super.recreate(); - } - @Override protected void onResumeFragments() { @@ -1459,12 +1406,6 @@ public class MwmActivity extends BaseMwmFragmentActivity return super.onGenericMotionEvent(event); } - @Override - public boolean onTouch(View view, MotionEvent event) - { - return mMapFragment != null && mMapFragment.onTouch(view, event); - } - public void customOnNavigateUp() { if (removeCurrentFragment(true)) @@ -1480,10 +1421,7 @@ public class MwmActivity extends BaseMwmFragmentActivity void updateCompassOffset(int offsetY, int offsetX) { - if (mMapFragment == null || !mMapFragment.isAdded()) - return; - - mMapFragment.updateCompassOffset(offsetX, offsetY); + mMapController.updateCompassOffset(offsetX, offsetY); final double north = MwmApplication.from(this).getSensorHelper().getSavedNorth(); if (!Double.isNaN(north)) @@ -1502,9 +1440,6 @@ public class MwmActivity extends BaseMwmFragmentActivity public void updateBottomWidgetsOffset(int offsetX) { - if (mMapFragment == null || !mMapFragment.isAdded()) - return; - int offsetY = mNavBarHeight; final Float bottomButtonHeight = mMapButtonsViewModel.getBottomButtonsHeight().getValue(); if (bottomButtonHeight != null) @@ -1519,8 +1454,8 @@ public class MwmActivity extends BaseMwmFragmentActivity if (mDisplayManager.isDeviceDisplayUsed()) { - mMapFragment.updateBottomWidgetsOffset(offsetX, offsetY); - mMapFragment.updateMyPositionRoutingOffset(offsetY); + mMapController.updateBottomWidgetsOffset(offsetX, offsetY); + mMapController.updateMyPositionRoutingOffset(offsetY); } } @@ -1738,7 +1673,7 @@ public class MwmActivity extends BaseMwmFragmentActivity public void onNavigationCancelled() { closeFloatingToolbarsAndPanels(true); - ThemeSwitcher.INSTANCE.restart(isMapRendererActive()); + ThemeSwitcher.INSTANCE.restart(mMapController.isRenderingActive()); if (mRoutingPlanInplaceController == null) return; @@ -1754,7 +1689,7 @@ public class MwmActivity extends BaseMwmFragmentActivity public void onNavigationStarted() { closeFloatingToolbarsAndPanels(true); - ThemeSwitcher.INSTANCE.restart(isMapRendererActive()); + ThemeSwitcher.INSTANCE.restart(mMapController.isRenderingActive()); mMapButtonsViewModel.setLayoutMode(MapButtonsController.LayoutMode.navigation); refreshLightStatusBar(); @@ -1790,7 +1725,7 @@ public class MwmActivity extends BaseMwmFragmentActivity public void onResetToPlanningState() { closeFloatingToolbarsAndPanels(true); - ThemeSwitcher.INSTANCE.restart(isMapRendererActive()); + ThemeSwitcher.INSTANCE.restart(mMapController.isRenderingActive()); NavigationService.stopService(this); mMapButtonsViewModel.setSearchOption(null); mMapButtonsViewModel.setLayoutMode(MapButtonsController.LayoutMode.planning); @@ -2619,4 +2554,13 @@ public class MwmActivity extends BaseMwmFragmentActivity window.setNavigationBarContrastEnforced(false); } } + + private void reportUnsupported() + { + new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog) + .setMessage(R.string.unsupported_phone) + .setCancelable(false) + .setPositiveButton(R.string.close, (dlg, which) -> this.moveTaskToBack(true)) + .show(); + } } diff --git a/android/app/src/main/java/app/organicmaps/SplashActivity.java b/android/app/src/main/java/app/organicmaps/SplashActivity.java index bcd2e41b3..9c417efda 100644 --- a/android/app/src/main/java/app/organicmaps/SplashActivity.java +++ b/android/app/src/main/java/app/organicmaps/SplashActivity.java @@ -56,15 +56,6 @@ public class SplashActivity extends AppCompatActivity protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - final String theme = Config.UiTheme.getCurrent(); - if (Config.UiTheme.isDefault(theme)) - setTheme(R.style.MwmTheme_Splash); - else if (Config.UiTheme.isNight(theme)) - setTheme(R.style.MwmTheme_Night_Splash); - else - throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme); - UiThread.cancelDelayedTasks(mInitCoreDelayedTask); setContentView(R.layout.activity_splash); diff --git a/android/app/src/main/java/app/organicmaps/base/BaseMwmDialogFragment.java b/android/app/src/main/java/app/organicmaps/base/BaseMwmDialogFragment.java index 1f513dac2..8559b0ac6 100644 --- a/android/app/src/main/java/app/organicmaps/base/BaseMwmDialogFragment.java +++ b/android/app/src/main/java/app/organicmaps/base/BaseMwmDialogFragment.java @@ -8,14 +8,13 @@ import androidx.annotation.Nullable; import androidx.annotation.StyleRes; import androidx.fragment.app.DialogFragment; import app.organicmaps.R; -import app.organicmaps.util.ThemeUtils; public class BaseMwmDialogFragment extends DialogFragment { @StyleRes protected final int getFullscreenTheme() { - return ThemeUtils.isNightTheme() ? getFullscreenDarkTheme() : getFullscreenLightTheme(); + return R.style.MwmTheme_DialogFragment_Fullscreen; } protected int getStyle() @@ -23,7 +22,8 @@ public class BaseMwmDialogFragment extends DialogFragment return STYLE_NORMAL; } - protected @StyleRes int getCustomTheme() + @StyleRes + protected int getCustomTheme() { return 0; } @@ -40,18 +40,6 @@ public class BaseMwmDialogFragment extends DialogFragment setStyle(style, theme); } - @StyleRes - protected int getFullscreenLightTheme() - { - return R.style.MwmTheme_DialogFragment_Fullscreen; - } - - @StyleRes - protected int getFullscreenDarkTheme() - { - return R.style.MwmTheme_DialogFragment_Fullscreen_Night; - } - @NonNull protected Application getAppContextOrThrow() { diff --git a/android/app/src/main/java/app/organicmaps/base/BaseMwmFragmentActivity.java b/android/app/src/main/java/app/organicmaps/base/BaseMwmFragmentActivity.java index 518373f8f..0f5c054ff 100644 --- a/android/app/src/main/java/app/organicmaps/base/BaseMwmFragmentActivity.java +++ b/android/app/src/main/java/app/organicmaps/base/BaseMwmFragmentActivity.java @@ -11,7 +11,6 @@ import androidx.activity.SystemBarStyle; import androidx.annotation.CallSuper; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.StyleRes; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentFactory; @@ -20,7 +19,6 @@ import app.organicmaps.MwmApplication; import app.organicmaps.R; import app.organicmaps.SplashActivity; import app.organicmaps.sdk.util.Config; -import app.organicmaps.sdk.util.concurrency.UiThread; import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.util.RtlUtils; import com.google.android.material.appbar.MaterialToolbar; @@ -32,24 +30,9 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity private boolean mSafeCreated; - @NonNull - private String mThemeName; - - @StyleRes - protected int getThemeResourceId(@NonNull String theme) - { - if (Config.UiTheme.isDefault(theme)) - return R.style.MwmTheme; - - if (Config.UiTheme.isNight(theme)) - return R.style.MwmTheme_Night; - - throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme); - } - /** * Shows splash screen and initializes the core in case when it was not initialized. - * + *

* Do not override this method! * Use {@link #onSafeCreate(Bundle savedInstanceState)} */ @@ -58,8 +41,6 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity protected final void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mThemeName = Config.UiTheme.getCurrent(); - setTheme(getThemeResourceId(mThemeName)); EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT)); RtlUtils.manageRtl(this); if (!MwmApplication.from(this).getOrganicMaps().arePlatformAndCoreInitialized()) @@ -113,18 +94,6 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity mSafeCreated = false; } - @CallSuper - @Override - public void onPostResume() - { - super.onPostResume(); - if (!mThemeName.equals(Config.UiTheme.getCurrent())) - { - // Workaround described in https://code.google.com/p/android/issues/detail?id=93731 - UiThread.runLater(this::recreate); - } - } - @Override public boolean onOptionsItemSelected(MenuItem item) { diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategoriesActivity.java b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategoriesActivity.java index a3f8c28f2..e0fff2cd9 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategoriesActivity.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategoriesActivity.java @@ -6,13 +6,11 @@ import android.os.Bundle; import androidx.annotation.CallSuper; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.StyleRes; import androidx.fragment.app.Fragment; import app.organicmaps.R; import app.organicmaps.base.BaseToolbarActivity; import app.organicmaps.sdk.bookmarks.data.BookmarkCategory; import app.organicmaps.sdk.bookmarks.data.BookmarkManager; -import app.organicmaps.util.ThemeUtils; public class BookmarkCategoriesActivity extends BaseToolbarActivity { @@ -38,13 +36,6 @@ public class BookmarkCategoriesActivity extends BaseToolbarActivity super.onPause(); } - @Override - @StyleRes - public int getThemeResourceId(@NonNull String theme) - { - return ThemeUtils.getWindowBgThemeResourceId(theme); - } - @Override protected Class getFragmentClass() { diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategorySettingsFragment.java b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategorySettingsFragment.java index e1b293ab8..9c3ed39df 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategorySettingsFragment.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategorySettingsFragment.java @@ -54,7 +54,6 @@ public class BookmarkCategorySettingsFragment extends BaseMwmToolbarFragment public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_bookmark_category_settings, container, false); - setHasOptionsMenu(true); initViews(root); return root; } @@ -85,7 +84,7 @@ public class BookmarkCategorySettingsFragment extends BaseMwmToolbarFragment }); mEditDescView = root.findViewById(R.id.edit_description); mEditDescView.setText(mCategory.getDescription()); - mSaveView = root.findViewById(R.id.done); + mSaveView = root.findViewById(R.id.save); mSaveView.setOnClickListener(v -> onEditDoneClicked()); } diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkListActivity.java b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkListActivity.java index 8dd111fac..6a2be1c62 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkListActivity.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkListActivity.java @@ -5,13 +5,11 @@ import android.os.Bundle; import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.CallSuper; import androidx.annotation.NonNull; -import androidx.annotation.StyleRes; import androidx.fragment.app.Fragment; import app.organicmaps.R; import app.organicmaps.base.BaseToolbarActivity; import app.organicmaps.sdk.bookmarks.data.BookmarkCategory; import app.organicmaps.sdk.bookmarks.data.BookmarkManager; -import app.organicmaps.util.ThemeUtils; public class BookmarkListActivity extends BaseToolbarActivity { @@ -37,13 +35,6 @@ public class BookmarkListActivity extends BaseToolbarActivity super.onPause(); } - @Override - @StyleRes - public int getThemeResourceId(@NonNull String theme) - { - return ThemeUtils.getCardBgThemeResourceId(theme); - } - @Override protected Class getFragmentClass() { diff --git a/android/app/src/main/java/app/organicmaps/car/CarAppSession.java b/android/app/src/main/java/app/organicmaps/car/CarAppSession.java index 594869b8f..ab97f90ed 100644 --- a/android/app/src/main/java/app/organicmaps/car/CarAppSession.java +++ b/android/app/src/main/java/app/organicmaps/car/CarAppSession.java @@ -12,9 +12,12 @@ import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.LifecycleOwner; import app.organicmaps.MwmApplication; import app.organicmaps.R; +import app.organicmaps.car.renderer.Renderer; +import app.organicmaps.car.renderer.RendererFactory; import app.organicmaps.car.screens.ErrorScreen; import app.organicmaps.car.screens.MapPlaceholderScreen; import app.organicmaps.car.screens.MapScreen; +import app.organicmaps.car.screens.NavigationScreen; import app.organicmaps.car.screens.PlaceScreen; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.screens.download.DownloadMapsScreen; @@ -49,8 +52,9 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse @Nullable private final SessionInfo mSessionInfo; + @SuppressWarnings("NotNullFieldNotInitialized") @NonNull - private final SurfaceRenderer mSurfaceRenderer; + private Renderer mSurfaceRenderer; @NonNull private final ScreenManager mScreenManager; @SuppressWarnings("NotNullFieldNotInitialized") @@ -67,7 +71,6 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse { getLifecycle().addObserver(this); mSessionInfo = sessionInfo; - mSurfaceRenderer = new SurfaceRenderer(getCarContext(), getLifecycle()); mScreenManager = getCarContext().getCarService(ScreenManager.class); mCurrentCountryChangedListener = new CurrentCountryChangedListener(); } @@ -114,6 +117,8 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse mSensorsManager = new CarSensorsManager(getCarContext()); mDisplayManager = MwmApplication.from(getCarContext()).getDisplayManager(); mDisplayManager.addListener(DisplayType.Car, this); + mSurfaceRenderer = RendererFactory.create(getCarContext(), mDisplayManager, + MwmApplication.from(getCarContext()).getLocationHelper(), this); init(); } @@ -281,7 +286,19 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse private void restoreRoute() { final RoutingController routingController = RoutingController.get(); - if (routingController.isPlanning() || routingController.isNavigating() || routingController.hasSavedRoute()) + final boolean isNavigating = routingController.isNavigating(); + final boolean hasNavigatingScreen = hasNavigationScreenInStack(); + + if (!isNavigating && hasNavigatingScreen) + mScreenManager.popToRoot(); + + if (isNavigating && routingController.getLastRouterType() == PlaceScreen.ROUTER && hasNavigatingScreen) + { + mScreenManager.popTo(NavigationScreen.MARKER); + return; + } + + if (routingController.isPlanning() || isNavigating || routingController.hasSavedRoute()) { final PlaceScreen placeScreen = new PlaceScreen.Builder(getCarContext(), mSurfaceRenderer) .setMapObject(routingController.getEndPoint()) @@ -290,4 +307,14 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse mScreenManager.push(placeScreen); } } + + private boolean hasNavigationScreenInStack() + { + for (final Screen screen : mScreenManager.getScreenStack()) + { + if (NavigationScreen.MARKER.equals(screen.getMarker())) + return true; + } + return false; + } } diff --git a/android/app/src/main/java/app/organicmaps/car/SurfaceRenderer.java b/android/app/src/main/java/app/organicmaps/car/SurfaceRenderer.java deleted file mode 100644 index 810dff898..000000000 --- a/android/app/src/main/java/app/organicmaps/car/SurfaceRenderer.java +++ /dev/null @@ -1,244 +0,0 @@ -package app.organicmaps.car; - -import static app.organicmaps.sdk.display.DisplayType.Car; - -import android.graphics.Rect; -import android.view.Surface; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.car.app.AppManager; -import androidx.car.app.CarContext; -import androidx.car.app.CarToast; -import androidx.car.app.SurfaceCallback; -import androidx.car.app.SurfaceContainer; -import androidx.lifecycle.DefaultLifecycleObserver; -import androidx.lifecycle.Lifecycle; -import androidx.lifecycle.LifecycleOwner; -import app.organicmaps.MwmApplication; -import app.organicmaps.R; -import app.organicmaps.sdk.Framework; -import app.organicmaps.sdk.Map; -import app.organicmaps.sdk.MapRenderingListener; -import app.organicmaps.sdk.settings.UnitLocale; -import app.organicmaps.sdk.util.concurrency.UiThread; -import app.organicmaps.sdk.util.log.Logger; - -public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallback, MapRenderingListener -{ - private static final String TAG = SurfaceRenderer.class.getSimpleName(); - - @NonNull - private final CarContext mCarContext; - - @NonNull - private final Map mMap = new Map(Car); - - @NonNull - private Rect mVisibleArea = new Rect(); - - @Nullable - private Surface mSurface = null; - - private boolean mIsRunning; - - public SurfaceRenderer(@NonNull CarContext carContext, @NonNull Lifecycle lifecycle) - { - Logger.d(TAG, "SurfaceRenderer()"); - mCarContext = carContext; - mIsRunning = true; - lifecycle.addObserver(this); - mMap.setMapRenderingListener(this); - } - - @Override - public void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer) - { - Logger.d(TAG, "Surface available " + surfaceContainer); - - if (mSurface != null) - mSurface.release(); - mSurface = surfaceContainer.getSurface(); - - mMap.setLocationHelper(MwmApplication.from(mCarContext).getLocationHelper()); - mMap.onSurfaceCreated(mCarContext, mSurface, - new Rect(0, 0, surfaceContainer.getWidth(), surfaceContainer.getHeight()), - surfaceContainer.getDpi()); - mMap.updateBottomWidgetsOffset(mCarContext, -1, -1); - } - - @Override - public void onVisibleAreaChanged(@NonNull Rect visibleArea) - { - Logger.d(TAG, "Visible area changed. visibleArea: " + visibleArea); - mVisibleArea = visibleArea; - - if (!mVisibleArea.isEmpty()) - Framework.nativeSetVisibleRect(mVisibleArea.left, mVisibleArea.top, mVisibleArea.right, mVisibleArea.bottom); - } - - @Override - public void onStableAreaChanged(@NonNull Rect stableArea) - { - Logger.d(TAG, "Stable area changed. stableArea: " + stableArea); - - if (!stableArea.isEmpty()) - Framework.nativeSetVisibleRect(stableArea.left, stableArea.top, stableArea.right, stableArea.bottom); - else if (!mVisibleArea.isEmpty()) - Framework.nativeSetVisibleRect(mVisibleArea.left, mVisibleArea.top, mVisibleArea.right, mVisibleArea.bottom); - } - - @Override - public void onSurfaceDestroyed(@NonNull SurfaceContainer surfaceContainer) - { - Logger.d(TAG, "Surface destroyed"); - if (mSurface != null) - { - mSurface.release(); - mSurface = null; - } - mMap.onSurfaceDestroyed(false, true); - } - - @Override - public void onCreate(@NonNull LifecycleOwner owner) - { - Logger.d(TAG); - mCarContext.getCarService(AppManager.class).setSurfaceCallback(this); - mMap.onCreate(false); - } - - @Override - public void onStart(@NonNull LifecycleOwner owner) - { - Logger.d(TAG); - mMap.onStart(); - mMap.setCallbackUnsupported(this::reportUnsupported); - } - - @Override - public void onResume(@NonNull LifecycleOwner owner) - { - Logger.d(TAG); - mMap.onResume(); - if (MwmApplication.from(mCarContext).getDisplayManager().isCarDisplayUsed()) - UiThread.runLater(() -> mMap.updateMyPositionRoutingOffset(0)); - } - - @Override - public void onPause(@NonNull LifecycleOwner owner) - { - Logger.d(TAG); - mMap.onPause(mCarContext); - } - - @Override - public void onStop(@NonNull LifecycleOwner owner) - { - Logger.d(TAG); - mMap.onStop(); - mMap.setCallbackUnsupported(null); - } - - @Override - public void onScroll(float distanceX, float distanceY) - { - Logger.d(TAG, "distanceX: " + distanceX + ", distanceY: " + distanceY); - mMap.onScroll(distanceX, distanceY); - } - - @Override - public void onFling(float velocityX, float velocityY) - { - Logger.d(TAG, "velocityX: " + velocityX + ", velocityY: " + velocityY); - } - - public void onZoomIn() - { - Map.zoomIn(); - } - - public void onZoomOut() - { - Map.zoomOut(); - } - - @Override - public void onScale(float focusX, float focusY, float scaleFactor) - { - Logger.d(TAG, "focusX: " + focusX + ", focusY: " + focusY + ", scaleFactor: " + scaleFactor); - float x = focusX; - float y = focusY; - - if (!mVisibleArea.isEmpty()) - { - // If a focal point value is negative, use the center point of the visible area. - if (x < 0) - x = mVisibleArea.centerX(); - if (y < 0) - y = mVisibleArea.centerY(); - } - - final boolean animated = Float.compare(scaleFactor, 2f) == 0; - - Map.onScale(scaleFactor, x, y, animated); - } - - @Override - public void onClick(float x, float y) - { - Logger.d(TAG, "x: " + x + ", y: " + y); - Map.onClick(x, y); - } - - public void disable() - { - if (!mIsRunning) - { - Logger.d(TAG, "Already disabled"); - return; - } - - mCarContext.getCarService(AppManager.class).setSurfaceCallback(null); - mMap.onSurfaceDestroyed(false, true); - mMap.onStop(); - mMap.setCallbackUnsupported(null); - mMap.setMapRenderingListener(null); - - mIsRunning = false; - } - - public void enable() - { - if (mIsRunning) - { - Logger.d(TAG, "Already enabled"); - return; - } - - mCarContext.getCarService(AppManager.class).setSurfaceCallback(this); - mMap.onStart(); - mMap.setCallbackUnsupported(this::reportUnsupported); - mMap.setMapRenderingListener(this); - UiThread.runLater(() -> mMap.updateMyPositionRoutingOffset(0)); - - mIsRunning = true; - } - - public boolean isRenderingActive() - { - return mIsRunning; - } - - private void reportUnsupported() - { - String message = mCarContext.getString(R.string.unsupported_phone); - Logger.e(TAG, message); - CarToast.makeText(mCarContext, message, CarToast.LENGTH_LONG).show(); - } - - @Override - public void onRenderingCreated() - { - UnitLocale.initializeCurrentUnits(); - } -} diff --git a/android/app/src/main/java/app/organicmaps/car/renderer/Renderer.java b/android/app/src/main/java/app/organicmaps/car/renderer/Renderer.java new file mode 100644 index 000000000..668929f6e --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/car/renderer/Renderer.java @@ -0,0 +1,130 @@ +package app.organicmaps.car.renderer; + +import androidx.annotation.CallSuper; +import androidx.annotation.NonNull; +import androidx.car.app.AppManager; +import androidx.car.app.CarContext; +import androidx.car.app.SurfaceCallback; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import app.organicmaps.sdk.Map; +import app.organicmaps.sdk.MapRenderingListener; +import app.organicmaps.sdk.display.DisplayManager; +import app.organicmaps.sdk.location.LocationHelper; +import app.organicmaps.sdk.settings.UnitLocale; +import app.organicmaps.sdk.util.log.Logger; + +public abstract class Renderer implements DefaultLifecycleObserver +{ + @NonNull + private final String TAG; + + private SurfaceCallback mSurfaceCallback; + + private boolean mIsRunning; + + @NonNull + protected final CarContext mCarContext; + + @NonNull + protected final DisplayManager mDisplayManager; + + @NonNull + protected final LocationHelper mLocationHelper; + + @NonNull + protected final LifecycleOwner mLifecycleOwner; + + @NonNull + private final MapRenderingListener mMapRenderingListener = new MapRenderingListener() { + @Override + public void onRenderingCreated() + { + UnitLocale.initializeCurrentUnits(); + } + }; + + public Renderer(@NonNull CarContext carContext, @NonNull DisplayManager displayManager, + @NonNull LocationHelper locationHelper, @NonNull LifecycleOwner lifecycleOwner) + { + TAG = getClass().getSimpleName(); + Logger.d(TAG, "SurfaceRenderer()"); + mIsRunning = true; + mCarContext = carContext; + mDisplayManager = displayManager; + mLocationHelper = locationHelper; + mLifecycleOwner = lifecycleOwner; + mLifecycleOwner.getLifecycle().addObserver(this); + } + + protected void setSurfaceCallback(@NonNull SurfaceCallback surfaceCallback) + { + mSurfaceCallback = surfaceCallback; + } + + public boolean isRenderingActive() + { + return mIsRunning; + } + + protected MapRenderingListener getMapRenderingListener() + { + return mMapRenderingListener; + } + + @CallSuper + @Override + public void onCreate(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + if (mSurfaceCallback == null) + throw new IllegalStateException("SurfaceCallback must be set before onCreate()"); + mCarContext.getCarService(AppManager.class).setSurfaceCallback(mSurfaceCallback); + } + + @CallSuper + @Override + public void onDestroy(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + mCarContext.getCarService(AppManager.class).setSurfaceCallback(null); + } + + @CallSuper + public void enable() + { + if (isRenderingActive()) + { + Logger.d(TAG, "Already enabled"); + return; + } + + if (mSurfaceCallback == null) + throw new IllegalStateException("SurfaceCallback must be set before enable()"); + mCarContext.getCarService(AppManager.class).setSurfaceCallback(mSurfaceCallback); + mIsRunning = true; + } + + @CallSuper + public void disable() + { + if (!isRenderingActive()) + { + Logger.d(TAG, "Already disabled"); + return; + } + + mCarContext.getCarService(AppManager.class).setSurfaceCallback(null); + mIsRunning = false; + } + + public void onZoomIn() + { + Map.zoomIn(); + } + + public void onZoomOut() + { + Map.zoomOut(); + } +} diff --git a/android/app/src/main/java/app/organicmaps/car/renderer/RendererFactory.java b/android/app/src/main/java/app/organicmaps/car/renderer/RendererFactory.java new file mode 100644 index 000000000..3dcc94170 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/car/renderer/RendererFactory.java @@ -0,0 +1,20 @@ +package app.organicmaps.car.renderer; + +import androidx.annotation.NonNull; +import androidx.car.app.CarContext; +import androidx.lifecycle.LifecycleOwner; +import app.organicmaps.sdk.display.DisplayManager; +import app.organicmaps.sdk.location.LocationHelper; + +public final class RendererFactory +{ + @NonNull + public static Renderer create(@NonNull CarContext carContext, @NonNull DisplayManager displayManager, + @NonNull LocationHelper locationHelper, @NonNull LifecycleOwner lifecycleOwner) + { + if (android.os.Build.VERSION.SDK_INT >= 23) + return new SurfaceRenderer(carContext, displayManager, locationHelper, lifecycleOwner); + else + return new SurfaceRendererLegacy(carContext, displayManager, locationHelper, lifecycleOwner); + } +} diff --git a/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceCallback.java b/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceCallback.java new file mode 100644 index 000000000..223d2cd9c --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceCallback.java @@ -0,0 +1,100 @@ +package app.organicmaps.car.renderer; + +import android.app.Presentation; +import android.hardware.display.DisplayManager; +import android.hardware.display.VirtualDisplay; +import android.view.SurfaceHolder; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.widget.FrameLayout; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import androidx.car.app.CarContext; +import androidx.car.app.SurfaceContainer; +import app.organicmaps.sdk.MapController; +import app.organicmaps.sdk.util.log.Logger; + +@RequiresApi(23) +class SurfaceCallback extends SurfaceCallbackBase +{ + private static final String TAG = SurfaceCallback.class.getSimpleName(); + + private static final String VIRTUAL_DISPLAY_NAME = "OM_Android_Auto_Display"; + + @NonNull + private final MapController mMapController; + + private VirtualDisplay mVirtualDisplay; + private Presentation mPresentation; + + public SurfaceCallback(@NonNull CarContext carContext, @NonNull MapController mapController) + { + super(carContext); + mMapController = mapController; + mMapController.getView().getHolder().addCallback(new SurfaceHolder.Callback() { + @Override + public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) + { + mMapController.updateMyPositionRoutingOffset(0); + } + @Override + public void surfaceCreated(@NonNull SurfaceHolder holder) + { + mMapController.updateMyPositionRoutingOffset(0); + } + @Override + public void surfaceDestroyed(@NonNull SurfaceHolder holder) + {} + }); + } + + @Override + public void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer) + { + Logger.d(TAG, "Surface available " + surfaceContainer); + + mVirtualDisplay = + mCarContext.getSystemService(DisplayManager.class) + .createVirtualDisplay(VIRTUAL_DISPLAY_NAME, surfaceContainer.getWidth(), surfaceContainer.getHeight(), + surfaceContainer.getDpi(), surfaceContainer.getSurface(), 0); + mPresentation = new Presentation(mCarContext, mVirtualDisplay.getDisplay()); + + mPresentation.setContentView(prepareViewForPresentation(mMapController.getView())); + mPresentation.show(); + } + + @Override + public void onSurfaceDestroyed(@NonNull SurfaceContainer surfaceContainer) + { + Logger.d(TAG, "Surface destroyed"); + mPresentation.dismiss(); + mVirtualDisplay.release(); + } + + void stopPresenting() + { + if (mPresentation != null) + mPresentation.dismiss(); + } + + void startPresenting() + { + if (mPresentation != null) + mPresentation.show(); + } + + @NonNull + private View prepareViewForPresentation(@NonNull View view) + { + final ViewParent parent = view.getParent(); + if (parent instanceof ViewGroup) + ((ViewGroup) parent).removeView(view); + + final FrameLayout container = new FrameLayout(mCarContext); + container.addView( + view, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + + return container; + } +} diff --git a/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceCallbackBase.java b/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceCallbackBase.java new file mode 100644 index 000000000..78ea39131 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceCallbackBase.java @@ -0,0 +1,96 @@ +package app.organicmaps.car.renderer; + +import android.graphics.Rect; +import androidx.annotation.NonNull; +import androidx.car.app.CarContext; +import androidx.car.app.SurfaceCallback; +import app.organicmaps.sdk.Framework; +import app.organicmaps.sdk.Map; +import app.organicmaps.sdk.util.concurrency.UiThread; +import app.organicmaps.sdk.util.log.Logger; + +abstract class SurfaceCallbackBase implements SurfaceCallback +{ + @NonNull + private final String TAG; + + @NonNull + protected final CarContext mCarContext; + + @NonNull + protected Rect mVisibleArea = new Rect(); + + public SurfaceCallbackBase(@NonNull CarContext carContext) + { + TAG = getClass().getSimpleName(); + mCarContext = carContext; + } + + @Override + public void onVisibleAreaChanged(@NonNull Rect visibleArea) + { + Logger.d(TAG, "Visible area changed. visibleArea: " + visibleArea); + mVisibleArea = visibleArea; + + if (!mVisibleArea.isEmpty()) + UiThread.runLater(() + -> Framework.nativeSetVisibleRect(mVisibleArea.left, mVisibleArea.top, mVisibleArea.right, + mVisibleArea.bottom)); + } + + @Override + public void onStableAreaChanged(@NonNull Rect stableArea) + { + Logger.d(TAG, "Stable area changed. stableArea: " + stableArea); + + if (!mVisibleArea.isEmpty()) + UiThread.runLater(() + -> Framework.nativeSetVisibleRect(mVisibleArea.left, mVisibleArea.top, mVisibleArea.right, + mVisibleArea.bottom)); + else if (!stableArea.isEmpty()) + UiThread.runLater( + () -> Framework.nativeSetVisibleRect(stableArea.left, stableArea.top, stableArea.right, stableArea.bottom)); + } + + @Override + public void onScroll(float distanceX, float distanceY) + { + Logger.d(TAG, "distanceX: " + distanceX + ", distanceY: " + distanceY); + Map.onScroll(distanceX, distanceY); + } + + @Override + public void onFling(float velocityX, float velocityY) + { + Logger.d(TAG, "velocityX: " + velocityX + ", velocityY: " + velocityY); + // TODO: Implement fling in the native code. + } + + @Override + public void onScale(float focusX, float focusY, float scaleFactor) + { + Logger.d(TAG, "focusX: " + focusX + ", focusY: " + focusY + ", scaleFactor: " + scaleFactor); + float x = focusX; + float y = focusY; + + if (!mVisibleArea.isEmpty()) + { + // If a focal point value is negative, use the center point of the visible area. + if (x < 0) + x = mVisibleArea.centerX(); + if (y < 0) + y = mVisibleArea.centerY(); + } + + final boolean animated = Float.compare(scaleFactor, 2f) == 0; + + Map.onScale(scaleFactor, x, y, animated); + } + + @Override + public void onClick(float x, float y) + { + Logger.d(TAG, "x: " + x + ", y: " + y); + Map.onClick(x, y); + } +} diff --git a/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceCallbackLegacy.java b/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceCallbackLegacy.java new file mode 100644 index 000000000..9135ee5ba --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceCallbackLegacy.java @@ -0,0 +1,60 @@ +package app.organicmaps.car.renderer; + +import android.graphics.Rect; +import android.view.Surface; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.car.app.CarContext; +import androidx.car.app.SurfaceContainer; +import app.organicmaps.sdk.Map; +import app.organicmaps.sdk.location.LocationHelper; +import app.organicmaps.sdk.util.log.Logger; + +class SurfaceCallbackLegacy extends SurfaceCallbackBase +{ + private static final String TAG = SurfaceCallbackLegacy.class.getSimpleName(); + + @NonNull + private final Map mMap; + + @NonNull + private final LocationHelper mLocationHelper; + + @Nullable + private Surface mSurface = null; + + public SurfaceCallbackLegacy(@NonNull CarContext carContext, @NonNull Map map, @NonNull LocationHelper locationHelper) + { + super(carContext); + mMap = map; + mLocationHelper = locationHelper; + } + + @Override + public void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer) + { + Logger.d(TAG, "Surface available " + surfaceContainer); + + if (mSurface != null) + mSurface.release(); + mSurface = surfaceContainer.getSurface(); + + mMap.setLocationHelper(mLocationHelper); + mMap.onSurfaceCreated(mCarContext, mSurface, + new Rect(0, 0, surfaceContainer.getWidth(), surfaceContainer.getHeight()), + surfaceContainer.getDpi()); + mMap.updateBottomWidgetsOffset(mCarContext, -1, -1); + } + + @Override + public void onSurfaceDestroyed(@NonNull SurfaceContainer surfaceContainer) + { + Logger.d(TAG, "Surface destroyed"); + if (mSurface != null) + { + mSurface.release(); + mSurface = null; + } + mMap.onSurfaceDestroyed(false); + } +} diff --git a/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceRenderer.java b/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceRenderer.java new file mode 100644 index 000000000..3a0822fa0 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceRenderer.java @@ -0,0 +1,53 @@ +package app.organicmaps.car.renderer; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import androidx.car.app.CarContext; +import androidx.lifecycle.LifecycleOwner; +import app.organicmaps.sdk.MapController; +import app.organicmaps.sdk.MapView; +import app.organicmaps.sdk.display.DisplayManager; +import app.organicmaps.sdk.display.DisplayType; +import app.organicmaps.sdk.location.LocationHelper; + +@RequiresApi(23) +class SurfaceRenderer extends Renderer +{ + @NonNull + private final MapController mMapController; + + @NonNull + private final SurfaceCallback mSurfaceCallback; + + public SurfaceRenderer(@NonNull CarContext carContext, @NonNull DisplayManager displayManager, + @NonNull LocationHelper locationHelper, @NonNull LifecycleOwner lifecycleOwner) + { + super(carContext, displayManager, locationHelper, lifecycleOwner); + + mMapController = new MapController(new MapView(carContext, DisplayType.Car), locationHelper, + getMapRenderingListener(), null, false); + mLifecycleOwner.getLifecycle().addObserver(mMapController); + mSurfaceCallback = new SurfaceCallback(mCarContext, mMapController); + setSurfaceCallback(mSurfaceCallback); + } + + @Override + public void enable() + { + super.enable(); + + mMapController.onStart(mLifecycleOwner); + mMapController.updateMyPositionRoutingOffset(0); + mSurfaceCallback.startPresenting(); + } + + @Override + public void disable() + { + super.disable(); + + mMapController.onPause(mLifecycleOwner); + mSurfaceCallback.stopPresenting(); + mMapController.onStop(mLifecycleOwner); + } +} diff --git a/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceRendererLegacy.java b/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceRendererLegacy.java new file mode 100644 index 000000000..0cabd95a7 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/car/renderer/SurfaceRendererLegacy.java @@ -0,0 +1,90 @@ +package app.organicmaps.car.renderer; + +import static app.organicmaps.sdk.display.DisplayType.Car; + +import androidx.annotation.NonNull; +import androidx.car.app.CarContext; +import androidx.lifecycle.LifecycleOwner; +import app.organicmaps.sdk.Map; +import app.organicmaps.sdk.display.DisplayManager; +import app.organicmaps.sdk.location.LocationHelper; +import app.organicmaps.sdk.util.log.Logger; + +class SurfaceRendererLegacy extends Renderer +{ + private static final String TAG = SurfaceRendererLegacy.class.getSimpleName(); + + @NonNull + private final Map mMap = new Map(Car); + + public SurfaceRendererLegacy(@NonNull CarContext carContext, @NonNull DisplayManager displayManager, + @NonNull LocationHelper locationHelper, @NonNull LifecycleOwner lifecycleOwner) + { + super(carContext, displayManager, locationHelper, lifecycleOwner); + setSurfaceCallback(new SurfaceCallbackLegacy(mCarContext, mMap, mLocationHelper)); + mMap.setMapRenderingListener(getMapRenderingListener()); + } + + @Override + public void onCreate(@NonNull LifecycleOwner owner) + { + super.onCreate(owner); + mMap.onCreate(false); + } + + @Override + public void onStart(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + if (mDisplayManager.isCarDisplayUsed()) + mMap.onStart(); + } + + @Override + public void onResume(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + if (mDisplayManager.isCarDisplayUsed()) + { + mMap.onResume(); + mMap.updateMyPositionRoutingOffset(0); + } + } + + @Override + public void onPause(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + if (mDisplayManager.isCarDisplayUsed()) + mMap.onPause(); + } + + @Override + public void onStop(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + if (mDisplayManager.isCarDisplayUsed()) + mMap.onStop(); + } + + @Override + public void enable() + { + super.enable(); + + mMap.onStart(); + mMap.setMapRenderingListener(getMapRenderingListener()); + mMap.updateMyPositionRoutingOffset(0); + } + + @Override + public void disable() + { + super.disable(); + + mMap.onPause(); + mMap.onSurfaceDestroyed(false); + mMap.onStop(); + mMap.setMapRenderingListener(null); + } +} diff --git a/android/app/src/main/java/app/organicmaps/car/screens/CategoriesScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/CategoriesScreen.java index 9d46d4033..0dc05ec50 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/CategoriesScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/CategoriesScreen.java @@ -15,30 +15,29 @@ import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapWithContentTemplate; import androidx.core.graphics.drawable.IconCompat; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.screens.search.SearchOnMapScreen; -import app.organicmaps.car.util.ThemeUtils; import app.organicmaps.car.util.UiHelpers; import java.util.Arrays; import java.util.List; public class CategoriesScreen extends BaseMapScreen { - private record CategoryData(@StringRes int nameResId, @DrawableRes int iconResId, @DrawableRes int iconNightResId) {} + private record CategoryData(@StringRes int nameResId, @DrawableRes int iconResId) {} - private static final List CATEGORIES = Arrays.asList( - new CategoryData(R.string.category_fuel, R.drawable.ic_category_fuel, R.drawable.ic_category_fuel_night), - new CategoryData(R.string.category_parking, R.drawable.ic_category_parking, R.drawable.ic_category_parking_night), - new CategoryData(R.string.category_eat, R.drawable.ic_category_eat, R.drawable.ic_category_eat_night), - new CategoryData(R.string.category_food, R.drawable.ic_category_food, R.drawable.ic_category_food_night), - new CategoryData(R.string.category_hotel, R.drawable.ic_category_hotel, R.drawable.ic_category_hotel_night), - new CategoryData(R.string.category_toilet, R.drawable.ic_category_toilet, R.drawable.ic_category_toilet_night), - new CategoryData(R.string.category_rv, R.drawable.ic_category_rv, R.drawable.ic_category_rv_night)); + private static final List CATEGORIES = + Arrays.asList(new CategoryData(R.string.category_fuel, R.drawable.ic_category_fuel), + new CategoryData(R.string.category_parking, R.drawable.ic_category_parking), + new CategoryData(R.string.category_eat, R.drawable.ic_category_eat), + new CategoryData(R.string.category_food, R.drawable.ic_category_food), + new CategoryData(R.string.category_hotel, R.drawable.ic_category_hotel), + new CategoryData(R.string.category_toilet, R.drawable.ic_category_toilet), + new CategoryData(R.string.category_rv, R.drawable.ic_category_rv)); private final int MAX_CATEGORIES_SIZE; - public CategoriesScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public CategoriesScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { super(carContext, surfaceRenderer); final ConstraintManager constraintManager = getCarContext().getCarService(ConstraintManager.class); @@ -47,7 +46,7 @@ public class CategoriesScreen extends BaseMapScreen @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); @@ -67,7 +66,6 @@ public class CategoriesScreen extends BaseMapScreen @NonNull private GridTemplate createCategoriesListTemplate() { - final boolean isNightMode = ThemeUtils.isNightMode(getCarContext()); final ItemList.Builder builder = new ItemList.Builder(); final int categoriesSize = Math.min(CATEGORIES.size(), MAX_CATEGORIES_SIZE); for (int i = 0; i < categoriesSize; ++i) @@ -75,7 +73,7 @@ public class CategoriesScreen extends BaseMapScreen final GridItem.Builder itemBuilder = new GridItem.Builder(); final String title = getCarContext().getString(CATEGORIES.get(i).nameResId); @DrawableRes - final int iconResId = isNightMode ? CATEGORIES.get(i).iconNightResId : CATEGORIES.get(i).iconResId; + final int iconResId = CATEGORIES.get(i).iconResId; itemBuilder.setTitle(title); itemBuilder.setImage(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), iconResId)).build()); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/ErrorScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/ErrorScreen.java index b6b71f053..4069d0efa 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/ErrorScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/ErrorScreen.java @@ -43,7 +43,7 @@ public class ErrorScreen extends BaseScreen implements UserActionRequired @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MessageTemplate.Builder builder = new MessageTemplate.Builder(getCarContext().getString(mErrorMessage)); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/FreeDriveScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/FreeDriveScreen.java index 7772ce041..072512812 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/FreeDriveScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/FreeDriveScreen.java @@ -9,20 +9,20 @@ import androidx.car.app.model.Template; import androidx.car.app.navigation.model.NavigationTemplate; import androidx.core.graphics.drawable.IconCompat; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.util.UiHelpers; public class FreeDriveScreen extends BaseMapScreen { - public FreeDriveScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public FreeDriveScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { super(carContext, surfaceRenderer); } @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final NavigationTemplate.Builder builder = new NavigationTemplate.Builder(); builder.setMapActionStrip(UiHelpers.createMapActionStrip(getCarContext(), getSurfaceRenderer())); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/MapPlaceholderScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/MapPlaceholderScreen.java index 467ddb0af..971bed012 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/MapPlaceholderScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/MapPlaceholderScreen.java @@ -22,7 +22,7 @@ public class MapPlaceholderScreen extends BaseScreen @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MessageTemplate.Builder builder = new MessageTemplate.Builder(getCarContext().getString(R.string.car_used_on_the_phone_screen)); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/MapScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/MapScreen.java index e27ef4beb..6d81192ce 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/MapScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/MapScreen.java @@ -14,7 +14,7 @@ import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapWithContentTemplate; import androidx.core.graphics.drawable.IconCompat; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.screens.bookmarks.BookmarkCategoriesScreen; import app.organicmaps.car.screens.search.SearchScreen; @@ -24,14 +24,14 @@ import app.organicmaps.car.util.UiHelpers; public class MapScreen extends BaseMapScreen { - public MapScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public MapScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { super(carContext, surfaceRenderer); } @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { SuggestionsHelpers.updateSuggestions(getCarContext()); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/NavigationScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/NavigationScreen.java index 968b2d86f..eb6125b7f 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/NavigationScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/NavigationScreen.java @@ -20,7 +20,7 @@ import androidx.lifecycle.LifecycleOwner; import app.organicmaps.MwmApplication; import app.organicmaps.R; import app.organicmaps.car.CarAppService; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.screens.settings.DrivingOptionsScreen; import app.organicmaps.car.util.Colors; @@ -70,7 +70,7 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final NavigationTemplate.Builder builder = new NavigationTemplate.Builder(); builder.setBackgroundColor(Colors.NAVIGATION_TEMPLATE_BACKGROUND); @@ -104,7 +104,11 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController public void onAutoDriveEnabled() { Logger.i(TAG); - final JunctionInfo[] points = Framework.nativeGetRouteJunctionPoints(); + + /// @todo Pass maxDistM from RouteSimulationProvider? + /// Result speed between points will be in range (25, 50] km/h (for 1 second update interval). + final double kMaxDistM = 13.9; // 13.9 m/s == 50 km/h + final JunctionInfo[] points = Framework.nativeGetRouteJunctionPoints(kMaxDistM); if (points == null) { Logger.e(TAG, "Navigation has not started yet"); @@ -121,6 +125,8 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController if (!mNavigationCancelled) CarToast.makeText(getCarContext(), getCarContext().getString(R.string.trip_finished), CarToast.LENGTH_LONG) .show(); + NavigationService.stopService(getCarContext()); + ThemeUtils.update(getCarContext()); finish(); getScreenManager().popToRoot(); } @@ -128,7 +134,7 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController @Override public void onCreate(@NonNull LifecycleOwner owner) { - Logger.d(TAG); + super.onCreate(owner); mRoutingController.attach(this); ThemeUtils.update(getCarContext()); mNavigationManager.setNavigationManagerCallback(this); @@ -144,20 +150,19 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController @Override public void onResume(@NonNull LifecycleOwner owner) { - Logger.d(TAG); + super.onResume(owner); mRoutingController.attach(this); } @Override public void onDestroy(@NonNull LifecycleOwner owner) { - NavigationService.stopService(getCarContext()); + super.onDestroy(owner); MwmApplication.from(getCarContext()).getLocationHelper().removeListener(mLocationListener); if (mRoutingController.isNavigating()) mRoutingController.onSaveState(); mRoutingController.detach(); - ThemeUtils.update(getCarContext()); mNavigationManager.navigationEnded(); mNavigationManager.clearNavigationManagerCallback(); } @@ -257,9 +262,9 @@ public class NavigationScreen extends BaseMapScreen implements RoutingController @NonNull private final CarContext mCarContext; @NonNull - private final SurfaceRenderer mSurfaceRenderer; + private final Renderer mSurfaceRenderer; - public Builder(@NonNull final CarContext carContext, @NonNull final SurfaceRenderer surfaceRenderer) + public Builder(@NonNull final CarContext carContext, @NonNull final Renderer surfaceRenderer) { mCarContext = carContext; mSurfaceRenderer = surfaceRenderer; diff --git a/android/app/src/main/java/app/organicmaps/car/screens/PlaceScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/PlaceScreen.java index 96489d783..47e9b7d42 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/PlaceScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/PlaceScreen.java @@ -26,7 +26,7 @@ import androidx.core.graphics.drawable.IconCompat; import androidx.lifecycle.LifecycleOwner; import app.organicmaps.MwmApplication; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.screens.download.DownloadMapsScreenBuilder; import app.organicmaps.car.screens.settings.DrivingOptionsScreen; @@ -46,7 +46,7 @@ import java.util.Objects; public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback.Callback, RoutingController.Container { - private static final Router ROUTER = Router.Vehicle; + public static final Router ROUTER = Router.Vehicle; @Nullable private MapObject mMapObject; @@ -68,7 +68,7 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback. @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); @@ -80,6 +80,7 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback. @Override public void onCreate(@NonNull LifecycleOwner owner) { + super.onCreate(owner); mRoutingController.restore(); if (mRoutingController.isNavigating() && mRoutingController.getLastRouterType() == ROUTER) { @@ -112,12 +113,14 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback. @Override public void onResume(@NonNull LifecycleOwner owner) { + super.onResume(owner); mRoutingController.attach(this); } @Override public void onDestroy(@NonNull LifecycleOwner owner) { + super.onDestroy(owner); if (mRoutingController.isPlanning()) mRoutingController.onSaveState(); if (!mRoutingController.isNavigating()) @@ -340,11 +343,11 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback. @NonNull private final CarContext mCarContext; @NonNull - private final SurfaceRenderer mSurfaceRenderer; + private final Renderer mSurfaceRenderer; @Nullable private MapObject mMapObject; - public Builder(@NonNull final CarContext carContext, @NonNull final SurfaceRenderer surfaceRenderer) + public Builder(@NonNull final CarContext carContext, @NonNull final Renderer surfaceRenderer) { mCarContext = carContext; mSurfaceRenderer = surfaceRenderer; diff --git a/android/app/src/main/java/app/organicmaps/car/screens/base/BaseMapScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/base/BaseMapScreen.java index f502074df..88eb2b77f 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/base/BaseMapScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/base/BaseMapScreen.java @@ -2,21 +2,21 @@ package app.organicmaps.car.screens.base; import androidx.annotation.NonNull; import androidx.car.app.CarContext; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; public abstract class BaseMapScreen extends BaseScreen { @NonNull - private final SurfaceRenderer mSurfaceRenderer; + private final Renderer mSurfaceRenderer; - public BaseMapScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public BaseMapScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { super(carContext); mSurfaceRenderer = surfaceRenderer; } @NonNull - protected SurfaceRenderer getSurfaceRenderer() + protected Renderer getSurfaceRenderer() { return mSurfaceRenderer; } diff --git a/android/app/src/main/java/app/organicmaps/car/screens/base/BaseScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/base/BaseScreen.java index a54fd570b..44f8aedb5 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/base/BaseScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/base/BaseScreen.java @@ -1,15 +1,71 @@ package app.organicmaps.car.screens.base; +import androidx.annotation.CallSuper; import androidx.annotation.NonNull; import androidx.car.app.CarContext; import androidx.car.app.Screen; +import androidx.car.app.model.Template; import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import app.organicmaps.sdk.util.log.Logger; public abstract class BaseScreen extends Screen implements DefaultLifecycleObserver { + @NonNull + private final String TAG; + public BaseScreen(@NonNull CarContext carContext) { super(carContext); + TAG = getClass().getSimpleName(); + getLifecycle().addObserver(this); } + + @NonNull + protected abstract Template onGetTemplateImpl(); + + @Override + @NonNull + public final Template onGetTemplate() + { + Logger.d(TAG); + return onGetTemplateImpl(); + } + + @CallSuper + public void onCreate(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + } + + @CallSuper + public void onStart(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + } + + @CallSuper + public void onResume(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + } + + @CallSuper + public void onPause(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + } + + @CallSuper + public void onStop(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + } + + @CallSuper + public void onDestroy(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + } } diff --git a/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/BookmarkCategoriesScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/BookmarkCategoriesScreen.java index 52c8e722a..fae1f3d4d 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/BookmarkCategoriesScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/BookmarkCategoriesScreen.java @@ -11,7 +11,7 @@ import androidx.car.app.model.Row; import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapWithContentTemplate; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.util.UiHelpers; import app.organicmaps.sdk.bookmarks.data.BookmarkCategory; @@ -23,7 +23,7 @@ public class BookmarkCategoriesScreen extends BaseMapScreen { private final int MAX_CATEGORIES_SIZE; - public BookmarkCategoriesScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public BookmarkCategoriesScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { super(carContext, surfaceRenderer); final ConstraintManager constraintManager = getCarContext().getCarService(ConstraintManager.class); @@ -32,7 +32,7 @@ public class BookmarkCategoriesScreen extends BaseMapScreen @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/BookmarksScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/BookmarksScreen.java index 218483c48..ffc964492 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/BookmarksScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/BookmarksScreen.java @@ -13,7 +13,7 @@ import androidx.car.app.navigation.model.MapWithContentTemplate; import androidx.core.graphics.drawable.IconCompat; import androidx.lifecycle.LifecycleOwner; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.util.UiHelpers; import app.organicmaps.sdk.bookmarks.data.BookmarkCategory; @@ -31,7 +31,7 @@ public class BookmarksScreen extends BaseMapScreen private boolean mIsOnSortingScreen = false; - public BookmarksScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer, + public BookmarksScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer, @NonNull BookmarkCategory bookmarkCategory) { super(carContext, surfaceRenderer); @@ -41,7 +41,7 @@ public class BookmarksScreen extends BaseMapScreen @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); @@ -52,6 +52,7 @@ public class BookmarksScreen extends BaseMapScreen @Override public void onStop(@NonNull LifecycleOwner owner) { + super.onStop(owner); if (!mIsOnSortingScreen) mBookmarksLoader.cancel(); } diff --git a/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/SortingScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/SortingScreen.java index 44eb459bc..c935c686b 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/SortingScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/bookmarks/SortingScreen.java @@ -16,7 +16,7 @@ import androidx.core.graphics.drawable.IconCompat; import androidx.lifecycle.LifecycleOwner; import app.organicmaps.MwmApplication; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.util.UiHelpers; import app.organicmaps.sdk.bookmarks.data.BookmarkCategory; @@ -38,7 +38,7 @@ class SortingScreen extends BaseMapScreen private @BookmarkManager.SortingType int mNewSortingType; - public SortingScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer, + public SortingScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer, @NonNull BookmarkCategory bookmarkCategory) { super(carContext, surfaceRenderer); @@ -53,7 +53,7 @@ class SortingScreen extends BaseMapScreen @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/download/DownloadMapsForFirstLaunchScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/download/DownloadMapsForFirstLaunchScreen.java index 9e423f3e7..0beca6d82 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/download/DownloadMapsForFirstLaunchScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/download/DownloadMapsForFirstLaunchScreen.java @@ -23,6 +23,7 @@ class DownloadMapsForFirstLaunchScreen extends DownloadMapsScreen @Override public void onResume(@NonNull LifecycleOwner owner) { + super.onResume(owner); // Attempting to streamline initial download by including the current country in the list of missing maps for // simultaneous retrieval. final Location location = MwmApplication.from(getCarContext()).getLocationHelper().getSavedLocation(); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/download/DownloadMapsScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/download/DownloadMapsScreen.java index 13572b934..15db37379 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/download/DownloadMapsScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/download/DownloadMapsScreen.java @@ -34,7 +34,7 @@ public abstract class DownloadMapsScreen extends BaseScreen @NonNull @Override - public final Template onGetTemplate() + protected final Template onGetTemplateImpl() { final MessageTemplate.Builder builder = new MessageTemplate.Builder(getText(getMapsSize(mMissingMaps))); final Header.Builder headerBuilder = new Header.Builder(); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/download/DownloaderScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/download/DownloaderScreen.java index 117e6fedc..4a2f80efe 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/download/DownloaderScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/download/DownloaderScreen.java @@ -102,6 +102,7 @@ class DownloaderScreen extends BaseScreen @Override public void onResume(@NonNull LifecycleOwner owner) { + super.onResume(owner); if (mSubscriptionSlot == 0) mSubscriptionSlot = MapManager.nativeSubscribe(mStorageCallback); for (final var item : mMissingMaps.entrySet()) @@ -114,6 +115,7 @@ class DownloaderScreen extends BaseScreen @Override public void onPause(@NonNull LifecycleOwner owner) { + super.onPause(owner); if (!mIsDownloadFailed) cancelMapsDownloading(); if (mSubscriptionSlot != 0) @@ -125,7 +127,7 @@ class DownloaderScreen extends BaseScreen @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MessageTemplate.Builder builder = new MessageTemplate.Builder(getText()); builder.setLoading(true); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/permissions/RequestPermissionsScreenWithApi.java b/android/app/src/main/java/app/organicmaps/car/screens/permissions/RequestPermissionsScreenWithApi.java index 1f1c950c5..ca95f7d4b 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/permissions/RequestPermissionsScreenWithApi.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/permissions/RequestPermissionsScreenWithApi.java @@ -37,7 +37,7 @@ public class RequestPermissionsScreenWithApi extends BaseScreen implements UserA @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MessageTemplate.Builder builder = new MessageTemplate.Builder(getCarContext().getString(R.string.aa_request_permission_activity_text)); @@ -63,6 +63,7 @@ public class RequestPermissionsScreenWithApi extends BaseScreen implements UserA @Override public void onResume(@NonNull LifecycleOwner owner) { + super.onResume(owner); // Let's review the permissions once more, as we might enter this function following an ErrorScreen situation // where the user manually enabled location permissions. if (LocationUtils.checkFineLocationPermission(getCarContext())) diff --git a/android/app/src/main/java/app/organicmaps/car/screens/permissions/RequestPermissionsScreenWithNotification.java b/android/app/src/main/java/app/organicmaps/car/screens/permissions/RequestPermissionsScreenWithNotification.java index 50f8dac53..2b4de9342 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/permissions/RequestPermissionsScreenWithNotification.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/permissions/RequestPermissionsScreenWithNotification.java @@ -47,7 +47,7 @@ public class RequestPermissionsScreenWithNotification extends BaseScreen impleme @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MessageTemplate.Builder builder = new MessageTemplate.Builder(getCarContext().getString(R.string.aa_location_permissions_request)); @@ -66,6 +66,7 @@ public class RequestPermissionsScreenWithNotification extends BaseScreen impleme @RequiresPermission(value = Manifest.permission.POST_NOTIFICATIONS) public void onStart(@NonNull LifecycleOwner owner) { + super.onStart(owner); mIsPermissionCheckEnabled = true; mBackgroundExecutor.execute(this::checkPermissions); sendPermissionsRequestNotification(); @@ -74,12 +75,14 @@ public class RequestPermissionsScreenWithNotification extends BaseScreen impleme @Override public void onStop(@NonNull LifecycleOwner owner) { + super.onStop(owner); mIsPermissionCheckEnabled = false; } @Override public void onDestroy(@NonNull LifecycleOwner owner) { + super.onDestroy(owner); NotificationManagerCompat.from(getCarContext()).cancel(NOTIFICATION_ID); } diff --git a/android/app/src/main/java/app/organicmaps/car/screens/search/SearchOnMapScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/search/SearchOnMapScreen.java index 481604af8..ae0965efb 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/search/SearchOnMapScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/search/SearchOnMapScreen.java @@ -17,7 +17,7 @@ import androidx.core.graphics.drawable.IconCompat; import androidx.lifecycle.LifecycleOwner; import app.organicmaps.MwmApplication; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.util.UiHelpers; import app.organicmaps.sdk.bookmarks.data.MapObject; @@ -54,7 +54,7 @@ public class SearchOnMapScreen extends BaseMapScreen implements SearchListener @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); @@ -136,12 +136,14 @@ public class SearchOnMapScreen extends BaseMapScreen implements SearchListener @Override public void onStart(@NonNull LifecycleOwner owner) { + super.onStart(owner); SearchEngine.INSTANCE.addListener(this); } @Override public void onResume(@NonNull LifecycleOwner owner) { + super.onResume(owner); SearchEngine.INSTANCE.cancel(); final MapObject location = MwmApplication.from(getCarContext()).getLocationHelper().getMyPosition(); @@ -156,6 +158,7 @@ public class SearchOnMapScreen extends BaseMapScreen implements SearchListener @Override public void onStop(@NonNull LifecycleOwner owner) { + super.onStop(owner); SearchEngine.INSTANCE.removeListener(this); SearchEngine.INSTANCE.cancel(); } @@ -177,7 +180,7 @@ public class SearchOnMapScreen extends BaseMapScreen implements SearchListener @NonNull private final CarContext mCarContext; @NonNull - private final SurfaceRenderer mSurfaceRenderer; + private final Renderer mSurfaceRenderer; @NonNull private String mQuery = ""; @@ -185,7 +188,7 @@ public class SearchOnMapScreen extends BaseMapScreen implements SearchListener private String mLocale; private boolean mIsCategory; - public Builder(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public Builder(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { mCarContext = carContext; mSurfaceRenderer = surfaceRenderer; diff --git a/android/app/src/main/java/app/organicmaps/car/screens/search/SearchScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/search/SearchScreen.java index 2b7661e03..7b1ed77cb 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/search/SearchScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/search/SearchScreen.java @@ -16,7 +16,7 @@ import androidx.core.graphics.drawable.IconCompat; import androidx.lifecycle.LifecycleOwner; import app.organicmaps.MwmApplication; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.search.SearchEngine; @@ -50,7 +50,7 @@ public class SearchScreen extends BaseMapScreen implements SearchTemplate.Search @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final SearchTemplate.Builder builder = new SearchTemplate.Builder(this); builder.setHeaderAction(Action.BACK); @@ -106,12 +106,14 @@ public class SearchScreen extends BaseMapScreen implements SearchTemplate.Search @Override public void onStart(@NonNull LifecycleOwner owner) { + super.onStart(owner); SearchEngine.INSTANCE.addListener(this); } @Override public void onStop(@NonNull LifecycleOwner owner) { + super.onStop(owner); SearchEngine.INSTANCE.removeListener(this); SearchEngine.INSTANCE.cancel(); } @@ -209,14 +211,14 @@ public class SearchScreen extends BaseMapScreen implements SearchTemplate.Search @NonNull private final CarContext mCarContext; @NonNull - private final SurfaceRenderer mSurfaceRenderer; + private final Renderer mSurfaceRenderer; @NonNull private String mQuery = ""; @NonNull private String mLocale; - public Builder(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public Builder(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { mCarContext = carContext; mSurfaceRenderer = surfaceRenderer; diff --git a/android/app/src/main/java/app/organicmaps/car/screens/settings/DrivingOptionsScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/settings/DrivingOptionsScreen.java index 1567cc715..90624f414 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/settings/DrivingOptionsScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/settings/DrivingOptionsScreen.java @@ -13,7 +13,7 @@ import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapWithContentTemplate; import androidx.lifecycle.LifecycleOwner; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.util.Toggle; import app.organicmaps.car.util.UiHelpers; @@ -31,12 +31,13 @@ public class DrivingOptionsScreen extends BaseMapScreen private final DrivingOption[] mDrivingOptions = {new DrivingOption(RoadType.Toll, R.string.avoid_tolls), new DrivingOption(RoadType.Dirty, R.string.avoid_unpaved), new DrivingOption(RoadType.Ferry, R.string.avoid_ferry), - new DrivingOption(RoadType.Motorway, R.string.avoid_motorways)}; + new DrivingOption(RoadType.Motorway, R.string.avoid_motorways), + new DrivingOption(RoadType.Steps, R.string.avoid_steps)}; @NonNull private final Map mInitialDrivingOptionsState = new HashMap<>(); - public DrivingOptionsScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public DrivingOptionsScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { super(carContext, surfaceRenderer); @@ -45,7 +46,7 @@ public class DrivingOptionsScreen extends BaseMapScreen @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); @@ -56,6 +57,7 @@ public class DrivingOptionsScreen extends BaseMapScreen @Override public void onStop(@NonNull LifecycleOwner owner) { + super.onStop(owner); for (final DrivingOption drivingOption : mDrivingOptions) { if (Boolean.TRUE.equals(mInitialDrivingOptionsState.get(drivingOption.roadType)) diff --git a/android/app/src/main/java/app/organicmaps/car/screens/settings/HelpScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/settings/HelpScreen.java index e1b8430de..56f884bd9 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/settings/HelpScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/settings/HelpScreen.java @@ -12,7 +12,7 @@ import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapWithContentTemplate; import app.organicmaps.BuildConfig; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.util.UiHelpers; import app.organicmaps.sdk.Framework; @@ -20,14 +20,14 @@ import app.organicmaps.sdk.util.DateUtils; public class HelpScreen extends BaseMapScreen { - public HelpScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public HelpScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { super(carContext, surfaceRenderer); } @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/settings/SettingsScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/settings/SettingsScreen.java index 1cb2ed8ef..da7b5afe0 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/settings/SettingsScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/settings/SettingsScreen.java @@ -13,7 +13,7 @@ import androidx.car.app.model.Row; import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapWithContentTemplate; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.util.ThemeUtils; import app.organicmaps.car.util.Toggle; @@ -33,14 +33,14 @@ public class SettingsScreen extends BaseMapScreen void set(boolean newValue); } - public SettingsScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public SettingsScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { super(carContext, surfaceRenderer); } @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/settings/ThemeScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/settings/ThemeScreen.java index 25e66e368..086d4daa1 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/settings/ThemeScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/settings/ThemeScreen.java @@ -12,7 +12,7 @@ import androidx.car.app.model.Template; import androidx.car.app.navigation.model.MapWithContentTemplate; import androidx.core.graphics.drawable.IconCompat; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.util.ThemeUtils; import app.organicmaps.car.util.UiHelpers; @@ -24,7 +24,7 @@ public class ThemeScreen extends BaseMapScreen @NonNull private final CarIcon mRadioButtonSelectedIcon; - public ThemeScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer) + public ThemeScreen(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer) { super(carContext, surfaceRenderer); mRadioButtonIcon = @@ -35,7 +35,7 @@ public class ThemeScreen extends BaseMapScreen @NonNull @Override - public Template onGetTemplate() + protected Template onGetTemplateImpl() { final MapWithContentTemplate.Builder builder = new MapWithContentTemplate.Builder(); builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer())); diff --git a/android/app/src/main/java/app/organicmaps/car/util/IntentUtils.java b/android/app/src/main/java/app/organicmaps/car/util/IntentUtils.java index ab37fbd72..e53da5233 100644 --- a/android/app/src/main/java/app/organicmaps/car/util/IntentUtils.java +++ b/android/app/src/main/java/app/organicmaps/car/util/IntentUtils.java @@ -12,7 +12,7 @@ import androidx.car.app.notification.CarPendingIntent; import app.organicmaps.MwmApplication; import app.organicmaps.api.Const; import app.organicmaps.car.CarAppService; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.NavigationScreen; import app.organicmaps.car.screens.search.SearchScreen; import app.organicmaps.sdk.Framework; @@ -30,7 +30,7 @@ public final class IntentUtils private static final int SEARCH_IN_VIEWPORT_ZOOM = 16; - public static void processIntent(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer, + public static void processIntent(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer, @NonNull Intent intent) { final String action = intent.getAction(); @@ -50,8 +50,8 @@ public final class IntentUtils } // https://developer.android.com/reference/androidx/car/app/CarContext#startCarApp(android.content.Intent) - private static void processNavigationIntent(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer, - @NonNull Intent intent) + private static void processNavigationIntent(@NonNull CarContext carContext, + @NonNull Renderer surfaceRenderer, @NonNull Intent intent) { // TODO (AndrewShkrob): This logic will need to be revised when we introduce support for adding stops during // navigation or route planning. Skip navigation intents during navigation diff --git a/android/app/src/main/java/app/organicmaps/car/util/UiHelpers.java b/android/app/src/main/java/app/organicmaps/car/util/UiHelpers.java index ada151fcb..214e0cac0 100644 --- a/android/app/src/main/java/app/organicmaps/car/util/UiHelpers.java +++ b/android/app/src/main/java/app/organicmaps/car/util/UiHelpers.java @@ -15,7 +15,7 @@ import androidx.car.app.navigation.model.MapController; import androidx.core.graphics.drawable.IconCompat; import app.organicmaps.MwmApplication; import app.organicmaps.R; -import app.organicmaps.car.SurfaceRenderer; +import app.organicmaps.car.renderer.Renderer; import app.organicmaps.car.screens.base.BaseMapScreen; import app.organicmaps.car.screens.settings.SettingsScreen; import app.organicmaps.sdk.Map; @@ -33,13 +33,14 @@ public final class UiHelpers { @NonNull public static ActionStrip createSettingsActionStrip(@NonNull BaseMapScreen mapScreen, - @NonNull SurfaceRenderer surfaceRenderer) + @NonNull Renderer surfaceRenderer) { return new ActionStrip.Builder().addAction(createSettingsAction(mapScreen, surfaceRenderer)).build(); } @NonNull - public static ActionStrip createMapActionStrip(@NonNull CarContext context, @NonNull SurfaceRenderer surfaceRenderer) + public static ActionStrip createMapActionStrip(@NonNull CarContext context, + @NonNull Renderer surfaceRenderer) { final CarIcon iconPlus = new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_plus)).build(); final CarIcon iconMinus = new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_minus)).build(); @@ -58,27 +59,30 @@ public final class UiHelpers } @NonNull - public static MapController createMapController(@NonNull CarContext context, @NonNull SurfaceRenderer surfaceRenderer) + public static MapController createMapController(@NonNull CarContext context, + @NonNull Renderer surfaceRenderer) { return new MapController.Builder().setMapActionStrip(createMapActionStrip(context, surfaceRenderer)).build(); } @NonNull - public static Action createSettingsAction(@NonNull BaseMapScreen mapScreen, @NonNull SurfaceRenderer surfaceRenderer) + public static Action createSettingsAction(@NonNull BaseMapScreen mapScreen, + @NonNull Renderer surfaceRenderer) { return createSettingsAction(mapScreen, surfaceRenderer, null); } @NonNull public static Action createSettingsActionForResult(@NonNull BaseMapScreen mapScreen, - @NonNull SurfaceRenderer surfaceRenderer, + @NonNull Renderer surfaceRenderer, @NonNull OnScreenResultListener onScreenResultListener) { return createSettingsAction(mapScreen, surfaceRenderer, onScreenResultListener); } @NonNull - private static Action createSettingsAction(@NonNull BaseMapScreen mapScreen, @NonNull SurfaceRenderer surfaceRenderer, + private static Action createSettingsAction(@NonNull BaseMapScreen mapScreen, + @NonNull Renderer surfaceRenderer, @Nullable OnScreenResultListener onScreenResultListener) { final CarContext context = mapScreen.getCarContext(); @@ -120,7 +124,7 @@ public final class UiHelpers final Row.Builder builder = new Row.Builder(); builder.setImage( - new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_operating_hours)).build()); + new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_opening_hours)).build()); if (isEmptyTT) builder.setTitle(ohStr); diff --git a/android/app/src/main/java/app/organicmaps/dialog/EditTextDialogFragment.java b/android/app/src/main/java/app/organicmaps/dialog/EditTextDialogFragment.java index f29d2fc2e..2bbe8ef4e 100644 --- a/android/app/src/main/java/app/organicmaps/dialog/EditTextDialogFragment.java +++ b/android/app/src/main/java/app/organicmaps/dialog/EditTextDialogFragment.java @@ -40,7 +40,6 @@ public class EditTextDialogFragment extends BaseMwmDialogFragment private String mHint; private TextInputEditText mEtInput; private TextInputLayout mEtInputLayout; - private Button mPositiveButton; private Validator mInputValidator; private OnTextSaveListener mTextSaveListener; @@ -117,21 +116,20 @@ public class EditTextDialogFragment extends BaseMwmDialogFragment AlertDialog editTextDialog = new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog) .setView(buildView()) .setNegativeButton(negativeButtonText, null) - .setPositiveButton(positiveButtonText, - (dialog, which) -> { - final String result = mEtInput.getText().toString(); - processInput(result); - dismiss(); - }) + .setPositiveButton(positiveButtonText, null) .create(); - // Wait till alert is shown to get mPositiveButton. + // Set up onClick listener for mPositiveButton. editTextDialog.setOnShowListener((dialog) -> { - mPositiveButton = editTextDialog.getButton(DialogInterface.BUTTON_POSITIVE); - final FragmentActivity activity = getActivity(); - if (activity == null) - return; - this.validateInput(activity, mInitialText); + Button positiveButton = editTextDialog.getButton(DialogInterface.BUTTON_POSITIVE); + + positiveButton.setOnClickListener(view -> { + final String result = mEtInput.getText().toString(); + if (validateInput(requireActivity(), result)) { + processInput(result); + editTextDialog.dismiss(); + } + }); }); // Setup validation on input edit. @@ -149,14 +147,16 @@ public class EditTextDialogFragment extends BaseMwmDialogFragment return editTextDialog; } - private void validateInput(@NonNull FragmentActivity activity, @Nullable String input) + private boolean validateInput(@NonNull FragmentActivity activity, @Nullable String input) { - if (mPositiveButton != null && mInputValidator != null) + if (mInputValidator != null) { final String maybeError = mInputValidator.validate(activity, input); - mPositiveButton.setEnabled(maybeError == null); mEtInputLayout.getEditText().setError(maybeError); + mEtInputLayout.requestFocus(); + return maybeError == null; } + return false; } private void processInput(@Nullable String text) diff --git a/android/app/src/main/java/app/organicmaps/editor/EditorFragment.java b/android/app/src/main/java/app/organicmaps/editor/EditorFragment.java index e4f86fe97..c9a33b2c4 100644 --- a/android/app/src/main/java/app/organicmaps/editor/EditorFragment.java +++ b/android/app/src/main/java/app/organicmaps/editor/EditorFragment.java @@ -1,13 +1,19 @@ package app.organicmaps.editor; +import android.annotation.SuppressLint; import android.content.Context; import android.os.Bundle; +import android.text.Editable; import android.text.InputType; import android.text.TextUtils; +import android.text.TextWatcher; import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AutoCompleteTextView; +import android.widget.GridLayout; +import android.widget.Toast; import androidx.annotation.CallSuper; import androidx.annotation.DrawableRes; import androidx.annotation.IdRes; @@ -22,6 +28,7 @@ import app.organicmaps.base.BaseMwmFragment; import app.organicmaps.dialog.EditTextDialogFragment; import app.organicmaps.editor.data.TimeFormatUtils; import app.organicmaps.sdk.Framework; +import app.organicmaps.sdk.bookmarks.data.ChargeSocketDescriptor; import app.organicmaps.sdk.bookmarks.data.Metadata; import app.organicmaps.sdk.editor.Editor; import app.organicmaps.sdk.editor.OpeningHours; @@ -30,26 +37,33 @@ import app.organicmaps.sdk.editor.data.LocalizedStreet; import app.organicmaps.sdk.editor.data.Timetable; import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.Utils; +import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.util.Graphics; import app.organicmaps.util.InputUtils; import app.organicmaps.util.UiUtils; - import com.google.android.material.button.MaterialButton; +import com.google.android.material.card.MaterialCardView; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.imageview.ShapeableImageView; import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; import com.google.android.material.textview.MaterialTextView; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; public class EditorFragment extends BaseMwmFragment implements View.OnClickListener { final static String LAST_INDEX_OF_NAMES_ARRAY = "LastIndexOfNamesArray"; + private static final String CHARGE_SOCKETS_TAG = "CHARGE_SOCKETS_TAG"; private MaterialTextView mCategory; private View mCardName; private View mCardAddress; + private View mCardChargingStation; private View mCardDetails; private View mCardSocialMedia; private View mCardBuilding; @@ -130,6 +144,8 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe private TextInputLayout mInputHouseNumber; private TextInputLayout mInputBuildingLevels; + private View mChargeSockets; + private View mEmptyOpeningHours; private MaterialTextView mOpeningHours; private View mEditOpeningHours; @@ -206,6 +222,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe mWifi.setChecked(Editor.nativeHasWifi()); // TODO Reimplement this to avoid https://github.com/organicmaps/organicmaps/issues/9049 // mOutdoorSeating.setChecked(Editor.nativeGetSwitchInput(Metadata.MetadataType.FMD_OUTDOOR_SEATING.toInt(),"yes")); + refreshChargeSockets(); refreshOpeningTime(); refreshEditableFields(); refreshResetButton(); @@ -329,6 +346,14 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe final int[] editableDetails = Editor.nativeGetEditableProperties(); + // charge sockets have their own card; check whether we should display it. + boolean hasChargeSockets = false; + for (int type : editableDetails) + { + hasChargeSockets = hasChargeSockets || (type == Metadata.MetadataType.FMD_CHARGE_SOCKETS.toInt()); + } + UiUtils.showIf(hasChargeSockets, mCardChargingStation); + setCardVisibility(mCardDetails, mDetailsBlocks, editableDetails); setCardVisibility(mCardSocialMedia, mSocialMediaBlocks, editableDetails); } @@ -351,6 +376,283 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe UiUtils.showIf(anyBlockElement, card); } + /** + * Builds a dialog for editing or adding a charge socket. + * + * @param socketIndex The index of the socket to edit, or -1 to add a new socket. + * @param type The current type of the socket (e.g., "type2", "type2_combo"). + * @param count The current number of sockets of this type or 0 for new socket. + * @param power The current power output of the socket in kW or 0 for new socket. + * @return A MaterialAlertDialogBuilder instance for the configured dialog. + */ + private MaterialAlertDialogBuilder buildChargeSocketDialog(int socketIndex, String type, int count, double power) + { + LayoutInflater inflater = LayoutInflater.from(getActivity()); + View dialogView = inflater.inflate(R.layout.dialog_edit_socket, null); + + GridLayout typeBtns = dialogView.findViewById(R.id.edit_socket_type_grid); + typeBtns.removeAllViews(); + + List SOCKET_TYPES = Arrays.stream(getResources().getStringArray(R.array.charge_socket_types)).toList(); + for (String socket : SOCKET_TYPES) + { + MaterialButton btn = (MaterialButton) inflater.inflate(R.layout.button_socket_type, typeBtns, false); + + btn.setTag(R.id.socket_type, socket); + + // load SVG icon converted into VectorDrawable in res/drawable + @SuppressLint("DiscouragedApi") + int resIconId = + getResources().getIdentifier("ic_charge_socket_" + socket, "drawable", requireContext().getPackageName()); + if (resIconId != 0) + { + btn.setIcon(getResources().getDrawable(resIconId)); + } + + @SuppressLint("DiscouragedApi") + int resTypeId = + getResources().getIdentifier("charge_socket_" + socket, "string", requireContext().getPackageName()); + if (resTypeId != 0) + { + btn.setText(getResources().getString(resTypeId)); + } + + if (socket.equals(type)) + { + btn.setChecked(true); + } + + typeBtns.addView(btn); + } + + // manage the grid of socket type buttons as a single 'radio group' + // (this can not be done with a MaterialButtonToggleGroup because it does + // not support GridLayout) + List buttonList = new ArrayList<>(); + + for (int i = 0; i < typeBtns.getChildCount(); i++) + { + View child = typeBtns.getChildAt(i); + if (child instanceof MaterialButton button) + { + buttonList.add(button); + + button.setOnClickListener(view -> { + // deselect all + for (MaterialButton b : buttonList) + { + b.setChecked(false); + } + // select clicked + button.setChecked(true); + }); + } + } + + TextInputLayout countInputLayout = dialogView.findViewById(R.id.edit_socket_count_layout); + AutoCompleteTextView countView = dialogView.findViewById(R.id.edit_socket_count); + if (count > 0) + { + countView.setText(String.valueOf(count)); + } + + // Add a TextWatcher to validate on text change + countView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) {} + + @Override + public void afterTextChanged(Editable s) { + validatePositiveField(s.toString(), countInputLayout); + } + }); + + TextInputLayout powerInputLayout = dialogView.findViewById(R.id.edit_socket_power_layout); + AutoCompleteTextView powerView = dialogView.findViewById(R.id.edit_socket_power); + if (power > 0) + { + powerView.setText(String.valueOf(power)); + } + + // Add a TextWatcher to validate on text change + powerView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) {} + + @Override + public void afterTextChanged(Editable s) { + validatePositiveField(s.toString(), powerInputLayout); + } + }); + + return new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog) + .setTitle(R.string.editor_socket) + .setView(dialogView) + .setPositiveButton(R.string.save, + (dialog, which) -> { + String socketType = ""; + for (MaterialButton b : buttonList) + { + if (b.isChecked()) + { + socketType = b.getTag(R.id.socket_type).toString(); + break; + } + } + + int countValue = 0; // 0 means 'unknown count' + try + { + countValue = Integer.parseInt(countView.getText().toString()); + } + catch (NumberFormatException ignored) + { + Logger.w(CHARGE_SOCKETS_TAG, "Invalid count value for socket:" + countView.getText().toString()); + } + + if (countValue < 0) + { + countValue = 0; + Logger.w(CHARGE_SOCKETS_TAG, "Invalid count value for socket:" + countView.getText().toString()); + } + + double powerValue = 0; // 0 means 'unknown power' + try + { + powerValue = Double.parseDouble(powerView.getText().toString()); + } + catch (NumberFormatException ignored) + { + Logger.w(CHARGE_SOCKETS_TAG, "Invalid power value for socket:" + powerView.getText().toString()); + } + + if (powerValue < 0) + { + powerValue = 0; + Logger.w(CHARGE_SOCKETS_TAG, "Invalid power value for socket:" + powerView.getText().toString()); + } + + ChargeSocketDescriptor socket = + new ChargeSocketDescriptor(socketType, countValue, powerValue); + + updateChargeSockets(socketIndex, socket); + }) + .setNegativeButton(R.string.cancel, (dialog, which) -> { dialog.dismiss(); }); + } + + // Helper method for validation logic + private boolean validatePositiveField(String text, TextInputLayout layout) { + if (text.isEmpty()) { + layout.setError(null); // No error if empty (assuming 0 is the default) + return true; + } + try { + double value = Double.parseDouble(text); + if (value < 0) { + layout.setError(getString(R.string.error_value_must_be_positive)); + return false; + } else { + layout.setError(null); + return true; + } + } catch (NumberFormatException e) { + layout.setError(getString(R.string.error_invalid_number)); + return false; + } + } + /** + * Updates the list of charge sockets. + * If socketIndex is >=0, it updates the socket at that index. + * Otherwise, it adds the new socket to the list. + * + * @param socketIndex The index of the socket to update, or -1 to add a new socket. + * @param socket The ChargeSocketDescriptor of the socket to add or update. + */ + private void updateChargeSockets(int socketIndex, ChargeSocketDescriptor socket) + { + ChargeSocketDescriptor[] sockets = Editor.nativeGetChargeSockets(); + if (socketIndex >= 0) + { + sockets[socketIndex] = socket; + } + else { + List list = new ArrayList<>(Arrays.asList(sockets)); + list.add(socket); + sockets = list.toArray(new ChargeSocketDescriptor[0]); + } + Editor.nativeSetChargeSockets(sockets); + + refreshChargeSockets(); + } + private void refreshChargeSockets() + { + ChargeSocketDescriptor[] sockets = Editor.nativeGetChargeSockets(); + + LayoutInflater inflater = LayoutInflater.from(requireContext()); + + GridLayout socketsGrid = mChargeSockets.findViewById(R.id.socket_grid_editor); + socketsGrid.removeAllViews(); + + for (int i = 0; i < sockets.length; i++) + { + final int currentIndex = i; + ChargeSocketDescriptor socket = sockets[i]; + + View itemView = inflater.inflate(R.layout.item_charge_socket, socketsGrid, false); + + MaterialTextView type = itemView.findViewById(R.id.socket_type); + ShapeableImageView icon = itemView.findViewById(R.id.socket_icon); + MaterialTextView power = itemView.findViewById(R.id.socket_power); + MaterialTextView count = itemView.findViewById(R.id.socket_count); + + // load SVG icon converted into VectorDrawable in res/drawable + @SuppressLint("DiscouragedApi") + int resIconId = getResources().getIdentifier("ic_charge_socket_" + socket.type(), "drawable", + requireContext().getPackageName()); + if (resIconId != 0) + { + icon.setImageResource(resIconId); + } + + @SuppressLint("DiscouragedApi") + int resTypeId = + getResources().getIdentifier("charge_socket_" + socket.type(), "string", requireContext().getPackageName()); + if (resTypeId != 0) + { + type.setText(resTypeId); + } + + if (socket.power() != 0) + { + DecimalFormat df = new DecimalFormat("#.##"); + power.setText(getString(R.string.kw_label, df.format(socket.power()))); + } + + if (socket.count() != 0) + { + count.setText(getString(R.string.count_label, socket.count())); + } + + itemView.setOnClickListener(v -> { + buildChargeSocketDialog(currentIndex, socket.type(), socket.count(), socket.power()).show(); + }); + socketsGrid.addView(itemView); + } + + // add a 'new item' button at the end, to create new sockets + View btnNewItemView = inflater.inflate(R.layout.button_new_item, socketsGrid, false); + btnNewItemView.setOnClickListener(v -> { + buildChargeSocketDialog(-1, "unknown", -1, -1).show(); + }); + socketsGrid.addView(btnNewItemView); + } + private void refreshOpeningTime() { final String openingHours = Editor.nativeGetOpeningHours(); @@ -435,6 +737,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe mCategory = categoryBlock.findViewById(R.id.name); mCardName = view.findViewById(R.id.cv__name); mCardAddress = view.findViewById(R.id.cv__address); + mCardChargingStation = view.findViewById(R.id.cv__charging_station); mCardDetails = view.findViewById(R.id.cv__details); mCardSocialMedia = view.findViewById(R.id.cv__social_media); mCardBuilding = view.findViewById(R.id.cv__building); @@ -507,6 +810,9 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe View blockOutdoorSeating = view.findViewById(R.id.block_outdoor_seating); mOutdoorSeating = view.findViewById(R.id.sw__outdoor_seating); blockOutdoorSeating.setOnClickListener(this); + + mChargeSockets = view.findViewById(R.id.block_charge_sockets); + View blockOpeningHours = view.findViewById(R.id.block_opening_hours); mEditOpeningHours = blockOpeningHours.findViewById(R.id.edit_opening_hours); mEditOpeningHours.setOnClickListener(this); @@ -701,7 +1007,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe private void placeDoesntExist() { EditTextDialogFragment dialogFragment = EditTextDialogFragment.show( - getString(R.string.editor_place_doesnt_exist), "", getString(R.string.editor_comment_hint), + getString(R.string.editor_place_doesnt_exist), "", getString(R.string.editor_place_doesnt_exist_description), getString(R.string.editor_report_problem_send_button), getString(R.string.cancel), this, getDeleteCommentValidator()); dialogFragment.setTextSaveListener(this::commitPlaceDoesntExists); diff --git a/android/app/src/main/java/app/organicmaps/editor/HoursMinutesPickerFragment.java b/android/app/src/main/java/app/organicmaps/editor/HoursMinutesPickerFragment.java index 923c5f5c3..c09ad53c5 100644 --- a/android/app/src/main/java/app/organicmaps/editor/HoursMinutesPickerFragment.java +++ b/android/app/src/main/java/app/organicmaps/editor/HoursMinutesPickerFragment.java @@ -13,7 +13,6 @@ import android.widget.TextView; import android.widget.TimePicker; import androidx.annotation.IntRange; import androidx.annotation.NonNull; -import androidx.annotation.StyleRes; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.content.res.AppCompatResources; import androidx.fragment.app.FragmentManager; @@ -21,7 +20,6 @@ import app.organicmaps.R; import app.organicmaps.base.BaseMwmDialogFragment; import app.organicmaps.sdk.editor.data.HoursMinutes; import app.organicmaps.sdk.util.DateUtils; -import app.organicmaps.util.ThemeUtils; import app.organicmaps.util.Utils; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.tabs.TabLayout; @@ -79,15 +77,13 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment // noinspection ConstantConditions mTabs.getTabAt(mSelectedTab).select(); - @StyleRes - final int theme = ThemeUtils.isNightTheme() ? R.style.MwmMain_DialogFragment_TimePicker_Night - : R.style.MwmMain_DialogFragment_TimePicker; - final AlertDialog dialog = new MaterialAlertDialogBuilder(requireActivity(), theme) - .setView(root) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.ok, null) - .setCancelable(true) - .create(); + final AlertDialog dialog = + new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmMain_DialogFragment_TimePicker) + .setView(root) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.ok, null) + .setCancelable(true) + .create(); dialog.setOnShowListener(dialogInterface -> { mOkButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE); @@ -141,9 +137,8 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment mTabs = root.findViewById(R.id.tabs); MaterialTextView tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false); tabView.setText(getResources().getString(R.string.editor_time_from)); - final ColorStateList textColor = AppCompatResources.getColorStateList( - requireContext(), - ThemeUtils.isNightTheme() ? R.color.accent_color_selector_night : R.color.accent_color_selector); + final ColorStateList textColor = + AppCompatResources.getColorStateList(requireContext(), R.color.accent_color_selector); tabView.setTextColor(textColor); mTabs.addTab(mTabs.newTab().setCustomView(tabView), true); tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false); diff --git a/android/app/src/main/java/app/organicmaps/editor/ProfileFragment.java b/android/app/src/main/java/app/organicmaps/editor/ProfileFragment.java index 4a952124c..af7e43149 100644 --- a/android/app/src/main/java/app/organicmaps/editor/ProfileFragment.java +++ b/android/app/src/main/java/app/organicmaps/editor/ProfileFragment.java @@ -22,7 +22,6 @@ import app.organicmaps.util.UiUtils; import app.organicmaps.util.Utils; import app.organicmaps.util.WindowInsetUtils; import app.organicmaps.widget.StackedButtonDialogFragment; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.imageview.ShapeableImageView; import com.google.android.material.textview.MaterialTextView; import java.text.NumberFormat; @@ -135,14 +134,7 @@ public class ProfileFragment extends BaseMwmToolbarFragment private void logout() { - new MaterialAlertDialogBuilder(requireContext(), R.style.MwmTheme_AlertDialog) - .setMessage(R.string.osm_log_out_confirmation) - .setPositiveButton(R.string.yes, - (dialog, which) -> { - OsmOAuth.clearAuthorization(); - refreshViews(); - }) - .setNegativeButton(R.string.no, null) - .show(); + OsmOAuth.clearAuthorization(); + refreshViews(); } } diff --git a/android/app/src/main/java/app/organicmaps/maplayer/LayerBottomSheetItem.java b/android/app/src/main/java/app/organicmaps/maplayer/LayerBottomSheetItem.java index a8b06d26c..1114b96ec 100644 --- a/android/app/src/main/java/app/organicmaps/maplayer/LayerBottomSheetItem.java +++ b/android/app/src/main/java/app/organicmaps/maplayer/LayerBottomSheetItem.java @@ -2,6 +2,7 @@ package app.organicmaps.maplayer; import android.content.Context; import android.view.View; +import androidx.annotation.AttrRes; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.StringRes; @@ -13,9 +14,7 @@ import app.organicmaps.util.ThemeUtils; public class LayerBottomSheetItem { @DrawableRes - private final int mEnabledStateDrawableResId; - @DrawableRes - private final int mDisabledStateDrawableResId; + private final int mDrawableResId; @StringRes private final int mTitleResId; @NonNull @@ -23,12 +22,10 @@ public class LayerBottomSheetItem @NonNull private final OnItemClickListener mItemClickListener; - LayerBottomSheetItem(@DrawableRes int enabledStateDrawableResId, @DrawableRes int disabledStateDrawableResId, - @StringRes int titleResId, @NonNull Mode mode, + LayerBottomSheetItem(@DrawableRes int drawableResId, @StringRes int titleResId, @NonNull Mode mode, @NonNull OnItemClickListener itemClickListener) { - mEnabledStateDrawableResId = enabledStateDrawableResId; - mDisabledStateDrawableResId = disabledStateDrawableResId; + mDrawableResId = drawableResId; mTitleResId = titleResId; mMode = mode; mItemClickListener = itemClickListener; @@ -37,35 +34,30 @@ public class LayerBottomSheetItem public static LayerBottomSheetItem create(@NonNull Context mContext, Mode mode, @NonNull OnItemClickListener layerItemClickListener) { - int disabledResource = 0; - int enabledResource = 0; + @DrawableRes + int drawableResId = 0; + @StringRes int buttonTextResource = R.string.layers_title; switch (mode) { case OUTDOORS: - disabledResource = R.attr.outdoorsMenuDisabled; - enabledResource = R.attr.outdoorsMenuEnabled; + drawableResId = R.drawable.ic_layers_outdoors; buttonTextResource = R.string.button_layer_outdoor; break; case SUBWAY: - disabledResource = R.attr.subwayMenuDisabled; - enabledResource = R.attr.subwayMenuEnabled; + drawableResId = R.drawable.ic_layers_subway; buttonTextResource = R.string.subway; break; case ISOLINES: - disabledResource = R.attr.isoLinesMenuDisabled; - enabledResource = R.attr.isoLinesMenuEnabled; + drawableResId = R.drawable.ic_layers_isoline; buttonTextResource = R.string.button_layer_isolines; break; case TRAFFIC: - disabledResource = R.attr.trafficMenuDisabled; - enabledResource = R.attr.trafficMenuEnabled; + drawableResId = R.drawable.ic_layers_traffic; buttonTextResource = R.string.button_layer_traffic; break; } - int disabled = ThemeUtils.getResource(mContext, disabledResource); - int enabled = ThemeUtils.getResource(mContext, enabledResource); - return new LayerBottomSheetItem(enabled, disabled, buttonTextResource, mode, layerItemClickListener); + return new LayerBottomSheetItem(drawableResId, buttonTextResource, mode, layerItemClickListener); } @NonNull @@ -75,15 +67,9 @@ public class LayerBottomSheetItem } @DrawableRes - public int getEnabledStateDrawable() + public int getDrawable() { - return mEnabledStateDrawableResId; - } - - @DrawableRes - public int getDisabledStateDrawable() - { - return mDisabledStateDrawableResId; + return mDrawableResId; } @StringRes diff --git a/android/app/src/main/java/app/organicmaps/maplayer/LayersAdapter.java b/android/app/src/main/java/app/organicmaps/maplayer/LayersAdapter.java index fc8021cc7..e54c40482 100644 --- a/android/app/src/main/java/app/organicmaps/maplayer/LayersAdapter.java +++ b/android/app/src/main/java/app/organicmaps/maplayer/LayersAdapter.java @@ -45,7 +45,8 @@ public class LayersAdapter extends RecyclerView.Adapter holder.mTitle.setText(item.getTitle()); boolean isNewLayer = SharedPropertiesUtils.shouldShowNewMarkerForLayerMode(item.getMode()); UiUtils.showIf(isNewLayer, holder.mNewMarker); - holder.mButton.setImageResource(isEnabled ? item.getEnabledStateDrawable() : item.getDisabledStateDrawable()); + holder.mButton.setBackgroundResource(item.getDrawable()); + holder.mButton.setActivated(isEnabled); holder.mListener = item::onClick; } diff --git a/android/app/src/main/java/app/organicmaps/maplayer/traffic/widget/TrafficButton.java b/android/app/src/main/java/app/organicmaps/maplayer/traffic/widget/TrafficButton.java index ccf986ab1..e129fe1a4 100644 --- a/android/app/src/main/java/app/organicmaps/maplayer/traffic/widget/TrafficButton.java +++ b/android/app/src/main/java/app/organicmaps/maplayer/traffic/widget/TrafficButton.java @@ -43,20 +43,19 @@ public class TrafficButton void turnOff() { stopWaitingAnimation(); - mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_on_night : R.drawable.ic_traffic_on); + mButton.setImageResource(R.drawable.ic_traffic_on); } void turnOn() { stopWaitingAnimation(); - mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_on_night : R.drawable.ic_traffic_on); + mButton.setImageResource(R.drawable.ic_traffic_on); } void markAsOutdated() { stopWaitingAnimation(); - mButton.setImageResource(ThemeUtils.isNightTheme() ? R.drawable.ic_traffic_outdated_night - : R.drawable.ic_traffic_outdated); + mButton.setImageResource(R.drawable.ic_traffic_outdated); } void startWaitingAnimation() diff --git a/android/app/src/main/java/app/organicmaps/search/CategoriesAdapter.java b/android/app/src/main/java/app/organicmaps/search/CategoriesAdapter.java index 53d80fc89..0f3b72227 100644 --- a/android/app/src/main/java/app/organicmaps/search/CategoriesAdapter.java +++ b/android/app/src/main/java/app/organicmaps/search/CategoriesAdapter.java @@ -20,7 +20,6 @@ import com.google.android.material.textview.MaterialTextView; import app.organicmaps.R; import app.organicmaps.sdk.search.DisplayedCategories; import app.organicmaps.sdk.util.Language; -import app.organicmaps.util.ThemeUtils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Locale; @@ -91,11 +90,7 @@ class CategoriesAdapter extends RecyclerView.Adapter getFragmentClass() { diff --git a/android/app/src/main/java/app/organicmaps/settings/BaseXmlSettingsFragment.java b/android/app/src/main/java/app/organicmaps/settings/BaseXmlSettingsFragment.java index ddc63a6ea..3961d2218 100644 --- a/android/app/src/main/java/app/organicmaps/settings/BaseXmlSettingsFragment.java +++ b/android/app/src/main/java/app/organicmaps/settings/BaseXmlSettingsFragment.java @@ -12,7 +12,6 @@ import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import androidx.recyclerview.widget.RecyclerView; import app.organicmaps.R; -import app.organicmaps.util.ThemeUtils; import app.organicmaps.util.Utils; import app.organicmaps.util.WindowInsetUtils.ScrollableContentInsetsListener; @@ -35,24 +34,17 @@ abstract class BaseXmlSettingsFragment extends PreferenceFragmentCompat } @Override - public void onAttach(Context context) + public void onAttach(@NonNull Context context) { super.onAttach(context); Utils.detachFragmentIfCoreNotInitialized(context, this); } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - - int color; - if (ThemeUtils.isDefaultTheme()) - color = ContextCompat.getColor(requireContext(), R.color.bg_cards); - else - color = ContextCompat.getColor(requireContext(), R.color.bg_cards_night); - view.setBackgroundColor(color); - + view.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.bg_cards)); RecyclerView recyclerView = getListView(); ViewCompat.setOnApplyWindowInsetsListener(recyclerView, new ScrollableContentInsetsListener(recyclerView)); } diff --git a/android/app/src/main/java/app/organicmaps/settings/DrivingOptionsFragment.java b/android/app/src/main/java/app/organicmaps/settings/DrivingOptionsFragment.java index 18349133b..aee0aa2ce 100644 --- a/android/app/src/main/java/app/organicmaps/settings/DrivingOptionsFragment.java +++ b/android/app/src/main/java/app/organicmaps/settings/DrivingOptionsFragment.java @@ -107,6 +107,11 @@ public class DrivingOptionsFragment extends BaseMwmToolbarFragment dirtyRoadsBtn.setChecked(RoutingOptions.hasOption(RoadType.Dirty)); CompoundButton.OnCheckedChangeListener dirtyBtnListener = new ToggleRoutingOptionListener(RoadType.Dirty); dirtyRoadsBtn.setOnCheckedChangeListener(dirtyBtnListener); + + SwitchCompat stepsBtn = root.findViewById(R.id.avoid_steps_btn); + stepsBtn.setChecked(RoutingOptions.hasOption(RoadType.Steps)); + CompoundButton.OnCheckedChangeListener stepsBtnListener = new ToggleRoutingOptionListener(RoadType.Steps); + stepsBtn.setOnCheckedChangeListener(stepsBtnListener); } private static class ToggleRoutingOptionListener implements CompoundButton.OnCheckedChangeListener diff --git a/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java b/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java index b6c5d4cc3..d7a62bf35 100644 --- a/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java +++ b/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java @@ -60,7 +60,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/android/app/src/main/java/app/organicmaps/settings/VoiceInstructionsSettingsFragment.java b/android/app/src/main/java/app/organicmaps/settings/VoiceInstructionsSettingsFragment.java index 2a9292153..e9633d7ef 100644 --- a/android/app/src/main/java/app/organicmaps/settings/VoiceInstructionsSettingsFragment.java +++ b/android/app/src/main/java/app/organicmaps/settings/VoiceInstructionsSettingsFragment.java @@ -137,7 +137,7 @@ public class VoiceInstructionsSettingsFragment extends BaseXmlSettingsFragment } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/android/app/src/main/java/app/organicmaps/util/ThemeSwitcher.java b/android/app/src/main/java/app/organicmaps/util/ThemeSwitcher.java index c82c0d5ed..0fd76f918 100644 --- a/android/app/src/main/java/app/organicmaps/util/ThemeSwitcher.java +++ b/android/app/src/main/java/app/organicmaps/util/ThemeSwitcher.java @@ -86,7 +86,7 @@ public enum ThemeSwitcher String oldTheme = Config.UiTheme.getCurrent(); MapStyle style; - if (ThemeUtils.isNightTheme()) + if (Config.UiTheme.isNight(theme)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) uiModeManager.setApplicationNightMode(UiModeManager.MODE_NIGHT_YES); diff --git a/android/app/src/main/java/app/organicmaps/util/ThemeUtils.java b/android/app/src/main/java/app/organicmaps/util/ThemeUtils.java index 8f44e5654..9225e057d 100644 --- a/android/app/src/main/java/app/organicmaps/util/ThemeUtils.java +++ b/android/app/src/main/java/app/organicmaps/util/ThemeUtils.java @@ -6,8 +6,6 @@ import android.util.TypedValue; import androidx.annotation.AttrRes; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; -import androidx.annotation.StyleRes; -import app.organicmaps.R; import app.organicmaps.sdk.util.Config; public final class ThemeUtils @@ -64,28 +62,4 @@ public final class ThemeUtils { return Config.UiTheme.isNavAuto(Config.UiTheme.getUiThemeSettings()); } - - @StyleRes - public static int getCardBgThemeResourceId(@NonNull String theme) - { - if (Config.UiTheme.isDefault(theme)) - return R.style.MwmTheme_CardBg; - - if (Config.UiTheme.isNight(theme)) - return R.style.MwmTheme_Night_CardBg; - - throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme); - } - - @StyleRes - public static int getWindowBgThemeResourceId(@NonNull String theme) - { - if (Config.UiTheme.isDefault(theme)) - return R.style.MwmTheme_WindowBg; - - if (Config.UiTheme.isNight(theme)) - return R.style.MwmTheme_Night_WindowBg; - - throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme); - } } diff --git a/android/app/src/main/java/app/organicmaps/widget/RoutingToolbarButton.java b/android/app/src/main/java/app/organicmaps/widget/RoutingToolbarButton.java index e51e84105..3e1744a95 100644 --- a/android/app/src/main/java/app/organicmaps/widget/RoutingToolbarButton.java +++ b/android/app/src/main/java/app/organicmaps/widget/RoutingToolbarButton.java @@ -35,9 +35,8 @@ public class RoutingToolbarButton extends AppCompatRadioButton private void initView() { - final boolean isNightTheme = ThemeUtils.isNightTheme(); - setBackgroundResource(isNightTheme ? R.drawable.routing_toolbar_button_night : R.drawable.routing_toolbar_button); - setButtonTintList(isNightTheme ? R.color.routing_toolbar_icon_tint_night : R.color.routing_toolbar_icon_tint); + setBackgroundResource(R.drawable.routing_toolbar_button); + setButtonTintList(R.color.routing_toolbar_icon_tint); } public void progress() diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageView.java b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageView.java index e4c86bc19..9a4938425 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageView.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageView.java @@ -72,6 +72,7 @@ import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment; import app.organicmaps.util.bottomsheet.MenuBottomSheetItem; import app.organicmaps.widget.ArrowView; import app.organicmaps.widget.placepage.sections.PlacePageBookmarkFragment; +import app.organicmaps.widget.placepage.sections.PlacePageChargeSocketsFragment; import app.organicmaps.widget.placepage.sections.PlacePageLinksFragment; import app.organicmaps.widget.placepage.sections.PlacePageOpeningHoursFragment; import app.organicmaps.widget.placepage.sections.PlacePagePhoneFragment; @@ -98,6 +99,7 @@ public class PlacePageView extends Fragment private static final String BOOKMARK_FRAGMENT_TAG = "BOOKMARK_FRAGMENT_TAG"; private static final String TRACK_FRAGMENT_TAG = "TRACK_FRAGMENT_TAG"; private static final String WIKIPEDIA_FRAGMENT_TAG = "WIKIPEDIA_FRAGMENT_TAG"; + private static final String CHARGE_SOCKETS_FRAGMENT_TAG = "CHARGE_SOCKETS_FRAGMENT_TAG"; private static final String PHONE_FRAGMENT_TAG = "PHONE_FRAGMENT_TAG"; private static final String OPENING_HOURS_FRAGMENT_TAG = "OPENING_HOURS_FRAGMENT_TAG"; private static final String LINKS_FRAGMENT_TAG = "LINKS_FRAGMENT_TAG"; @@ -146,7 +148,6 @@ public class PlacePageView extends Fragment private MaterialTextView mTvEntrance; private MaterialTextView mTvLastChecked; private View mEditPlace; - private View mAddOrganisation; private View mAddPlace; private View mEditTopSpace; private ShapeableImageView mColorIcon; @@ -311,7 +312,6 @@ public class PlacePageView extends Fragment mTvEntrance = mEntrance.findViewById(R.id.tv__place_entrance); mTvLastChecked = mFrame.findViewById(R.id.place_page_last_checked); mEditPlace = mFrame.findViewById(R.id.ll__place_editor); - mAddOrganisation = mFrame.findViewById(R.id.ll__add_organisation); mAddPlace = mFrame.findViewById(R.id.ll__place_add); mEditTopSpace = mFrame.findViewById(R.id.edit_top_space); latlon.setOnLongClickListener(this); @@ -407,6 +407,12 @@ public class PlacePageView extends Fragment R.id.place_page_opening_hours_fragment, !TextUtils.isEmpty(ohStr)); } + private void updateChargeSocketsView() + { + updateViewFragment(PlacePageChargeSocketsFragment.class, CHARGE_SOCKETS_FRAGMENT_TAG, + R.id.place_page_charge_sockets_fragment, mMapObject.hasChargeSockets()); + } + private void updatePhoneView() { updateViewFragment(PlacePagePhoneFragment.class, PHONE_FRAGMENT_TAG, R.id.place_page_phone_fragment, @@ -665,28 +671,25 @@ public class PlacePageView extends Fragment if (!lastChecked.isEmpty()) { String periodSinceCheck = DateUtils.getRelativePeriodString(getResources(), lastChecked); - UiUtils.setTextAndShow(mTvLastChecked, requireContext().getString(R.string.existence_confirmed_time_ago, periodSinceCheck)); + UiUtils.setTextAndShow(mTvLastChecked, + requireContext().getString(R.string.existence_confirmed_time_ago, periodSinceCheck)); } else UiUtils.hide(mTvLastChecked); if (RoutingController.get().isNavigating() || RoutingController.get().isPlanning()) { - UiUtils.hide(mEditPlace, mAddOrganisation, mAddPlace, mEditTopSpace); + UiUtils.hide(mEditPlace, mAddPlace, mEditTopSpace); } else { UiUtils.showIf(Editor.nativeShouldShowEditPlace(), mEditPlace); - UiUtils.showIf(Editor.nativeShouldShowAddBusiness(), mAddOrganisation); UiUtils.showIf(Editor.nativeShouldShowAddPlace(), mAddPlace); MaterialButton mTvEditPlace = mEditPlace.findViewById(R.id.mb__place_editor); - MaterialButton mTvAddBusiness = mAddOrganisation.findViewById(R.id.mb__add_organisation); MaterialButton mTvAddPlace = mAddPlace.findViewById(R.id.mb__place_add); mTvEditPlace.setOnClickListener(this); - mTvAddBusiness.setOnClickListener(this); mTvAddPlace.setOnClickListener(this); mTvEditPlace.setEnabled(Editor.nativeShouldEnableEditPlace()); - mTvAddBusiness.setEnabled(Editor.nativeShouldEnableAddPlace()); mTvAddPlace.setEnabled(Editor.nativeShouldEnableAddPlace()); final int editPlaceButtonColor = Editor.nativeShouldEnableEditPlace() @@ -695,19 +698,18 @@ public class PlacePageView extends Fragment UiUtils.getStyledResourceId(getContext(), com.google.android.material.R.attr.colorSecondary)) : ContextCompat.getColor(getContext(), R.color.button_accent_text_disabled); mTvEditPlace.setTextColor(editPlaceButtonColor); - mTvAddBusiness.setTextColor(editPlaceButtonColor); mTvAddPlace.setTextColor(editPlaceButtonColor); mTvEditPlace.setStrokeColor(ColorStateList.valueOf(editPlaceButtonColor)); - mTvAddBusiness.setStrokeColor(ColorStateList.valueOf(editPlaceButtonColor)); mTvAddPlace.setStrokeColor(ColorStateList.valueOf(editPlaceButtonColor)); UiUtils.showIf( - UiUtils.isVisible(mEditPlace) || UiUtils.isVisible(mAddOrganisation) || UiUtils.isVisible(mAddPlace), + UiUtils.isVisible(mEditPlace) || UiUtils.isVisible(mAddPlace), mEditTopSpace); } updateLinksView(); updateOpeningHoursView(); updateWikipediaView(); updateBookmarkView(); + updateChargeSocketsView(); updatePhoneView(); updateTrackView(); } @@ -837,11 +839,6 @@ public class PlacePageView extends Fragment UiUtils.hide(mTvOpenState); } - private void addOrganisation() - { - ((MwmActivity) requireActivity()).showPositionChooserForEditor(true, true); - } - private void addPlace() { ((MwmActivity) requireActivity()).showPositionChooserForEditor(false, true); @@ -859,8 +856,6 @@ public class PlacePageView extends Fragment } else if (id == R.id.mb__place_editor) ((MwmActivity) requireActivity()).showEditor(); - else if (id == R.id.mb__add_organisation) - addOrganisation(); else if (id == R.id.mb__place_add) addPlace(); else if (id == R.id.ll__place_latlon) diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/sections/PlacePageChargeSocketsFragment.java b/android/app/src/main/java/app/organicmaps/widget/placepage/sections/PlacePageChargeSocketsFragment.java new file mode 100644 index 000000000..152614d2e --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/sections/PlacePageChargeSocketsFragment.java @@ -0,0 +1,121 @@ +package app.organicmaps.widget.placepage.sections; + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.GridLayout; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.google.android.material.imageview.ShapeableImageView; +import com.google.android.material.textview.MaterialTextView; + +import app.organicmaps.R; +import app.organicmaps.sdk.Framework; +import app.organicmaps.sdk.bookmarks.data.ChargeSocketDescriptor; +import app.organicmaps.sdk.bookmarks.data.MapObject; +import app.organicmaps.sdk.bookmarks.data.Metadata; +import app.organicmaps.widget.placepage.PlacePageViewModel; +import java.text.DecimalFormat; + +public class PlacePageChargeSocketsFragment extends Fragment implements Observer +{ + private GridLayout mGrid; + private PlacePageViewModel mViewModel; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) + { + mViewModel = new ViewModelProvider(requireActivity()).get(PlacePageViewModel.class); + return inflater.inflate(R.layout.place_page_charge_sockets_fragment, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + { + super.onViewCreated(view, savedInstanceState); + + mGrid = view.findViewById(R.id.socket_grid); + } + + @Override + public void onStart() + { + super.onStart(); + mViewModel.getMapObject().observe(requireActivity(), this); + } + + @Override + public void onStop() + { + super.onStop(); + mViewModel.getMapObject().removeObserver(this); + } + + @Override + public void onChanged(@Nullable MapObject mapObject) + { + if (mapObject == null) + { + return; + } + + mGrid.removeAllViews(); + + ChargeSocketDescriptor[] sockets = Framework.nativeGetActiveObjectChargeSockets(); + + LayoutInflater inflater = LayoutInflater.from(requireContext()); + + for (ChargeSocketDescriptor socket : sockets) + { + View itemView = inflater.inflate(R.layout.item_charge_socket, mGrid, false); + + itemView.setClickable(false); + itemView.setFocusable(false); + + MaterialTextView type = itemView.findViewById(R.id.socket_type); + ShapeableImageView icon = itemView.findViewById(R.id.socket_icon); + MaterialTextView power = itemView.findViewById(R.id.socket_power); + MaterialTextView count = itemView.findViewById(R.id.socket_count); + + // load SVG icon converted into VectorDrawable in res/drawable + @SuppressLint("DiscouragedApi") + int resIconId = getResources().getIdentifier("ic_charge_socket_" + socket.type(), "drawable", + requireContext().getPackageName()); + if (resIconId != 0) + { + icon.setImageResource(resIconId); + } + + @SuppressLint("DiscouragedApi") + int resTypeId = + getResources().getIdentifier("charge_socket_" + socket.type(), "string", requireContext().getPackageName()); + if (resTypeId != 0) + { + type.setText(resTypeId); + } + + if (socket.power() != 0) + { + DecimalFormat df = new DecimalFormat("#.##"); + power.setText(getString(R.string.kw_label, df.format(socket.power()))); + } + + if (socket.count() != 0) + { + count.setText(getString(R.string.count_label, socket.count())); + } + + mGrid.addView(itemView); + } + } +} diff --git a/android/app/src/main/res/color/accent_color_selector_night.xml b/android/app/src/main/res/color/accent_color_selector_night.xml deleted file mode 100644 index 5ac5acec9..000000000 --- a/android/app/src/main/res/color/accent_color_selector_night.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/android/app/src/main/res/color/button_accent_night.xml b/android/app/src/main/res/color/button_accent_night.xml deleted file mode 100644 index 15851ecf2..000000000 --- a/android/app/src/main/res/color/button_accent_night.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/color/button_night.xml b/android/app/src/main/res/color/button_night.xml deleted file mode 100644 index e526e5ac6..000000000 --- a/android/app/src/main/res/color/button_night.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/color/routing_toolbar_icon_tint_night.xml b/android/app/src/main/res/color/routing_toolbar_icon_tint_night.xml deleted file mode 100644 index 883a8200a..000000000 --- a/android/app/src/main/res/color/routing_toolbar_icon_tint_night.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_1_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_1.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_1_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_1.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_10_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_10.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_10_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_10.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_11_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_11.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_11_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_11.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_12_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_12.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_12_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_12.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_13_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_13.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_13_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_13.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_14_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_14.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_14_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_14.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_15_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_15.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_15_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_15.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_16_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_16.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_16_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_16.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_17_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_17.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_17_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_17.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_18_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_18.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_18_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_18.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_2_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_2.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_2_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_2.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_3_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_3.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_3_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_3.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_4_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_4.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_4_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_4.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_5_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_5.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_5_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_5.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_6_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_6.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_6_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_6.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_7_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_7.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_7_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_7.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_8_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_8.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_8_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_8.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_9_night.webp b/android/app/src/main/res/drawable-hdpi/ic_spinner_pending_9.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_spinner_pending_9_night.webp rename to android/app/src/main/res/drawable-hdpi/ic_spinner_pending_9.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_1_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_1.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_1_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_1.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_10_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_10.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_10_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_10.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_11_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_11.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_11_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_11.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_12_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_12.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_12_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_12.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_13_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_13.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_13_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_13.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_14_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_14.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_14_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_14.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_15_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_15.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_15_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_15.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_16_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_16.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_16_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_16.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_17_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_17.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_17_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_17.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_18_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_18.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_18_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_18.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_2_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_2.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_2_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_2.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_3_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_3.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_3_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_3.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_4_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_4.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_4_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_4.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_5_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_5.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_5_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_5.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_6_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_6.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_6_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_6.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_7_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_7.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_7_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_7.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_8_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_8.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_8_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_8.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_9_night.webp b/android/app/src/main/res/drawable-mdpi/ic_spinner_pending_9.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_spinner_pending_9_night.webp rename to android/app/src/main/res/drawable-mdpi/ic_spinner_pending_9.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_traffic_download_night_1.webp b/android/app/src/main/res/drawable-night-hdpi/ic_traffic_download_1.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_traffic_download_night_1.webp rename to android/app/src/main/res/drawable-night-hdpi/ic_traffic_download_1.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_traffic_download_night_2.webp b/android/app/src/main/res/drawable-night-hdpi/ic_traffic_download_2.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_traffic_download_night_2.webp rename to android/app/src/main/res/drawable-night-hdpi/ic_traffic_download_2.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_traffic_download_night_3.webp b/android/app/src/main/res/drawable-night-hdpi/ic_traffic_download_3.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_traffic_download_night_3.webp rename to android/app/src/main/res/drawable-night-hdpi/ic_traffic_download_3.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_traffic_on_night.webp b/android/app/src/main/res/drawable-night-hdpi/ic_traffic_on.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_traffic_on_night.webp rename to android/app/src/main/res/drawable-night-hdpi/ic_traffic_on.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_traffic_outdated_night.webp b/android/app/src/main/res/drawable-night-hdpi/ic_traffic_outdated.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_traffic_outdated_night.webp rename to android/app/src/main/res/drawable-night-hdpi/ic_traffic_outdated.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_triangle_night.webp b/android/app/src/main/res/drawable-night-hdpi/ic_triangle.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_triangle_night.webp rename to android/app/src/main/res/drawable-night-hdpi/ic_triangle.webp diff --git a/android/app/src/main/res/drawable-hdpi/ic_triangle_elevation_night.webp b/android/app/src/main/res/drawable-night-hdpi/ic_triangle_elevation.webp similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_triangle_elevation_night.webp rename to android/app/src/main/res/drawable-night-hdpi/ic_triangle_elevation.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_traffic_download_night_1.webp b/android/app/src/main/res/drawable-night-mdpi/ic_traffic_download_1.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_traffic_download_night_1.webp rename to android/app/src/main/res/drawable-night-mdpi/ic_traffic_download_1.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_traffic_download_night_2.webp b/android/app/src/main/res/drawable-night-mdpi/ic_traffic_download_2.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_traffic_download_night_2.webp rename to android/app/src/main/res/drawable-night-mdpi/ic_traffic_download_2.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_traffic_download_night_3.webp b/android/app/src/main/res/drawable-night-mdpi/ic_traffic_download_3.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_traffic_download_night_3.webp rename to android/app/src/main/res/drawable-night-mdpi/ic_traffic_download_3.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_traffic_on_night.webp b/android/app/src/main/res/drawable-night-mdpi/ic_traffic_on.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_traffic_on_night.webp rename to android/app/src/main/res/drawable-night-mdpi/ic_traffic_on.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_traffic_outdated_night.webp b/android/app/src/main/res/drawable-night-mdpi/ic_traffic_outdated.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_traffic_outdated_night.webp rename to android/app/src/main/res/drawable-night-mdpi/ic_traffic_outdated.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_triangle_night.webp b/android/app/src/main/res/drawable-night-mdpi/ic_triangle.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_triangle_night.webp rename to android/app/src/main/res/drawable-night-mdpi/ic_triangle.webp diff --git a/android/app/src/main/res/drawable-mdpi/ic_triangle_elevation_night.webp b/android/app/src/main/res/drawable-night-mdpi/ic_triangle_elevation.webp similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_triangle_elevation_night.webp rename to android/app/src/main/res/drawable-night-mdpi/ic_triangle_elevation.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_traffic_download_night_1.webp b/android/app/src/main/res/drawable-night-xhdpi/ic_traffic_download_1.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_traffic_download_night_1.webp rename to android/app/src/main/res/drawable-night-xhdpi/ic_traffic_download_1.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_traffic_download_night_2.webp b/android/app/src/main/res/drawable-night-xhdpi/ic_traffic_download_2.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_traffic_download_night_2.webp rename to android/app/src/main/res/drawable-night-xhdpi/ic_traffic_download_2.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_traffic_download_night_3.webp b/android/app/src/main/res/drawable-night-xhdpi/ic_traffic_download_3.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_traffic_download_night_3.webp rename to android/app/src/main/res/drawable-night-xhdpi/ic_traffic_download_3.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_traffic_on_night.webp b/android/app/src/main/res/drawable-night-xhdpi/ic_traffic_on.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_traffic_on_night.webp rename to android/app/src/main/res/drawable-night-xhdpi/ic_traffic_on.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_traffic_outdated_night.webp b/android/app/src/main/res/drawable-night-xhdpi/ic_traffic_outdated.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_traffic_outdated_night.webp rename to android/app/src/main/res/drawable-night-xhdpi/ic_traffic_outdated.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_triangle_night.webp b/android/app/src/main/res/drawable-night-xhdpi/ic_triangle.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_triangle_night.webp rename to android/app/src/main/res/drawable-night-xhdpi/ic_triangle.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_triangle_elevation_night.webp b/android/app/src/main/res/drawable-night-xhdpi/ic_triangle_elevation.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_triangle_elevation_night.webp rename to android/app/src/main/res/drawable-night-xhdpi/ic_triangle_elevation.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_traffic_download_night_1.webp b/android/app/src/main/res/drawable-night-xxhdpi/ic_traffic_download_1.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_traffic_download_night_1.webp rename to android/app/src/main/res/drawable-night-xxhdpi/ic_traffic_download_1.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_traffic_download_night_2.webp b/android/app/src/main/res/drawable-night-xxhdpi/ic_traffic_download_2.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_traffic_download_night_2.webp rename to android/app/src/main/res/drawable-night-xxhdpi/ic_traffic_download_2.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_traffic_download_night_3.webp b/android/app/src/main/res/drawable-night-xxhdpi/ic_traffic_download_3.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_traffic_download_night_3.webp rename to android/app/src/main/res/drawable-night-xxhdpi/ic_traffic_download_3.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_traffic_on_night.webp b/android/app/src/main/res/drawable-night-xxhdpi/ic_traffic_on.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_traffic_on_night.webp rename to android/app/src/main/res/drawable-night-xxhdpi/ic_traffic_on.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_traffic_outdated_night.webp b/android/app/src/main/res/drawable-night-xxhdpi/ic_traffic_outdated.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_traffic_outdated_night.webp rename to android/app/src/main/res/drawable-night-xxhdpi/ic_traffic_outdated.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_triangle_night.webp b/android/app/src/main/res/drawable-night-xxhdpi/ic_triangle.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_triangle_night.webp rename to android/app/src/main/res/drawable-night-xxhdpi/ic_triangle.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_triangle_elevation_night.webp b/android/app/src/main/res/drawable-night-xxhdpi/ic_triangle_elevation.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_triangle_elevation_night.webp rename to android/app/src/main/res/drawable-night-xxhdpi/ic_triangle_elevation.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_traffic_download_night_1.webp b/android/app/src/main/res/drawable-night-xxxhdpi/ic_traffic_download_1.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_traffic_download_night_1.webp rename to android/app/src/main/res/drawable-night-xxxhdpi/ic_traffic_download_1.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_traffic_download_night_2.webp b/android/app/src/main/res/drawable-night-xxxhdpi/ic_traffic_download_2.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_traffic_download_night_2.webp rename to android/app/src/main/res/drawable-night-xxxhdpi/ic_traffic_download_2.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_traffic_download_night_3.webp b/android/app/src/main/res/drawable-night-xxxhdpi/ic_traffic_download_3.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_traffic_download_night_3.webp rename to android/app/src/main/res/drawable-night-xxxhdpi/ic_traffic_download_3.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_traffic_on_night.webp b/android/app/src/main/res/drawable-night-xxxhdpi/ic_traffic_on.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_traffic_on_night.webp rename to android/app/src/main/res/drawable-night-xxxhdpi/ic_traffic_on.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_traffic_outdated_night.webp b/android/app/src/main/res/drawable-night-xxxhdpi/ic_traffic_outdated.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_traffic_outdated_night.webp rename to android/app/src/main/res/drawable-night-xxxhdpi/ic_traffic_outdated.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_triangle_night.webp b/android/app/src/main/res/drawable-night-xxxhdpi/ic_triangle.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_triangle_night.webp rename to android/app/src/main/res/drawable-night-xxxhdpi/ic_triangle.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_triangle_elevation_night.webp b/android/app/src/main/res/drawable-night-xxxhdpi/ic_triangle_elevation.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_triangle_elevation_night.webp rename to android/app/src/main/res/drawable-night-xxxhdpi/ic_triangle_elevation.webp diff --git a/android/app/src/main/res/drawable/bg_altitude_night.xml b/android/app/src/main/res/drawable-night/bg_altitude.xml similarity index 100% rename from android/app/src/main/res/drawable/bg_altitude_night.xml rename to android/app/src/main/res/drawable-night/bg_altitude.xml diff --git a/android/app/src/main/res/drawable/bg_point_desc_night.xml b/android/app/src/main/res/drawable-night/bg_point_desc.xml similarity index 100% rename from android/app/src/main/res/drawable/bg_point_desc_night.xml rename to android/app/src/main/res/drawable-night/bg_point_desc.xml diff --git a/android/app/src/main/res/drawable/bg_rounded_rect_night.xml b/android/app/src/main/res/drawable-night/bg_rounded_rect.xml similarity index 100% rename from android/app/src/main/res/drawable/bg_rounded_rect_night.xml rename to android/app/src/main/res/drawable-night/bg_rounded_rect.xml diff --git a/android/app/src/main/res/drawable/bg_your_location_pin_night.xml b/android/app/src/main/res/drawable-night/bg_your_location_pin.xml similarity index 100% rename from android/app/src/main/res/drawable/bg_your_location_pin_night.xml rename to android/app/src/main/res/drawable-night/bg_your_location_pin.xml diff --git a/android/app/src/main/res/drawable/dot_divider_night.xml b/android/app/src/main/res/drawable-night/dot_divider.xml similarity index 100% rename from android/app/src/main/res/drawable/dot_divider_night.xml rename to android/app/src/main/res/drawable-night/dot_divider.xml diff --git a/android/app/src/main/res/drawable/downloader_done_night.xml b/android/app/src/main/res/drawable-night/downloader_done.xml similarity index 94% rename from android/app/src/main/res/drawable/downloader_done_night.xml rename to android/app/src/main/res/drawable-night/downloader_done.xml index 74ae3d345..64618de23 100644 --- a/android/app/src/main/res/drawable/downloader_done_night.xml +++ b/android/app/src/main/res/drawable-night/downloader_done.xml @@ -2,7 +2,7 @@ - + diff --git a/android/app/src/main/res/drawable/downloader_download_night.xml b/android/app/src/main/res/drawable-night/downloader_download.xml similarity index 92% rename from android/app/src/main/res/drawable/downloader_download_night.xml rename to android/app/src/main/res/drawable-night/downloader_download.xml index de8b69c3c..10740954d 100644 --- a/android/app/src/main/res/drawable/downloader_download_night.xml +++ b/android/app/src/main/res/drawable-night/downloader_download.xml @@ -2,7 +2,7 @@ - + diff --git a/android/app/src/main/res/drawable/downloader_folder_night.xml b/android/app/src/main/res/drawable-night/downloader_folder.xml similarity index 92% rename from android/app/src/main/res/drawable/downloader_folder_night.xml rename to android/app/src/main/res/drawable-night/downloader_folder.xml index 00fa330a4..711951947 100644 --- a/android/app/src/main/res/drawable/downloader_folder_night.xml +++ b/android/app/src/main/res/drawable-night/downloader_folder.xml @@ -2,7 +2,7 @@ - + diff --git a/android/app/src/main/res/drawable/downloader_folder_done_night.xml b/android/app/src/main/res/drawable-night/downloader_folder_done.xml similarity index 93% rename from android/app/src/main/res/drawable/downloader_folder_done_night.xml rename to android/app/src/main/res/drawable-night/downloader_folder_done.xml index 7745e86f9..b170525c8 100644 --- a/android/app/src/main/res/drawable/downloader_folder_done_night.xml +++ b/android/app/src/main/res/drawable-night/downloader_folder_done.xml @@ -2,7 +2,7 @@ - + diff --git a/android/app/src/main/res/drawable/ic_category_atm_night.xml b/android/app/src/main/res/drawable-night/ic_category_atm.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_atm_night.xml rename to android/app/src/main/res/drawable-night/ic_category_atm.xml diff --git a/android/app/src/main/res/drawable/ic_category_bank_night.xml b/android/app/src/main/res/drawable-night/ic_category_bank.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_bank_night.xml rename to android/app/src/main/res/drawable-night/ic_category_bank.xml diff --git a/android/app/src/main/res/drawable/ic_category_children_night.xml b/android/app/src/main/res/drawable-night/ic_category_children.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_children_night.xml rename to android/app/src/main/res/drawable-night/ic_category_children.xml diff --git a/android/app/src/main/res/drawable/ic_category_eat_night.xml b/android/app/src/main/res/drawable-night/ic_category_eat.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_eat_night.xml rename to android/app/src/main/res/drawable-night/ic_category_eat.xml diff --git a/android/app/src/main/res/drawable/ic_category_entertainment_night.xml b/android/app/src/main/res/drawable-night/ic_category_entertainment.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_entertainment_night.xml rename to android/app/src/main/res/drawable-night/ic_category_entertainment.xml diff --git a/android/app/src/main/res/drawable/ic_category_food_night.xml b/android/app/src/main/res/drawable-night/ic_category_food.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_food_night.xml rename to android/app/src/main/res/drawable-night/ic_category_food.xml diff --git a/android/app/src/main/res/drawable/ic_category_fuel_night.xml b/android/app/src/main/res/drawable-night/ic_category_fuel.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_fuel_night.xml rename to android/app/src/main/res/drawable-night/ic_category_fuel.xml diff --git a/android/app/src/main/res/drawable/ic_category_hospital_night.xml b/android/app/src/main/res/drawable-night/ic_category_hospital.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_hospital_night.xml rename to android/app/src/main/res/drawable-night/ic_category_hospital.xml diff --git a/android/app/src/main/res/drawable/ic_category_hotel_night.xml b/android/app/src/main/res/drawable-night/ic_category_hotel.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_hotel_night.xml rename to android/app/src/main/res/drawable-night/ic_category_hotel.xml diff --git a/android/app/src/main/res/drawable/ic_category_luggagehero_night.xml b/android/app/src/main/res/drawable-night/ic_category_luggagehero.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_luggagehero_night.xml rename to android/app/src/main/res/drawable-night/ic_category_luggagehero.xml diff --git a/android/app/src/main/res/drawable/ic_category_nightlife_night.xml b/android/app/src/main/res/drawable-night/ic_category_nightlife.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_nightlife_night.xml rename to android/app/src/main/res/drawable-night/ic_category_nightlife.xml diff --git a/android/app/src/main/res/drawable/ic_category_parking_night.xml b/android/app/src/main/res/drawable-night/ic_category_parking.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_parking_night.xml rename to android/app/src/main/res/drawable-night/ic_category_parking.xml diff --git a/android/app/src/main/res/drawable/ic_category_pharmacy_night.xml b/android/app/src/main/res/drawable-night/ic_category_pharmacy.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_pharmacy_night.xml rename to android/app/src/main/res/drawable-night/ic_category_pharmacy.xml diff --git a/android/app/src/main/res/drawable/ic_category_police_night.xml b/android/app/src/main/res/drawable-night/ic_category_police.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_police_night.xml rename to android/app/src/main/res/drawable-night/ic_category_police.xml diff --git a/android/app/src/main/res/drawable/ic_category_post_night.xml b/android/app/src/main/res/drawable-night/ic_category_post.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_post_night.xml rename to android/app/src/main/res/drawable-night/ic_category_post.xml diff --git a/android/app/src/main/res/drawable/ic_category_recycling_night.xml b/android/app/src/main/res/drawable-night/ic_category_recycling.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_recycling_night.xml rename to android/app/src/main/res/drawable-night/ic_category_recycling.xml diff --git a/android/app/src/main/res/drawable/ic_category_rv_night.xml b/android/app/src/main/res/drawable-night/ic_category_rv.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_rv_night.xml rename to android/app/src/main/res/drawable-night/ic_category_rv.xml diff --git a/android/app/src/main/res/drawable/ic_category_secondhand_night.xml b/android/app/src/main/res/drawable-night/ic_category_secondhand.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_secondhand_night.xml rename to android/app/src/main/res/drawable-night/ic_category_secondhand.xml diff --git a/android/app/src/main/res/drawable/ic_category_shopping_night.xml b/android/app/src/main/res/drawable-night/ic_category_shopping.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_shopping_night.xml rename to android/app/src/main/res/drawable-night/ic_category_shopping.xml diff --git a/android/app/src/main/res/drawable/ic_category_toilet_night.xml b/android/app/src/main/res/drawable-night/ic_category_toilet.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_toilet_night.xml rename to android/app/src/main/res/drawable-night/ic_category_toilet.xml diff --git a/android/app/src/main/res/drawable/ic_category_tourism_night.xml b/android/app/src/main/res/drawable-night/ic_category_tourism.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_tourism_night.xml rename to android/app/src/main/res/drawable-night/ic_category_tourism.xml diff --git a/android/app/src/main/res/drawable/ic_category_transport_night.xml b/android/app/src/main/res/drawable-night/ic_category_transport.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_transport_night.xml rename to android/app/src/main/res/drawable-night/ic_category_transport.xml diff --git a/android/app/src/main/res/drawable/ic_category_water_night.xml b/android/app/src/main/res/drawable-night/ic_category_water.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_water_night.xml rename to android/app/src/main/res/drawable-night/ic_category_water.xml diff --git a/android/app/src/main/res/drawable/ic_category_wifi_night.xml b/android/app/src/main/res/drawable-night/ic_category_wifi.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_category_wifi_night.xml rename to android/app/src/main/res/drawable-night/ic_category_wifi.xml diff --git a/android/app/src/main/res/drawable-night/ic_layers_isoline.xml b/android/app/src/main/res/drawable-night/ic_layers_isoline.xml new file mode 100644 index 000000000..b07c9c642 --- /dev/null +++ b/android/app/src/main/res/drawable-night/ic_layers_isoline.xml @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable-night/ic_layers_outdoors.xml b/android/app/src/main/res/drawable-night/ic_layers_outdoors.xml new file mode 100644 index 000000000..768fe35dd --- /dev/null +++ b/android/app/src/main/res/drawable-night/ic_layers_outdoors.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable-night/ic_layers_subway.xml b/android/app/src/main/res/drawable-night/ic_layers_subway.xml new file mode 100644 index 000000000..586ab5349 --- /dev/null +++ b/android/app/src/main/res/drawable-night/ic_layers_subway.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_menu_location_pending_night.png b/android/app/src/main/res/drawable-night/ic_menu_location_pending.png similarity index 100% rename from android/app/src/main/res/drawable/ic_menu_location_pending_night.png rename to android/app/src/main/res/drawable-night/ic_menu_location_pending.png diff --git a/android/app/src/main/res/drawable/list_divider_night.xml b/android/app/src/main/res/drawable-night/list_divider.xml similarity index 100% rename from android/app/src/main/res/drawable/list_divider_night.xml rename to android/app/src/main/res/drawable-night/list_divider.xml diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_1_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_1.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_1_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_1.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_10_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_10.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_10_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_10.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_11_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_11.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_11_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_11.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_12_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_12.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_12_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_12.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_13_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_13.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_13_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_13.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_14_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_14.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_14_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_14.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_15_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_15.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_15_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_15.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_16_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_16.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_16_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_16.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_17_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_17.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_17_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_17.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_18_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_18.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_18_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_18.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_2_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_2.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_2_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_2.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_3_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_3.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_3_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_3.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_4_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_4.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_4_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_4.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_5_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_5.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_5_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_5.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_6_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_6.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_6_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_6.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_7_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_7.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_7_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_7.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_8_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_8.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_8_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_8.webp diff --git a/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_9_night.webp b/android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_9.webp similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_9_night.webp rename to android/app/src/main/res/drawable-xhdpi/ic_spinner_pending_9.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_1_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_1.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_1_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_1.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_10_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_10.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_10_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_10.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_11_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_11.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_11_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_11.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_12_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_12.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_12_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_12.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_13_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_13.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_13_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_13.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_14_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_14.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_14_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_14.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_15_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_15.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_15_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_15.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_16_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_16.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_16_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_16.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_17_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_17.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_17_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_17.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_18_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_18.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_18_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_18.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_2_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_2.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_2_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_2.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_3_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_3.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_3_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_3.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_4_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_4.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_4_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_4.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_5_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_5.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_5_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_5.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_6_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_6.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_6_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_6.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_7_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_7.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_7_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_7.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_8_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_8.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_8_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_8.webp diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_9_night.webp b/android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_9.webp similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_9_night.webp rename to android/app/src/main/res/drawable-xxhdpi/ic_spinner_pending_9.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_1_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_1.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_1_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_1.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_10_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_10.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_10_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_10.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_11_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_11.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_11_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_11.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_12_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_12.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_12_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_12.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_13_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_13.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_13_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_13.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_14_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_14.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_14_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_14.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_15_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_15.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_15_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_15.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_16_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_16.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_16_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_16.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_17_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_17.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_17_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_17.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_18_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_18.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_18_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_18.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_2_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_2.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_2_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_2.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_3_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_3.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_3_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_3.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_4_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_4.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_4_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_4.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_5_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_5.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_5_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_5.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_6_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_6.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_6_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_6.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_7_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_7.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_7_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_7.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_8_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_8.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_8_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_8.webp diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_9_night.webp b/android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_9.webp similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_9_night.webp rename to android/app/src/main/res/drawable-xxxhdpi/ic_spinner_pending_9.webp diff --git a/android/app/src/main/res/drawable/anim_spinner_pending.xml b/android/app/src/main/res/drawable/anim_spinner_pending.xml index 182e0ac42..520f0784a 100644 --- a/android/app/src/main/res/drawable/anim_spinner_pending.xml +++ b/android/app/src/main/res/drawable/anim_spinner_pending.xml @@ -1,56 +1,56 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/anim_traffic_loading_night.xml b/android/app/src/main/res/drawable/anim_traffic_loading_night.xml deleted file mode 100644 index e97d26257..000000000 --- a/android/app/src/main/res/drawable/anim_traffic_loading_night.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/android/app/src/main/res/drawable/bg_badge.xml b/android/app/src/main/res/drawable/bg_badge.xml new file mode 100644 index 000000000..e2d2dbab8 --- /dev/null +++ b/android/app/src/main/res/drawable/bg_badge.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/bg_nav_next_next_turn_night.xml b/android/app/src/main/res/drawable/bg_nav_next_next_turn_night.xml deleted file mode 100644 index f8c3d5eb5..000000000 --- a/android/app/src/main/res/drawable/bg_nav_next_next_turn_night.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/bg_nav_next_turn_night.xml b/android/app/src/main/res/drawable/bg_nav_next_turn_night.xml deleted file mode 100644 index 46212ff7a..000000000 --- a/android/app/src/main/res/drawable/bg_nav_next_turn_night.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/bg_search_wheel_background_rect_night.xml b/android/app/src/main/res/drawable/bg_search_wheel_background_rect_night.xml deleted file mode 100644 index 13509a5d5..000000000 --- a/android/app/src/main/res/drawable/bg_search_wheel_background_rect_night.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/bg_search_wheel_background_round_night.xml b/android/app/src/main/res/drawable/bg_search_wheel_background_round_night.xml deleted file mode 100644 index 00e31d17a..000000000 --- a/android/app/src/main/res/drawable/bg_search_wheel_background_round_night.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/button_accent_disabled_night.xml b/android/app/src/main/res/drawable/button_accent_disabled_night.xml deleted file mode 100644 index f7c73a817..000000000 --- a/android/app/src/main/res/drawable/button_accent_disabled_night.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/button_accent_night.xml b/android/app/src/main/res/drawable/button_accent_night.xml deleted file mode 100644 index 192a6af3e..000000000 --- a/android/app/src/main/res/drawable/button_accent_night.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/android/app/src/main/res/drawable/button_accent_night_internal.xml b/android/app/src/main/res/drawable/button_accent_night_internal.xml deleted file mode 100644 index 67c7755d2..000000000 --- a/android/app/src/main/res/drawable/button_accent_night_internal.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/android/app/src/main/res/drawable/button_accent_normal_night.xml b/android/app/src/main/res/drawable/button_accent_normal_night.xml deleted file mode 100644 index 9c9af0b2f..000000000 --- a/android/app/src/main/res/drawable/button_accent_normal_night.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/button_accent_pressed_night.xml b/android/app/src/main/res/drawable/button_accent_pressed_night.xml deleted file mode 100644 index 32a06fe28..000000000 --- a/android/app/src/main/res/drawable/button_accent_pressed_night.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/button_disabled.xml b/android/app/src/main/res/drawable/button_disabled.xml deleted file mode 100644 index 0e5b6478e..000000000 --- a/android/app/src/main/res/drawable/button_disabled.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/button_disabled_night.xml b/android/app/src/main/res/drawable/button_disabled_night.xml deleted file mode 100644 index 508f68863..000000000 --- a/android/app/src/main/res/drawable/button_disabled_night.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/button_night.xml b/android/app/src/main/res/drawable/button_night.xml deleted file mode 100644 index a4f3d16e0..000000000 --- a/android/app/src/main/res/drawable/button_night.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/button_normal.xml b/android/app/src/main/res/drawable/button_normal.xml deleted file mode 100644 index 7f363de8a..000000000 --- a/android/app/src/main/res/drawable/button_normal.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/button_normal_night.xml b/android/app/src/main/res/drawable/button_normal_night.xml deleted file mode 100644 index 5c7a45a0a..000000000 --- a/android/app/src/main/res/drawable/button_normal_night.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/button_pressed.xml b/android/app/src/main/res/drawable/button_pressed.xml deleted file mode 100644 index 948c7ba2e..000000000 --- a/android/app/src/main/res/drawable/button_pressed.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/button_pressed_night.xml b/android/app/src/main/res/drawable/button_pressed_night.xml deleted file mode 100644 index 2cb80bf0c..000000000 --- a/android/app/src/main/res/drawable/button_pressed_night.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/ic_layers_isoline.xml b/android/app/src/main/res/drawable/ic_layers_isoline.xml new file mode 100644 index 000000000..f78e8da78 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_layers_isoline.xml @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_layers_isoline_active.xml b/android/app/src/main/res/drawable/ic_layers_isoline_active.xml deleted file mode 100644 index a55d34c1b..000000000 --- a/android/app/src/main/res/drawable/ic_layers_isoline_active.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_layers_isoline_inactive.xml b/android/app/src/main/res/drawable/ic_layers_isoline_inactive.xml deleted file mode 100644 index 1b5467333..000000000 --- a/android/app/src/main/res/drawable/ic_layers_isoline_inactive.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_layers_outdoors.xml b/android/app/src/main/res/drawable/ic_layers_outdoors.xml new file mode 100644 index 000000000..cc538ea14 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_layers_outdoors.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_layers_outdoors_active.xml b/android/app/src/main/res/drawable/ic_layers_outdoors_active.xml deleted file mode 100644 index ff0868415..000000000 --- a/android/app/src/main/res/drawable/ic_layers_outdoors_active.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_layers_outdoors_inactive.xml b/android/app/src/main/res/drawable/ic_layers_outdoors_inactive.xml deleted file mode 100644 index 952bf0824..000000000 --- a/android/app/src/main/res/drawable/ic_layers_outdoors_inactive.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_layers_outline_selector.xml b/android/app/src/main/res/drawable/ic_layers_outline_selector.xml new file mode 100644 index 000000000..d92d4b36b --- /dev/null +++ b/android/app/src/main/res/drawable/ic_layers_outline_selector.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_layers_subway.xml b/android/app/src/main/res/drawable/ic_layers_subway.xml new file mode 100644 index 000000000..d081e0f7c --- /dev/null +++ b/android/app/src/main/res/drawable/ic_layers_subway.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_layers_subway_active.xml b/android/app/src/main/res/drawable/ic_layers_subway_active.xml deleted file mode 100644 index fbbf1f007..000000000 --- a/android/app/src/main/res/drawable/ic_layers_subway_active.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_layers_subway_inactive.xml b/android/app/src/main/res/drawable/ic_layers_subway_inactive.xml deleted file mode 100644 index 2a6ef02d4..000000000 --- a/android/app/src/main/res/drawable/ic_layers_subway_inactive.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_layers_traffic_inactive.xml b/android/app/src/main/res/drawable/ic_layers_traffic.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_layers_traffic_inactive.xml rename to android/app/src/main/res/drawable/ic_layers_traffic.xml diff --git a/android/app/src/main/res/drawable/ic_layers_traffic_active.xml b/android/app/src/main/res/drawable/ic_layers_traffic_active.xml deleted file mode 100644 index 7877be682..000000000 --- a/android/app/src/main/res/drawable/ic_layers_traffic_active.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_operating_hours.xml b/android/app/src/main/res/drawable/ic_opening_hours.xml similarity index 87% rename from android/app/src/main/res/drawable/ic_operating_hours.xml rename to android/app/src/main/res/drawable/ic_opening_hours.xml index 2ce8a142b..682253e6f 100644 --- a/android/app/src/main/res/drawable/ic_operating_hours.xml +++ b/android/app/src/main/res/drawable/ic_opening_hours.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/android/app/src/main/res/drawable/routing_toolbar_button_night.xml b/android/app/src/main/res/drawable/routing_toolbar_button_night.xml deleted file mode 100644 index 0be952a4b..000000000 --- a/android/app/src/main/res/drawable/routing_toolbar_button_night.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - diff --git a/android/app/src/main/res/drawable/routing_toolbar_button_normal_night.xml b/android/app/src/main/res/drawable/routing_toolbar_button_normal_night.xml deleted file mode 100644 index 47906aacb..000000000 --- a/android/app/src/main/res/drawable/routing_toolbar_button_normal_night.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/app/src/main/res/layout-land/dialog_edit_socket.xml b/android/app/src/main/res/layout-land/dialog_edit_socket.xml new file mode 100644 index 000000000..100fe10a1 --- /dev/null +++ b/android/app/src/main/res/layout-land/dialog_edit_socket.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/layout-land/layout_nav_top.xml b/android/app/src/main/res/layout-land/layout_nav_top.xml index 8ee90433e..e6fcfaeb6 100644 --- a/android/app/src/main/res/layout-land/layout_nav_top.xml +++ b/android/app/src/main/res/layout-land/layout_nav_top.xml @@ -9,45 +9,57 @@ tools:background="#20FF0000" tools:showIn="@layout/layout_nav"> + + app:cardBackgroundColor="?colorSecondary"> - + + + + - + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/button_socket_type.xml b/android/app/src/main/res/layout/button_socket_type.xml new file mode 100644 index 000000000..3aee3018e --- /dev/null +++ b/android/app/src/main/res/layout/button_socket_type.xml @@ -0,0 +1,18 @@ + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/dialog_edit_socket.xml b/android/app/src/main/res/layout/dialog_edit_socket.xml new file mode 100644 index 000000000..b1c136e1b --- /dev/null +++ b/android/app/src/main/res/layout/dialog_edit_socket.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/layout/dialog_edit_text.xml b/android/app/src/main/res/layout/dialog_edit_text.xml index 660933577..5e7c82ac3 100644 --- a/android/app/src/main/res/layout/dialog_edit_text.xml +++ b/android/app/src/main/res/layout/dialog_edit_text.xml @@ -23,7 +23,8 @@ style="@style/MwmWidget.Editor.CustomTextInput" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="text|textCapSentences" + android:inputType="textMultiLine" + android:gravity="top" android:padding="@dimen/margin_half_double_plus" android:maxLength="100" android:singleLine="true" /> diff --git a/android/app/src/main/res/layout/fragment_bookmark_category_settings.xml b/android/app/src/main/res/layout/fragment_bookmark_category_settings.xml index 0e80884e8..330463c43 100644 --- a/android/app/src/main/res/layout/fragment_bookmark_category_settings.xml +++ b/android/app/src/main/res/layout/fragment_bookmark_category_settings.xml @@ -13,6 +13,7 @@ android:layout_height="wrap_content" android:theme="@style/MwmWidget.ToolbarTheme"> + + + + + diff --git a/android/app/src/main/res/layout/fragment_editor.xml b/android/app/src/main/res/layout/fragment_editor.xml index 7fdeb1427..947e2b2ee 100644 --- a/android/app/src/main/res/layout/fragment_editor.xml +++ b/android/app/src/main/res/layout/fragment_editor.xml @@ -1,18 +1,18 @@ - + android:layout_height="match_parent" + android:clipToPadding="false" + tools:context=".editor.EditorActivity" + tools:ignore="DuplicateIds"> + + android:id="@+id/cv__category" + style="@style/MwmWidget.Editor.CardView"> - + android:layout_marginBottom="0dp" + android:padding="@dimen/margin_half_plus"> + + android:id="@+id/title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_marginStart="@dimen/margin_quarter" + android:layout_toEndOf="@id/icon" + android:text="@string/editor_edit_place_category_title" + android:textAppearance="@style/MwmTextAppearance.Body4" + tools:text="Trololo"/> + android:id="@+id/name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignStart="@id/title" + android:layout_below="@id/title" + android:textAppearance="@style/MwmTextAppearance.Body1" + tools:text="Ololo"/> - - - + android:id="@+id/cv__charging_station" + style="@style/MwmWidget.Editor.CardView" + android:visibility="gone"> - - - - + - - - + android:layout_marginTop="@dimen/margin_base" + android:fontFamily="@string/robotoMedium" + android:text="@string/charging_station_available_sockets" + android:textAppearance="@style/MwmTextAppearance.Body3" + tools:ignore="UnusedAttribute"/> - + android:id="@+id/block_charge_sockets" + layout="@layout/item_charging_sockets"/> + android:id="@+id/cv__name" + style="@style/MwmWidget.Editor.CardView"> + + + - + android:orientation="vertical" + android:paddingEnd="@dimen/margin_base" + android:paddingStart="@dimen/margin_base"> + + + + + + + + + + + + + + + + android:id="@+id/block_opening_hours" + layout="@layout/item_opening_hours"/> + android:id="@+id/block_operator" + layout="@layout/item_editor_input"/> + android:id="@+id/block_website" + layout="@layout/item_editor_input"/> + android:id="@+id/block_email" + layout="@layout/item_editor_input"/> + android:id="@+id/block_level" + layout="@layout/item_editor_input"/> + android:id="@+id/cv__social_media" + style="@style/MwmWidget.Editor.CardView"> - + android:orientation="vertical" + android:paddingEnd="@dimen/margin_base" + android:paddingStart="@dimen/margin_base"> + + android:id="@+id/block_facebook" + layout="@layout/item_editor_input"/> + android:id="@+id/block_instagram" + layout="@layout/item_editor_input"/> + android:id="@+id/block_twitter" + layout="@layout/item_editor_input"/> + android:id="@+id/block_vk" + layout="@layout/item_editor_input"/> + android:id="@+id/block_line" + layout="@layout/item_editor_input"/> @@ -356,61 +381,61 @@ + android:id="@+id/cv__building" + style="@style/MwmWidget.Editor.CardView"> - + android:orientation="vertical" + android:paddingEnd="@dimen/margin_base" + android:paddingStart="@dimen/margin_base"> + + android:id="@+id/block_levels" + layout="@layout/item_editor_input"/> + android:id="@+id/cv__more" + style="@style/MwmWidget.Editor.CardView"> - + android:orientation="vertical" + android:padding="@dimen/margin_base"> + + android:id="@+id/custom_input" + style="@style/MwmWidget.Editor.CustomTextInput" + android:gravity="center_vertical" + android:minHeight="74dp" + android:textColorHint="?android:textColorSecondary" + app:hintEnabled="false"> + android:id="@+id/input" + style="@style/MwmWidget.Editor.FieldLayout.EditText" + android:inputType="textMultiLine" + android:hint="@string/editor_note_hint"/> - - \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_toggle_map_layer.xml b/android/app/src/main/res/layout/fragment_toggle_map_layer.xml index 730489cab..5329985e3 100644 --- a/android/app/src/main/res/layout/fragment_toggle_map_layer.xml +++ b/android/app/src/main/res/layout/fragment_toggle_map_layer.xml @@ -21,12 +21,12 @@ app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/layout/item_charging_sockets.xml b/android/app/src/main/res/layout/item_charging_sockets.xml new file mode 100644 index 000000000..5ca42266e --- /dev/null +++ b/android/app/src/main/res/layout/item_charging_sockets.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/item_layer.xml b/android/app/src/main/res/layout/item_layer.xml index 459844931..376f4b340 100644 --- a/android/app/src/main/res/layout/item_layer.xml +++ b/android/app/src/main/res/layout/item_layer.xml @@ -20,7 +20,8 @@ android:background="@null" android:minWidth="@dimen/margin_double_plus" android:minHeight="@dimen/margin_double_plus" - tools:background="?attr/subwayMenuDisabled" /> + android:src="@drawable/ic_layers_outline_selector" + tools:background="?attr/subwayMenuIcon" /> + app:srcCompat="@drawable/ic_opening_hours" + android:tint="?iconTint"/> + app:backgroundTint="@color/base_red" /> diff --git a/android/app/src/main/res/layout/layout_nav_top.xml b/android/app/src/main/res/layout/layout_nav_top.xml index e71475c1e..05a22b681 100644 --- a/android/app/src/main/res/layout/layout_nav_top.xml +++ b/android/app/src/main/res/layout/layout_nav_top.xml @@ -9,44 +9,58 @@ tools:background="#20FF0000" tools:showIn="@layout/layout_nav"> + + app:cardBackgroundColor="?colorSecondary"> - + @@ -111,7 +125,7 @@ android:layout_width="0dp" android:layout_height="68dp" android:layout_marginEnd="@dimen/margin_half" - android:layout_marginTop="@dimen/margin_half" + android:layout_marginTop="@dimen/margin_quarter" android:padding="@dimen/margin_half" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" diff --git a/android/app/src/main/res/layout/onmap_downloader.xml b/android/app/src/main/res/layout/onmap_downloader.xml index 73402bafa..3d00a11b4 100644 --- a/android/app/src/main/res/layout/onmap_downloader.xml +++ b/android/app/src/main/res/layout/onmap_downloader.xml @@ -19,6 +19,28 @@ android:background="@drawable/onmap_downloader_background" tools:ignore="UselessParent"> + + + - - - - - diff --git a/android/app/src/main/res/layout/place_page_charge_sockets_fragment.xml b/android/app/src/main/res/layout/place_page_charge_sockets_fragment.xml new file mode 100644 index 000000000..c35b1e321 --- /dev/null +++ b/android/app/src/main/res/layout/place_page_charge_sockets_fragment.xml @@ -0,0 +1,9 @@ + diff --git a/android/app/src/main/res/layout/place_page_cuisine.xml b/android/app/src/main/res/layout/place_page_cuisine.xml index 2e9b58014..efe1a6265 100644 --- a/android/app/src/main/res/layout/place_page_cuisine.xml +++ b/android/app/src/main/res/layout/place_page_cuisine.xml @@ -12,7 +12,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/margin_base" - app:tint="?iconTint" + android:tint="?iconTint" app:srcCompat="@drawable/ic_cuisine"/> + + - - + app:srcCompat="@drawable/ic_opening_hours" + android:tint="?iconTint"/> + android:tint="?iconTint"/> Gereed OpenStreetMap-data: %s - - Is jy seker jy wil by jou OpenStreetMap-rekening afmeld? Paaie @@ -445,7 +443,6 @@ Kategorie Gedetailleerde beskrywing van die probleem ’n Ander probleem - Voeg besigheid toe Geen voorwerp kan hier geplaas word nie Gemeenskap-geskepte OpenStreetMap-data vanaf %s. Kom meer te wete oor hoe om die kaart te redigeer en op te dateer by OpenStreetMap.org @@ -487,7 +484,6 @@ Meer Wysig boekmerk Persoonlike notas (teks of html) - Kommentaar… Wys alle lokale veranderinge af? Wys af Skrap toegevoegde plek? diff --git a/android/app/src/main/res/values-ar/strings.xml b/android/app/src/main/res/values-ar/strings.xml index bb9106d4f..16d9a88d6 100644 --- a/android/app/src/main/res/values-ar/strings.xml +++ b/android/app/src/main/res/values-ar/strings.xml @@ -184,8 +184,6 @@ تم بيانات خريطة الشارع المفتوحة: %s - - هل أنت متأكد أنك تريد تسجيل الخروج من حساب OpenStreetMap الخاص بك؟ المسارات @@ -461,7 +459,6 @@ الفئة وصف مفصّل للمشكلة مشكلة أخرى - إضافة مؤسسة لا يمكن تحديد موقع الكائن هنا بيانات OpenStreetMap التي أنشأها المجتمع اعتبارًا من %s. تعرف على المزيد حول كيفية تعديل الخريطة وتحديثها على OpenStreetMap.org @@ -503,7 +500,6 @@ المزيد تحرير العلامة المرجعية ملاحظات شخصية (نص أو html) - تعليق… هل تريد مسح كافة التغييرات المحلية؟ مسح إزالة مكان الذي تمت إضافته؟ diff --git a/android/app/src/main/res/values-ast/strings.xml b/android/app/src/main/res/values-ast/strings.xml index 73c8a1394..5206850a4 100644 --- a/android/app/src/main/res/values-ast/strings.xml +++ b/android/app/src/main/res/values-ast/strings.xml @@ -102,7 +102,6 @@ Editar marcador El llugar nun esiste Desaniciar - Comentariu… Amestar una cai Notes personales (testu o HTML) Baxar mapes diff --git a/android/app/src/main/res/values-az/strings.xml b/android/app/src/main/res/values-az/strings.xml index 7e2109e50..a13720e4b 100644 --- a/android/app/src/main/res/values-az/strings.xml +++ b/android/app/src/main/res/values-az/strings.xml @@ -186,8 +186,6 @@ Bitdi OpenStreetMap datası: %s - - OpenStreetMap hesabınızdan çıxmaq istədiyinizə əminsiniz? Marşrutlari @@ -463,7 +461,6 @@ Kateqoriya Problemin ətraflı təsviri Fərqli problem - Təşkilat əlavə edin Burada obyekti yerləşdirmək mümkün deyil %s tarixinə icma tərəfindən yaradılmış OpenStreetMap datası. OpenStreetMap.org saytında xəritəni necə redaktə etmək və yeniləmək haqqında ətraflı məlumat əldə edin @@ -505,7 +502,6 @@ Digər Əlfəcini redaktə edin Şəxsi qeydlər (mətn və ya html) - Şərh… Bütün yerli dəyişikliklər ləğv edilsin? İmtina Əlavə edilmiş məkan silinsin? diff --git a/android/app/src/main/res/values-be/strings.xml b/android/app/src/main/res/values-be/strings.xml index 30a5d853b..57afa0721 100644 --- a/android/app/src/main/res/values-be/strings.xml +++ b/android/app/src/main/res/values-be/strings.xml @@ -180,8 +180,6 @@ Гатова Даныя OpenStreetMap: %s - - Вы ўпэўнены, што хочаце выйсці са свайго ўліковага запісу OpenStreetMap? Маршруты @@ -456,7 +454,6 @@ Катэгорыя Падрабязнае апісанне праблемы Іншая праблема - Дадаць установу Аб\'ект не можа знаходзіцца тут Створаныя супольнасцю даныя OpenStreetMap па стане на %s. Даведайцеся больш пра тое, як рэдагаваць і абнаўляць карту на OpenStreetMap.org @@ -498,7 +495,6 @@ Яшчэ Рэдагаваць закладку Асабістыя нататкі (тэкст або html) - Каментарый… Адмовіцца ад усіх лакальных змен? Адмовіцца Выдаліць дададзенае месца? diff --git a/android/app/src/main/res/values-bg/strings.xml b/android/app/src/main/res/values-bg/strings.xml index 75dc9e632..d7b15cb8f 100644 --- a/android/app/src/main/res/values-bg/strings.xml +++ b/android/app/src/main/res/values-bg/strings.xml @@ -179,8 +179,6 @@ Готово Данни на OpenStreetMap: %s - - Сигурни ли сте, че искате да излезете от профила си в OpenStreetMap? Пътеки @@ -434,7 +432,6 @@ Категория Подробно описание на проблема Друг проблем - Добавяне на бизнес Тук не може да бъде намерен обект Създадени от общността данни от OpenStreetMap към %s. Научете повече за това как да редактирате и актуализирате картата в OpenStreetMap.org @@ -473,7 +470,6 @@ Още Редакция на отметка Лични бележки (текст или html) - Коментиране… Отхвърляне на всички локални промени? Отхвърляне Изтриване на добавеното място? diff --git a/android/app/src/main/res/values-bn/strings.xml b/android/app/src/main/res/values-bn/strings.xml index 9716a4294..6bd85fc85 100644 --- a/android/app/src/main/res/values-bn/strings.xml +++ b/android/app/src/main/res/values-bn/strings.xml @@ -98,7 +98,6 @@ মানচিত্রটি এখন ডাউনলোডবিরত বুকমার্কগুলি লোড করা হয়ে গেছে! আপনি এগুলি মানচিত্রে অথবা বুকমার্ক পরিচালক স্ক্রিনে দেখতে পারেন। এটি হতে কিছুক্ষণ সময় লাগবে।\nঅনুগ্রহ করে প্রতীক্ষা করুন… - আপনি কি আপনার ওপেনস্ট্রিটম্যাপ অ্যাকাউন্ট থেকে বের হতে চান? অ্যাপটি ব্যবহার করার আগে অনুগ্রহ করে বিশ্বের পরিদর্শনের মানচিত্রটি ডাউনলোড করুন।\nএটি আপনার স্টোরেজের %s ব্যবহার করবে। যানবাহন আপনার অবস্থানটি এখনও অব্দি চিহ্নিত করা যায়নি @@ -286,7 +285,6 @@ যোগ করা হচ্ছে স্থানের নাম সম্পাদনা - ব্যবসা যোগ করুন একটি রাস্তা অ্যাড করুন অনুগ্রহ করে রাস্তার নামটি লিখুন একটি ভাষা বেছে নিন diff --git a/android/app/src/main/res/values-ca/strings.xml b/android/app/src/main/res/values-ca/strings.xml index eabc25f3b..76a5fa810 100644 --- a/android/app/src/main/res/values-ca/strings.xml +++ b/android/app/src/main/res/values-ca/strings.xml @@ -184,8 +184,6 @@ Fet Dades de l\'OpenStreetMap: %s - - Esteu segur que voleu tancar la sessió del vostre compte d\'OpenStreetMap? Recorreguts @@ -462,7 +460,6 @@ Categoria Descripció detallada del problema Un altre problema - Afegeix un negoci No s’ha trobat cap objecte aquí Dades de l’OpenStreetMap creades per la comunitat a partir de %s. Obteniu més informació sobre com editar i actualitzar el mapa a OpenStreetMap.org @@ -504,7 +501,6 @@ Més Edita el marcador Notes personals (text o html) - Comentari… Voleu descartar tots els canvis locals? Descarta Voleu suprimir el lloc afegit? diff --git a/android/app/src/main/res/values-cs/strings.xml b/android/app/src/main/res/values-cs/strings.xml index 04892142c..1708975b1 100644 --- a/android/app/src/main/res/values-cs/strings.xml +++ b/android/app/src/main/res/values-cs/strings.xml @@ -181,8 +181,6 @@ Hotovo Data OpenStreetMap: %s - - Opravdu se chcete odhlásit ze svého účtu OpenStreetMap? Stopy @@ -453,7 +451,6 @@ Kategorie Detailní popis problému Jiný problém - Přidat organizaci Objekt zde nemůže být umístěn Data OpenStreetMap vytvořená komunitou ke dni %s. Další informace o tom, jak upravovat a aktualizovat mapu, najdete na stránkách OpenStreetMap.org @@ -495,7 +492,6 @@ Více Upravit záložku Vlastní poznámka (text nebo HTML) - Poznámka… Vymazat všechny místní změny? Zahodit Odstranit přidané místo? @@ -870,4 +866,22 @@ Potvrzeno %s Existence potvrzena %s Nenalezen žádný modul pro převod textu na řeč, zkontrolujte nastavení aplikace + neznámé + Typ 2 (bez kabelu) + Typ 2 (s kabelem) + Typ 2 combo + Typ 1 + NACS + CHAdeMO + neznámá zásuvka + neznámá zásuvka + Vytvořit nové zásuvky nebo upravit stávající. + Dostupné zásuvky + Jiné nebo neznámé + Výkon (kW) + Upravit zásuvku + Hodnota musí být kladná + Neplatné číslo + Počet + neznámé diff --git a/android/app/src/main/res/values-cy/strings.xml b/android/app/src/main/res/values-cy/strings.xml index b17280485..0eaf907f3 100644 --- a/android/app/src/main/res/values-cy/strings.xml +++ b/android/app/src/main/res/values-cy/strings.xml @@ -114,7 +114,6 @@ min d Rhagor - Sylw… Dileu Dileu Stopio @@ -223,7 +222,6 @@ Gwall mewngofnodi Newidiadau wedi\'u Dilysu Problem arall - Ychwanegu busnes Cod ZIP Gweithredwr: %s Golygu Nod Tudalen diff --git a/android/app/src/main/res/values-da/strings.xml b/android/app/src/main/res/values-da/strings.xml index 590c61323..48a8d43f1 100644 --- a/android/app/src/main/res/values-da/strings.xml +++ b/android/app/src/main/res/values-da/strings.xml @@ -181,8 +181,6 @@ Færdig OpenStreetMap-data: %s - - Er du sikker på, at du vil logge ud af din OpenStreetMap-konto? Spor @@ -449,7 +447,6 @@ Kategori Detaljeret beskrivelse af problemet Et andet problem - Tilføj virksomhed Et objekt kan ikke placeres her Fællesskabsskabte OpenStreetMap-data fra %s. Få mere at vide om, hvordan du redigerer og opdaterer kortet på OpenStreetMap.org @@ -491,7 +488,6 @@ Mere Rediger bogmærke Personlige notater (tekst eller html) - Kommentar… Kassér alle lokale ændringer? Kassér Slet tilføjet sted? diff --git a/android/app/src/main/res/values-de/strings.xml b/android/app/src/main/res/values-de/strings.xml index 2db7b479a..81443bebc 100644 --- a/android/app/src/main/res/values-de/strings.xml +++ b/android/app/src/main/res/values-de/strings.xml @@ -186,8 +186,6 @@ Fertig OpenStreetMap-Daten: %s - - Sind Sie sicher, dass Sie sich von Ihrem OpenStreetMap-Konto abmelden möchten? Tracks @@ -462,7 +460,6 @@ Kategorie Detaillierte Beschreibung des Problems Ein anderes Problem - Organisation hinzufügen Ein Objekt kann hier nicht positioniert werden Von der Community erstellte OpenStreetMap-Daten (Stand: %s). Erfahre mehr darüber, wie du die Karte bearbeiten und aktualisieren kannst unter OpenStreetMap.org @@ -504,7 +501,6 @@ Mehr Lesezeichen bearbeiten Persönliche Notizen (Text oder html) - Kommentar… Alle lokalen Änderungen verwerfen? Verwerfen Hinzugefügtes Objekt löschen? @@ -874,4 +870,5 @@ Existenz bestätigt %s Bestätigt %s Kein Text-zu-Sprache-Modul gefunden, überprüfe die App-Einstellungen + Treppen vermeiden diff --git a/android/app/src/main/res/values-el/strings.xml b/android/app/src/main/res/values-el/strings.xml index de9563295..49d064355 100644 --- a/android/app/src/main/res/values-el/strings.xml +++ b/android/app/src/main/res/values-el/strings.xml @@ -184,8 +184,6 @@ Ολοκλήρωση Δεδομένα OpenStreetMap: %s - - Είστε σίγουροι ότι θέλετε να αποσυνδεθείτε από το λογαριασμό σας στο OpenStreetMap; Διαδρομές @@ -463,7 +461,6 @@ Κατηγορία Λεπτομερής περιγραφή του θέματος Διαφορετικό πρόβλημα - Προσθήκη επιχείρησης Δε μπορεί να τοποθετηθεί αντικείμενο εδώ Δεδομένα OpenStreetMap που δημιουργήθηκαν από την κοινότητα στις %s. Μάθετε περισσότερα για τον τρόπο επεξεργασίας και ενημέρωσης του χάρτη στο OpenStreetMap.org @@ -501,7 +498,6 @@ Περισσότερα Επεξεργασία αγαπημένου Προσωπικές σημειώσεις (κείμενο ή html) - Σχόλιο… Απόρριψη όλων των τοπικών αλλαγών; Απόρριψη Διαγραφή της τοποθεσίας που προστέθηκε; diff --git a/android/app/src/main/res/values-es/strings.xml b/android/app/src/main/res/values-es/strings.xml index e57fb41c4..366b93a65 100644 --- a/android/app/src/main/res/values-es/strings.xml +++ b/android/app/src/main/res/values-es/strings.xml @@ -186,8 +186,6 @@ Hecho Datos de OpenStreetMap: %s - - ¿Quieres salir de tu cuenta de OpenStreetMap? Trazas @@ -465,7 +463,6 @@ Categoría Descripción detallada del problema Un problema diferente - Añadir empresa No se puede ubicar ningún objeto aquí Datos de OpenStreetMap creados por la comunidad a partir de %s. Más información sobre cómo editar y actualizar el mapa en OpenStreetMap.org @@ -507,7 +504,6 @@ Más Editar marcador Notas personales (texto o html) - Comentario… ¿Restablecer todos los cambios locales? Restablecer ¿Eliminar el lugar añadido? @@ -880,4 +876,14 @@ Confirmado %s Compartir traza No se ha encontrado ningún motor de texto-a-voz, comprueba la configuración de la aplicación + desconocida + Tipo 2 (sin cable) + Tipo 2 (con cable) + Tipo 2 combo + Tipo 1 + NACS + CHAdeMO + Recuento + Potencia (kW) + desconocido diff --git a/android/app/src/main/res/values-et/strings.xml b/android/app/src/main/res/values-et/strings.xml index 0f7caaa36..862d460f1 100644 --- a/android/app/src/main/res/values-et/strings.xml +++ b/android/app/src/main/res/values-et/strings.xml @@ -180,8 +180,6 @@ Valmis OpenStreetMapi andmed: %s - - Kas oled kindel, et soovid oma OpenStreetMapi kontost välja logida? Rajad @@ -457,7 +455,6 @@ Kategooria Probleemi üksikasjalik kirjeldus Erinev probleem - Lisa ettevõte või äri Ükski objekt ei saa siin asuda Kogukonna loodud OpenStreetMapi andmed seisuga %s. Lisateavet kaardi muutmise ja uuendamise kohta leiad OpenStreetMap.org saidist @@ -499,7 +496,6 @@ Veel Muuda järjehoidjat Isiklikud märkmed (tekst või html) - Kommenteeri… Kas loobud kõigist kohalikest muudatustest? Loobu Kas kustutad lisatud koha? @@ -870,4 +866,22 @@ Olemasolu on kontrollitud %s Kontrollitud %s Ühtegi kõnesünteesimootorit ei leidu, palun kontrolli rakenduse seadistusi + pole teada + Tüüp 2 (ilma kaablita) + Tüüp 2 (kaabliga) + Tüüp 2 kombo + Tüüp 1 + NACS + CHAdeMO + pistik pole teada + pistik pole teada + Pistikuid + Lisa uusi pistikuid või muuda olemasolevaid. + Saadaval pistikud + Muu või teadmata + Võimsus (kW) + Muuda pistikut + Sisestuse väärtus peab olema positiitve + tundmatu + Vigane number diff --git a/android/app/src/main/res/values-eu/strings.xml b/android/app/src/main/res/values-eu/strings.xml index a475fe7b3..310d4a83d 100644 --- a/android/app/src/main/res/values-eu/strings.xml +++ b/android/app/src/main/res/values-eu/strings.xml @@ -186,8 +186,6 @@ Eginda OpenStreetMap datuak: %s - - Ziur zure OpenStreetMap kontutik saioa amaitu nahi duzula? Arrastoak @@ -463,7 +461,6 @@ Kategoria Arazoaren deskribapen zehatza Beste arazo bat - Gehitu aktibitatea Hemen ezin da objekturik jarri Komunitateak sortutako OpenStreetMap datuak %s-tik aurrera. Lortu informazio gehiago mapa editatu eta eguneratzeari buruz OpenStreetMap.org helbidean @@ -505,7 +502,6 @@ Gehiago Editatu markagailua Ohar pertsonalak (testua edo html) - Iruzkina… Tokiko aldaketa guztiak berrezarri nahi dituzu? Berreskuratu Gehitutako tokia ezabatu? diff --git a/android/app/src/main/res/values-fa/strings.xml b/android/app/src/main/res/values-fa/strings.xml index fe405059d..3468ce2dc 100644 --- a/android/app/src/main/res/values-fa/strings.xml +++ b/android/app/src/main/res/values-fa/strings.xml @@ -165,8 +165,6 @@ انجام شد OpenStreetMap: %s داده‌های - - آیا مطمئن هستید که می خواهید از حساب OpenStreetMap خود خارج شوید؟ مسیر @@ -439,7 +437,6 @@ دسته بندی توضیح مفصل در مورد مشکل مشکلی دیگر - اضافه کردن یک تجارت نمی توان شی ای در این مکان باشد داده های OpenStreetMap ایجاد شده توسط انجمن از %s. درباره نحوه ویرایش و به روز رسانی نقشه در OpenStreetMap.org بیشتر بیاموزید @@ -481,7 +478,6 @@ بیشتر ویرایش نشانه‌ها یادداشت های شخصی (متن یا html) - اظهار نظر آیا تغییرات محلی را نادیده می گیرید؟ نادیده گرفتن آیا مکان ثبت شده حذف شود؟ diff --git a/android/app/src/main/res/values-fi/strings.xml b/android/app/src/main/res/values-fi/strings.xml index ca90817e3..c25b03178 100644 --- a/android/app/src/main/res/values-fi/strings.xml +++ b/android/app/src/main/res/values-fi/strings.xml @@ -185,8 +185,6 @@ Valmis OpenStreetMap-tiedot: %s - - Haluatko varmasti kirjautua ulos OpenStreetMap-tililtäsi? Reitit @@ -464,7 +462,6 @@ Kategoria Ongelman tarkka kuvaus Eri ongelma - Lisää organisaatio Kohdetta ei voida asettaa tänne Yhteisön luomat OpenStreetMap-tiedot %s:sta alkaen. Lisätietoja kartan muokkaamisesta ja päivittämisestä osoitteessa OpenStreetMap.org @@ -506,7 +503,6 @@ Lisää Muokkaa kirjanmerkkiä Henkilökohtaiset merkinnät (teksti tai html) - Kommentti… Nollataanko kaikki paikalliset muutokset? Nollaa Poistetaanko lisätty paikka? diff --git a/android/app/src/main/res/values-fr/strings.xml b/android/app/src/main/res/values-fr/strings.xml index cdc331db0..5d3b625ec 100644 --- a/android/app/src/main/res/values-fr/strings.xml +++ b/android/app/src/main/res/values-fr/strings.xml @@ -186,8 +186,6 @@ Terminé Données OpenStreetMap : %s - - Voulez-vous vraiment vous déconnecter de votre compte OpenStreetMap ? Traces @@ -466,7 +464,6 @@ Catégorie Description détaillée du problème Autre problème - Ajouter une entreprise Aucun objet ne peut être localisé ici Données OpenStreetMap créées par la communauté en date du %s. Pour en savoir plus sur la façon de modifier et de mettre à jour la carte, consultez le site OpenStreetMap.org @@ -508,7 +505,6 @@ Plus Modifier le signet Notes personnelles (texte ou html) - Commentaire… Abandonner toutes les modifications locales ? Ignorer Supprimer le lieu ajouté ? @@ -879,4 +875,24 @@ Existence confirmée %s Confirmé %s Impossible de lire ce texte à voix haute, vérifiez les paramètres de l’application + inconnue + Type 2 (sans câble) + Type 2 (avec câble) + Type 2 combo + Type 1 + NACS + CHAdeMO + Quantité + Puissance (kW) + inconnue + Créer de nouvelles prises ou modifier celles existantes. + Autre ou inconnue + Modifier la prise + La valeur doit être positive + Nombre incorrect + type de prise inconnu + prise inconnue + Prises libres + Éviter les escaliers + Cartes hors-ligne diff --git a/android/app/src/main/res/values-gl/strings.xml b/android/app/src/main/res/values-gl/strings.xml index 542267e64..ba082c43a 100644 --- a/android/app/src/main/res/values-gl/strings.xml +++ b/android/app/src/main/res/values-gl/strings.xml @@ -136,7 +136,6 @@ Historial Activar servizos de localización Información - Engadir organización Caixeiro automático Navegación Activado @@ -200,7 +199,6 @@ Ola: \n\nAgora estou aquí: %1$s. Fai clic nesta ligazón %2$s ou esta %3$s para velo no mapa. \n\nGrazas. Copiado ao portarretallos: %s Datos de OpenStreetMap: %s - Quere saír da súa conta de OpenStreetMap? Compartir a miña localización Axustes xerais Botóns de zum @@ -344,7 +342,6 @@ Más Editar marcador Notas persoais (texto ou html) - Comentario… Restablecer todos os cambios locais? Eliminar o lugar engadido? O lugar non existe @@ -607,4 +604,22 @@ Existencia confirmada %s Compartir ruta Non se atopa un motor texto-a-fala, comproba os axustes da app + descoñecida + Tipo 2 (sen cable) + Tipo 2 (con cable) + Tipo 2 combo + Tipo 1 + NACS + CHAdeMO + engache descoñecido + Cantidade + Potencia (kW) + Editar enganche + descoñecido + O valor ten que ser positivo + Número non válido + Crear novos enganches ou editar os existentes. + Enganches dispoñibles + Outro ou descoñecido + engache descoñecido diff --git a/android/app/src/main/res/values-gsw/strings.xml b/android/app/src/main/res/values-gsw/strings.xml index 4cd45ab7e..ba0f273ef 100644 --- a/android/app/src/main/res/values-gsw/strings.xml +++ b/android/app/src/main/res/values-gsw/strings.xml @@ -204,7 +204,6 @@ E-Mail Fertig OpenStreetMap-Date: %s - Bisch du dir sicher, dass du dich vo dim OpenStreetMap-Konto möchtsch abmelde? Tracks Längi Min Standort teile @@ -386,7 +385,6 @@ Kategorie Detaillierti Beschriibig vom Problem Es anders Problem - Organisation hinzuefüege Es Objekt cha da nöd positioniert werde Erstell es OpenStreetMap-Konto oder meld dich a, zum dini Chartebearbeitige weltwiit z veröffentliche %1$d vo %2$d @@ -401,7 +399,6 @@ d Lesezeiche bearbeite Persönlichi Notize (Text oder HTML) - Kommentar… Verwerfe Hinzuegfüegts Objekt lösche? Lösche diff --git a/android/app/src/main/res/values-hi/strings.xml b/android/app/src/main/res/values-hi/strings.xml index dde7c033f..7039da81b 100644 --- a/android/app/src/main/res/values-hi/strings.xml +++ b/android/app/src/main/res/values-hi/strings.xml @@ -182,8 +182,6 @@ हो गया OpenStreetMap डेटा: %s - - क्या आप वाकई अपने OpenStreetMap खाते से लॉग आउट करना चाहते हैं? पटरियों @@ -339,7 +337,6 @@ जैसा कि स्थानीय भाषा में लिखा गया है वर्ग - व्यवसाय जोड़ें समुदाय-निर्मित OpenStreetMap डेटा %s तक। OpenStreetMap.org पर मानचित्र को संपादित और अपडेट करने के तरीके के बारे में और जानें diff --git a/android/app/src/main/res/values-hu/strings.xml b/android/app/src/main/res/values-hu/strings.xml index 1fdfc3821..edba0c08b 100644 --- a/android/app/src/main/res/values-hu/strings.xml +++ b/android/app/src/main/res/values-hu/strings.xml @@ -49,7 +49,7 @@ Hardveres gyorsítású OpenGL szükséges. Sajnos az Ön eszköze nem támogatott. Letöltés - A CoMaps használatához válassza le az USB-kábelt, vagy helyezze be a memóriakártyát + A CoMaps használatához válassza le az USB-kábelt vagy helyezze be a memóriakártyát Az alkalmazás használatához először szabadítson fel némi helyet az SD-kártyán/USB-tárolón Mielőtt elkezdené használni az alkalmazást, töltse le az áttekintő világtérképet az eszközre. \nEz %s tárhelyet fog igénybe venni. @@ -183,8 +183,6 @@ Kész OpenStreetMap adatok: %s - - Biztosan ki akar jelentkezni az OpenStreetMap fiókjából? Nyomvonalak @@ -451,7 +449,6 @@ Kategória Probléma részletes leírása Más jellegű probléma - Vállalkozás hozzáadása Itt nem található objektum A közösségi OpenStreetMap adatok frissítésének időpontja: %s. Tudjon meg többet a térkép szerkesztéséről és frissítéséről az OpenStreetMap.org oldalon @@ -492,7 +489,6 @@ Tovább Könyvjelző szerkesztése Személyes jegyzetek (szöveg vagy html) - Megjegyzés… Elveti az összes módosítást? Elvetés Törli a hozzáadott helyet? @@ -866,4 +862,12 @@ Nyomvonal megosztása Nem található szövegfelovasási szolgáltatás (TTS), ellenőrizze az alkalmazás beállításait a „Hangutasítások” müpontban Küldjön hibajelentést:\n - „Naplózás engedélyezése” a beállításokban\n - reprodukálja a hibát\n - A „Névjegy és súgó” képernyőn nyomja meg a „Hibajelentés” gombot, és küldje el e-mailben vagy csevegésben.\n - naplózás kikapcsolása + 2. típus (nincs kábel) + 2. típus (kábel nélküli) + 2. típus kombinált + 1. típus + NACS (Észak-Amerikai töltőszabvány) + Gyors töltési szabvány Japán autókhoz + ismeretlen aljzat + ismeretlen áramkimenet diff --git a/android/app/src/main/res/values-in/strings.xml b/android/app/src/main/res/values-in/strings.xml index 03ed341a6..5210dd872 100644 --- a/android/app/src/main/res/values-in/strings.xml +++ b/android/app/src/main/res/values-in/strings.xml @@ -179,8 +179,6 @@ Selesai Data OpenStreetMap: %s - - Apakah Anda yakin ingin keluar dari akun OpenStreetMap Anda? Jalur @@ -445,7 +443,6 @@ Kategori Gambaran terperinci tentang masalah Masalah yang berbeda - Tambahkan organisasi Objek tidak dapat diletakkan di sini Data OpenStreetMap yang dibuat oleh komunitas pada tanggal %s. Pelajari lebih lanjut mengenai cara mengedit dan memperbarui peta di OpenStreetMap.org @@ -487,7 +484,6 @@ Lainnya Edit Bookmark Catatan pribadi (teks atau html) - Komentar… Atur ulang perubahan lokal? Atur Ulang Hapus tempat yang ditambahkan? diff --git a/android/app/src/main/res/values-is/strings.xml b/android/app/src/main/res/values-is/strings.xml index c636c5f7e..f6baf282d 100644 --- a/android/app/src/main/res/values-is/strings.xml +++ b/android/app/src/main/res/values-is/strings.xml @@ -177,7 +177,6 @@ Póstnúmer Settu inn gilt póstnúmer Rekstraraðili: %s - Athugasemd… Henda Alltaf nota Listar @@ -235,7 +234,6 @@ Trúarlegir staðir Sækja heims-yfirlitskortið Styddu við verkefnið - Ertu viss um að þú viljir skrá þig út af OpenStreetMap-aðgangnum þínum? Algengar spurningar (FAQ) Styrkja Tilkynna um villu @@ -443,7 +441,6 @@ Eða gerðu það sjálf/ur á https://www.openstreetmap.org/ Breyta opnunartímum Skráðu þig á OpenStreetMap - Bæta við fyrirtæki Sækja í gegnum gagnatengingu farsíma? Þetta gæti verið dýrt á sumum tegundum áskrifta eða ef verið sé á reiki. Minnispunktar þínir við gögn korts diff --git a/android/app/src/main/res/values-it/strings.xml b/android/app/src/main/res/values-it/strings.xml index eec99985c..42f82b26c 100644 --- a/android/app/src/main/res/values-it/strings.xml +++ b/android/app/src/main/res/values-it/strings.xml @@ -182,8 +182,6 @@ Fatto Dati OpenStreetMap: %s - - Sei sicuro di voler uscire dal tuo account OpenStreetMap? Tracce @@ -459,7 +457,6 @@ Categoria Descrizione dettagliata del problema Un problema diverso - Aggiungi attività Nessun oggetto può essere posizionato qui Dati OpenStreetMap creati dalla comunità aggiornati al %s. Per saperne di più su come modificare e aggiornare la mappa, visita OpenStreetMap.org @@ -500,7 +497,6 @@ Di più Modifica luogo preferito Note personali (testo o html) - Commenta… Cancellare tutte le modifiche locali? Cancella Eliminare il luogo aggiunto? diff --git a/android/app/src/main/res/values-iw/strings.xml b/android/app/src/main/res/values-iw/strings.xml index 938aa450f..52085bf2d 100644 --- a/android/app/src/main/res/values-iw/strings.xml +++ b/android/app/src/main/res/values-iw/strings.xml @@ -184,8 +184,6 @@ בוצע נתוני OpenStreetMap: %s - - האם אתה בטוח שברצונך להתנתק מחשבון OpenStreetMap שלך? מסלולים @@ -457,7 +455,6 @@ קטגוריה תאור מפורט של הבעיה בעיה אחרת - הוסף בית עסק לא ניתן למקם כאן פריט נתוני OpenStreetMap שנוצרו על ידי הקהילה החל מ-%s. למידע נוסף על איך לערוך ולעדכן את המפה ב-OpenStreetMap.org @@ -499,7 +496,6 @@ עוד ערוך סימניה הערות אישיות (טקסט או HTML) - תגובה… למחוק את כל השינויים המקומיים? מחק למחוק את המקום שהוסף? diff --git a/android/app/src/main/res/values-ja/strings.xml b/android/app/src/main/res/values-ja/strings.xml index 86a2cf4d1..9abc0a932 100644 --- a/android/app/src/main/res/values-ja/strings.xml +++ b/android/app/src/main/res/values-ja/strings.xml @@ -186,8 +186,6 @@ 完了 OpenStreetMapデータ:%s - - 本当にOpenStreetMapアカウントからログアウトしますか? トラック @@ -467,7 +465,6 @@ カテゴリ 問題の詳細な説明 異なる問題 - ビジネスを追加 ここにはオブジェクトを配置できません コミュニティが作成した%s時点の OpenStreetMap のデータ。地図の編集や更新の方法については、OpenStreetMap.org を参照してください @@ -509,7 +506,6 @@ さらに詳しく ブックマークを編集 パーソナルメモ(テキストまたはHTML) - コメント… ローカル編集をすべてリセットしますか? リセット 追加された場所を削除しますか? diff --git a/android/app/src/main/res/values-ko/strings.xml b/android/app/src/main/res/values-ko/strings.xml index 3adb5eab9..5e73b31fa 100644 --- a/android/app/src/main/res/values-ko/strings.xml +++ b/android/app/src/main/res/values-ko/strings.xml @@ -179,8 +179,6 @@ 완료 OpenStreetMap 데이터: %s - - OpenStreetMap 계정에서 로그아웃하시겠습니까? 트랙 @@ -445,7 +443,6 @@ 범주 문제에 대한 자세한 설명 다른 문제 - 조직 추가 목적지를 이곳에서 찾을 수 없습니다 커뮤니티에서 만든 OpenStreetMap 데이터(%s 기준). 지도를 편집하고 업데이트하는 방법에 대한 자세한 내용은 OpenStreetMap.org에서 확인하세요. @@ -487,7 +484,6 @@ 자세히 즐겨찾기 편집 개인 메모 (글자 혹은 html) - 설명… 지역 변경 사항을 재설정하시겠습니까? 재설정 추가한 장소를 삭제하시겠습니까? diff --git a/android/app/src/main/res/values-lt/strings.xml b/android/app/src/main/res/values-lt/strings.xml index 35772a43f..0176fe506 100644 --- a/android/app/src/main/res/values-lt/strings.xml +++ b/android/app/src/main/res/values-lt/strings.xml @@ -178,8 +178,6 @@ Baigta „OpenStreetMap“ duomenys: %s - - Ar tikrai norite atsijungti nuo „OpenStreetMap“ paskyros? Trasos @@ -451,7 +449,6 @@ Kategorija Išsamus problemos aprašymas Kita problema - Pridėti verslą Čia negalima talpinti jokių objektų Bendruomenės surinkti „OpenStreetMap“ duomenys %s dienai. Sužinokite, kaip redaguoti ir atnaujinti žemėlapį, apsilankydami OpenStreetMap.org svetainėje @@ -493,7 +490,6 @@ Išsamiau Taisyti žymę Asmeninės pastabos (tekstas arba HTML) - Komentaras… Anuliuoti visus vietinius pakeitimus? Anuliuoti Šalinti pridėtą vietą? diff --git a/android/app/src/main/res/values-lv/strings.xml b/android/app/src/main/res/values-lv/strings.xml index ef5afe541..41cb9b8e1 100644 --- a/android/app/src/main/res/values-lv/strings.xml +++ b/android/app/src/main/res/values-lv/strings.xml @@ -184,8 +184,6 @@ Pabeigts „OpenStreetMap“ dati: %s - - Vai tiešām vēlaties izrakstīties no „OpenStreetMap“ konta? Ceļi @@ -465,7 +463,6 @@ Kategorija Plašāks problēmas apraksts Cita problēma - Pievienot iestādi Šeit objekti nevar atrasties Kopienas veidotie OpenStreetMap dati, %s. Uzzināt vairāk par to, kā labot un atjaunināt karti, var OpenStreetMap.org @@ -501,7 +498,6 @@ Vairāk Rediģēt grāmatzīmi Personīgi pieraksti (teksts vai HTML) - Komentārs… Vai izmest visas lokāli saglabātās izmaiņas? Noraidīt Vai dzēst pievienoto vietu? @@ -816,4 +812,16 @@ https://comaps.app/ Saglabāts Atvērts projekts, kuru darbina kopiena + Nederīgs skaitlis + Apstiprināts %s + Esamība apstiprināta %s + Vērtībai jābūt pozitīvai + Labot ligzdu + Jauda (kW) + Skaits + Cits vai nezināms + Pieejamās ligzdas + Pievienot jaunas ligzdas vai labot esošās. + nezināma ligzda + nezināms diff --git a/android/app/src/main/res/values-mr/strings.xml b/android/app/src/main/res/values-mr/strings.xml index 7fab80de2..12b317c6c 100644 --- a/android/app/src/main/res/values-mr/strings.xml +++ b/android/app/src/main/res/values-mr/strings.xml @@ -172,8 +172,6 @@ झाले OpenStreetMap डेटा: %s - - तुमची खात्री आहे की तुम्ही तुमच्या OpenStreetMap खात्यातून लॉग आउट करू इच्छिता? ट्रॅक @@ -440,7 +438,6 @@ प्रवर्ग समस्येचे तपशिलात वर्णन वेगळी समस्या - व्यवसाय जोडा इथे कोणतीही वस्तू ठेवू शकत नाही समुदाय-निर्मित OpenStreetMap डेटा %s नुसार. OpenStreetMap.org वर नकाशा संपादित आणि अपडेट कसा करायचा याबद्दल अधिक जाणून घ्या @@ -482,7 +479,6 @@ अधिक खूणपत्र संपादित करा वैयक्तिक चिठ्ठ्या (मजकूर किंवा html) - टिप्पणी… सर्व स्थानिक बदल टाकून द्यायचे? टाकून द्या जोडलेले ठिकाण पुसून टाकायचे? diff --git a/android/app/src/main/res/values-mt/strings.xml b/android/app/src/main/res/values-mt/strings.xml index 686316235..c7a97685e 100644 --- a/android/app/src/main/res/values-mt/strings.xml +++ b/android/app/src/main/res/values-mt/strings.xml @@ -171,7 +171,6 @@ Ikkupjat fuq il-klibbord: %s Lest Dejta tal-OpenStreetMap: %s - Ċert li trid toħroġ mill-akkount tal-OpenStreetMap? Korsa Ixxerja l-post tiegħi Informazzjoni @@ -311,7 +310,6 @@ Żiddiet Isem tal-post Problema differenti - Żid in-negozju Dejta tal-OpenStreetMap maħluqa mill-komunita’ fl-%s. Sir af aktar dwar kif teditja u taġġorna l-mappa f’ OpenStreetMap.org Oħloq kont ma\' OpenStreetMap jew illoggja fih biex tippubblika l-editjar tal-mapep tiegħek għad-dinja %1$d ta\' %2$d @@ -481,7 +479,6 @@ OpenStreetMap.org (OSM) huwa proġett komunitarju biex tinbena mappa ħielsa u miftuħa. Huwa s-sors ewlieni tad-dejta tal-mapep fil-CoMaps u xogħlijiet simili għall-Wikipedija. Tista ’żżid jew teditja postijiet u dawn isiru disponibbli għal miljuni ta’ utenti madwar id-dinja kollha. \nIngħaqad mal-komunita’ u għen biex issir mappa aħjar għal kulħadd! Issortja… Meta tkun attivata, l-applikazzjoni taħdem fuq il-lockscreen anki meta t-tagħmir ikun imsakkar. - Kumment… L-editjar tiegħek jittella’ fid-database pubblika ta’ OpenStreetMap. Jekk jogħġbok iżżidx informazzjoni personali jew bid-drittijiet tal-awtur. CoMaps jippermetti li jiżdiedu kategoriji punti sempliċi biss, li jfisser l-ebda bliet, toroq, lagi, linji ġenerali tal-bini, eċċ. Jekk jogħġbok żid dawn il-kategoriji direttament mal-OpenStreetMap.org. Iċċekkja l-gwida tagħna għal struzzjonijiet dettaljati. Tgħallem iktar diff --git a/android/app/src/main/res/values-nb/strings.xml b/android/app/src/main/res/values-nb/strings.xml index 4c1b58d80..d3883ffed 100644 --- a/android/app/src/main/res/values-nb/strings.xml +++ b/android/app/src/main/res/values-nb/strings.xml @@ -9,7 +9,7 @@ Slett Last ned kart - Nedlastingen mislyktes. Trykk for å prøve igjen. + Nedlastingen mislyktes, trykk for å prøve igjen Laster ned … @@ -27,7 +27,7 @@ Begrenset nøyaktighet - For å sikre nøyaktig navigering aktiverer du Precise Location i innstillingene + For å sikre nøyaktig navigering aktiverer du nøyaktig posisjon i innstillingene Vis på kartet @@ -84,7 +84,7 @@ Lagre kart på - Velg mappe for kartlagring + Velg lagringsmappe for de nedlastede kartene Kart @@ -165,17 +165,17 @@ Posisjonen din har ikke blitt fastslått enda - Beklager, innstillingene for kartlagring er for øyeblikket deaktivert. + Beklager, innstillingene for kartlagring er for øyeblikket deaktivert - Nedlasting av kartdata pågår + Nedlasting av kart er i gang nå - Hei, se posisjonen min på CoMaps! %1$s eller %2$s Har du ikke offline-kart? Last dem ned her: https://www.comaps.app/download/ + Se posisjonen min på CoMaps! %1$s eller %2$s Har du ikke offline-kart? Last ned her: https://www.comaps.app/download/ Hei, se merket mitt på CoMaps-kartet Hei, se posisjonen min på CoMaps-kartet! - Hei, \nJeg er her nå: %1$s. Klikk denne lenken %2$s eller denne %3$s for å se stedet på kartet. \n \nTakk. + Hei, \n \nJeg er her nå: %1$s. Klikk denne lenken %2$s eller denne %3$s for å se stedet på kartet. \n \nTakk. Del @@ -186,8 +186,6 @@ Ferdig OpenStreetMap-data: %s - - Er du sikker på at du vil logge ut av OpenStreetMap-kontoen din? Ruter @@ -223,9 +221,9 @@ Talespråk - Test taleanvisninger (TTS, tekst-til-tale) + Test taleanvisninger - Kontroller volumet eller systeminnstillingene for tekst-til-tale hvis du ikke hører stemmen nå. + Kontroller volumet eller systeminnstillingene for tekst-til-tale hvis du ikke hører tale nå Ikke tilgjengelig Automatisk zooming @@ -248,7 +246,7 @@ Donere - Støtt prosjektet + Bidra som frivillig og forbedre CoMaps Opphavsrett @@ -273,7 +271,7 @@ Last ned alle Laster ned: - Stans navigeringen for å slette kartet. + Stans navigeringen for å slette kartet Det kan bare opprettes ruter som passer fullstendig innenfor ett enkelt kart. @@ -285,7 +283,7 @@ Oppdater kart - Google Play Stedstjenester + Google Fused-posisjonstjeneste Produsenteid tjeneste som kombinerer GPS, Wi-Fi, mobilnettverk etc. for å bestemme posisjonen din mer nøyaktig. Den kan koble til Google-servere. @@ -345,18 +343,18 @@ Aktiver stedstjenester Nåværende GPS-koordinater ble ikke funnet. Aktiver stedstjenester for å beregne en rute. Kunne ikke finne rute - Kunne ikke finne rute. + Kan ikke opprette rute Endre startpunkt eller bestemmelsessted. Endre startpunkt Ingen rute ble opprettet. Startpunktet ble ikke funnet. Velg et startpunkt som er i nærheten av en vei. Endre bestemmelsessted Ingen rute ble opprettet. Bestemmelsesstedet ble ikke funnet. - Velg et bestemmelsessted som er i nærheten av en vei. - Kunne ikke finne mellomstopp. - Kontroller og juster mellomstopp. + Velg et bestemmelsessted som er nærmere en vei + Kan ikke finne det mellomliggende punktet + Juster ditt mellomliggende punkt Systemfeil - En applikasjonsfeil førte til at ruten ikke kunne opprettes. + Kan ikke opprette rute pga. en programfeil Vennligst prøv igjen Ikke nå Vil du laste ned kartet og lage en mer optimal rute som går over flere kart? @@ -370,17 +368,17 @@ Skjul Kategorier Historikk - Beklager, jeg fant ingenting. + Ingen resultater funnet Last ned regionen du søker i, eller prøv å legge til et bynavn i nærheten. Søkehistorikk - Vis de siste søkene raskt. + Vis de siste søkene dine Tøm søkehistorikk Din beliggenhet Start Fra Rute til - Navigering er kun tilgjengelig fra din nåværende beliggenhet. + Navigering er kun tilgjengelig fra din gjeldende posisjon Vil du vi skal planlegge en rute fra din nåværende posisjon? Neste @@ -430,7 +428,7 @@ Legg til et språk Gate - Et husnummer + Husnummer Detaljer Sosiale medier Bygning @@ -440,22 +438,22 @@ Legg til en gateadresse Velg et språk Velg en gate - Matrett - Velg matrett + Kjøkken + Velg kjøkken Legg til telefon Gulv - Alle endringer i kartet vil slettes sammen med kartet. + Alle dine kartredigeringer vil slettes sammen med kartet Oppdater kart For å opprette en reiserute må du oppdatere alle kartene og deretter planlegge reiseruten på nytt. Finn kartet - Kontroller innstillingene dine og sørg for at enheten din er koblet til Internett. + Sørg for at enheten din er koblet til Internett Ikke nok plass Fjern unødvendig data - Innloggingsfeil. + Innloggingsfeil Bekreftede endringer Dra kartet for å plassere korset der stedet eller virksomheten befinner seg. - Redigerer + Redigering Legger til Navn på stedet @@ -463,17 +461,16 @@ Kategori Detaljert beskrivelse av problemet Et annet problem - Legg til organisasjon Et objekt kan ikke plasseres her Fellesskapsopprettede OpenStreetMap-data fra %s. Les mer om hvordan du redigerer og oppdaterer kartet på OpenStreetMap.org. OpenStreetMap.org (OSM) er et fellesskapsprosjekt for å bygge et gratis og åpent kart. Det er hovedkilden til kartdata i CoMaps og fungerer på samme måte som Wikipedia. Du kan legge til eller redigere steder, og de blir tilgjengelige for millioner av brukere over hele verden. \nBli med i fellesskapet og bidra til å lage et bedre kart for alle! - Opprett en OpenStreetMap-konto eller logg inn for å publisere kartredigeringene dine til hele verden. + Opprett en OpenStreetMap-konto eller logg inn for å publisere kartredigeringene dine til hele verden %1$d av %2$d Last ned med mobildata? - Dette kan medføre store kostnader med enkelte dataplaner eller om du roamer. + Dette kan være veldig dyrt med enkelte abonnementer eller ved roaming Skriv riktig husnummer Rediger bygningen med maks. %d etasjer @@ -494,8 +491,8 @@ Finner du ikke en passende kategori? CoMaps tillater kun å legge til enkle punktkategorier, det vil si ingen byer, veier, innsjøer, bygningsomriss osv. Vennligst legg til slike kategorier direkte til OpenStreetMap.org. Sjekk vår guide for detaljerte trinnvise instruksjoner. Du har ikke lastet ned noen kart - Last ned kart for å finne plasseringen og navigere frakoblet. - Gjeldende plassering er ukjent. + Last ned kart for å søke og navigere frakoblet + Gjeldende posisjon er ukjent km/t mph @@ -505,7 +502,6 @@ Mer Rediger bokmerke Personlige notater (text or html) - Kommentar… Nullstille alle lokale endringer? Nullstill Fjerne et tilføyd sted? @@ -526,8 +522,8 @@ Vil du sende det til alle brukere? - Sørg for at du ikke har skrevet noe personlig informasjon. - OpenStreetMap-redaktører vil sjekke endringene og ta kontakt med deg hvis de har spørsmål. + Sørg for at du ikke har angitt noen private eller personlige data + OpenStreetMap-redaktører vil sjekke endringene og kontakte deg hvis de har spørsmål Stopp Registrere sporet @@ -541,10 +537,10 @@ Ikke bruk i dag Mobilt Internett - Mobilt Internett er nødvendig for å vise detaljert informasjon om steder, for eksempel fotografier, priser og anmeldelser. + Mobilt Internett kreves for kartoppdateringsvarslinger og laste opp redigeringer Aldri bruk Alltid spør - For å vise trafikkdata må kartene i appen være oppdaterte. + For å vise trafikkdata må kartene være oppdaterte Forstørr skriften på kartet Vennligst oppdater CoMaps @@ -554,7 +550,7 @@ Generell tilbakemelding Vi bruker system TTS for stemmeveiledning. Mange Android-enheter bruker Google TTS, Du kan laste ned eller oppdatere via Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts) For enkelte språk er det nødvendig å installere en annen talesyntese eller en ekstra språkpakke fra appbutikken (Google Play, Galaxy Store, App Gallery, FDroid). \nGå til enhetens innstillinger → Språk og input → Tale → Tekst til tale output. \nHer kan du administrere innstillingene for talesyntese (for eksempel laste ned språkpakke for offline bruk) og velge en annen tekst-til-tale-motor. - Les denne veiledningen for mer informasjon. + Les denne veiledningen for mer informasjon Omskrivning til latin Finn ut mer @@ -624,7 +620,7 @@ Advar aldri Strømsparemodus - Når automatisk modus er valgt, begynner programmet å deaktivere batteridriftfunksjonene avhengig av det nåværende batterinivået + Prøv å redusere strømforbruket på bekostning av noen funksjoner Aldri Automatisk Maksimum strømsparing @@ -638,7 +634,7 @@ Unngå fergeoverganger Unngå motorveien Kan ikke beregne rute - Dessverre kunne vi ikke finne en rute sannsynligvis på grunn av dine definerte alternativer. Vennligst endre innstillingene og prøv igjen + Kan ikke finne en rute. Dette kan skyldes dine rutealternativer eller ufullstendige OpenStreetMap-data. Endre dine rutealternativer og prøv igjen. Definer veier som skal unngås Kjørealternativer aktivert Bompengevei @@ -699,8 +695,8 @@ T-bane navigasjon er ikke tilgjengelig i denne regionen ennå T-bane rute ikke funnet Velg utgangspunkt eller destinasjon som befinner seg nærmere en T-bane stasjon - Høyder - For å bruke høydekurver oppdater eller last opp kartet til nødvendig område + Høydekurver + Aktivering av høydekurver krever nedlasting av kartdata for dette området Høydekurver er ikke tilgjengelige i dette området ennå Stigning Nedstigning @@ -829,5 +825,41 @@ Panoramax-bilde https://comaps.app/ Bekreftet %s - Bekreftet eksisterer %s + Eksistens bekreftet %s + %1$s, %2$s + Sikkerhetskopiering pågår… + Sikkerhetskopiplassering + Automatisk sikkerhetskopiering + Av (kun manuelt) + Slette %s? + Bokmerkefarge + Om & Hjelp + Åpen nå + Wikipedia + Wikimedia Commons + Sikkerhetskopier nå + Sikkerhetskopiering feilet + Daglig + Ukentlig + Rutetype + Kjøretøy + Fotgjenger + Sykkel + Lukket nå + Nivå: %s + Etasjer (inkl. bakkeplan, ekskl. tak) + kl. %s + Ingen tekst-til-tale-motor funnet, sjekk appinnstillingene + Venstreknappoppsett + Sikkerhetskopi av bokmerker og spor + Automatisk sikkerhetskopiering til en mappe på enheten din + Opprett en sikkerhetskopi med en gang + Sikkerhetskopiering fullført + Ingen bokmerker og spor å sikkerhetskopiere + Sikkerhetskopimappen er ikke tilgjengelig + Siste vellykkede sikkerhetskopiering + Velg en mappe først og gi tillatelse + Antall sikkerhetskopier som skal beholdes + Den valgte sikkerhetskopiplasseringen er ikke tilgjengelig eller skrivbar. Velg en annen plassering. + Del spor diff --git a/android/app/src/main/res/values-night/colors.xml b/android/app/src/main/res/values-night/colors.xml new file mode 100644 index 000000000..6cda6a17c --- /dev/null +++ b/android/app/src/main/res/values-night/colors.xml @@ -0,0 +1,44 @@ + + + #FF7CBC7B + #FF588157 + + #FFC4C6C7 + + #FF76797C + + #1EFFFFFF + + + #FF32363A + #37653F + #FF3C4044 + @color/bg_window + #FF588157 + + #CC2D3237 + + #004120 + + + #40CCCCCC + @color/white_12 + #FFFFFFFF + #4CFFFFFF + + @color/base_accent + @color/base_accent_pressed + #FF505050 + #FF000000 + #4CFFFFFF + + + @color/black_primary + + #FF9600 + @color/base_accent + + + #54575b + #ffe68c + diff --git a/android/app/src/main/res/values-night/themes.xml b/android/app/src/main/res/values-night/themes.xml new file mode 100644 index 000000000..3aedf386c --- /dev/null +++ b/android/app/src/main/res/values-night/themes.xml @@ -0,0 +1,136 @@ + + + + + + + + diff --git a/android/app/src/main/res/values-nl/strings.xml b/android/app/src/main/res/values-nl/strings.xml index de558b91d..51538af89 100644 --- a/android/app/src/main/res/values-nl/strings.xml +++ b/android/app/src/main/res/values-nl/strings.xml @@ -186,8 +186,6 @@ Klaar OpenStreetMap-gegevens: %s - - Weet u zeker dat u wilt uitloggen uit uw OpenStreetMap account? Sporen @@ -461,7 +459,6 @@ Categorie Gedetailleerde probleemomschrijving Een ander probleem - Bedrijf toevoegen Hier kan geen object worden geplaatst Door de gemeenschap gemaakte OpenStreetMap-gegevens tot %s. Lees meer over hoe je de kaart kunt bewerken en bijwerken op OpenStreetMap.org @@ -503,7 +500,6 @@ Meer Bladwijzer bewerken Persoonlijke aantekeningen (tekst of html) - Reactie… Alle lokale wijzigingen weggooien? Gooi weg Toegevoegde locatie verwijderen? diff --git a/android/app/src/main/res/values-pl/strings.xml b/android/app/src/main/res/values-pl/strings.xml index 76493b0e0..7cf94863b 100644 --- a/android/app/src/main/res/values-pl/strings.xml +++ b/android/app/src/main/res/values-pl/strings.xml @@ -27,7 +27,7 @@ Ograniczona dokładność - Aby zapewnić dokładną nawigację, proszę włączyć opcję Precyzyjna lokalizacja w ustawieniach. + Aby zapewnić dokładną nawigację, włącz opcję Dokładna lokalizacja w ustawieniach Wyświetl na mapie @@ -186,8 +186,6 @@ Gotowe Dane OpenStreetMap: %s - - Czy na pewno chcesz się wylogować ze swojego konta OpenStreetMap? Trasy @@ -465,7 +463,6 @@ Kategoria Szczegółowy opis problemu Inny problem - Dodaj organizację Obiekt nie może znajdować się tutaj Dane OpenStreetMap stworzone przez społeczność na dzień %s. Dowiedz się więcej o tym, jak edytować i aktualizować mapę na stronie OpenStreetMap.org @@ -507,7 +504,6 @@ Więcej Edytuj zakładkę Notatki osobiste (tekst lub html) - Komentarz… Usunąć wszystkie lokalne zmiany? Usuń Usunąć dodane miejsce? diff --git a/android/app/src/main/res/values-pt-rBR/strings.xml b/android/app/src/main/res/values-pt-rBR/strings.xml index 926ce6000..01b860efb 100644 --- a/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/android/app/src/main/res/values-pt-rBR/strings.xml @@ -180,8 +180,6 @@ Feito Dados do OpenStreetMap: %s - - Você tem certeza de que deseja sair da sua conta do OpenStreetMap? Trilhas @@ -415,7 +413,6 @@ Categoria Descrição detalhada do problema Um problema diferente - Adicionar uma empresa Nenhum objeto pode ser posicionado aqui Dados do OpenStreetMap criados pela comunidade até %s. Saiba mais sobre como editar e atualizar o mapa em OpenStreetMap.org @@ -450,7 +447,6 @@ Mais Editar favorito Anotações pessoais (texto ou html) - Comentar… Descartar todas as modificações locais? Descartar Remover local adicionado? @@ -851,4 +847,23 @@ Existência confirmada %s Confirmado %s Nenhum mecanismo de conversão de texto em voz encontrado, verifique as configurações do aplicativo + desconhecido + Tipo 2 (sem cabo) + Tipo 2 (com cabo) + Combo tipo 2 + Tipo 1 + NACS + tomada desconhecida + CHAdeMO + Evitar degraus + tomada desconhecida + Criar novas tomadas ou editar existentes. + Tomadas disponíveis + Outra ou desconhecida + Quantidade + Potência (kW) + Editar tomada + desconhecida + O valor deve ser positivo + Número inválido diff --git a/android/app/src/main/res/values-pt/strings.xml b/android/app/src/main/res/values-pt/strings.xml index 73ffaa69a..40f4208fa 100644 --- a/android/app/src/main/res/values-pt/strings.xml +++ b/android/app/src/main/res/values-pt/strings.xml @@ -182,8 +182,6 @@ Feito Dados do OpenStreetMap: %s - - Tem certeza de que deseja sair da sua conta do OpenStreetMap? Trajetos @@ -454,7 +452,6 @@ Categoria Descrição detalhada do problema Um problema diferente - Adicionar uma organização Nenhum objeto pode ser posicionado aqui Dados do OpenStreetMap criados pela comunidade até %s. Sabe mais sobre como editar e atualizar o mapa em OpenStreetMap.org @@ -496,7 +493,6 @@ Mais Editar favorito Notas pessoais (texto ou html) - Comentário… Eliminar todas as alterações locais? Eliminar Eliminar o local adicionado? diff --git a/android/app/src/main/res/values-ro/strings.xml b/android/app/src/main/res/values-ro/strings.xml index 81835be91..5b521d8ac 100644 --- a/android/app/src/main/res/values-ro/strings.xml +++ b/android/app/src/main/res/values-ro/strings.xml @@ -180,8 +180,6 @@ Gata Date OpenStreetMap: %s - - Sigur doriți să vă deconectați din contul OpenStreetMap? Trasee @@ -457,7 +455,6 @@ Categorie Descriere detaliată a problemei Altă problemă - Adaugă o firmă Niciun obiect nu poate fi poziționat aici Date OpenStreetMap create de comunitate la data de %s. Aflați mai multe despre cum să editați și să actualizați harta la OpenStreetMap.org @@ -499,7 +496,6 @@ Mai mult Modifică locul preferat Însemnări personale (text sau html) - Comentariu… Ștergi toate modificările locale? Renunță Elimini locul adăugat? diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml index 1394eec50..e7b458d56 100644 --- a/android/app/src/main/res/values-ru/strings.xml +++ b/android/app/src/main/res/values-ru/strings.xml @@ -186,8 +186,6 @@ Готово Данные OpenStreetMap: %s - - Вы уверены, что хотите выйти из своей учетной записи OpenStreetMap? Треки @@ -457,7 +455,7 @@ Недостаточно места Удалите ненужные данные Не удалось войти - Учтённые правки + Учтенные правки Перетащите карту, чтобы поместить крестик на место расположения добавляемого объекта или заведения. Редактирование Добавление @@ -467,7 +465,6 @@ Категория Подробное описание проблемы Другая проблема - Добавить организацию Объект не может находиться в этом месте Созданные сообществом данные OpenStreetMap по состоянию на %s. Узнайте больше о том, как редактировать и обновлять карту на сайте OpenStreetMap.org @@ -509,7 +506,6 @@ Ещё Редактировать метку Примечание (текст или html) - Коментарий… Сбросить все локальные правки? Сбросить Удалить добавленный вами объект? diff --git a/android/app/src/main/res/values-sk/strings.xml b/android/app/src/main/res/values-sk/strings.xml index 1a2a14977..787b9da9b 100644 --- a/android/app/src/main/res/values-sk/strings.xml +++ b/android/app/src/main/res/values-sk/strings.xml @@ -184,8 +184,6 @@ Hotovo Údaje OpenStreetMap: %s - - Ste si istí, že sa chcete odhlásiť zo svojho účtu OpenStreetMap? Stopy @@ -461,7 +459,6 @@ Kategória Podrobný popis problému Iný problém - Pridať organizáciu Objekt sa tu nedá umiestniť Údaje OpenStreetMap vytvorené komunitou od %s. Viac informácií o tom, ako upravovať a aktualizovať mapu, nájdete na stránke OpenStreetMap.org @@ -503,7 +500,6 @@ Viac Upraviť záložku Osobné poznámky (text alebo html) - Poznámka… Resetovať všetky miestne časy? Resetovať Odstrániť pridané miesto? diff --git a/android/app/src/main/res/values-sl/strings.xml b/android/app/src/main/res/values-sl/strings.xml index 14a7491dd..a92fd4ead 100644 --- a/android/app/src/main/res/values-sl/strings.xml +++ b/android/app/src/main/res/values-sl/strings.xml @@ -3,4 +3,534 @@ Išči Prekliči Izbriši + Nazaj + Prenesi zemljevide + Prenos ni uspel, pritisnite za ponovni poskus + Prenašam … + Kilometri + Milje + Kasneje + Išči po zemljevidu + Na tej napravi so trenutno izklopljene vse lokacijske storitve. Omogočite jih v nastavitvah. + Nenatančna navigacija + Natančnejšo navigacijo lahko omogočite prek nastavitve Uporabi natančno lokacijo v sistemskih nastavitvah + Pokaži na zemljevidu + Prenos ni uspel + Poskusi ponovno + O programu CoMaps + Odprt projekt, ki ga vzdržuje skupnost + • Enostaven za uporabo in domišljen + • Osredotočen na zasebnost in brez oglasov + • Ne potrebuje internetne povezave, je hiter in priročen + Je popolnoma odprtokoden, ni usmerjen v zaslužek, vse odločanje in upravljanje s financami je transparentno. + Nastavitve lokacije + Blizu + Aplikacija potrebuje strojno pospešeni OpenGL. Na žalost vaša naprava ni podprta. + Prenesi + Omogoči lokacijske storitve + To je lahko precej drago z nekaterimi mobilnimi naročninami ali če gostujete v tujem omrežju + Vnesite veljavno številko stavbe + https://comaps.app/ + Pred uporabo CoMaps iztaknite kabel USB ali vstavite spominsko kartico + Pred uporabo aplikacije najprej sprostite nekaj prostora na SD kartici/USB shrambi + Preden začnete uporabljati aplikacijo, najprej prenesite pregledni zemljevid sveta na svojo napravo. \nZemljevid bo porabil %s prostora. + Na zemljevid + Prenašam %1$s (%2$s). Zdaj lahko \nnadaljujete na zemljevid. + Naj prenesem %1$s? (%2$s) + Naj posodobim %1$s? (%2$s) + Premor + Nadaljuj + Prenos za državo %s ni uspel + Dodaj nov seznam + Ime seznama zaznamkov + Zaznamki + Ime + Naslov + Seznam + Nastavitve + Shrani zemljevide v + Izberi mapo, v katero naj se prenesejo zemljevidi + Prenesenih zemljevidov + %1$s prosto od %2$s + Premaknem zemljevide? + Napaka med premikanjem datotek zemljevidov + To lahko traja nekaj minut. \nProsimo, počakajte … + Merske enote + Izberite med miljami in kilometri + Kje jesti + Špecerija + Javni prevoz + Gorivo + Parkiranje + Nakupovanje + Rabljeno blago + Hotel + Znamenitosti + Zabava + Bankomat + Nočno življenje + Družinske počitnice + Banka + Lekarna + Bolnišnica + Stranišče + Pošta + Policija + Ekološki otok + Voda + Prostori za avtodome + Pripis + Nekdo je z vami delil zaznamke CoMaps + Živjo! \n \nV priponki so moji zaznamki. Prosim, odpri jih v aplikaciji CoMaps. Če je še nimaš nameščene, jo lahko preneseš tukaj: https://www.comaps.app/download/ \n \nUživaj v potovanju s CoMaps! + Nalagam zaznamke + Zaznamki so uspešno naloženi! Najdete jih lahko na zemljevidu ali v upravitelju zaznamkov. + Zaznamkov ni bilo mogoče naložiti. Datoteka je morda okvarjena. + Aplikacija ne prepozna te vrste datoteke: \n%1$s + Ni bilo mogoče odpreti datoteke %1$s \n \n%2$s + Uredi + Vaša lokacija še ni znana + Žal so nastavitve shranjevanja zemljevidov trenutno onemogočene + Poteka prenašanje zemljevida + Zaznamki in poti + Oglej si mojo trenutno lokacijo na CoMaps! %1$s ali %2$s Si brez zemljevidov? Prenesi jih tukaj: https://www.comaps.app/download/ + Živjo, oglej si tale kraj na CoMaps! + Živjo, poglej si mojo trenutno lokacijo na zemljevidu CoMaps! + Živjo, \n \nzdajle sem tukaj: %1$s. S povezavo %2$s ali %3$s si lahko ogledaš ta kraj na zemljevidu. \n \nHvala. + Deli + E-pošta + Kopirano na odložišče: %s + Končano + Podatki OpenStreetMap: %s + Poti + Dolžina + Deli mojo lokacijo + Splošne nastavitve + Informacije + Navigacija + Gumbi za povečavo + Prikaži na zemljevidu + Nočni način + Izklopljeno + Vklopljeno + Samodejno + Pogled iz perspektive + 3D stavbe + 3D stavbe so onemogočene v načinu varčevanja z energijo + Glasovni ukazi + Najavi imena ulic + Ko je to omogočeno, bodo na glas izgovorjena imena ulic ali izvozov, na katere morate zaviti. + Jezik glasu + Preizkusi glasovne napotke + Če zdajle ne slišite glasu, preverite glasnost naprave ali nastavitve sistema pretvorbe besedila v govor + Ni na voljo + Samodejno približaj + Razdalja + Poglej na zemljevidu + Meni + Spletišče + Novice + Fotografija Panoramax + Povratne informacije + Ocenite aplikacijo + Pomoč + Pogosta vprašanja + Doniraj + Prispevajte in izboljšajte CoMaps + Avtorske pravice + Prijavite napako + Če usmeritev puščic ni dovolj dobra, lahko umerite kompas na napravi tako, da jo premikate v obliki osmice. + Popravite usmerjenost puščice na zemljevidu tako, da napravo premikate v obliki osmice. S tem boste umerili kompas. + Spet za dlje časa pritisnite na zemljevid, da se prikaže vmesnik + Posodobi vse + Prekliči vse + Preneseni zemljevidi + V čakalni vrsti + V moji bližini + Zemljevidi + Prenesi vse + Prenašam: + Preden izbrišete zemljevid, ustavite navigacijo + Lahko ustvarite samo relacije, ki so vsebovane v zemljevidu enega območja. + Prenesite zemljevid + Poskusi znova + Izbriši zemljevid + Posodobi zemljevid + Lastniška storitev, ki s pomočjo več tehnologij, kot so GPS, Wi-Fi, mobilno omrežje itd., natančneje določi vašo lokacijo. Morda zahteva povezavo na Googlove strežnike. + Prenesite vse zemljevide, čez katere gre vaša relacija + Preden lahko ustvarite relacijo, morate prenesti in posodobiti vse zemljevide med vašo lokacijo in končnim ciljem. + Ni dovolj prostora + Prosim, omogočite lokacijske storitve + Shrani + Rdeča + Rumena + Modra + Zelena + Vijolična + Oranžna + Rjava + Rožnata + Temno vijolična + Svetlo modra + Cijan + Zelenomodra + Rumenozelena + Temno oranžna + Siva + Modrosiva + Ko potujete po relaciji, imejte v mislih, da: + — imajo stanje na cesti, cestnoprometni predpisi in prometni znaki vedno prednost pred navigacijskimi predlogi; + — je lahko zemljevid nenatančen in predlagana pot ni vedno najbolj optimalna; + — so predlagane relacije zgolj in samo priporočila; + — morate biti previdni ob mejah: poti, ki jih začrta naša aplikacija, lahko včasih peljejo čez državne meje na nedovoljenih krajih. + Na cesti bodite pozorni in poskrbite za varnost! + Preveri signal GPS + Relacije ni bilo mogoče ustvariti. Ne morem določiti trenutnih koordinat GPS. + Preverite svoj signal GPS. Vašo lokacijo se bo dalo natančneje določiti, če omogočite Wi-Fi. + Ni bilo mogoče določiti trenutnih koordinat GPS. Za izračun relacije morate vklopiti lokacijske storitve. + Ni bilo mogoče najti relacije + Ni bilo mogoče ustvariti relacije + Prilagodite svoje izhodišče ali cilj. + Prilagodi izhodišče + Relacija ni bila ustvarjena. Ne morem najti izhodišča. + Izberite izhodišče, ki je bližje cesti. + Prilagodi cilj + Relacija ni bila ustvarjena. Ne morem najti cilja. + Izberite ciljno točko, ki je bližje cesti + Ne morem najti vmesne točke + Prilagodite vmesno točko + Sistemska napaka + Zaradi aplikacijske napake ne morem ustvariti relacije + Poskusite znova + Ne zdaj + Bi želeli prenesti zemljevid, da izračunam ugodnejšo relacijo, ki vodi čez več kot en zemljevid? + Prenesite dodatne zemljevide, da ustvarite boljšo relacijo, ki vodi izven tega zemljevida. + Preden začnete iskati in ustvarjati relacije, prosim, prenesite zemljevid. Po tem ne boste več potrebovali internetne povezave. + Izberi zemljevid + Pokaži + Skrij + Kategorije + Zgodovina + Ups, ni rezultatov + Prenesite območje, po katerem iščete, ali poskusite dodati ime bližnjega mesta/naselja. + Zgodovina iskanja + Pokaže vaše nedavne poizvedbe + Počisti zgodovino iskanja + Wikipedija + Wikimedijina zbirka + Vaša lokacija + Začetek + Relacija iz + Relacija v + Navigacija je mogoča le z vaše trenutne lokacije + Ali želite sestaviti načrt poti z vaše trenutne lokacije? + Naprej + Od + Do + Dodaj urnik + Izbriši urnik + Ves dan (24 ur) + Odprto + Zaprto + Dodaj dela prost čas + Obratovalni čas + Napredni način + Preprosti način + Dela prost čas + Primeri vrednosti + Popravi napako + Izberi lokacijo + Prosimo, podrobno opišite težavo, da jo lahko skupnost OpenStreetMap odpravi. + Ali pa jo popravite sami na https://www.openstreetmap.org/ + Pošlji + Težava + Ta kraj ne obstaja + Zaprto zaradi vzdrževalnih del + Podvojen kraj + Samodejno prenesi zemljevide + Vsak dan + 24/7 + Danes zaprto + Zaprto + Odpre se čez %s + Zapre se čez %s + Zaprto + Nazadnje potrjeno %s + Obstoj nazadnje potrjen %s + Uredi obratovalni čas + Nimate računa OpenStreetMap? + Registrirajte se na OpenStreetMap + Prijava + Niste prijavljeni + Prijavite se v OpenStreetMap + Odjava + Uredi kraj + Dodaj jezik + Ulica + Hišna številka + Podrobnosti + Družbena omrežja + Stavba + Dodaj ulico + Prosimo, vnesite ime ulice + Izberite jezik + Izberite ulico + Kuhinja + Izberite vrsto kuhinje + Dodaj telefon + Nadstropje + Nadstropje: %s + Z zemljevidom bodo izbrisana tudi vsa vaša urejanja + Posodobi zemljevide + Relacijo ustvarite tako, da posodobite vse zemljevide in ponovno začrtate relacijo. + Najdi zemljevid + Preverite, da je vaša naprava povezana na internet + Ni dovolj prostora + Prosimo, izbrišite vse nepotrebne podatke + Napaka pri prijavi + Potrjene spremembe + Povlecite zemljevid tako, da bo križ na lokaciji kraja ali podjetja. + Urejanje + Dodajanje + Ime kraja + Kot je zapisano v lokalnem jeziku + Kategorija + Podroben opis težave + Druga težava + Tukaj ni mogoče postaviti objekta + Javno ustvarjeni podatki OpenStreetMap z dne %s. Več o urejanju in posodabljanju zemljevida izveste na OpenStreetMap.org + OpenStreetMap.org (OSM) je projekt splošne javnosti za izdelavo brezplačnega in odprtega zemljevida. Je glavni vir zemljepisnih podatkov v CoMaps in deluje na podoben način kot Wikipedija. Lahko dodajate in urejate kraje, ti pa bodo potem na voljo milijonom ljudi povsem svetu. \nPridružite se skupnosti in pomagajte izboljšati zemljevid za vse! + Ustvarite račun OpenStreetMap ali pa se prijavite, da priobčite svoja urejanja na zemljevidu + %1$d od %2$d + Naj prenesem prek povezave mobilnega omrežja? + Nadstropja (s pritličjem, brez strehe) + Število nadstropij ne sme preseči %d + Poštna številka + Vnesite veljavno poštno številko + Komentar za prostovoljce na OpenStreetMap (neobvezno) + Opišite napake na zemljevidu ali stvari, ki jih ni mogoče urediti prek CoMaps + Vaša urejanja se naložijo v javno podatkovno bazo OpenStreetMap. Prosimo, da ne dodajate osebnih ali avtorsko zaščitenih podatkov. + Več o OpenStreetMap + Vaša zgodovina urejanja + Vaši komentarji za zemljevid + Izvajalec: %s + Izvajalec + Ne najdete primerne kategorije? + CoMaps dovoljuje dodajanje preprostih točkovnih kategorij, ne pa mest, cest, jezer, obrisov stavb itd. Tovrstne kategorije dodajte neposredno na OpenStreetMap.org. Natančna navodila si preberite v vodiču. + Prenesli niste nobenih zemljevidov + Prenesite zemljevide, da jih lahko uporabite tudi brez internetne povezave + Trenutna lokacija ni znana + km/h + mph + h + min + d + Več + Uredi zaznamek + Zasebne beležke (besedilo ali HTML) + Naj zavržem vse krajevne spremembe? + Zavrzi + Naj izbrišem dodane kraje? + Izbriši + Kraj ne obstaja + Označite razlog za izbris kraja + Vnesite veljavno telefonsko številko + Vnesite veljaven spletni naslov + Vnesite veljaven e-poštni naslov + Nadstropje (0 je pritličje) + Vnesite veljavno številko nadstropja + Vnesite veljavni Facebook naslov, račun ali ime strani + Vnesite veljavno uporabniško ime ali naslov za Instagram + Vnesite veljavno uporabniško ime ali naslov za Twitter + Vnesite veljavno uporabniško ime ali naslov za VK + Vnesite veljaven ID ali naslov za LINE + Vnesite veljavno uporabniško ime ali naslov za Mastodon + Vnesite veljavno uporabniško ime ali naslov za Bluesky + Dodaj kraj na OpenStreetMap + Ali pa pusti sporočilo skupnosti OpenStreetMap, da bo nekdo drug dodal ali popravil ta kraj. + Sporočilo bo poslano na OpenStreetMap + Ali to želite poslati vsem uporabnikom? + Poskrbite, da niste vnesli nobenih zasebnih podatkov + Uredniki na OpenStreetMap bodo preverili spremembe in stopili v stik z vami, če kaj ne bo jasno + Ustavi + Snemam pot + Potrdi + Zavrni + Naj pridobim podrobne informacije prek mobilnega interneta? + Vedno uporabi + Samo danes + Ne uporabi danes + Mobilni internet + Mobilni internet je potreben za obvestila o posodobitvah zemljevidov in za objavljanje urejanj + Nikoli ne uporabi + Vedno vprašaj + Za prikazovanje podatkov o prometu je treba posodobiti zemljevide + Povečajte velikost oznak na zemljevidu + Prosimo, posodobite CoMaps + Prometni podatki niso na voljo + Omogoči dnevniške zapise + Splošne povratne informacije + Za govorne napotke uporabljamo sistemski TTS. Mnoge naprave s sistemom Android uporabljajo Googlov TTS, ki ga lahko prenesete ali posodobite prek storitve Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts) + Več informacij najdete v tem vodiču + Prečrkuj v latinico + Več o tem + Uporabite iskanje ali pritisnite točko na zemljevidu, da dodate izhodišče relacije + Uporabite iskanje ali pritisnite točko na zemljevidu, da dodate cilj + Upravljaj relacijo + Načrtuj + Odstrani postanek + Dodaj postanek + Shranjeno + Težava z dostopom do pomnilnika + Zunanja shramba ni dostopna. SD kartica je bila morda odstranjena, je poškodovana ali pa datotečni sistem ne podpira zapisovanja. Preverite svojo SD kartico ali stopite v stik z nami prek support@comaps.app + Emuliraj pokvarjeno shrambo + Vnesite pravilno ime + Seznami + Skrij vse + Pokaži vse + + %d zaznamek + %d zaznamka + %d zaznamki + %d zaznamkov + + Ustvarite nov seznam + Uvozi zaznamke in poti + Ni bilo mogoče deliti zaradi aplikacijske napake + Napaka pri deljenju + Ni mogoče deliti praznega seznama + Ime ne sme biti prazno + Vnesite ime seznama + Nov seznam + To ime je že zasedeno + Izberite drugo ime + Prosim, počakajte … + Telefonska številka + Profil OpenStreetMap + + %d datoteka najdena. Po pretvorbi si jo lahko ogledate. + %d datoteki najdeni. Po pretvorbi si ju lahko ogledate. + %d datoteke najdene. Po pretvorbi si jih lahko ogledate. + %d datotek najdenih. Po pretvorbi si jih lahko ogledate. + + Obnovi + + %d pot + %d poti + %d poti + %d poti + + Zasebnost + Politika zasebnosti + Pogoji uporabe + Promet + Metro + Slogi in plasti zemljevida + Ta seznam je prazen + Da dodate zaznamek, pritisnite na točko na zemljevidu in nato pritisnite zvezdico + Izvozi KMZ + Izvozi GPX + Izbriši seznam + Radarji + Opis kraja + Prenašalnik zemljevidov + Opozori pri prehitri vožnji + Vedno opozori + Nikoli ne opozori + Način varčevanja z energijo + Poskusi zmanjšati porabo energije tako, da izklopi nekatere funkcionalnosti + Nikoli + Kadar zmanjkuje energije + Vedno + Začasno omogočite to možnost, da zabeležite in nam ročno pošljete podrobne diagnostične podatke o svoji težave prek gumba \"Prijavite napako\" v dialogu za pomoč. Beleženi podatki lahko vključujejo tudi informacije o lokaciji. + Možnosti relacije + Brez cestnin + Brez netlakovanih cest + Brez trajektov + Brez avtocest + Ne morem izračunati poti + Ni bilo mogoče najti relacije. Mogoče so krive vaše zahteve za pot ali pa nepopolni podatki OpenStreetMap. Prosimo, spremenite možnosti relacije in poskusite ponovno. + Definirajte, katerim cestam naj se izognemo + Možnosti relacije so omogočene + Cesta s cestnino + Netlakovana cesta + Plovba s trajektom + Da + Ne + Da + Ne + Kapaciteta: %s + Mreža: %s + Prispeli ste na cilj! + V redu + Uredi … + Uredi zaznamke + Privzeto + Po tipu + Po razdalji + Po datumu + Po imenu + Pred enim tednom + Pred enim mesecem + Pred več kot mesecem + Pred več kot letom + V moji bližini + Drugo + Hrana + Znamenitosti + Muzeji + Parki + Plavanje + Gore + Živali + Hoteli + Stavbe + Denar + Trgovine + Parkiranje + Bencinske črpalke + Zdravstvo + Išči po seznamu + Verski kraji + Izberi seznam + V tem območju navigacija s podzemno železnico še ni na voljo + Ne najdem relacije s podzemno železnico + Izberite začetno ali končno točko, ki je bližje postaji podzemne železnice + Plastnice + Plastnice lahko omogočite šele, ko prenesete kartografske podatke za to območje + Plastnice za to območje še niso na voljo + Vzpon + Spust + Min. višina + Maks. višina + Težavnost + Razd.: + Čas: + Približajte, da si ogledate izočrte + Prenašam + Prenesite pregledni zemljevid sveta + Ni bilo mogoče ustvariti mape in premakniti datotek v notranji spomin naprave ali na SD kartico + Diskovna napaka + Okvara povezave + Odklopite kabel USB + Ohrani zaslon prižgan + Če je to omogočeno, bo zaslon vedno prižgan, kadar bo prikazan zemljevid. + Vidno na zaklenjenem zaslonu + Kadar je to omogočeno, bo aplikacija delovala na zaslonu tudi, ko bo naprava zaklenjena. + Jezik zemljevida + Kartografski podatki z OpenStreetMap + https://t.me/CoMapsApp/ + https://www.instagram.com/comaps.app/ + https://www.comaps.app/support/tts-configuration-guide-for-android/ + %1$s, %2$s + Hvala, ker uporabljate naše javno narejene zemljevide! + Z vašo podporo lahko ustvarimo najboljše zemljevide na svetu! + Ali vam je naša aplikacija všeč? Vabimo vas, da finančno podprete njen razvoj! Ali niste zadovoljni z njo? Prosimo, da nam sporočite, zakaj, in jo bomo popravili! + Če poznate kakega_o razvijalca_ko programske opreme, ga_jo lahko prosite, da implementira funkcionalnost, ki jo potrebujete. + S kratkim pritiskom na zemljevid lahko izberete kateri koli element. Z dolgim pritiskom lahko skrijete ali pokažete vmesnik. + Ali ste vedeli, da lahko na zemljevidu izberete svojo trenutno lokacijo? + Lahko nam pomagate prevesti našo aplikacijo v svoj jezik. + Našo aplikacijo razvija nekaj zanesenjakov in skupnost. + Enostavno lahko popravite in izboljšate kartografske podatke. + Naš cilj je ustvariti učinkovite in enostavne zemljevide, ki spoštujejo zasebnost in vam koristijo. + CoMaps zdaj uporabljate na zaslonu telefona diff --git a/android/app/src/main/res/values-sr/strings.xml b/android/app/src/main/res/values-sr/strings.xml index 84d7d1965..b84f96ddc 100644 --- a/android/app/src/main/res/values-sr/strings.xml +++ b/android/app/src/main/res/values-sr/strings.xml @@ -180,8 +180,6 @@ Готово OpenStreetMap подаци: %s - - Да ли сте сигурни да желите да се одјавите са OpenStreetMap налога? Путање @@ -457,7 +455,6 @@ Категорија Детаљан опис проблема Други проблем - Додај фирму Објекат не може бити на овом месту Подаци са OpenStreetMap-а које је креирала заједница до %s. Научите више о томе како да мењате и ажурирате мапу на OpenStreetMap.org @@ -496,7 +493,6 @@ д Више Измени маркер - Коментар… Брисање свих измена које нису послате? Обриши Брисање додатог места? @@ -872,4 +868,22 @@ Није пронађен програм за претварање текста у говор, проверите подешавања апликације Или оставите напомену OpenStreetMap заједници да би неко други могао да дода или паправи ово место. Напомена ће бити послата на OpenStreetMap + Неисправан број + Вредност мора бити већа од нуле + непознато + Непознато напајање + Тип 2 (без кабла) + Тип 2 (са каблом) + Тип 2 комбо + Тип 1 + NACS + CHAdeMO + непозната утичница + непозната утичница + Расположиве утичнице + Друга или непозната + Број + Снага (kW) + Измени утичницу + Креирајте нову утичницу или промените постојеће. diff --git a/android/app/src/main/res/values-sv/strings.xml b/android/app/src/main/res/values-sv/strings.xml index d190d0e05..d1db7dc0a 100644 --- a/android/app/src/main/res/values-sv/strings.xml +++ b/android/app/src/main/res/values-sv/strings.xml @@ -179,8 +179,6 @@ Klar OpenStreetMap-data: %s - - Är du säker på att du vill logga ut från ditt OpenStreetMap-konto? Rutter @@ -445,7 +443,6 @@ Kategori Detaljerad beskrivning av problemet Annat problem - Lägg till organisation Ett objekt kan inte placeras här Community-skapade OpenStreetMap-data från och med %s. Läs mer om hur du redigerar och uppdaterar kartan på OpenStreetMap.org @@ -487,7 +484,6 @@ Mer Redigera bokmärke Personlig anteckning (text eller html) - kommentar… Återställ alla lokala ändringar? Återställ Ta bort en tillagd plats? diff --git a/android/app/src/main/res/values-sw/strings.xml b/android/app/src/main/res/values-sw/strings.xml index 3cac44b3e..7ce49238b 100644 --- a/android/app/src/main/res/values-sw/strings.xml +++ b/android/app/src/main/res/values-sw/strings.xml @@ -45,8 +45,6 @@ Imeshindwa kufungua faili %1$s \n \n%2$s Data ya OpenStreetMap: %s - - Je, una uhakika unataka kuondoka kwenye akaunti yako ya OpenStreetMap? Auto diff --git a/android/app/src/main/res/values-th/strings.xml b/android/app/src/main/res/values-th/strings.xml index 36e56ffed..6c8695837 100644 --- a/android/app/src/main/res/values-th/strings.xml +++ b/android/app/src/main/res/values-th/strings.xml @@ -179,8 +179,6 @@ เสร็จแล้ว ข้อมูล OpenStreetMap: %s - - คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบบัญชี OpenStreetMap ของคุณ? การติดตาม @@ -445,7 +443,6 @@ หมวดหมู่ คำอธิบายปัญหาอย่างละเอียด ปัญหาอีกอย่างหนึ่ง - เพิ่มองค์กร ไม่สามารถตั้งวัตถุได้ที่นี่ ข้อมูล OpenStreetMap ที่สร้างโดยชุมชน ณ %s เรียนรู้เพิ่มเติมเกี่ยวกับวิธีแก้ไขและอัปเดตแผนที่ได้ที่ OpenStreetMap.org @@ -487,7 +484,6 @@ เพิ่มเติม แก้ไข Bookmark ข้อความส่วนตัว (ข้อความหรือ html) - ข้อคิดเห็น ตั้งค่าการเปลี่ยนแปลงท้องถิ่นทั้งหมด ตั้งค่าใหม่ ลบที่ที่เพิ่มออก diff --git a/android/app/src/main/res/values-tr/strings.xml b/android/app/src/main/res/values-tr/strings.xml index 704ca6dde..d964bc023 100644 --- a/android/app/src/main/res/values-tr/strings.xml +++ b/android/app/src/main/res/values-tr/strings.xml @@ -9,7 +9,7 @@ Sil Harita İndir - İndirme başarısız olmuştur, yeniden denemek için dokunun. + İndirme başarısız oldu, Tekrar denemek için dokunun. İndiriliyor… @@ -82,7 +82,7 @@ Ayarlar - Haritaları şuraya kaydet: + Haritaları şuraya kaydet Haritaların indirileceği klasörü seçin @@ -186,8 +186,6 @@ Bitti OpenStreetMap verileri: %s - - OpenStreetMap hesabınızdan çıkış yapmak istediğinizden emin misiniz? GPS Kayıtları @@ -225,7 +223,7 @@ Sesli Navigasyon Testi - Sesi duyamıyorsanız ses seviyesini veya sistem metin okuma ayarlarını kontrol edin. + Sesi duyamıyorsanız ses seviyesini veya sistem metin okuma ayarlarını kontrol edin Yok Kendiliğinden yaklaştır @@ -271,7 +269,7 @@ Tümünü İndir İndiriliyor: - Haritayı silmek için lütfen navigasyonu kapatın. + Haritayı silmek için lütfen navigasyonu kapatın Rotalar yalnızca tümüyle tek bir bölgenin haritası içinde oluşturulabilir. @@ -463,7 +461,6 @@ Kategori Sorunun ayrıntılı açıklaması Farklı bir sorun - Kuruluş ekle Buraya bir nesne konumlandırılamıyor %s tarihine ait topluluk tarafından oluşturulmuş OpenStreetMap verilerini kullanıyorsunuz. OpenStreetMap.org adresinden haritayı nasıl düzenleyebileceğiniz hakkında bilgi edinebilirsiniz @@ -505,7 +502,6 @@ Diğer Yer İmini Düzenle Kişisel notlar (metin veya html) - Yorum… Tüm yerel değişiklikler sıfırlansın mı? Sıfırla Eklenen yer kaldırılsın mı? @@ -873,4 +869,7 @@ Notunuz OpenStreetMap\'e gönderilecektir %s onaylandı %s varlığı onaylandı + Rotayı paylaş + %s silinsin mi? + Metinden sese dönüştürme motoru bulunamadı, uygulama ayarlarını kontrol edin diff --git a/android/app/src/main/res/values-uk/strings.xml b/android/app/src/main/res/values-uk/strings.xml index 48adfd875..372333d7d 100644 --- a/android/app/src/main/res/values-uk/strings.xml +++ b/android/app/src/main/res/values-uk/strings.xml @@ -186,8 +186,6 @@ Готово Дані OpenStreetMap: %s - - Ви впевнені, що хочете вийти зі свого облікового запису OpenStreetMap? Маршрути @@ -464,7 +462,6 @@ Категорія Детальний опис проблеми Інші проблема - Додати організацію Об\'єкт не може перебувати в цьому місцезнаходженні Дані OpenStreetMap, створені спільнотою, станом на %s. Дізнайтеся більше про те, як редагувати та оновлювати мапу на OpenStreetMap.org @@ -506,7 +503,6 @@ Ще Редагувати мiтку Примітка (текст чи html) - Коментар… Скинути всі локальні виправлення? Скинути Видалити об\'єкт, що ви додали? diff --git a/android/app/src/main/res/values-v27/themes.xml b/android/app/src/main/res/values-v27/themes.xml index be189822b..1f4882c4d 100644 --- a/android/app/src/main/res/values-v27/themes.xml +++ b/android/app/src/main/res/values-v27/themes.xml @@ -9,12 +9,4 @@ shortEdges - diff --git a/android/app/src/main/res/values-vi/strings.xml b/android/app/src/main/res/values-vi/strings.xml index 77a42f1ad..13bfc2cc8 100644 --- a/android/app/src/main/res/values-vi/strings.xml +++ b/android/app/src/main/res/values-vi/strings.xml @@ -179,8 +179,6 @@ Xong Dữ liệu OpenStreetMap: %s - - Bạn có chắc chắn muốn đăng xuất khỏi tài khoản OpenStreetMap của mình không? Dấu vết @@ -445,7 +443,6 @@ Thể loại Mô tả chi tiết của vấn đề Một vấn đề khác - Thêm tổ chức Một đối tượng không thể đặt được ở đây Dữ liệu OpenStreetMap do cộng đồng tạo ra kể từ %s. Tìm hiểu thêm về cách chỉnh sửa và cập nhật bản đồ tại OpenStreetMap.org @@ -487,7 +484,6 @@ Bổ sung Sửa Dấu Trang Ghi chú cá nhân (văn bản hoặc html) - Nhận xét… Cài đặt lại tất cả thay đổi cục bộ? Cài đặt lại Xóa một địa điểm đã thêm? diff --git a/android/app/src/main/res/values-zh-rTW/strings.xml b/android/app/src/main/res/values-zh-rTW/strings.xml index 982278ddd..1648fcf06 100644 --- a/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/android/app/src/main/res/values-zh-rTW/strings.xml @@ -186,8 +186,6 @@ 完成 OpenStreetMap 數據:%s - - 您確定要登出您的 OpenStreetMap 帳戶嗎? 軌跡 @@ -471,7 +469,6 @@ 類別 問題的詳細描述 不同的問題 - 將地點添加到 地點無法放置在這裡 截至 %s 的社群創建的 OpenStreetMap 資料。請訪問 OpenStreetMap.org 以了解有關如何編輯和更新地圖的更多資訊 @@ -513,7 +510,6 @@ 更多 編輯書籤 個人備註(文字或 html) - 備註… 重設所有本機變更? 重設 移除已新增的地點? diff --git a/android/app/src/main/res/values-zh/strings.xml b/android/app/src/main/res/values-zh/strings.xml index 4bff1eb15..702502bcf 100644 --- a/android/app/src/main/res/values-zh/strings.xml +++ b/android/app/src/main/res/values-zh/strings.xml @@ -186,8 +186,6 @@ 完成 OpenStreetMap 数据:%s - - 是否确定要登出您的 OpenStreetMap 账号? 轨迹 @@ -471,7 +469,6 @@ 类别 问题的详细描述 不同的问题 - 将地点添加到 地点不能放置在这里 截至 %s 的社区创建的 OpenStreetMap 数据。请访问 OpenStreetMap.org 以了解有关如何编辑和更新地图的信息 @@ -513,7 +510,6 @@ 更多 编辑书签 个人备注(文字或 html) - 备注… 重置所有本地更改? 重置 删除已添加的地点? @@ -877,4 +873,22 @@ 已于%s确认 分享轨迹 未找到文字转语音引擎,请检查应用设置 + 未知 + Type 2(无电缆) + Type 2(带电缆) + Type 2 Combo + Type 1 + NACS + CHAdeMO + 未知充电接口 + 未知充电接口 + 创建新充电接口或编辑现有充电接口。 + 可用的充电接口 + 其他或未知 + 数量 + 功率(千瓦) + 编辑充电接口 + 未知 + 值必须为正数 + 无效的数字 diff --git a/android/app/src/main/res/values/arrays.xml b/android/app/src/main/res/values/arrays.xml index a6f3b36e2..de2c651d7 100644 --- a/android/app/src/main/res/values/arrays.xml +++ b/android/app/src/main/res/values/arrays.xml @@ -22,4 +22,32 @@ @drawable/route_point_19 @drawable/route_point_20 + + + type2_combo + nacs + chademo + type1 + type2_cable + type2 + unknown + + + + 22 + 43 + 50 + 100 + 150 + 200 + 350 + + + + 1 + 2 + 4 + 8 + 10 + diff --git a/android/app/src/main/res/values/attrs.xml b/android/app/src/main/res/values/attrs.xml index 4db620a25..2721ec905 100644 --- a/android/app/src/main/res/values/attrs.xml +++ b/android/app/src/main/res/values/attrs.xml @@ -65,14 +65,6 @@ - - - - - - - - diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index be3c9f4b7..717751f5a 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -9,9 +9,7 @@ @color/white_lightest #FF37653F - #FF7CBC7B #FF588157 - #FF588157 #1EF9B42D #F51E30 @@ -55,35 +53,25 @@ #3C8C3C #FF757575 - #FFC4C6C7 #FFBDBDBD - #FF76797C #1E000000 - #1EFFFFFF #FFEEEEEE - #FF32363A #588157 - #37653F @android:color/white - #FF3C4044 @color/bg_window - @color/bg_window_night #37653F - #FF588157 #BB000000 #99FFFFFF #CCFFFFFF - #CC2D3237 #004120 #66000000 - #121417 @color/bg_primary @@ -101,26 +89,16 @@ #00000000 - #00000000 #66999999 - #40CCCCCC #00000000 - @color/white_12 #FF000000 - #FFFFFFFF #42000000 - #4CFFFFFF @color/base_accent - @color/base_accent_night @color/base_accent_pressed - @color/base_accent_pressed_night @color/black_12 - #FF505050 #FFFFFFFF - #FF000000 #42000000 - #4CFFFFFF @color/base_red #FFFFFFFF @@ -129,14 +107,11 @@ #1F000000 #FFFFFFFF @color/bg_statusbar - @color/bg_statusbar_night #80FFFFFF - @color/white_primary - @color/black_primary - @color/black_30 - @color/black_30 + @color/white_primary + @color/black_20 #FFF2F6F6 @@ -146,8 +121,7 @@ #FFC800 #FF9600 - #1E96F0 - #4BB9E6 + @color/base_accent #0057ff @@ -156,8 +130,7 @@ #ebebeb - #54575b #FF37653F - #ffe68c #ffc30a + diff --git a/android/app/src/main/res/values/dimens.xml b/android/app/src/main/res/values/dimens.xml index 8d80993bc..77c248fdb 100644 --- a/android/app/src/main/res/values/dimens.xml +++ b/android/app/src/main/res/values/dimens.xml @@ -101,7 +101,7 @@ 6dp 44dp - 104dp + 100dp 88dp 8dp 6dp diff --git a/android/app/src/main/res/values/donottranslate.xml b/android/app/src/main/res/values/donottranslate.xml index 677369e46..f38701efc 100644 --- a/android/app/src/main/res/values/donottranslate.xml +++ b/android/app/src/main/res/values/donottranslate.xml @@ -103,4 +103,6 @@ VK Lemmy Pixelfed + × %d + %s kW diff --git a/android/app/src/main/res/values/font_sizes.xml b/android/app/src/main/res/values/font_sizes.xml index 3277b1530..6ff60ffd3 100644 --- a/android/app/src/main/res/values/font_sizes.xml +++ b/android/app/src/main/res/values/font_sizes.xml @@ -55,7 +55,7 @@ 20sp 56sp - 17sp + 19sp 24sp 22sp 24sp diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 7bd9cfa30..cfcde9394 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -205,8 +205,6 @@ Done OpenStreetMap data: %s - - Are you sure you want to log out of your OpenStreetMap account? Tracks @@ -495,7 +493,6 @@ Category Detailed description of the issue Different problem - Add business No object can be located here Community-created OpenStreetMap data as of %s. Learn more about how to edit and update the map at OpenStreetMap.org @@ -539,12 +536,12 @@ More Edit Bookmark Personal notes (text or html) - Comment… Discard all local changes? Discard Delete added place? Delete Place does not exist + Describe what the place looks like now to send an error note to the OpenStreetMap community Please indicate the reason for deleting the place @@ -680,6 +677,7 @@ Avoid ferries Avoid freeways + Avoid steps Unable to calculate route A route could not be found. This may be caused by your routing options or incomplete OpenStreetMap data. Please change your routing options and retry. Define roads to avoid @@ -935,4 +933,24 @@ Share Track Delete %s? No text-to-speech engine found, check the app settings + unknown + Type 2 (no cable) + Type 2 (w/ cable) + Type 2 combo + Type 1 + NACS + CHAdeMO + unknown socket + unknown socket + Create new sockets or edit existing ones. + Available sockets + Other or unknown + Count + Power (kW) + Edit socket + unknown + The value must be positive + Invalid number + Offline Maps + A map needs to be downloaded to view and navigate the area.\nDownload maps for areas you want to travel. diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index e6a6fd847..b4faab183 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -165,7 +165,7 @@ - - - - - - - - - - - - - - - - - - @@ -369,33 +197,11 @@ @android:color/transparent - - - - - - - @@ -435,43 +232,19 @@ @drawable/downloader_folder_done - - - - - - - - - - - diff --git a/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp b/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp index fac992985..4a7913b47 100644 --- a/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp +++ b/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp @@ -1241,16 +1241,32 @@ JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_Framework_nativeGetRouteFollo return CreateRoutingInfo(env, info, rm); } -JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_Framework_nativeGetRouteJunctionPoints(JNIEnv * env, jclass) +JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_Framework_nativeGetRouteJunctionPoints(JNIEnv * env, jclass, + jdouble maxDistM) { - vector junctionPoints; - if (!frm()->GetRoutingManager().RoutingSession().GetRouteJunctionPoints(junctionPoints)) + vector points; + if (!frm()->GetRoutingManager().RoutingSession().GetRouteJunctionPoints(points)) { LOG(LWARNING, ("Can't get the route junction points")); return nullptr; } - return CreateJunctionInfoArray(env, junctionPoints); + vector result; + result.reserve(points.size()); + result.push_back(points[0]); + for (size_t i = 1; i < points.size(); ++i) + { + double const dist = ms::DistanceOnEarth(points[i - 1].ToLatLon(), points[i].ToLatLon()); + if (dist > maxDistM) + { + int const steps = static_cast(dist / maxDistM) + 1; + for (int s = 1; s < steps; ++s) + result.push_back(points[i - 1].Interpolate(points[i], static_cast(s) / steps)); + } + result.push_back(points[i]); + } + + return CreateJunctionInfoArray(env, result); } JNIEXPORT jintArray JNICALL Java_app_organicmaps_sdk_Framework_nativeGenerateRouteAltitudeChartBits( @@ -1592,6 +1608,33 @@ JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_Framework_nativeGetActiveObje return jni::ToJavaString(env, g_framework->GetPlacePageInfo().FormatCuisines()); } +JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_Framework_nativeGetActiveObjectChargeSockets(JNIEnv * env, + jclass) +{ + auto sockets = g_framework->GetPlacePageInfo().GetChargeSockets(); + + jclass descClass = env->FindClass("app/organicmaps/sdk/bookmarks/data/ChargeSocketDescriptor"); + jmethodID ctor = env->GetMethodID(descClass, "", "(Ljava/lang/String;ID)V"); + + // Create a Java array + jobjectArray result = env->NewObjectArray(sockets.size(), descClass, nullptr); + + for (size_t i = 0; i < sockets.size(); ++i) + { + auto const & s = sockets[i]; + + jstring jType = env->NewStringUTF(s.type.c_str()); + jobject jDesc = env->NewObject(descClass, ctor, jType, (jint)s.count, (jdouble)s.power); + + env->SetObjectArrayElement(result, i, jDesc); + + env->DeleteLocalRef(jType); + env->DeleteLocalRef(jDesc); + } + + return result; +} + JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativeSetVisibleRect(JNIEnv * env, jclass, jint left, jint top, jint right, jint bottom) { diff --git a/android/sdk/src/main/cpp/app/organicmaps/sdk/editor/Editor.cpp b/android/sdk/src/main/cpp/app/organicmaps/sdk/editor/Editor.cpp index 6c3f573b4..bd0bfea2a 100644 --- a/android/sdk/src/main/cpp/app/organicmaps/sdk/editor/Editor.cpp +++ b/android/sdk/src/main/cpp/app/organicmaps/sdk/editor/Editor.cpp @@ -7,6 +7,7 @@ #include "indexer/cuisines.hpp" #include "indexer/editable_map_object.hpp" +#include "indexer/feature_charge_sockets.hpp" #include "indexer/feature_utils.hpp" #include "indexer/validate_and_format_contacts.hpp" @@ -94,6 +95,64 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSetOpeningHo g_editableMapObject.SetOpeningHours(jni::ToNativeString(env, value)); } +JNIEXPORT jobjectArray JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetChargeSockets(JNIEnv * env, jclass) +{ + auto sockets = g_editableMapObject.GetChargeSockets(); + + jclass descClass = env->FindClass("app/organicmaps/sdk/bookmarks/data/ChargeSocketDescriptor"); + jmethodID ctor = env->GetMethodID(descClass, "", "(Ljava/lang/String;ID)V"); + + // Create a Java array + jobjectArray result = env->NewObjectArray(sockets.size(), descClass, nullptr); + + for (size_t i = 0; i < sockets.size(); ++i) + { + auto const & s = sockets[i]; + + jstring jType = env->NewStringUTF(s.type.c_str()); + jobject jDesc = env->NewObject(descClass, ctor, jType, (jint)s.count, (jdouble)s.power); + + env->SetObjectArrayElement(result, i, jDesc); + + env->DeleteLocalRef(jType); + env->DeleteLocalRef(jDesc); + } + + return result; +} + +JNIEXPORT void JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeSetChargeSockets(JNIEnv * env, jclass, + jobjectArray jSockets) +{ + ChargeSocketsHelper chargeSockets; + + jsize len = env->GetArrayLength(jSockets); + + jclass descClass = env->FindClass("app/organicmaps/sdk/bookmarks/data/ChargeSocketDescriptor"); + jfieldID fidType = env->GetFieldID(descClass, "type", "Ljava/lang/String;"); + jfieldID fidCount = env->GetFieldID(descClass, "count", "I"); + jfieldID fidPower = env->GetFieldID(descClass, "power", "D"); + + for (jsize i = 0; i < len; ++i) + { + jobject jDesc = env->GetObjectArrayElement(jSockets, i); + + jstring jType = (jstring)env->GetObjectField(jDesc, fidType); + char const * cType = env->GetStringUTFChars(jType, nullptr); + + jint count = env->GetIntField(jDesc, fidCount); + jdouble power = env->GetDoubleField(jDesc, fidPower); + + chargeSockets.AddSocket(cType, static_cast(count), static_cast(power)); + + env->ReleaseStringUTFChars(jType, cType); + env->DeleteLocalRef(jType); + env->DeleteLocalRef(jDesc); + } + + g_editableMapObject.SetChargeSockets(chargeSockets.ToString()); +} + JNIEXPORT jstring JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetMetadata(JNIEnv * env, jclass, jint id) { auto const metaID = static_cast(id); @@ -167,15 +226,6 @@ JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeShouldSh return g_framework->GetPlacePageInfo().ShouldShowEditPlace(); } -JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowAddBusiness(JNIEnv *, jclass) -{ - ::Framework * frm = g_framework->NativeFramework(); - if (!frm->HasPlacePageInfo()) - return static_cast(false); - - return g_framework->GetPlacePageInfo().ShouldShowAddBusiness(); -} - JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeShouldShowAddPlace(JNIEnv *, jclass) { ::Framework * frm = g_framework->NativeFramework(); diff --git a/android/sdk/src/main/cpp/app/organicmaps/sdk/routing/JunctionInfo.hpp b/android/sdk/src/main/cpp/app/organicmaps/sdk/routing/JunctionInfo.hpp index e73a3f52a..510bb0854 100644 --- a/android/sdk/src/main/cpp/app/organicmaps/sdk/routing/JunctionInfo.hpp +++ b/android/sdk/src/main/cpp/app/organicmaps/sdk/routing/JunctionInfo.hpp @@ -2,8 +2,6 @@ #include "app/organicmaps/sdk/core/jni_helper.hpp" -#include "geometry/point_with_altitude.hpp" - #include jobjectArray CreateJunctionInfoArray(JNIEnv * env, std::vector const & junctionPoints) @@ -15,7 +13,7 @@ jobjectArray CreateJunctionInfoArray(JNIEnv * env, std::vectorNewObject(junctionClazz, junctionConstructor, mercator::YToLat(point.y), mercator::XToLon(point.x)); + auto const & ll = pointWithAltitude.ToLatLon(); + return env->NewObject(junctionClazz, junctionConstructor, ll.m_lat, ll.m_lon); }); } diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/Framework.java b/android/sdk/src/main/java/app/organicmaps/sdk/Framework.java index 67a8dbc06..d0dc92311 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/Framework.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/Framework.java @@ -8,6 +8,7 @@ import androidx.annotation.Size; import app.organicmaps.sdk.api.ParsedRoutingData; import app.organicmaps.sdk.api.ParsedSearchRequest; import app.organicmaps.sdk.api.RequestType; +import app.organicmaps.sdk.bookmarks.data.ChargeSocketDescriptor; import app.organicmaps.sdk.bookmarks.data.DistanceAndAzimut; import app.organicmaps.sdk.bookmarks.data.FeatureId; import app.organicmaps.sdk.bookmarks.data.MapObject; @@ -200,7 +201,8 @@ public class Framework public static native RoutingInfo nativeGetRouteFollowingInfo(); @Nullable - public static native JunctionInfo[] nativeGetRouteJunctionPoints(); + /// @param[in] maxDistM Max distance between points in meters. + public static native JunctionInfo[] nativeGetRouteJunctionPoints(double maxDistM); @Nullable public static native final int[] nativeGenerateRouteAltitudeChartBits(int width, int height, @@ -304,6 +306,8 @@ public class Framework public static native String nativeGetActiveObjectFormattedCuisine(); + public static native ChargeSocketDescriptor[] nativeGetActiveObjectChargeSockets(); + public static native void nativeSetVisibleRect(int left, int top, int right, int bottom); // Navigation. diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/Map.java b/android/sdk/src/main/java/app/organicmaps/sdk/Map.java index a60c3976e..3a689dbbf 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/Map.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/Map.java @@ -21,7 +21,6 @@ public final class Map void report(); } - public static final String ARG_LAUNCH_BY_DEEP_LINK = "launch_by_deep_link"; private static final String TAG = Map.class.getSimpleName(); // Should correspond to android::MultiTouchAction from Framework.cpp @@ -220,11 +219,10 @@ public final class Map mMapRenderingListener.onRenderingRestored(); } - public void onSurfaceDestroyed(boolean activityIsChangingConfigurations, boolean isAdded) + public void onSurfaceDestroyed(boolean activityIsChangingConfigurations) { - Logger.d(TAG, "mSurfaceCreated = " + mSurfaceCreated + ", mSurfaceAttached = " + mSurfaceAttached - + ", isAdded = " + isAdded); - if (!mSurfaceCreated || !mSurfaceAttached || !isAdded) + Logger.d(TAG, "mSurfaceCreated = " + mSurfaceCreated + ", mSurfaceAttached = " + mSurfaceAttached); + if (!mSurfaceCreated || !mSurfaceAttached) return; nativeDetachSurface(!activityIsChangingConfigurations); @@ -261,7 +259,7 @@ public final class Map nativeSetRenderingInitializationFinishedListener(null); } - public void onPause(final Context context) + public void onPause() { mUiThemeOnPause = Config.UiTheme.getCurrent(); @@ -282,7 +280,7 @@ public final class Map return mSurfaceCreated; } - public void onScroll(double distanceX, double distanceY) + public static void onScroll(double distanceX, double distanceY) { Map.nativeOnScroll(distanceX, distanceY); } @@ -331,6 +329,11 @@ public final class Map nativeExecuteMapApiRequest(); } + public DisplayType getDisplayType() + { + return mDisplayType; + } + private void setupWidgets(final Context context, int width, int height) { mHeight = height; diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/MapController.java b/android/sdk/src/main/java/app/organicmaps/sdk/MapController.java new file mode 100644 index 000000000..6636621c2 --- /dev/null +++ b/android/sdk/src/main/java/app/organicmaps/sdk/MapController.java @@ -0,0 +1,107 @@ +package app.organicmaps.sdk; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import app.organicmaps.sdk.location.LocationHelper; +import app.organicmaps.sdk.util.log.Logger; + +public class MapController implements DefaultLifecycleObserver +{ + private static final String TAG_PEFRIX = MapController.class.getSimpleName(); + @NonNull + private final String TAG; + + @NonNull + private final MapView mMapView; + @NonNull + private final Map mMap; + + @Nullable + private Runnable mOnSurfaceDestroyedListener = null; + + public MapController(@NonNull MapView mapView, @NonNull LocationHelper locationHelper, + @NonNull MapRenderingListener mapRenderingListener, + @Nullable Map.CallbackUnsupported callbackUnsupported, boolean launchByDeepLink) + { + mMapView = mapView; + mMap = mMapView.getMap(); + mMap.onCreate(launchByDeepLink); + mMap.setLocationHelper(locationHelper); + mMap.setMapRenderingListener(mapRenderingListener); + mMap.setCallbackUnsupported(callbackUnsupported); + TAG = TAG_PEFRIX + "[" + mMap.getDisplayType() + "]"; + } + + public MapView getView() + { + return mMapView; + } + + public boolean isRenderingActive() + { + return Map.isEngineCreated() && mMap.isContextCreated(); + } + + public void updateCompassOffset(int offsetX, int offsetY) + { + mMap.updateCompassOffset(mMapView.getContext(), offsetX, offsetY, true); + } + + public void updateBottomWidgetsOffset(int offsetX, int offsetY) + { + mMap.updateBottomWidgetsOffset(mMapView.getContext(), offsetX, offsetY); + } + + public void updateMyPositionRoutingOffset(int offsetY) + { + mMap.updateMyPositionRoutingOffset(offsetY); + } + + public void setOnDestroyListener(@NonNull Runnable task) + { + mOnSurfaceDestroyedListener = task; + } + + @Override + public void onStart(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + mMap.onStart(); + } + + @Override + public void onResume(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + mMap.onResume(); + } + + @Override + public void onPause(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + mMap.onPause(); + } + + @Override + public void onStop(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + mMap.onStop(); + } + + @Override + public void onDestroy(@NonNull LifecycleOwner owner) + { + Logger.d(TAG); + mMap.setMapRenderingListener(null); + mMap.setCallbackUnsupported(null); + if (mOnSurfaceDestroyedListener != null) + { + mOnSurfaceDestroyedListener.run(); + mOnSurfaceDestroyedListener = null; + } + } +} diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/MapView.java b/android/sdk/src/main/java/app/organicmaps/sdk/MapView.java new file mode 100644 index 000000000..7944ad027 --- /dev/null +++ b/android/sdk/src/main/java/app/organicmaps/sdk/MapView.java @@ -0,0 +1,182 @@ +package app.organicmaps.sdk; + +import android.app.Activity; +import android.content.Context; +import android.content.ContextWrapper; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import androidx.annotation.NonNull; +import androidx.core.content.res.ConfigurationHelper; +import app.organicmaps.sdk.display.DisplayType; +import app.organicmaps.sdk.util.Utils; +import app.organicmaps.sdk.util.log.Logger; + +public class MapView extends SurfaceView +{ + private static final String TAG = MapView.class.getSimpleName(); + + private class SurfaceHolderCallback implements SurfaceHolder.Callback + { + @Override + public void surfaceCreated(@NonNull SurfaceHolder holder) + { + Logger.d(TAG); + mMap.onSurfaceCreated(MapView.this.getContext(), holder.getSurface(), holder.getSurfaceFrame(), + ConfigurationHelper.getDensityDpi(MapView.this.getResources())); + } + + @Override + public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) + { + Logger.d(TAG); + mMap.onSurfaceChanged(MapView.this.getContext(), holder.getSurface(), holder.getSurfaceFrame(), + holder.isCreating()); + } + + @Override + public void surfaceDestroyed(@NonNull SurfaceHolder holder) + { + Logger.d(TAG); + mMap.onSurfaceDestroyed(isHostActivityChangingConfigurations()); + } + } + + @NonNull + private final Map mMap; + + public MapView(Context context) + { + this(context, null, 0); + } + + public MapView(Context context, DisplayType displayType) + { + this(context, null, 0, 0, displayType); + } + + public MapView(Context context, AttributeSet attrs) + { + this(context, attrs, 0); + } + + public MapView(Context context, AttributeSet attrs, int defStyleAttr) + { + this(context, attrs, defStyleAttr, 0); + } + + public MapView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) + { + this(context, attrs, defStyleAttr, defStyleRes, DisplayType.Device); + } + + private MapView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, + @NonNull DisplayType displayType) + { + super(context, attrs, defStyleAttr, defStyleRes); + mMap = new Map(displayType); + getHolder().addCallback(new SurfaceHolderCallback()); + } + + public final void onDraw(@NonNull Canvas canvas) + { + super.onDraw(canvas); + if (isInEditMode()) + drawMapPreview(canvas); + } + + @Override + public boolean onTouchEvent(@NonNull MotionEvent event) + { + int action = event.getActionMasked(); + int pointerIndex = event.getActionIndex(); + switch (action) + { + case MotionEvent.ACTION_POINTER_UP -> action = Map.NATIVE_ACTION_UP; + case MotionEvent.ACTION_UP -> + { + action = Map.NATIVE_ACTION_UP; + pointerIndex = 0; + } + case MotionEvent.ACTION_POINTER_DOWN -> action = Map.NATIVE_ACTION_DOWN; + case MotionEvent.ACTION_DOWN -> + { + action = Map.NATIVE_ACTION_DOWN; + pointerIndex = 0; + } + case MotionEvent.ACTION_MOVE -> + { + action = Map.NATIVE_ACTION_MOVE; + pointerIndex = Map.INVALID_POINTER_MASK; + } + case MotionEvent.ACTION_CANCEL -> action = Map.NATIVE_ACTION_CANCEL; + } + Map.onTouch(action, event, pointerIndex); + performClick(); + return true; + } + + @Override + public boolean performClick() + { + super.performClick(); + return false; + } + + @NonNull + Map getMap() + { + return mMap; + } + + /// The function is called only in the design mode of Android Studio. + private void drawMapPreview(@NonNull Canvas canvas) + { + final int w = getWidth(); + final int h = getHeight(); + + // Background + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + paint.setStyle(Paint.Style.FILL); + if (Utils.isDarkMode(getContext())) + paint.setColor(Color.rgb(30, 30, 30)); + else + paint.setColor(Color.rgb(245, 242, 230)); + canvas.drawRect(0, 0, w, h, paint); + + // Grid lines (lat/lon) + paint.setColor(Color.LTGRAY); + paint.setStrokeWidth(2f); + final int step = Math.min(w, h) / 6; + for (int i = 0; i < Math.max(w, h); i += step) + { + if (i < w) + canvas.drawLine(i, 0, i, h, paint); + if (i < h) + canvas.drawLine(0, i, w, i, paint); + } + } + + private boolean isHostActivityChangingConfigurations() + { + Activity activity = findActivity(getContext()); + return activity != null && activity.isChangingConfigurations(); + } + + private static Activity findActivity(Context context) + { + while (context instanceof ContextWrapper) + { + if (context instanceof Activity) + { + return (Activity) context; + } + context = ((ContextWrapper) context).getBaseContext(); + } + return null; + } +} diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/ChargeSocketDescriptor.java b/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/ChargeSocketDescriptor.java new file mode 100644 index 000000000..955464bc6 --- /dev/null +++ b/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/ChargeSocketDescriptor.java @@ -0,0 +1,7 @@ +package app.organicmaps.sdk.bookmarks.data; + +/** + * represents the details of the socket available on a particular charging station + * + */ +public record ChargeSocketDescriptor(String type, int count, double power) {} diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/MapObject.java b/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/MapObject.java index fc097fe23..147bf2bff 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/MapObject.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/MapObject.java @@ -296,6 +296,11 @@ public class MapObject implements PlacePageData mMetadata.addMetadata(type, value); } + public boolean hasChargeSockets() + { + return !TextUtils.isEmpty(getMetadata(Metadata.MetadataType.FMD_CHARGE_SOCKETS)); + } + public boolean hasPhoneNumber() { return !TextUtils.isEmpty(getMetadata(Metadata.MetadataType.FMD_PHONE_NUMBER)); diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/Metadata.java b/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/Metadata.java index 509df74a9..cfb591c55 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/Metadata.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/bookmarks/data/Metadata.java @@ -11,6 +11,7 @@ import java.util.Map; public class Metadata implements Parcelable { // Values must correspond to the Metadata definition from indexer/feature_meta.hpp. + // Remember to also update IntRange below to match the max ID public enum MetadataType { // Defined by classifier types now. @@ -71,7 +72,7 @@ public class Metadata implements Parcelable FMD_PANORAMAX(52), FMD_CHECK_DATE(53), FMD_CHECK_DATE_OPEN_HOURS(54), - //FMD_BRANCH(55), + FMD_BRANCH(55), FMD_CHARGE_SOCKETS(56); private final int mMetaType; @@ -81,7 +82,7 @@ public class Metadata implements Parcelable } @NonNull - public static MetadataType fromInt(@IntRange(from = 1, to = 49) int metaType) + public static MetadataType fromInt(@IntRange(from = 1, to = 56) int metaType) { for (MetadataType type : values()) if (type.mMetaType == metaType) diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/editor/Editor.java b/android/sdk/src/main/java/app/organicmaps/sdk/editor/Editor.java index f736fbb6e..b73198b55 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/editor/Editor.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/editor/Editor.java @@ -5,6 +5,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Size; import androidx.annotation.WorkerThread; import app.organicmaps.sdk.Framework; +import app.organicmaps.sdk.bookmarks.data.ChargeSocketDescriptor; import app.organicmaps.sdk.bookmarks.data.Metadata; import app.organicmaps.sdk.editor.data.FeatureCategory; import app.organicmaps.sdk.editor.data.Language; @@ -49,7 +50,6 @@ public final class Editor } public static native boolean nativeShouldShowEditPlace(); - public static native boolean nativeShouldShowAddBusiness(); public static native boolean nativeShouldShowAddPlace(); public static native boolean nativeShouldEnableEditPlace(); public static native boolean nativeShouldEnableAddPlace(); @@ -63,6 +63,8 @@ public final class Editor public static native void nativeSetMetadata(int id, String value); public static native String nativeGetOpeningHours(); public static native void nativeSetOpeningHours(String openingHours); + public static native ChargeSocketDescriptor[] nativeGetChargeSockets(); + public static native void nativeSetChargeSockets(ChargeSocketDescriptor[] sockets); public static String nativeGetPhone() { return nativeGetMetadata(Metadata.MetadataType.FMD_PHONE_NUMBER.toInt()); diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/location/RouteSimulationProvider.java b/android/sdk/src/main/java/app/organicmaps/sdk/location/RouteSimulationProvider.java index 329cd319f..3eaf6aece 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/location/RouteSimulationProvider.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/location/RouteSimulationProvider.java @@ -16,6 +16,7 @@ class RouteSimulationProvider extends BaseLocationProvider private final JunctionInfo[] mPoints; private int mCurrentPoint = 0; + private Location mPrev = null; private boolean mActive = false; RouteSimulationProvider(@NonNull Context context, @NonNull Listener listener, JunctionInfo[] points) @@ -56,9 +57,20 @@ class RouteSimulationProvider extends BaseLocationProvider location.setLatitude(mPoints[mCurrentPoint].mLat); location.setLongitude(mPoints[mCurrentPoint].mLon); location.setAccuracy(1.0f); + + if (mPrev != null) + { + location.setSpeed(mPrev.distanceTo(location) / (INTERVAL_MS / 1000)); + location.setBearing(mPrev.bearingTo(location)); + } + location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); + location.setTime(System.currentTimeMillis()); + mListener.onLocationChanged(location); mCurrentPoint += 1; + mPrev = location; + UiThread.runLater(this::nextPoint, INTERVAL_MS); } } diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/settings/RoadType.java b/android/sdk/src/main/java/app/organicmaps/sdk/settings/RoadType.java index e74f08aed..976702e68 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/settings/RoadType.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/settings/RoadType.java @@ -6,5 +6,6 @@ public enum RoadType Toll, Motorway, Ferry, - Dirty + Dirty, + Steps } diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/util/Utils.java b/android/sdk/src/main/java/app/organicmaps/sdk/util/Utils.java index 2f5cfdbad..eefef19f7 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/util/Utils.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/util/Utils.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.res.Configuration; import android.content.res.Resources; import android.os.Build; import android.text.TextUtils; @@ -346,4 +347,10 @@ public class Utils { return context.getResources().getDimensionPixelSize(id); } + + public static boolean isDarkMode(@NonNull Context context) + { + return (context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) + == Configuration.UI_MODE_NIGHT_YES; + } } diff --git a/android/sdk/src/main/res/drawable/ic_charge_socket_chademo.xml b/android/sdk/src/main/res/drawable/ic_charge_socket_chademo.xml new file mode 100644 index 000000000..d76ab9d02 --- /dev/null +++ b/android/sdk/src/main/res/drawable/ic_charge_socket_chademo.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/sdk/src/main/res/drawable/ic_charge_socket_nacs.xml b/android/sdk/src/main/res/drawable/ic_charge_socket_nacs.xml new file mode 100644 index 000000000..dcd6d0e05 --- /dev/null +++ b/android/sdk/src/main/res/drawable/ic_charge_socket_nacs.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/sdk/src/main/res/drawable/ic_charge_socket_type1.xml b/android/sdk/src/main/res/drawable/ic_charge_socket_type1.xml new file mode 100644 index 000000000..2d249d390 --- /dev/null +++ b/android/sdk/src/main/res/drawable/ic_charge_socket_type1.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/sdk/src/main/res/drawable/ic_charge_socket_type2.xml b/android/sdk/src/main/res/drawable/ic_charge_socket_type2.xml new file mode 100644 index 000000000..4dbf661c8 --- /dev/null +++ b/android/sdk/src/main/res/drawable/ic_charge_socket_type2.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/sdk/src/main/res/drawable/ic_charge_socket_type2_cable.xml b/android/sdk/src/main/res/drawable/ic_charge_socket_type2_cable.xml new file mode 100644 index 000000000..6ddd56021 --- /dev/null +++ b/android/sdk/src/main/res/drawable/ic_charge_socket_type2_cable.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/sdk/src/main/res/drawable/ic_charge_socket_type2_combo.xml b/android/sdk/src/main/res/drawable/ic_charge_socket_type2_combo.xml new file mode 100644 index 000000000..af0dab217 --- /dev/null +++ b/android/sdk/src/main/res/drawable/ic_charge_socket_type2_combo.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/sdk/src/main/res/drawable/ic_charge_socket_unknown.xml b/android/sdk/src/main/res/drawable/ic_charge_socket_unknown.xml new file mode 100644 index 000000000..aa7ecd20b --- /dev/null +++ b/android/sdk/src/main/res/drawable/ic_charge_socket_unknown.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/sdk/src/main/res/values-bg/types_strings.xml b/android/sdk/src/main/res/values-bg/types_strings.xml index 8cad77a0e..e5a7b2889 100644 --- a/android/sdk/src/main/res/values-bg/types_strings.xml +++ b/android/sdk/src/main/res/values-bg/types_strings.xml @@ -164,7 +164,6 @@ Тунел Мост - Площад Тунел @@ -419,7 +418,7 @@ Пердета Магазин за деликатеси Строителен маркет - Магазин за селскостопански храни + Фермерски магазин Модни аксесоари Магазин за газ Хранителни стоки @@ -1235,7 +1234,7 @@ Магазин за алкохол Букмейкър Книжарница - Автокъща на домове на колела + Автокъща за кемпери Магазин за шоколад Магазин за кафе Магазин за компютри @@ -1374,4 +1373,7 @@ Спускане със ски за начинаещи Обслужвана зона Гора + Приют за животни + Интернет + Интернет diff --git a/android/sdk/src/main/res/values-de/types_strings.xml b/android/sdk/src/main/res/values-de/types_strings.xml index 197f3e76d..97cfb3ee9 100644 --- a/android/sdk/src/main/res/values-de/types_strings.xml +++ b/android/sdk/src/main/res/values-de/types_strings.xml @@ -23,7 +23,7 @@ Kunstzentrum Geldautomat Bankfiliale - Grillplatz + Grillstelle Sitzbank Fahrradständer Fahrradverleih @@ -38,8 +38,8 @@ Autowaschanlage Kasino Glücksspiel - Gaming-Zentrum für Erwachsene - Arkade + Spielhalle für Erwachsene + Spielhalle für Unterhaltungsspiele Ladestation Fahrrad-Ladestation Kfz-Ladestation @@ -47,11 +47,11 @@ Kino Bowlingbahn Klinik - Hochschule - Bürgerhaus + Bildungseinrichtung + Gemeinschaftszentrum Druckluft Konferenzzentrum - Justizgebäude + Gericht Zahnarzt Arztpraxis Trinkwasser @@ -95,9 +95,9 @@ Parkbucht Parkbucht Private Parkbucht - Fahrspur parken - Fahrspur parken - Privatspur parken + Parkstreifen + Parkstreifen + Privater Parkstreifen Parkplatzeinfahrt Private Parkplatzeinfahrt Parkplatzeinfahrt @@ -116,8 +116,8 @@ Hinduistischer Tempel Synagoge Moschee - Schrein - Tempel + Shintō-Schrein + Daoistischer Tempel Polizeistation Briefkasten Postfiliale @@ -130,7 +130,7 @@ Wertstoffcontainer Batterien Altkleider - Glas + Glasflaschen Papier Kunststoff Plastikflaschen @@ -179,8 +179,8 @@ Abfalleimer Müllcontainer Müllumladestation - Wasseranschluss - Wasseranschluss + Wassertank-Auffüllstation + Wassertank-Auffüllstation Barriere Barriere Block @@ -190,7 +190,7 @@ Stadtmauer Umlaufschranke Entwässerungsgraben - Graben + Verteidigungsgraben Abwasser Durchgang Zaun @@ -207,14 +207,14 @@ Grenze Verwaltungsgrenze Nationalpark - Indigene länder - Geschützter Bereich - Geschützter Bereich - Geschützter Bereich - Geschützter Bereich - Geschützter Bereich - Geschützter Bereich - Geschützter Bereich + Indigenes Gebiet + Schutzgebiet + Schutzgebiet + Schutzgebiet + Schutzgebiet + Schutzgebiet + Schutzgebiet + Schutzgebiet Gebäude Adresse @@ -227,9 +227,9 @@ Imker Schmied Brauerei - Partyservice + Caterer Zimmermann - Süßwarenladen + Süßwaren-Manufaktur Elektriker Elektrogerätereparatur Landschaftsgärtner @@ -293,7 +293,7 @@ International Irisch Italienisch - Italienisch; Pizza + Italienische Pizza Japanisch Kebap Koreanisch @@ -365,7 +365,7 @@ Reitweg Tunnel - Eigene Busstraße + Busstraße Brücke @@ -384,7 +384,7 @@ Fußgängerübergang Fußweg - Brücke + Fußgängerbrücke Fußgängertunnel Furt @@ -433,7 +433,7 @@ Brücke Tunnel - Rennbahn + Rennstrecke Wohnstraße Wohnstraße @@ -509,10 +509,10 @@ Straßentunnel Radweg - Weg - Wohnstraße + Fußweg + Spielstraße Autobahn - Weg + Pfad Fußgängerzone Hauptstraße Wohnstraße @@ -528,7 +528,7 @@ Historisches Flugzeug Historischer Anker Ausgrabungsstätte - Schlachtfeld + Historisches Schlachtfeld Grenzstein Kanone Burg @@ -591,7 +591,7 @@ Mischwald Garagen Wiese - Rohbauland + Bauland Gewächshaus-Fläche Industriegebiet Müllhalde @@ -605,10 +605,10 @@ Wohngebiet Einzelhandelsgebiet Saline - Dorfplatz + Grünfläche Weinberg Freizeit - öffentliche Grünfläche + Öffentliche Grünfläche Hundeauslauffläche Fitnessstudio Fitnessstation @@ -620,11 +620,11 @@ Eislaufplatz Jachthafen Naturschutzgebiet - Außengastronomie + Außenbestuhlung Park - Park + Privater Park Park - Park + Privater Park Picknicktisch Sportplatz Spielplatz @@ -639,7 +639,7 @@ Laufbahn Laufbahn Aquapark - künstliche Anlage + Künstliche Anlage Wellenbrecher Steinmännchen Fabrikschornstein @@ -1120,7 +1120,7 @@ Gartencenter Gas-Geschäft Geschenkeladen - Gemüseladen + Obst- und Gemüseladen Lebensmittelkonserven Friseur Eisenwarengeschäft @@ -1268,7 +1268,7 @@ Motel Museum Picknickplatz - Freizeitanlage + Resort Freizeitpark Aussichtspunkt @@ -1276,11 +1276,11 @@ Zoo Streichelzoo Verkehrsberuhigung - kurze Bodenwelle - lange Bodenwelle + Kurze Bodenwelle + Lange Bodenwelle Wasserweg Kanal - Kanal + Kanal-Tunnel Fischtreppe Staudamm Graben @@ -1316,7 +1316,7 @@ Leichte Ski-Abfahrt Profi-Ski-Abfahrt Profi-Ski-Abfahrt - Ski-Abfahrt + Freeride Ski-Abfahrt Mittelschwere Ski-Abfahrt Mittelschwere Ski-Abfahrt Anfängerfreundliche Ski-Abfahrt @@ -1324,10 +1324,10 @@ Langlaufloipe Rodelbahn Rodelbahn - Schneepark - Schneewanderweg - Pistenanschluss - Skitour Pfad + Funpark + Winterwanderweg + Verbindungs Ski-Abfahrt + Skitouren-Route Veranstaltungszentrum Auktion Sammlerartikel @@ -1338,7 +1338,7 @@ Soziale Einrichtung - Eingang der Notfallstation + Notaufnahme Dojo @@ -1348,15 +1348,15 @@ Restaurant Internet Internet - Hackerraum + Hackerspace Yoga Studio Sackgasse Kiosk Landesgrenze Garage - Fisch und Chips - Badestrand - Gastronomiebereich + Fish and Chips + Strandbad + Food Court $ Versorgungsmast Bubble Tea @@ -1377,13 +1377,13 @@ Studio Kran U-Bahn-Station - Religiöses Land + Religiöses Gelände Salzmarsch Gezeitenabhängige Salzmarsch Fenn Schilfgürtel Sumpf - Mangrove + Mangroven Watt Escape Room Gepäckschließfach @@ -1392,7 +1392,7 @@ Försterstation Tierheim Schlupfpforte - Büro des Sicherheitsdienstes + Sicherheitsdienst Pförtnerhäuschen Abspannportal Lampenladen diff --git a/android/sdk/src/main/res/values-gsw/types_strings.xml b/android/sdk/src/main/res/values-gsw/types_strings.xml index ebeb33c63..0c1fe5088 100644 --- a/android/sdk/src/main/res/values-gsw/types_strings.xml +++ b/android/sdk/src/main/res/values-gsw/types_strings.xml @@ -338,7 +338,7 @@ Veloweg Brugg Veloweg - Tunnel + Velotunnel Lift Fuessweg Trottoir @@ -348,14 +348,14 @@ Furt Begegnigszone Brugg - Tunnel + Begegnigszonetunnel Autobahn Autobahnbrugg Autobahntunnel Autobahnuusfahrt Autobahnuffahrt Brugg - Tunnel + Autobahnaaschlusstunnel Pfad Alpinwanderweg oder weglose Pfad Velo- und Fuessweg @@ -371,7 +371,7 @@ Hauptstrassetunnel Hauptstrass Brugg - Tunnel + Strassetunnel Rennbahn Quartierstrass Quartierstrass @@ -381,44 +381,44 @@ Strass Brugg Brugg - Tunnel + Strassetunnel Kantons-/Staatstrass Brugg Strass Brugg - Tunnel + Strassetunnel Zuefahrtsweg Zuefahrtsweg Brugg Grundstückszuefahrt Zuefahrtsweg - Tunnel + Strassetunnel Raschtstätt Blitzer Stäge Leitere Brugg Gmeindsstrass - Tunnel + Strassetunnel Strass Brugg - Tunnel + Strassetunnel Forst-/Feldweg Forst-/Feldweg Brugg Forst-/Feldweg Forst-/Feldweg - Tunnel + Feld-/Waldwegtunnel Liechtsignal Autostrass Autostrassetunnel Autostrassebrugg Autostrass - Tunnel + Strassetunnel Näbestrass Näbestrass Brugg - Tunnel + Strassetunnel Veloweg Fuessweg Begegnigszone @@ -589,7 +589,7 @@ See Schlüüsechammere Teich - Reservoir + Stausee Bassin Land Wiese @@ -803,7 +803,7 @@ Wasseraaschluss Landschaftsgärtner Hauptiigang - Tunnel + Treppetunnel Picknicktisch Funkturm Wiiler @@ -827,7 +827,7 @@ U-Bahn-Station U-Bahn-Station U-Bahn-Station - Tunnel + Strassetunnel Brugg Quartierstrass Isebahnaalaage @@ -1217,7 +1217,7 @@ Tennisplatz Volleyball Bowling - Bowling + Chegle Padel Futsal Iishockey diff --git a/android/sdk/src/main/res/values-nb/strings.xml b/android/sdk/src/main/res/values-nb/strings.xml index 956e623c3..144c71310 100644 --- a/android/sdk/src/main/res/values-nb/strings.xml +++ b/android/sdk/src/main/res/values-nb/strings.xml @@ -37,4 +37,12 @@ Redigering på nett GB I dag + I går + %s dager siden + %s uke siden + %s uker siden + %s måned siden + %s måneder siden + %s år siden + %s år siden diff --git a/android/sdk/src/main/res/values-nb/types_strings.xml b/android/sdk/src/main/res/values-nb/types_strings.xml index fe235f742..42ac984d9 100644 --- a/android/sdk/src/main/res/values-nb/types_strings.xml +++ b/android/sdk/src/main/res/values-nb/types_strings.xml @@ -172,7 +172,7 @@ Port Bom Gjerdeklyver - Turnstile + Rotasjonsport Bom Bomstasjon Nasjonalpark @@ -387,7 +387,6 @@ Gågate Bru - Torg Tunnel @@ -699,7 +698,7 @@ Kabelbane Togstasjon Planovergang - Monorail + Énskinnebane Smalsporet jernbane Jernbaneplattform Museumsjernbane @@ -972,7 +971,7 @@ Baderomsmøbler Skjønnhetssalong Drinker - Sykkel + Sykkelbutikk Bokhandel Slakter Cannabisbutikk @@ -1175,7 +1174,7 @@ Begrenset tilgang for rullestol Ingen tilgang for rullestol Full tilgang for rullestol - Snow Park + Snøpark Tursti i snø Pisteforbindelse Skitour-stien @@ -1201,6 +1200,63 @@ Gate Helipad Rullebane - Taxibane + Taksebane Terminal + Mathall + Bagasjeoppbevaring + Sko + Mur + Grense + Administrativ grense + Landegrense + Regiongrense + Regiongrense + Lagerbygning + Nødstilfelle + Heis + Vei + Internett + Internett + Veikryss + Rundkjøring + Rundkjøring + Fritid + Rekreasjonsområde + Bank + Bar + Restaurant + Eng + Bålplass + Molo + Pir + Fjellpass + Økologisk + Økologisk + Plattform + Jernbaneovergang + T-banestasjon + T-banelinje + Ferge + Rullestol + Langrennsløype + Gapahuk + Hekk + Boligområde + Rute + Sumpskog + Mangrove + Tidevannslette + Flaggstang + Mast + Kaffeautomat + Matautomat + Avisautomat + Godteriautomat + Pakkeboks + Rekreasjonsområde + Marina + Overbygd sykkelparkering + Sykkelbarriere + Stige + Autovern diff --git a/android/sdk/src/main/res/values-pl/strings.xml b/android/sdk/src/main/res/values-pl/strings.xml index 1f922993a..ee552c988 100644 --- a/android/sdk/src/main/res/values-pl/strings.xml +++ b/android/sdk/src/main/res/values-pl/strings.xml @@ -36,4 +36,12 @@ MB GB Dzisiaj + Wczoraj + %s dni temu + %s tydzień temu + %s tygodni temu + %s miesiąc temu + %s miesięcy temu + %s rok temu + %s lat temu diff --git a/android/sdk/src/main/res/values-ro/types_strings.xml b/android/sdk/src/main/res/values-ro/types_strings.xml index 72c8f54c0..d6eabc2f2 100644 --- a/android/sdk/src/main/res/values-ro/types_strings.xml +++ b/android/sdk/src/main/res/values-ro/types_strings.xml @@ -6,7 +6,7 @@ Adresă/Bloc Stație de teleferic Aeroport - Aeroport + Aeroport Internațional Heliport Obiecte ale infrastructurii Centru de artă @@ -1381,4 +1381,8 @@ Loc de campare Magazin de corpuri de iluminat Hostel + Baraj + Motel + Hotel + Supermarket diff --git a/android/sdk/src/main/res/values-sl/types_strings.xml b/android/sdk/src/main/res/values-sl/types_strings.xml index 5a3efed9a..5f3b263e4 100644 --- a/android/sdk/src/main/res/values-sl/types_strings.xml +++ b/android/sdk/src/main/res/values-sl/types_strings.xml @@ -2,4 +2,7 @@ Naslov/blok Žičnica + Naslov/blok + Žičnica + Nudli diff --git a/android/sdk/src/main/res/values-tr/types_strings.xml b/android/sdk/src/main/res/values-tr/types_strings.xml index 8f67880a3..441b386d4 100644 --- a/android/sdk/src/main/res/values-tr/types_strings.xml +++ b/android/sdk/src/main/res/values-tr/types_strings.xml @@ -1390,4 +1390,7 @@ Posta Ortağı Hayvan Barınağı Tel Örgü Kapısı + Kaçış odası + Sazlık + Aydınlatma dükkanı diff --git a/data/categories-strings/ar.json/localize.json b/data/categories-strings/ar.json/localize.json index 11725cd41..9cd0d4489 100644 --- a/data/categories-strings/ar.json/localize.json +++ b/data/categories-strings/ar.json/localize.json @@ -1,11 +1,11 @@ { -"@category_eat": "طعام|أمكان لتناول الطعام", -"@category_food": "طعام|بقالية", +"@category_eat": "طعام|مكان لتناول الطعام|أكل|غذاء", +"@category_food": "طعام|بقالة|بقال|بقول", "@category_transport": "مواصلات|مواصلات", "@category_fuel": "1وقود|بنزين|سولار|ديزل|وقود الحافلات", "@category_parking": "موقف سيارات|مرافق ركن السيارات", "@category_shopping": "تسوق", -"@category_hotel": "فندق|الفنادق", +"@category_hotel": "فندق|الفنادق|بانسيون|أوتيل", "@category_tourism": "سياحة", "@category_entertainment": "ترفيه وتسلية|تسلية", "@category_nightlife": "أنشطة ترفيه ليلية", @@ -23,17 +23,17 @@ "amenity-fast_food|@category_eat": "وجبات سريعة|مطعم|مقهى|وجبة جاهزة|طعام", "amenity-restaurant|@category_eat": "2مطعم|مقهى|طعام", "amenity-fuel|@category_fuel": "محطة وقود|بترول", -"@shop": "متجر", +"@shop": "محل|دكان|متجر", "shop-bakery|shop-pastry|@category_eat|@category_food|@shop": "مخبز|متجر", "shop-cosmetics|@category_shopping|@shop": "مستحضرات تجميل|تجميل", "shop-convenience|@category_food|@shop": "متجر صغير", "shop-deli|@category_food|@shop": "أطعمة مبردة|محل جواهز", "shop-garden_centre|@shop": "حضانة|روضة", "shop-hearing_aids|@shop": "المعينات السمعية", -"shop-mobile_phone|@shop": "متجر هواتف محمولة|متجر إلكترونيات|متجر هواتف خلوية|هاتف", +"shop-mobile_phone|@shop": "متجر هواتف محمولة|متجر هواتف خلوية|هاتف|محل موبايلات|موبايل|محمول|جوال", "shop-florist|@shop": "متجر زهور|متجر", "shop-butcher|@category_food|@shop": "جزار|جزارة|متجر لحوم|متجر|قصابة", -"shop-furniture|@shop": "معرض أثاث|أثاث|متجر", +"shop-furniture|@shop": "معرض أثاث|أثاث|متجر مفروشات|عفش|مفروشات", "shop-kitchen|@shop": "متجر مطابخ", "shop-alcohol|@category_food|@shop": "متجر مشروبات كحولية|خمور|خمر|متجر", "shop-books|@shop": "مكتبة لبيع الكتب|متجر", @@ -58,13 +58,13 @@ "amenity-marketplace|@category_food": "سوق|السوق|متجر", "amenity-money_transfer": "تحويل المال", "shop-clothes|@category_shopping|@shop": "متجر ملابس|ملابس|متجر", -"shop-car|@shop": "متجر سيارات|متجر|وكالة بيع السيارات", +"shop-car|@shop": "متجر سيارات|متجر عربيات|وكالة بيع السيارات|معرض عربيات|معرض سيارات", "shop-bicycle|@shop": "متجر دراجات|متجر", "shop-kiosk": "كشك|متجر", -"highway-bus_stop|@category_transport": "موقف حافلة|باص|حافلة|مواصلات|مواصلات", +"highway-bus_stop|@category_transport": "موقف حافلة|باص|حافلة|مواصلات|محطة|محطة اتوبيس|اتوبيس", "railway-tram_stop|@category_transport": "موقف ترام|مواصلات|مواصلات", -"amenity-bus_station|@category_transport": "محطة حافلات|باص|حافلة|مواصلات|مواصلات", -"railway-station|railway-halt|building-train_station|@category_transport": "محطة سكك حديدية|محطة قطار|قطار|محطة|مواصلات|مواصلات", +"amenity-bus_station|@category_transport": "محطة حافلات|موقف حافلة|باص|حافلة|مواصلات|محطة|محطة اتوبيس|اتوبيس", +"railway-station|railway-halt|building-train_station|@category_transport": "محطة سكك حديدية|محطة قطار|قطار|قطر|السكة الحديد|محطة|مواصلات|مواصلات", "railway-station-funicular": "حبلي", "railway-station-subway|@category_transport": "محطة مترو|القطار الكهربائي النفقي|قطار الأنفاق|مترو|تحت الأرض", "amenity-ferry_terminal|@category_transport": "محطة عبّارات|مركب|محطة|مواصلات|مواصلات", @@ -77,7 +77,7 @@ "tourism-picnic_site|amenity-bbq|leisure-picnic_table": "مكان نزهة|سياحة|مناظر|شواية شواء", "amenity-place_of_worship": "1مكان عبادة|معبد", "amenity-place_of_worship-christian": "كنيسة|مكان عبادة|معبد", -"amenity-place_of_worship-muslim": "مسجد|جامع|مكان عبادة|مسلم|معبد", +"amenity-place_of_worship-muslim": "مسجد|جامع|مكان عبادة|مسلم|معبد|مصلى", "amenity-place_of_worship-buddhist": "معبد بوذي|مكان عبادة|بوذا|معبد", "amenity-place_of_worship-hindu": "معبد هندوسي|مكان عبادة|معبد", "amenity-place_of_worship-shinto": "معبد شنتو|مكان عبادة|معبد", @@ -118,9 +118,9 @@ "leisure-garden": "بستان|مناظر|سياحة|حديقة", "amenity-bench": "مقعد طويل|مصطبة", "amenity-bicycle_rental": "تأجير دراجات", -"amenity-bicycle_repair_station": "تصليح الدراجات", +"amenity-bicycle_repair_station": "تصليح الدراجات|اصلاح الدراجات|صيانة الدراجات|تصليح عجل|اصلاح عجل", "amenity-car_sharing": "مشاركة السيارة|تقاسم السيارة", -"amenity-car_rental": "تأجير سيارات|سيارة|تأجير|إيجار", +"amenity-car_rental": "تأجير سيارات|سيارة|تأجير سيارة|إيجار سيارة|تأجير عربيات|عربية|تأجير عربية|إيجار عربية", "amenity-motorcycle_rental": "تأجير الدراجات النارية", "amenity-cinema|@category_entertainment": "سينما", "leisure-bowling_alley|@category_entertainment": "ﺞﻨﻴﻟﻮﺑ ﺔﻟﺎﺻ", @@ -132,16 +132,16 @@ "leisure-adult_gaming_centre|@gambling": "مركز ألعاب الكبار", "leisure-amusement_arcade|@category_entertainment": "ممر", "amenity-college": "كلية", -"amenity-fire_station": "محطة إطفاء", +"amenity-fire_station": "محطة إطفاء|مطافي|حريق", "amenity-fountain": "نافورة", "amenity-grave_yard|landuse-cemetery": "مقبرة", "shop-funeral_directors": "منظموا الجنازات", "@category_hospital": "مستشفى", -"amenity-hospital|@category_hospital": "عيادة|طبيب|دكتور", +"amenity-hospital|@category_hospital": "عيادة|طبيب|دكتور|مركز طبي|اسعافات اولية|مستشفى", "amenity-clinic|@category_hospital": "عيادة|مستشفى|طبيب|دكتور", -"amenity-doctors|@category_hospital": "طبيب|عيادة|مستشفى", +"amenity-doctors|@category_hospital": "دكتور|طبيب|عيادة|مستشفى", "amenity-dentist": "طبيب أسنان", -"healthcare-laboratory": "ﺔﻴﺒﻄﻟﺍ ﺕﺍﺮﺒﺘﺨﻤﻟﺍ|مختبر طبي", +"healthcare-laboratory": "معمل تحاليل|معمل طبي|تحاليل|مركز تحاليل|مختبر تحاليل|مختبر طبي", "healthcare-physiotherapist": "اخصائي علاج طبيعي", "healthcare-alternative": "الطب البديل", "healthcare-audiologist": "السمع|السمعيات", @@ -154,8 +154,8 @@ "amenity-kindergarten": "حضانة أطفال|روضة أطفال", "amenity-library": "مكتبة", "amenity-parking|amenity-parking_entrance|@category_parking": "موقف سيارات", -"@category_pharmacy": "صيدلية", -"amenity-pharmacy|@category_pharmacy": "متجر أدوية|صيدلية", +"@category_pharmacy": "صيدلية|اجزخانة", +"amenity-pharmacy|@category_pharmacy": "متجر أدوية|صيدلية|اجزخانة", "@category_post": "بريد", "amenity-post_box|@category_post": "صندوق بريد|البريد", "amenity-post_office|post_office-post_partner|@category_post": "مكتب بريد", @@ -176,7 +176,7 @@ "amenity-shelter-basic_hut": "كوخ إقامة مؤقتة", "amenity-shelter-lean_to": "ملجأ", "amenity-stripclub": "Stripclub|نادي تعري", -"amenity-telephone": "هاتف", +"amenity-telephone": "هاتف|تليفون", "@category_toilet": "مرحاض", "amenity-toilets|toilets-yes|@category_toilet": "مرحاض|مرحاض", "amenity-university": "جامعة", @@ -196,7 +196,7 @@ "place-farm": "مزرعة", "highway-raceway": "مسار سباق", "highway-path|highway-footway|highway-steps|highway-cycleway": "مسار", -"highway-pedestrian|highway-primary|highway-primary_link|highway-residential|highway-secondary|highway-secondary_link|highway-tertiary|highway-tertiary_link|highway-service|highway-road|highway-track|highway-trunk|highway-trunk_link|highway-living_street|highway-unclassified|highway-motorway_link|highway-motorway|highway-cycleway": "شارع", +"highway-pedestrian|highway-primary|highway-primary_link|highway-residential|highway-secondary|highway-secondary_link|highway-tertiary|highway-tertiary_link|highway-service|highway-road|highway-track|highway-trunk|highway-trunk_link|highway-living_street|highway-unclassified|highway-motorway_link|highway-motorway|highway-cycleway": "شارع|طريق|حارة|زقاق", "highway-motorway_junction": "مخرج|تقاطع", "@mountain": "قمة|جبل", "natural-strait": "مضيق", @@ -246,25 +246,25 @@ "sport-9pin|sport-10pin": "لعبة البولنج|بولينج بعشرة دبابيس|بولنغ", "building": "مبنى", "building-address": "العنوان", -"@category_police": "شرطة", -"amenity-police|@category_police": "الشرطة", +"@category_police": "شرطة|بوليس", +"amenity-police|@category_police": "الشرطة|البوليس", "office-diplomatic": "سفارة", "natural-bay": "خليج", -"@category_water": "ماء", -"amenity-drinking_water|drinking_water-yes|@category_water": "مياه شرب", -"natural-hot_spring|@category_water": "ربيع حار", -"natural-spring|@category_water": "ينبوع", -"man_made-water_well|@category_water": "بئر ماء", +"@category_water": "ماء|مية|ماية", +"amenity-drinking_water|drinking_water-yes|@category_water": "مياه شرب|ماء شرب|ماية شرب|سبيل ماية|كولدير", +"natural-hot_spring|@category_water": "ينبوع حار|ينابيع حارة", +"natural-spring|@category_water": "ينبوع|ينابيع", +"man_made-water_well|@category_water": "بئر ماء|بير ماية|آبار ماء|ابيار ماء|آبار ماية|ابيار ماية", "amenity-water_point|@category_water|@category_rv": "نقطة مائية|الماء للقافلة", -"man_made-water_tap|@category_water": "حنفية مياه", +"man_made-water_tap|@category_water": "حنفية مياه|حنفية ماء|صنبور مياه|صنبور ماء", "@waterbody": "مسطح مائي", "natural-water-basin|landuse-basin|@waterbody": "حوض المياه", "natural-water-pond|@waterbody": "بركة|مياه", "natural-water-lake|@waterbody": "بحيرة|مياه", -"natural-water-reservoir|landuse-reservoir|@waterbody": "خزان", +"natural-water-reservoir|landuse-reservoir|@waterbody": "خزان|فنطاس", "waterway-river|waterway-stream|natural-water-river": "نهر", "waterway-canal": "قناة", -"shop-car_repair": "محل صيانة السيارات|محطة خدمات", +"shop-car_repair": "محل صيانة السيارات|محطة خدمات|ميكانيكي|صيانة سيارات|صيانة عربيات|تصليح سيارات|تصليح عربيات", "tourism-camp_site|@category_hotel": "تخييم|مكان التخييم|أرض التخييم", "tourism-caravan_site|@category_rv||@category_hotel": "موقع البيت المتنقل", "office": "مكتب|شركة", @@ -279,7 +279,7 @@ "craft-carpenter": "نجار", "craft-confectionery": "حلواني", "craft-electrician": "كهربائي", -"craft-electronics_repair": "إصلاح الإلكترونيات", +"craft-electronics_repair": "إصلاح الإلكترونيات|تصليح الإلكترونيات|صيانة الإلكترونيات", "craft-gardener": "مهندس مناظر|بستاني", "craft-grinding_mill": "مطحنة", "craft-handicraft": "مشغولات يدوية", @@ -291,7 +291,7 @@ "craft-photographer": "مصور فوتوغرافي|استوديو تصوير", "craft-plumber": "سمكري|سباك", "craft-sawmill": "منشرة", -"craft-shoemaker": "تصليح الاحذية", +"craft-shoemaker": "تصليح الاحذية|اصلاح الاحذية|تصليح جزم|اصلاح جزم", "craft-winery": "مصنع الخمرة", "craft-tailor": "خياط|ترزي", "area:highway-footway|area:highway-pedestrian|area:highway-steps|place-square": "ساحة|ميدان", @@ -314,7 +314,7 @@ "shop-dry_cleaning": "غسيل جاف|غسيل", "shop-tyres|@shop": "محل إطارات|محل", "amenity-car_wash": "مغسلة سيارات", -"amenity-veterinary": "طبيب بيطري", +"amenity-veterinary": "طبيب بيطري|دكتور بيطري", "@charging_station": "محطة شحن|شحن", "amenity-charging_station-bicycle|@charging_station": "شحن الدراجات الهوائية", "amenity-childcare": "حضانة|رعاية أطفال|حضّانة", @@ -323,7 +323,7 @@ "emergency-phone": "هاتف الطوارئ", "leisure-fitness_centre": "مركز للياقة البدنية، نادي رياضي", "leisure-sauna": "ساونا", -"shop-car_repair-tyres|shop-car_repair": "إصلاح إطارات", +"shop-car_repair-tyres|shop-car_repair": "إصلاح إطارات|تصليح إطارات|إطارات|كاوتش|تصليح كاوتش|إصلاح كاوتش", "shop-chemist|@shop": "متجر كيماويات", "shop-pet|@shop": "متجر للحيوانات الأليفة", "tourism-zoo|@category_tourism|@category_children": "حديقة حيوان", @@ -356,7 +356,7 @@ "aeroway-helipad": "مهبط مروحيات", "barrier-border_control": "أمن الحدود", "leisure-water_park|@category_tourism|@category_children": "ملاهي مائية", -"man_made-water_tower": "برج مياه", +"man_made-water_tower": "برج مياه|خزان مياه|خزان ماء", "man_made-windmill": "طاحونة هواء", "natural-cave_entrance": "كهف", "natural-volcano|@mountain": "بركان", @@ -381,7 +381,7 @@ "amenity-shower": "مرحاض|حمام", "emergency-assembly_point": "نقطة التجمع في حالات الطوارئ", "emergency-defibrillator": "مزيل الرجفان", -"emergency-fire_hydrant": "صنبور الإطفاء", +"emergency-fire_hydrant": "صنبور الإطفاء|حنفية المطافي", "emergency-lifeguard": "منقذ الطوارئ|منقذ", "emergency-mountain_rescue": "الإنقاذ الجبلي الطارئ", "leisure-fitness_station": "مركز لياقة", @@ -390,7 +390,7 @@ "shop-erotic|@shop": "متجر منتجات جنسية", "shop-massage": "قاعة تدليك", "shop-motorcycle|@shop": "متجر دراجات نارية", -"shop-motorcycle_repair": "تصليح الدراجات النارية", +"shop-motorcycle_repair": "تصليح الدراجات النارية|اصلاح الدراجات النارية|تصليح موتوسيكل|اصلاح موتوسيكل", "shop-newsagent": "كشك الجرائد|كشك جرائد", "shop-pawnbroker": "سمسار تسليف|مُرتهِن", "shop-stationery|@shop": "متجر قرطاسية", @@ -452,5 +452,7 @@ "amenity-waste_transfer_station": "محطة نقل النفايات", "shop-carpet|@shop": "متجر سجادات", "shop-pasta|@shop": "المعكرونة", -"amenity-luggage_locker": "خزانة الأمتعة" +"amenity-luggage_locker": "خزانة الأمتعة", +"shop-grocery|@category_food|@shop": "بقال|بقالة", +"shop-health_food|@category_food|@shop": "طعام صحي|أكل صحي" } diff --git a/data/categories-strings/bg.json/localize.json b/data/categories-strings/bg.json/localize.json index 74794854c..538bbb57c 100644 --- a/data/categories-strings/bg.json/localize.json +++ b/data/categories-strings/bg.json/localize.json @@ -456,5 +456,12 @@ "amenity-animal_shelter": "Подслон за животно", "shop-money_lender": "Кредитор", "shop-coffee|@category_food|@shop": "магазин за кафе|кафе", -"shop-tea|@shop": "Чай" +"shop-tea|@shop": "Чай", +"shop-cannabis|@shop": "канабис|марихуана", +"shop-farm|@category_food|@shop": "Фермерски магазин|фермерски продукти", +"shop-health_food|@category_food|@shop": "Магазин за здравословни храни|здравословно хранене", +"shop-alcohol|@category_food|@shop": "Магазин за алкохол|4алкохол|5спиртни напитки|U+1F377", +"shop-caravan|@category_rv|@shop": "Автокъща за кемпери|кемпери|каравани|къщи на колела", +"leisure-dance|@category_entertainment": "Зала за танци|Танцово училище|Танцова школа|танци", +"leisure-firepit": "4Огнище" } diff --git a/data/categories-strings/cs.json/localize.json b/data/categories-strings/cs.json/localize.json index c9f1028b3..b58398eff 100644 --- a/data/categories-strings/cs.json/localize.json +++ b/data/categories-strings/cs.json/localize.json @@ -123,7 +123,7 @@ "amenity-car_sharing": "Sdílení aut", "amenity-car_rental": "3Půjčovna aut|auto|pronájem|nájemné", "amenity-motorcycle_rental": "Půjčovna motocyklů", -"amenity-cinema|@category_entertainment": "3Kino|biograf", +"amenity-cinema|@category_entertainment": "3Kino|Filmy|U+1F3A6|U+1F3AC", "leisure-bowling_alley|@category_entertainment": "Bowlingová dráha", "amenity-theatre|@category_entertainment": "3Divadlo", "amenity-nightclub|@category_entertainment|@category_nightlife": "4Noční klub|3disco|3klub", @@ -354,7 +354,7 @@ "natural-volcano|@mountain": "Sopka", "office-estate_agent": "Realitní makléř", "waterway-lock_gate": "Stavidlo", -"amenity-public_bookcase": "4Knihovna|Směnárna knih", +"amenity-public_bookcase": "4Knihovna|Směnárna knih|Výměna knih", "sport-climbing": "Horolezecké centrum", "sport-yoga": "Studio jógy", "tourism-apartment|@category_hotel": "Byty|Prázdninový apartmán", @@ -445,5 +445,9 @@ "amenity-luggage_locker": "Skříňka na zavazadla", "shop-cannabis|@shop": "Konopí", "shop-grocery|@category_food|@shop": "Potraviny", -"shop-farm|@category_food|@shop": "Farmářské jídlo" +"shop-farm|@category_food|@shop": "Farmářské jídlo", +"shop-health_food|@category_food|@shop": "Zdravá výživa", +"healthcare-blood_donation": "Darování krve", +"healthcare-sample_collection": "Odběr vzorků", +"amenity-parking|amenity-parking_entrance|@category_parking": "U+1F697|U+1F17F|U+1F698|U+1F699" } diff --git a/data/categories-strings/de.json/localize.json b/data/categories-strings/de.json/localize.json index 04e3c05d4..b396a282c 100644 --- a/data/categories-strings/de.json/localize.json +++ b/data/categories-strings/de.json/localize.json @@ -1,6 +1,6 @@ { -"@category_eat": "Essmöglichkeiten|Essen|5Essensmöglichkeiten", -"@category_food": "4Lebensmittel|Essen", +"@category_eat": "Essmöglichkeiten|Essen|5Essensmöglichkeiten|Mahlzeit", +"@category_food": "4Lebensmittel|Essen|Nahrung|Nahrungsmittel", "@category_transport": "Verkehr", "@category_fuel": "3Tankstelle|4Benzin|4Diesel|4Sprit", "@category_parking": "4Parkplätze|Parkplatz|Parkhaus|Tiefgarage", @@ -9,7 +9,7 @@ "@category_tourism": "4Sehenswürdigkeit|4Attraktion|4Tourismus|Touristenattraktion|Sehenswürdigkeiten", "@category_entertainment": "Unterhaltung", "@category_nightlife": "Nachtleben", -"@category_children": "Freizeit mit Kindern", +"@category_children": "Freizeit mit Kindern|Familienurlaub", "@category_atm": "3Geldautomat|4Bankautomat|7Bargeldautomat", "@category_rv": "Einrichtungen für Wohnmobile|4Wohnmobile", "amenity-atm|@category_atm": "5Bankomat|Geld", @@ -135,8 +135,8 @@ "@gambling": "Glücksspiel", "amenity-casino|@category_entertainment|@category_nightlife|@gambling": "Casino|Kasino|Spielkasino|Spielhalle", "leisure-adult_gaming_centre|@gambling": "Gaming-Zentrum für Erwachsene", -"leisure-amusement_arcade|@category_entertainment": "Arkade", -"amenity-college": "4Hochschule|4Fachschule|4Kolleg", +"leisure-amusement_arcade|@category_entertainment": "Arcade", +"amenity-college": "4Bildungseinrichtung|3Volkshochschule|Berufsakademie|Fachschule|4Kolleg", "amenity-fire_station": "5Feuerwehr|Feuerwache", "amenity-fountain": "4Springbrunnen|4Fontäne", "amenity-grave_yard|landuse-cemetery": "5Friedhof|Gottesacker|Kirchhof", @@ -201,7 +201,7 @@ "place-village": "Dorf|Weiler", "place-locality": "Örtlichkeit|Lokalität|Region|Ort", "place-farm": "4Bauernhof|Farm", -"highway-raceway": "Rennbahn", +"highway-raceway": "Rennstrecke|Rennbahn", "highway-path|highway-footway|highway-steps|highway-cycleway": "Weg|Fußweg|Pfad", "highway-pedestrian|highway-primary|highway-primary_link|highway-residential|highway-secondary|highway-secondary_link|highway-tertiary|highway-tertiary_link|highway-service|highway-road|highway-track|highway-trunk|highway-trunk_link|highway-living_street|highway-unclassified|highway-motorway_link|highway-motorway|highway-cycleway": "Straße", "highway-motorway_junction": "4Ausfahrt|Abfahrt", @@ -262,7 +262,7 @@ "natural-hot_spring|@category_water": "Heiße Quelle|Thermalquelle", "natural-spring|@category_water": "Quelle", "man_made-water_well|@category_water": "Brunnen", -"amenity-water_point|@category_water|@category_rv": "6Wasseranschluss", +"amenity-water_point|@category_water|@category_rv": "6Wassertank-Auffüllstation|Wasseranschluss", "man_made-water_tap|@category_water": "6Wasserhahn", "@waterbody": "Wasserfläche|Gewässer", "natural-water-basin|landuse-basin|@waterbody": "Wasserbecken", @@ -338,7 +338,7 @@ "attraction-animal": "Tiergehege", "tourism-information-office|amenity-ranger_station|@category_tourism": "Fremdenverkehrsamt", "tourism-information-visitor_centre|amenity-ranger_station|@category_tourism": "3Besucherzentrum", -"amenity-community_centre": "Bürgerhaus", +"amenity-community_centre": "5Gemeinschaftszentrum|Bürgerhaus", "amenity-compressed_air": "Druckluft|Pressluft", "amenity-courthouse": "Justizgebäude|Gerichtsgebäude", "amenity-vending_machine-cigarettes": "5Zigarettenautomat", @@ -495,5 +495,12 @@ "recycling-shoes|@category_recycling": "4Recycling von Schuhen|Schuh Recycling|Schuhe spenden|Schuhe", "recycling-green_waste|@category_recycling": "4Recycling von Gartenabfällen|5Organisches Müll Recycling|5Gartenabfälle", "recycling-cartons|@category_recycling": "4Recycling von Getränkekartons|5Karton Recycling|5Getränkekartons", -"highway-elevator": "Fahrstuhl|Aufzug" +"highway-elevator": "Fahrstuhl|Aufzug", +"office-security": "4Sicherheitsdienst", +"recycling-cardboard|@category_recycling": "9Recycling von Karton|9Recycling von Pappe|Kartonrecycling|Pappenrecycling|Kartonmüll|Pappenmüll|Karton|Pappe|Pappkarton|Kartonpappe", +"natural-saddle|mountain_pass": "4Sattel|4Bergsattel|Bergpass|Pass|Gebirgspass", +"man_made-chimney": "Schornstein", +"attraction-amusement_ride|attraction-carousel|attraction-roller_coaster|attraction-maze|attraction-historic|attraction-big_wheel|attraction-bumper_car|@category_children": "Attraktion|Labyrinth", +"building-guardhouse": "4Wache", +"shop-lighting|@shop": "Leuchtmittel|Lampen|Leuchte" } diff --git a/data/categories-strings/en-US.json/localize.json b/data/categories-strings/en-US.json/localize.json index 365851de3..a972f77ba 100644 --- a/data/categories-strings/en-US.json/localize.json +++ b/data/categories-strings/en-US.json/localize.json @@ -1,6 +1,6 @@ { "shop-garden_centre|@shop": "4Garden Center", -"amenity-cinema|@category_entertainment": "Movies|4Movie Theater", +"amenity-cinema|@category_entertainment": "3Movie Theatre|3Cinema|Movies|Film|U+1F3A6|U+1F3AC", "amenity-theatre|@category_entertainment": "4Theater", "amenity-recycling-centre|@category_recycling": "4Recycling Center|U+1F6AE|U+267B", "shop-tyres|@shop": "3Tire|tires", diff --git a/data/categories-strings/en.json/localize.json b/data/categories-strings/en.json/localize.json index 25160b13e..f1a21bf5c 100644 --- a/data/categories-strings/en.json/localize.json +++ b/data/categories-strings/en.json/localize.json @@ -133,7 +133,7 @@ "amenity-car_sharing": "Car Share|3carsharing|car|sharing|U+1F697|U+1F698|U+1F699|carpool|carsharing services|car sharing|4rideshare", "amenity-car_rental": "3Car Rental|car|rental|U+1F697|U+1F698|U+1F699|car hire|rent a car|auto rental|vehicle rent", "amenity-motorcycle_rental": "4Motorcycle Rental|bike|hire|4scooter", -"amenity-cinema|@category_entertainment": "3Cinema|Film|U+1F3A6|U+1F3AC|", +"amenity-cinema|@category_entertainment": "3Cinema|3Movie Theatre|Film|Movies|U+1F3A6|U+1F3AC", "leisure-bowling_alley|@category_entertainment": "4Bowling Alley", "amenity-theatre|@category_entertainment": "4Theatre|U+1F3AD", "amenity-nightclub|@category_entertainment|@category_nightlife": "3Nightclub|night club|4disco|dance|U+1F378|U+1F379|U+1F46F|U+1F483|club|nightspot|night bar", diff --git a/data/categories-strings/es.json/localize.json b/data/categories-strings/es.json/localize.json index b9600b205..da1136818 100644 --- a/data/categories-strings/es.json/localize.json +++ b/data/categories-strings/es.json/localize.json @@ -1,84 +1,84 @@ { "@category_eat": "Dónde comer|Comer|Comida", -"@category_food": "Provisiones|Víveres|4Alimentos|Abarrotes|Productos|Comer", +"@category_food": "Provisiones|Víveres|4Alimentos|4Alimentación|Abasto|Despensa|Abarrotes|Comestibles", "@category_transport": "5Transporte", -"@category_fuel": "3Gasolinera|Estación de servicio|gasoil|diesel|nafta|combustible|bencina|gasolina", -"@category_parking": "5Aparcamiento|5Estacionamiento|Aparcar|Estacionar|Parquear|4Parking", +"@category_fuel": "3Gasolinera|Gasolinería|3Estación de servicio|gasoil|diésel|nafta|combustible|bencina|gasolina|gasóleo|surtidor|4bomba de gasolina", +"@category_parking": "5Aparcamiento|5Estacionamiento|Aparcar|Estacionar|Parquear|4Parking|Aparcadero|Parqueadero|Parqueo", "@category_shopping": "4Compras", "@category_hotel": "Hotel|Hoteles", -"@category_tourism": "5Atracciones turísticas|4Turismo", -"@category_entertainment": "Entretenimiento|Diversión", +"@category_tourism": "5Atracciones turísticas|4Turismo|Lugares de interés", +"@category_entertainment": "Entretenimiento|Diversión|Ocio", "@category_nightlife": "Vida nocturna|noche", -"@category_children": "Ocio en familia|Diversión en familia", +"@category_children": "Ocio en familia|Diversión en familia|4Familia|3Niños|Infantil", "@category_atm": "Cajero|cajero automático", "@category_rv": "5Caravanas|5Autocaravanas|5Motorhome|camper", "amenity-atm|@category_atm": "dinero|efectivo|cajero", -"@category_bank": "3Banco", +"@category_bank": "3Banco|4Sucursal bancaria", "@category_secondhand": "Segunda mano", "amenity-bank|@category_bank": "dinero", -"@category_recycling": "Reciclaje|Reciclaje de residuos|Eliminación de residuos|Materiales reciclables|Recogida selectiva de basura|Clasificación de residuos|Reutilización", -"amenity-bureau_de_change": "3Cambio de divisas|dinero", -"amenity-bar|amenity-pub|@category_eat|@category_nightlife": "2Bar|2pub", -"amenity-cafe|@category_eat": "3Café|3restaurante", -"amenity-fast_food|@category_eat": "4Comida rápida|restaurante|café", +"@category_recycling": "4Reciclaje|Reciclaje de residuos|Eliminación de residuos|Materiales reciclables|Recogida selectiva de basura|Clasificación de residuos|Reutilización", +"amenity-bureau_de_change": "3Cambio de divisas|dinero|Casa de cambio|Cambista", +"amenity-studio": "Estudio", +"amenity-bar|amenity-pub|@category_eat|@category_nightlife": "2Bar|2pub|taberna|bebida|beber|4cerveza|cóctel", +"amenity-cafe|@category_eat": "3Café|3cafetería|3restaurante", +"amenity-fast_food|@category_eat": "4Comida rápida|restaurante", "amenity-restaurant|@category_eat": "3Restaurante|3café|restaurant|restorán", -"amenity-fuel|@category_fuel": "Estación de servicio|Gasolinera", "@shop": "Tienda", -"shop-bakery|shop-pastry|@category_eat|@category_food|@shop": "3Panadería|panificadora|pastelería", -"shop-cosmetics|@category_shopping|@shop": "4Productos cosméticos|Cosméticos|Belleza", -"shop-convenience|@category_food|@shop": "Tienda de barrio|chino|provisión|almacén|minimercado", -"shop-deli|@category_food|@shop": "Delicatesen", +"shop-bakery|shop-pastry|@category_eat|@category_food|@shop": "3Panadería|panificadora|4pastelería|5repostería|4confitería|4bollería", +"shop-cannabis|@shop": "Cánnabis|marihuana|mariguana", +"shop-cosmetics|@category_shopping|@shop": "4Productos cosméticos|Cosméticos|Belleza|Maquillaje", +"shop-convenience|@category_food|@shop": "Tienda de barrio|Tienda de conveniencia|chino|provisión|almacén|minimercado|colmado", +"shop-deli|@category_food|@shop": "Delicatesen|Tienda de productos gourmet|Tienda gourmet|Gourmet", "shop-farm|@category_food|@shop": "4Granja|Productos de granja", -"shop-garden_centre|@shop": "Vivero|tienda de jardinería", +"shop-garden_centre|@shop": "4Jardinería|4Vivero|Tienda de jardinería", "shop-grocery|@category_food|@shop": "Tienda de comestibles|Almacén|Provisión", "shop-health_food|@category_food|@shop": "Alimentos saludables", "shop-hearing_aids|@shop": "Audífonos", -"shop-mobile_phone|@shop": "Móviles|Tienda de telefonía móvil|tienda de aparatos electrónicos|4celulares|4teléfonos", -"shop-florist|@shop": "4Floristería|tienda de flores|Florería", -"shop-butcher|@category_food|@shop": "4Carnicería|carne", -"shop-furniture|@shop": "Tienda de muebles|Mueblería", -"shop-kitchen|@shop": "Tienda de cocina|Equipamiento de cocina", -"shop-alcohol|@category_food|@shop": "4Licorería|licor|vinería", +"shop-mobile_phone|@shop": "Móviles|Tienda de telefonía móvil|tienda de aparatos electrónicos|tienda de electrónica|4celulares|4teléfonos", +"shop-florist|@shop": "4Floristería|florería|tienda de flores|flores", +"shop-butcher|@category_food|@shop": "4Carnicería|charcutería|carnicero|carne", +"shop-furniture|@shop": "Tienda de muebles|Mueblería|Muebles", +"shop-kitchen|@shop": "Tienda de cocina|Equipamiento de cocina|Cocina", +"shop-alcohol|@category_food|@shop": "4Licorería|licor|alcohol|6bebidas alcohólicas", "shop-books|@shop": "4Librería|Libros", -"shop-shoes|@category_shopping|@shop": "4Zapatería", -"shop-electronics|@shop": "4Electrónica", +"shop-shoes|@category_shopping|@shop": "4Zapatería|tienda de zapatos|zapatos|zapatillas", +"shop-electronics|@shop": "4Electrónica|tienda de aparatos electrónicos|tienda de electrónica", "shop-hardware|shop-doityourself|@shop": "Ferretería|bricolaje", "shop-houseware|@shop": "Enseres domésticos|Artículos del hogar", "shop-jewelry|@category_shopping|@shop": "Joyería|Joyas", -"shop-optician|@shop": "4Óptica", -"shop-gift|@category_shopping|@shop": "Tienda de regalos|Regalos", +"shop-optician|@shop": "4Óptica|lentes|gafas|lentillas|lentes de sol|gafas de sol|anteojos", +"shop-gift|@category_shopping|@shop": "Tienda de regalos|Regalos|Souvenir|4Souvenirs", "shop-beauty": "Centro de belleza|Salón de belleza", -"shop-greengrocer|@category_food|@shop": "4Frutería|4Verdulería|vegetales", -"shop-sports|@category_shopping|@shop": "Artículos de deporte|Artículos deportivos", +"shop-greengrocer|@category_food|@shop": "4Frutería|4Verdulería|fruta|verdura|vegetales|hortalizas|legumbres", +"shop-sports|@category_shopping|@shop": "Artículos de deporte|Artículos deportivos|Tienda de deportes|Tienda deportiva", "shop-supermarket|@category_food|@shop": "3Supermercado|Supermarket|automercado", -"shop-mall|@category_shopping|@shop": "Centro comercial|Shopping center|Galería", -"shop-department_store|@category_shopping|@shop": "Grandes almacenes|Grandes tiendas|Tienda por departamentos", -"shop-beverages|@category_food|@shop": "4Bebidas", -"shop-computer|@shop": "Tienda de informática|tienda de ordenadores|computación|informática", -"shop-confectionery|craft-confectionery|@category_food|@shop": "4Confitería", +"shop-mall|@category_shopping|@shop": "Centro comercial|Shopping center|Galería|Mall", +"shop-department_store|@category_shopping|@shop": "Grandes almacenes|Grandes tiendas|Tienda por departamentos|Tienda de departamentos|Tiendas departamentales", +"shop-beverages|@category_food|@shop": "4Bebidas|4Refrescos", +"shop-computer|@shop": "Tienda de informática|tienda de ordenadores|computación|informática|computadora|computadoras|ordernador|ordenadores", +"shop-confectionery|craft-confectionery|@category_food|@shop": "4Confitería|4pastelería|5repostería|4bollería|5dulces|5chucherías|5golosinas", "shop-laundry": "4Lavandería", "shop-toys|@category_children|@shop": "Tienda de juguetes|juguetería|juguetes", "amenity-marketplace|@category_food": "3Mercado", "amenity-money_transfer": "Transferencia de dinero", "shop-clothes|@category_shopping|@shop": "Tienda de ropa|3ropa", "shop-caravan|@category_rv|@shop": "Venta de caravanas|Venta de autocaravanas|Venta de motorhomes", -"shop-car|@shop": "Venta de coches|Venta de autos|Automotora|Automotores|5Concesionaria|Concesionario", -"shop-bicycle|@shop": "Tienda de bicicletas|4bicicleta|Tienda de bicis", -"shop-kiosk": "4Quiosco|kiosko", -"highway-bus_stop|@category_transport": "Parada de autobús|Parada", -"railway-tram_stop|@category_transport": "Parada de tranvía|Parada", -"amenity-bus_station|@category_transport": "Estación de autobuses|Estación de ómnibus|Estación de micros|Estación de colectivos", -"railway-station|railway-halt|building-train_station|@category_transport": "3Estación de tren|3tren|Punto de parada", +"shop-car|@shop": "Venta de coches|Venta de autos|Automotora|Automotores|5Concesionaria|Concesionario|Carros|Coches|Automóviles|Autos", +"shop-bicycle|@shop": "Tienda de bicicletas|Tienda de bicis|bicicleta|4Bicicletas|Bicis|Ciclismo", +"shop-kiosk": "4Quiosco|4kiosko|kiosco", +"highway-bus_stop|@category_transport": "Parada de autobús|Parada|Autobús|Bus", +"railway-tram_stop|@category_transport": "Parada de tranvía|Parada|Tranvía", +"amenity-bus_station|@category_transport": "3Estación de autobuses|Estación de ómnibus|Estación de micros|Estación de colectivos|Autobús|Bus|Terminal de buses|Terminal de autobuses", +"railway-station|railway-halt|building-train_station|@category_transport": "Estación de tren|3tren|3Estación de trenes|trenes", "railway-station-funicular": "Funicular", -"railway-station-subway|@category_transport": "3Metro|3Subte", -"amenity-ferry_terminal|@category_transport": "3Transbordador|terminal|ferry", +"railway-station-subway|@category_transport": "3Metro|3Subte|Subterráneo", +"amenity-ferry_terminal|@category_transport": "3Transbordador|terminal|ferry|terminal de ferry|puerto de ferry", "amenity-taxi|@category_transport": "3Taxi", "amenity-townhall": "3Ayuntamiento|Municipio", "tourism-attraction|@category_tourism": "3Atracción turística|3turismo", "tourism-artwork": "3Obras de arte|Obra de arte", "tourism-viewpoint|@category_tourism": "3Vista panorámica|Mirador", -"tourism-information": "4Información", -"tourism-picnic_site|amenity-bbq|leisure-picnic_table": "3Picnic|Barbacoa", +"tourism-information": "4Información turística|Información", "amenity-place_of_worship": "4Lugar de culto|templo", "amenity-place_of_worship-christian": "3Iglesia|templo|lugar de culto|basílica|catedral", "amenity-place_of_worship-muslim": "4Mezquita|templo|lugar de culto", @@ -92,102 +92,106 @@ "historic-archaeological_site|@category_tourism": "Yacimiento arqueológico|Sitio arqueológico", "historic-battlefield": "Campo de batalla", "historic-stone": "Piedra histórica", -"historic-boundary_stone": "Hito fronterizo", +"historic-boundary_stone": "Hito|Hito fronterizo|Mojón", "historic-castle|@category_tourism": "4Castillo|Castrum|Iglesia fortificada|Fortaleza|Castro|Kremlin|Casa solariega|Palacio", -"historic-city_gate|@category_tourism": "Puerta de la ciudad", +"historic-city_gate|@category_tourism": "Puerta de la ciudad|Arco de ciudad", "historic-citywalls|@category_tourism": "Muro de la ciudad|Muralla", -"historic-fort|@category_tourism": "Fuerte", -"historic-gallows|@category_tourism": "Horca", -"historic-memorial|@category_tourism": "4Memorial|Monumento conmemorativo", -"historic-memorial-cross": "Cruz conmemorativa", +"historic-fort|@category_tourism": "Fuerte|Fortificación|Fortín|Fortaleza", +"historic-gallows|@category_tourism": "Horca|Patíbulo|Guillotina|Cadalso", +"historic-memorial|@category_tourism": "4Memorial|Monumento conmemorativo|Monumento", +"historic-memorial-cross": "Cruz conmemorativa|Cruz", "historic-memorial-plaque": "Placa conmemorativa", "historic-memorial-sculpture|@category_tourism": "Escultura", "historic-memorial-statue|@category_tourism": "Estatua", "historic-memorial-stolperstein": "Stolperstein", -"historic-memorial-war_memorial|@category_tourism": "Monumento a la guerra", +"historic-memorial-war_memorial|@category_tourism": "Monumento de guerra|Memorial de guerra|Monumento a los caídos", "historic-monument|@category_tourism": "4Monumento", "historic-pillory|@category_tourism": "Picota", "historic-cannon": "Cañón", -"historic-anchor": "Ancla histórica", +"historic-anchor": "Ancla|Ancla histórica", "historic-ruins|@category_tourism": "3Ruinas", "historic-mine": "Mina histórica", -"historic-ship|@category_tourism": "Barco|Navío", +"historic-ship|@category_tourism": "Barco|Navío|Embarcación|Buque", "historic-wreck": "Naufragio", "historic-locomotive|@category_tourism": "Locomotora histórica", "historic-tank|@category_tourism": "Tanque histórico", "historic-aircraft|@category_tourism": "Avión histórico", -"historic-tomb|@category_tourism": "Tumba|Sepultura", -"historic-wayside_cross": "Cruz de término", -"historic-wayside_shrine": "Peto de ánimas", -"leisure-dog_park": "Parque para perros", +"historic-tomb|@category_tourism": "Tumba|Sepultura|Enterramiento", +"man_made-cross": "Cruz", +"historic-wayside_cross": "Cruz de término|Cruz de humilladero|Cruz de camino|Crucero|Cruz", +"historic-wayside_shrine": "Ermita del humilladero|Ermita|Santuario|Capilla|Altar", +"leisure-dog_park": "Parque para perros|Parque canino|Pipicán|Perros", +"leisure-dance|@category_entertainment": "4Baile|Escuela de baile|4Danza|Escuela de danza", "leisure-garden": "2Jardín", -"amenity-bench": "Asiento|Banco", -"amenity-bicycle_rental": "3Alquiler de bicicletas|4bicicleta|alquiler|Alquiler de bicis", -"amenity-bicycle_repair_station": "Reparación de bicicletas|4bicicleta|Reparación de bicis", -"amenity-car_sharing": "Compartir coche", +"leisure-firepit": "3Fogón|Fogata", +"amenity-bench": "Asiento|3Banco", +"amenity-bicycle_rental": "3Alquiler de bicicletas|4bicicleta|alquiler|Alquiler de bicis|Bicicletas|Bicis|Ciclismo", +"amenity-bicycle_repair_station": "4Reparación de bicicletas|Reparación de bicis|Bicicletas|Bicis", +"amenity-car_sharing": "Coche compartido|4carsharing", "amenity-car_rental": "3Coche de alquiler|alquiler|rentadora|alquiladora|3alquiler de coches|alquiler de autos|alquiler de carros", -"amenity-motorcycle_rental": "3Alquiler de motos", +"amenity-motorcycle_rental": "3Alquiler de motos|moto|motos|motocicleta|motocicletas|scooter", "amenity-cinema|@category_entertainment": "3Cine", "leisure-bowling_alley|@category_entertainment": "Bolera|bowling", "amenity-theatre|@category_entertainment": "3Teatro", -"amenity-nightclub|@category_entertainment|@category_nightlife": "3Discoteca", -"amenity-brothel": "Burdel|prostíbulo|kilombo", -"@gambling": "Juegos de azar|Casa de apuestas", +"amenity-nightclub|@category_entertainment|@category_nightlife": "3Discoteca|boliche|antro|club nocturno", +"amenity-brothel": "Burdel|prostíbulo|quilombo", +"amenity-love_hotel": "5Albergue transitorio|Hotel para parejas", +"@gambling": "Juegos de azar|Casa de apuestas|Apuestas|Apostar|Azar", "amenity-casino|@category_entertainment|@category_nightlife|@gambling": "Casino", "leisure-adult_gaming_centre|@gambling": "Centro de juegos para adultos", -"leisure-amusement_arcade|@category_entertainment": "Arcade|maquinitas", -"amenity-college": "4Colegio", -"amenity-fire_station": "Parque de bomberos|cuartel de bomberos|bomberos", +"leisure-amusement_arcade|@category_entertainment": "Arcade|maquinitas|recreativos", +"amenity-fire_station": "Parque de bomberos|Estación de bomberos|cuartel de bomberos|bomberos", "amenity-fountain": "4Fuente", -"amenity-grave_yard|landuse-cemetery": "5Cementerio", -"shop-funeral_directors": "5Funeraria|Servicio fúnebre", -"@category_hospital": "4Hospital|Sanatorio", -"amenity-hospital|@category_hospital": "Hospital|Sanatorio", -"amenity-clinic|@category_hospital": "4Clínica|centro de salud|hospital|policlínica", +"amenity-grave_yard|landuse-cemetery": "5Cementerio|Camposanto", +"shop-funeral_directors": "5Funeraria|Servicio fúnebre|Servicio funerario", +"@category_hospital": "4Hospital|Sanatorio|Centro de salud|Salud", +"amenity-clinic|@category_hospital": "4Clínica|policlínica", "amenity-doctors|@category_hospital": "Consulta del médico|Clínica|hospital|Consultorio médico", -"amenity-dentist": "4Dentista|odontólogo", +"amenity-dentist": "4Dentista|Odontólogo|4Odontología", "healthcare-laboratory": "Laboratorio médico|Laboratorio clínico", -"healthcare-physiotherapist": "Fisioterapeuta", +"healthcare-physiotherapist": "5Fisioterapeuta|Fisioterapia", "healthcare-alternative": "Medicina alternativa", "healthcare-audiologist": "Audiología|Audiólogo", -"healthcare-blood_donation": "Donación de sangre", +"healthcare-blood_donation": "Donación de sangre|Banco de sangre|Sangre", "healthcare-optometrist": "Optometría|Optometrista", "healthcare-podiatrist": "Podología|Podólogo", -"healthcare-psychotherapist": "Psicoterapia|Psicoterapeuta", +"healthcare-psychotherapist": "Psicoterapia|Sicoterapia|Psicoterapeuta|Sicoterapeuta", +"healthcare-sample_collection": "Toma de muestras|Recogida de muestras|Recolección de muestras", "healthcare-speech_therapist": "Logopedia|Logopeda|Fonoaudiólogo|fonoaudiología", -"amenity-hunting_stand": "Galería de caza", -"amenity-kindergarten": "Guardería|Prescolar|Preescolar|Jardín de infantes|Maternal|Escuela infantil", +"amenity-hunting_stand": "Puesto de caza", +"amenity-kindergarten": "Guardería|Prescolar|Preescolar|Jardín de infantes|Maternal|Escuela infantil|Kínder", "amenity-library": "3Biblioteca", -"amenity-parking|amenity-parking_entrance|@category_parking": "3aparcamiento|estacionamiento|parking", "@category_pharmacy": "3Farmacia", -"amenity-pharmacy|@category_pharmacy": "3Farmacia", -"@category_post": "4Oficina de correos", -"amenity-post_box|@category_post": "3Buzón", -"amenity-post_office|post_office-post_partner|@category_post": "3post", +"amenity-pharmacy|@category_pharmacy": "3Farmacia|Droguería", +"@category_post": "4Correos|Correo", +"amenity-post_box|@category_post": "3Buzón de correos", +"amenity-post_office|post_office-post_partner|@category_post": "4Oficina de correos", "amenity-vehicle_inspection": "Inspección de vehículos|inspección vehicular", -"amenity-waste_disposal": "Basura|Basurero", -"amenity-recycling-centre|@category_recycling": "Centro de reciclaje|punto limpio", +"amenity-waste_disposal": "Basura|Basurero|Cubo de basura|Contenedor de basura", +"amenity-recycling-centre|@category_recycling": "Centro de reciclaje|punto limpio|punto verde", "amenity-recycling-container|amenity-recycling|@category_recycling": "Contenedor de reciclaje", -"recycling-batteries|@category_recycling": "Baterías", -"recycling-clothes|@category_recycling": "Ropa vieja|Reciclaje de cosas innecesarias|Ropa", -"recycling-glass_bottles|@category_recycling": "Cascos de botellas|Reciclaje de vidrio", +"recycling-batteries|@category_recycling": "Baterías|Pilas|Reciclaje de baterías|Reciclaje de pilas", +"recycling-clothes|@category_recycling": "Reciclaje de ropa|Reciclaje textil", +"recycling-glass_bottles|@category_recycling": "Cascos de botellas|Reciclaje de vidrio|Vidrio", "recycling-paper|@category_recycling": "Desperdicio de papel|Papel de desecho|Papel", "recycling-plastic|@category_recycling": "Residuos de plástico|Residuos plásticos|Plástico", -"recycling-plastic_bottles|@category_recycling": "Botellas de plástico", +"recycling-plastic_bottles|@category_recycling": "Botellas de plástico|Botellas", "recycling-scrap_metal|@category_recycling": "Residuos de metal|Chatarra", -"recycling-small_appliances|@category_recycling": "Residuos electrónicos|Chatarra electrónica", -"recycling-cardboard|@category_recycling": "Cartón", -"recycling-cans|@category_recycling": "Latas de aluminio|Latas", -"amenity-sanitary_dump_station|@category_rv": "Estación de vaciado para caravanas", -"amenity-school": "3Escuela|colegio|liceo", +"recycling-small_appliances|@category_recycling": "Residuos electrónicos|Chatarra electrónica|Reciclaje de dispositivos electrónicos", +"recycling-cardboard|@category_recycling": "Cartón|Cartones|Reciclaje de cartón", +"recycling-cans|@category_recycling": "Latas de aluminio|Latas|Reciclaje de latas", +"recycling-shoes|@category_recycling": "Reciclaje de zapatos", +"recycling-green_waste|@category_recycling": "Reciclaje de residuos orgánicos|Reciclaje de residuos vegetales|Orgánico", +"recycling-cartons|@category_recycling": "Reciclaje de envases de bebidas|Reciclaje de tetrapack", +"amenity-sanitary_dump_station|@category_rv": "4Desagüe|Estación de vaciado para caravanas|Estación de desagüe para caravanas", +"amenity-school": "3Escuela|colegio|liceo|4Instituto|Academia|Plantel", "amenity-shelter": "Refugio", "amenity-shelter-basic_hut": "Cabaña de Vivac", -"amenity-shelter-lean_to": "Alpende|Refugio", -"amenity-stripclub": "Club de striptease|Club de estriptis", -"amenity-telephone": "2Teléfono", -"@category_toilet": "Baño|WC", -"amenity-toilets|toilets-yes|@category_toilet": "3Baños|aseos|3lavabo|inodoro|baño|wc", -"amenity-university": "4Universidad", +"amenity-shelter-lean_to": "Alpende|Cobertizo|Refugio", +"amenity-stripclub": "Club de striptease|Club de estriptis|Striptease|Estriptis", +"amenity-telephone": "3Teléfono|teléfono público|cabina telefónica", +"@category_toilet": "Baño|Aseo|Lavabo|Servicio|4Sanitarios|3Baños|3Aseos|3Servicios|3Lavabos|Inodoro|WC", +"amenity-university": "3Universidad", "place-continent": "Continente", "place-country": "País", "place-city": "Ciudad", @@ -197,43 +201,47 @@ "place-state": "Estado|provincia|departamento", "place-region": "Región", "place-island|place-islet": "Isla|islote", -"place-suburb|place-quarter|place-neighbourhood|landuse-residential": "Barrio|Vecindario", +"place-suburb|place-quarter|place-neighbourhood|landuse-residential": "Barrio|Vecindario|Urbanización", "place-hamlet": "Aldea", -"place-village": "Pueblo|aldea|villa", +"place-village": "Pueblo", "place-locality": "Localidad|Paraje", "place-farm": "Granja|Chacra|Estancia", "highway-raceway": "Circuito|Pista", "highway-path|highway-footway|highway-steps|highway-cycleway": "Camino|Trocha|Sendero", "highway-pedestrian|highway-primary|highway-primary_link|highway-residential|highway-secondary|highway-secondary_link|highway-tertiary|highway-tertiary_link|highway-service|highway-road|highway-track|highway-trunk|highway-trunk_link|highway-living_street|highway-unclassified|highway-motorway_link|highway-motorway|highway-cycleway": "Calle|Avenida", "highway-motorway_junction": "Salida|3intersección", +"highway-elevator": "Ascensor|Elevador", "@mountain": "Cima|pico|montaña|monte|cerro", +"natural-peak|@mountain": "Cima|Pico|Cumbre", +"natural-saddle|mountain_pass": "Collado|Paso de montaña|Puerto de montaña", "natural-strait": "Estrecho", "landuse-forest": "Bosque", -"leisure-park": "Parque|Plaza", +"leisure-park": "4Parque", "tourism-aquarium|@category_tourism": "Acuario", -"tourism-hostel|@category_hotel": "3Albergue juvenil|hostal|motel", -"tourism-hotel|@category_hotel": "motel", -"tourism-guest_house|@category_hotel": "Casa de huéspedes|albergue juvenil|hostal", -"tourism-motel|@category_hotel": "3Motel|albergue juvenil|hostal", -"tourism-alpine_hut|@category_hotel": "4Cabaña|cabaña alpina|hotel de montaña|hotel", +"tourism-hostel|@category_hotel": "3Albergue juvenil|hostal|hostel|hospedaje", +"tourism-hotel|@category_hotel": "Hotel", +"tourism-guest_house|@category_hotel": "Casa de huéspedes|posada|albergue|hospedaje|pensión", +"tourism-motel|@category_hotel": "3Motel", +"tourism-alpine_hut|@category_hotel": "4Cabaña|cabaña alpina|hotel de montaña", "shop-hairdresser": "4Peluquería", "aeroway-aerodrome": "3Aeropuerto|3avión|aeródromo", -"leisure-stadium": "5Estadio|4deporte", -"leisure-playground|@category_children": "Patio de recreo|Parque infantil", -"leisure-sports_centre": "Polideportivo|deporte", -"leisure-golf_course": "Campo de golf", -"leisure-miniature_golf": "Minigolf", +"leisure-stadium": "5Estadio", +"leisure-playground|@category_children": "Patio de recreo|4Parque infantil|Corral|Corralito", +"leisure-sports_centre": "Polideportivo|Centro deportivo|deporte", +"leisure-golf_course": "Campo de golf|Golf", +"leisure-miniature_golf": "5Minigolf|Mini golf", "leisure-escape_game": "Escape room|Sala de escape|Cuarto de escape", -"leisure-pitch": "Complejo deportivo|terreno|deporte|cancha", +"leisure-hackerspace": "Espacio hacker|Espacio para hackers|Hacklab|Hackerspace", +"leisure-pitch": "pista|deporte|cancha|campo", "leisure-swimming_pool": "4Piscina|deporte|pileta|natación", "sport-american_football": "Fútbol americano", "sport-archery": "Tiro al arco", "sport-athletics": "Atletismo", "sport-australian_football": "Fútbol australiano", "sport-baseball": "Béisbol", -"sport-basketball": "Baloncesto|basquetbol|básquet", -"sport-beachvolleyball": "Voleibol de playa|Voley playa", -"sport-bowls": "Bolos sobre hierba", +"sport-basketball": "Baloncesto|básquetbol|básquet|basket", +"sport-beachvolleyball": "Voleibol de playa|Voley playa|Voleiplaya|Voleibol|Volibol|Balonvolea|Vóley", +"sport-bowls": "Bolos sobre hierba|Bowls|Bolo césped", "sport-chess": "Ajedrez", "sport-cricket": "Críquet", "sport-curling": "Curling|Curlin", @@ -243,37 +251,37 @@ "sport-handball": "Balonmano", "sport-scuba_diving": "Submarinismo|buceo", "sport-shooting": "Campo de tiro|Club de tiro", -"sport-skateboard": "Monopatinaje|skate|patineta", -"sport-skiing": "Esquí", +"sport-skateboard": "4Skatepark|Skate park|Monopatinaje|skate|patineta|skateboard|patinar|parque de patineta", +"sport-skiing": "4Esquí|Ski|Esquiar", "sport-soccer": "Fútbol", -"sport-swimming": "Centro de natación", -"sport-table_tennis": "Tenis de mesa", -"sport-tennis": "Tenis", +"sport-swimming": "Centro de natación|Natación|Piscinas|Nado", +"sport-table_tennis": "3Tenis de mesa|3Ping-pong|Ping pong|Pimpón", +"sport-tennis": "3Tenis", "sport-padel": "Pádel", -"sport-volleyball": "Voleibol", +"sport-volleyball": "Voleibol|Voleibol|Volibol|Balonvolea|Vóley|Volleyball", "sport-9pin|sport-10pin": "Bolos de nueve bolas|Bowling|Bolos", "building": "Edificio", "building-address": "Dirección", "@category_police": "4Policía", -"office-diplomatic": "4Embajada", +"office-diplomatic": "4Embajada|4Consulado", "natural-bay": "Bahía", "@category_water": "3Agua", -"amenity-drinking_water|drinking_water-yes|@category_water": "3Agua potable|Fuente de agua potable", +"amenity-drinking_water|drinking_water-yes|@category_water": "3Agua potable|4Fuente de agua potable", "natural-hot_spring|@category_water": "Aguas termales", "natural-spring|@category_water": "Manantial", "man_made-water_well|@category_water": "Pozo", "amenity-water_point|@category_water|@category_rv": "Fuente de agua|agua para caravana", -"man_made-water_tap|@category_water": "Toma de agua", +"man_made-water_tap|@category_water": "Grifo", "@waterbody": "Cuerpo de agua", "natural-water-basin|landuse-basin|@waterbody": "Cuenca", "natural-water-pond|@waterbody": "5Estanque|laguna", "natural-water-lake|@waterbody": "Lago", -"natural-water-reservoir|landuse-reservoir|@waterbody": "5Reservorio", -"waterway-river|waterway-stream|natural-water-river": "Río", +"natural-water-reservoir|landuse-reservoir|@waterbody": "5Reservorio|5Embalse", +"waterway-river|waterway-stream|natural-water-river": "Río|Riachuelo|Arroyo|Quebrada", "waterway-canal": "Canal", -"shop-car_repair": "4Taller|3reparación de automóviles|coche|automóvil", -"tourism-camp_site|@category_hotel": "4Campamento|cámping|acampar|acampada", -"tourism-caravan_site|@category_rv||@category_hotel": "Zona de caravanas|zona de camping", +"shop-car_repair": "4Taller|4reparación de automóviles|coche|automóvil|auto|carro", +"tourism-camp_site|@category_hotel": "4Cámping|Campamento|acampar|acampada", +"tourism-caravan_site|@category_rv||@category_hotel": "Zona de caravanas|Caravana|Camper|Autocaravana", "office": "Oficina", "office-company": "Oficina", "office-government": "Oficina gubernamental", @@ -283,16 +291,16 @@ "craft-blacksmith": "Herrero", "craft-brewery": "Fábrica de cerveza|6cervecera|cervecería", "craft-caterer": "Catering", -"craft-carpenter": "5Carpintero", -"craft-confectionery": "Confitería", +"craft-carpenter": "Carpintero|4Carpintería", +"craft-confectionery": "4Confitería|4Pastelería|4Dulcería", "craft-electrician": "4Electricista", "craft-electronics_repair": "Reparación de aparatos electrónicos", -"craft-gardener": "Paisajista|Jardinero", +"craft-gardener": "Paisajista|Jardinero|Jardinería", "craft-grinding_mill": "Molino", "craft-handicraft": "Artesanía", -"craft-hvac": "Aire acondicionado", -"craft-metal_construction": "Trabajador del metal", -"craft-key_cutter": "Copista de llaves", +"craft-hvac": "Aire acondicionado|Climatización", +"craft-metal_construction": "Trabajador del metal|Metalurgia", +"craft-key_cutter": "Copista de llaves|Copia de llaves|Llaves", "craft-locksmith": "Cerrajero", "craft-painter": "Pintor", "craft-photographer": "4Fotógrafo|estudio de fotografía", @@ -308,64 +316,69 @@ "internet_access|internet_access-wlan|@category_wifi": "3Internet", "natural-beach|natural-beach-sand|natural-beach-gravel|leisure-beach_resort": "Playa", "man_made-lighthouse": "Faro", -"man_made-survey_point": "punto geodésico", -"man_made-flagpole": "Mástil de bandera", +"man_made-survey_point": "Punto geodésico", +"man_made-flagpole": "Mástil de bandera|Mástil|Asta", "man_made-mast": "Mástil", "man_made-communications_tower|man_made-tower-communication": "Torre de comunicaciones", "man_made-petroleum_well": "Pozo de petróleo|Pozo petrolífero", "organic-only|organic-yes": "eco|5ecológicos|ecológica|ecológico|5orgánicos|orgánico|5biológica|biológicos|biológico|bio|natural|saludable", -"shop-copyshop": "4Copistería|4imprenta|Centro de copiado|Centro de fotocopiado|Fotocopiadora", -"shop-photo|@shop": "Artículos de fotografía", -"shop-camera|@shop": "Tienda de cámaras", +"shop-copyshop": "4Copistería|4imprenta|Centro de copiado|Centro de fotocopiado|Fotocopiadora|Copias", +"shop-photo|@shop": "Artículos de fotografía|5Fotografía", +"shop-camera|@shop": "Tienda de cámaras|cámaras", "shop-travel_agency": "Agencia de viajes|viajes", -"shop-outdoor|@shop": "Equipamiento|senderismo|escalada|acampada", +"shop-outdoor|@shop": "Equipo de montaña|senderismo|escalada|acampada", "shop-dry_cleaning": "Tintorería", -"shop-tyres|@shop": "Tienda de neumáticos", -"amenity-car_wash": "5Lavado de coches", -"amenity-veterinary": "Clínica veterinaria|veterinaria", -"@charging_station": "Estación de carga|punto de carga", -"amenity-charging_station-bicycle|@charging_station": "Carga de bicicletas|4bicicleta|Carga de bicis", +"shop-tyres|@shop": "Tienda de neumáticos|neumáticos|cauchos|llantas|gomas|cauchera", +"amenity-car_wash": "5Lavado de coches|5autolavado", +"amenity-veterinary": "Clínica veterinaria|veterinaria|veterinario", +"amenity-animal_shelter": "Refugio de animales", +"@charging_station": "Estación de carga|punto de carga|punto de recarga|Cargador", +"amenity-charging_station-bicycle|@charging_station": "4Carga de bicicletas|Carga de bicis|Bicicletas|Bicis", +"amenity-charging_station-motorcar|@charging_station": "4Carga de vehículos|Carga de coches|Punto de carga|Punto de recarga", "amenity-childcare": "Guardería", "amenity-bicycle_parking": "5Aparcamiento de bicicletas|5Estacionamiento de bicicletas|4Parking de bicicletas|Aparcamiento de bicis|Estacionamiento de bicis|Parking de bicis|4bicicleta", -"amenity-waste_basket": "Papelera", +"amenity-waste_basket": "3Papelera|Cubo de basura", "emergency-phone": "3Teléfono de emergencia", -"leisure-fitness_centre": "Centro de fitness|gimnasio", +"leisure-fitness_centre": "Centro de fitness|gimnasio|gym", "leisure-sauna": "3Sauna", -"shop-car_repair-tyres|shop-car_repair": "Reparación de neumáticos|Gomería|Vulcanizadora", -"shop-chemist|@shop": "4Droguería", +"shop-car_repair-tyres|shop-car_repair": "Reparación de neumáticos|Gomería|Vulcanizadora|Cauchera", +"shop-chemist|@shop": "4Droguería|Parafamacia", "shop-pet|@shop": "Tienda de mascotas", "tourism-zoo|@category_tourism|@category_children": "Zoo", "attraction-animal": "Recinto de animales", "tourism-information-office|amenity-ranger_station|@category_tourism": "Oficina de turismo", "tourism-information-visitor_centre|amenity-ranger_station|@category_tourism": "Centro de visitantes", "amenity-community_centre": "Centro comunitario", -"amenity-compressed_air": "Aire comprimido|Compresor|Hinchador", +"amenity-compressed_air": "3Aire comprimido|Compresor|Hinchador|Inflador|4Bomba de aire", "amenity-courthouse": "Juzgado", -"amenity-vending_machine-cigarettes": "Máquina expendedora de tabaco", -"amenity-vending_machine-coffee": "Máquina expendedora de café|Café", -"amenity-vending_machine-condoms": "Máquina expendedora de condones|Condones", -"amenity-vending_machine-drinks": "Máquina expendedora de bebidas", -"amenity-vending_machine-food|@category_food": "Máquina expendedora de comida|Comida|Snacks", +"amenity-vending_machine-cigarettes": "Máquina expendedora de tabaco|Máquina expendedora|Expendedora", +"amenity-vending_machine-coffee": "Máquina expendedora de café|Café|Máquina expendedora|Expendedora", +"amenity-vending_machine-condoms": "Máquina expendedora de condones|Condones|Máquina expendedora|Expendedora", +"amenity-vending_machine-drinks": "Máquina expendedora de bebidas|Expendedora de bebidas|Máquina expendedora|Expendedora", +"amenity-vending_machine-food|@category_food": "Máquina expendedora de comida|Comida|Snacks|Máquina expendedora|Expendedora", "amenity-vending_machine-parking_tickets|@category_parking": "4Máquina de pago de aparcamiento|4Tique de aparcamiento|Tique de estacionamiento|Ticket de aparcamiento|Ticket de estacionamiento|Máquina de pago de tique de aparcamiento|5Parquímetro", -"amenity-vending_machine-public_transport_tickets|@category_transport": "Máquina expendedora de boletos para el transporte público", -"amenity-vending_machine-newspapers": "Máquina expendedora de periódicos|Periódicos", -"amenity-vending_machine-sweets": "Máquina expendedora de dulces|Dulces|Chuches|Chucherías", -"shop-outpost": "Punto de recogida", -"building-garage": "Garaje", +"amenity-vending_machine-public_transport_tickets|@category_transport": "Máquina expendedora de boletos para el transporte público|Máquina expendedora de billetes para el transporte público|Máquina expendedora de tickets para el transporte público|Máquina expendedora|Expendedora", +"amenity-vending_machine-newspapers": "Máquina expendedora de periódicos|Periódicos|Máquina expendedora|Expendedora", +"amenity-vending_machine-sweets": "Máquina expendedora de dulces|Dulces|Chuches|Chucherías|Golosinas|Máquina expendedora|Expendedora", +"amenity-vending_machine-excrement_bags": "4Dispensador de bolsas para perros|dispensador|excremento|excrementos|perros|perro", +"amenity-parcel_locker|@category_post": "Recogida de paquetes|Punto de recogida|Taquilla para recogida de paquetes|Paquetes|Paquetería", +"shop-outpost": "Recogida de paquetes|Punto de recogida|Paquetes|Paquetería", +"amenity-vending_machine-fuel|@category_fuel": "Surtidor|Surtidor de combustible|Surtidor de gasolina", +"building-garage": "4Garaje", "highway-rest_area|highway-services": "Área de descanso|Área de servicio", "man_made-chimney": "Chimenea de fábrica", +"man_made-crane": "Grúa", "man_made-tower|man_made-flare": "Torre", -"shop-bookmaker|@gambling": "Casa de apuestas", -"shop-seafood|@category_food|@shop": "4Pescadería|5Marisquería", -"shop-second_hand|@category_shopping|@shop|@category_secondhand": "Tienda de segunda mano", +"shop-seafood|@category_food|@shop": "4Pescadería|5Marisquería|Pescadero|Pescatero|Pescado|Mariscos|Comida del mar", +"shop-second_hand|@category_shopping|@shop|@category_secondhand": "Tienda de segunda mano|Vintage|Usado|5Segunda mano", "shop-charity|@shop|@category_secondhand": "Tienda de caridad", -"shop-ticket": "Venta de entradas", -"shop-wine|@category_food|@shop": "Tienda de vinos|Vino|Vinería", -"shop-car_parts|@shop": "Piezas de automóvil|Autopartes", -"tourism-chalet|@category_hotel": "Casa de vacaciones", -"tourism-information-board": "Tablón de información|Panel informativo", -"tourism-information-map": "Mapa turístico", -"aerialway-station": "Estación de teleférico", +"shop-ticket": "Venta de entradas|Venta de tickets|Venta de tiques|ticket|tickets|tiquet|tiquets|boleto|boletos|tiquete|tiquetes|billete|billetes", +"shop-wine|@category_food|@shop": "Tienda de vinos|Vino|Vinos|Vinería|Vinoteca", +"shop-car_parts|@shop": "Piezas de automóvil|Autopartes|Recambios|Repuestos", +"tourism-chalet|@category_hotel": "Casa de vacaciones|Casa rural|Chalet", +"tourism-information-board": "Tablón de información|Tablón informativo|Panel de información|Panel informativo", +"tourism-information-map": "Mapa turístico|Mapa", +"aerialway-station": "Estación de teleférico|Teleférico", "aeroway-helipad": "Helipuerto", "barrier-border_control": "Control de fronteras", "leisure-water_park|@category_tourism|@category_children": "Parque acuático", @@ -375,118 +388,113 @@ "natural-volcano|@mountain": "4Volcán", "office-estate_agent": "Agente inmobiliario|Inmobiliaria", "waterway-lock_gate": "Compuerta", -"amenity-public_bookcase": "Intercambio de libros|librería", -"sport-climbing": "Centro de escalada", -"sport-yoga": "Centro de yoga", -"tourism-apartment|@category_hotel": "5Apartamentos|Apartamento de vacaciones", -"leisure-resort|@category_hotel": "Resort", +"amenity-public_bookcase": "Intercambio de libros|biblioteca libre|punto de intercambio|libros", +"sport-climbing": "Centro de escalada|3Rocódromo|Escalar|Escalada|Gimnasio de escalada", +"sport-yoga": "3Yoga|Centro de yoga|Estudio de yoga|Sala de yoga", +"tourism-apartment|@category_hotel": "5Apartamentos|Apartamento de vacaciones|Piso vacacional|Piso turístico", +"leisure-resort|@category_hotel": "Resort|Complejo turístico|Complejo hotelero", "amenity-biergarten|@category_eat|@category_nightlife": "5Biergarten", "amenity-driving_school": "4Autoescuela", -"amenity-music_school": "Escuela de música", -"amenity-language_school": "Escuela de idiomas", -"amenity-ice_cream": "5Heladería", -"amenity-internet_cafe": "5Cibercafé", +"amenity-music_school": "Escuela de música|música", +"amenity-language_school": "Escuela de idiomas|idiomas", +"amenity-ice_cream": "5Heladería|Helados", +"amenity-internet_cafe": "5Cibercafé|2cyber|café internet|ciber", "amenity-motorcycle_parking": "5Aparcamiento de motocicletas|5Estacionamiento de motocicletas|4Parking de motocicletas|Aparcamiento de motos|Estacionamiento de motos|Parking de motos", "amenity-parking_space-disabled|@category_parking": "Plaza de aparcamiento para discapacitados|Plaza de estacionamiento para discapacitados|Plaza de parking para discapacitados", -"amenity-nursing_home": "Residencia de ancianos", +"amenity-nursing_home": "5Residencia de ancianos", "amenity-payment_terminal": "Terminal de pago", -"amenity-public_bath": "Baños públicos", +"amenity-public_bath": "Baños públicos|baños comunitarios", "amenity-shower": "Ducha", -"emergency-assembly_point": "Punto de reunión de emergencia", -"emergency-defibrillator": "4Desfibrilador", +"emergency-assembly_point": "Punto de reunión de emergencia|reunión de emergencia|emergencia", +"emergency-defibrillator": "4Desfibrilador|defibrilador|socorro|primeros auxilios|auxilio|electroshock|emergencia", "emergency-fire_hydrant": "Boca de incendio|Hidrante", -"emergency-lifeguard": "Socorrista de emergencia|Socorrista", -"emergency-mountain_rescue": "Puesto de rescate de montaña", -"leisure-fitness_station": "Aparatos de gimnasia|Aparatos de ejercicio|Estación de ejercicios", -"office-insurance": "Oficina de seguros|Corredor de seguros", -"office-ngo": "Sede de ONG|Organización no gubernamental", +"emergency-lifeguard": "Socorrista|Salvavidas", +"emergency-mountain_rescue": "Puesto de rescate de montaña|Búsqueda y rescate|Rescate", +"leisure-fitness_station": "Aparatos de gimnasia|Aparatos de ejercicio|Estación de ejercicios|Gimnasio exterior|Calistenia|Ejercicio", +"office-insurance": "Oficina de seguros|Corredor de seguros|Aseguradora", +"office-ngo": "Sede de ONG|Organización no gubernamental|ONG", "shop-erotic|@shop": "3Sex Shop|Boutique erótica|Tienda erótica", -"shop-massage": "Salón de masajes", -"shop-motorcycle|@shop": "Tienda de motos", -"shop-motorcycle_repair": "Reparación de motos|Taller de motos", -"shop-newsagent": "Puesto de venta de periódicos", -"shop-pawnbroker": "Casa de empeños", -"shop-stationery|@shop": "Papelería", -"shop-tattoo": "4Tatuajes", -"shop-variety_store|@category_shopping|@shop": "Tienda de Variedades", -"shop-video|@shop": "Tienda de vídeo", -"shop-video_games|@shop": "Tienda de videojuegos", +"shop-massage": "Salón de masajes|Masaje|Masajes", +"shop-motorcycle|@shop": "Tienda de motos|motocicletas|motos|scooter", +"shop-motorcycle_repair": "Reparación de motos|Taller de motos|motos|motocicletas|mototaller", +"shop-newsagent": "Puesto de venta de periódicos|4Periódicos|Periódico", +"shop-pawnbroker": "Casa de empeños|Prestamista", +"shop-stationery|@shop": "3Papelería|4Suministros de oficina|4Útiles escolares", +"shop-tattoo": "4Tatuajes|Tattoo|Tattoos", +"shop-variety_store|@category_shopping|@shop": "Todo a cien|Chino|Todo a cinco mil|Todo por dos pesos|Todo a dólar|Dolarazo|Cincuentazo|Bazar|Tienda de variedades|Misceláneo|Misceláneos|Variedades", +"shop-video|@shop": "5Videoclub", +"shop-video_games|@shop": "Tienda de videojuegos|Videojuegos|Gaming", "tourism-wilderness_hut|@category_hotel": "4Cabaña", "tourism-gallery|@category_tourism": "3Galería de arte|museo|Galería", -"tourism-theme_park|@category_tourism|@category_children": "Parque de atracciones", +"tourism-theme_park|@category_tourism|@category_children": "Parque de atracciones|Parque temático|Atracciones", "boundary-national_park|@category_tourism": "Parque nacional", "leisure-nature_reserve|@category_tourism": "Territorio reservado|Reserva natural", "natural-cape": "Cabo|Punta", -"natural-geyser": "3Geiser|Géiser", +"natural-geyser": "3Géiser", "natural-glacier|@category_tourism": "Glaciar", "highway-ford": "Vado|3Cruce|3Paso", -"leisure-marina": "3Marina|Puerto o amarradero", -"piste:type-downhill|piste:type-nordic": "Esquí|Pista de esquí", -"amenity-events_venue": "Lugar de eventos|Salón de fiestas |Centro de eventos", -"shop-chocolate|@category_food|@shop": "Tienda de chocolate|Chocolatería", -"shop-fabric|@shop": "Mercería", -"shop-music|@shop": "Disquería|Tienda de discos", -"shop-musical_instrument|@shop": "Instrumentos musicales", -"shop-tea|@shop": "Tienda de té|Casa de té", +"leisure-marina": "Puerto deportivo|3Marina|3Puerto|Amarradero", +"piste:type-downhill|piste:type-nordic": "4Esquí|Ski|Pista de esquí|Esquí nórdico", +"amenity-events_venue": "Lugar de eventos|Centro de eventos", +"shop-chocolate|@category_food|@shop": "Tienda de chocolate|Chocolatería|Chocolate", +"shop-coffee|@category_food|@shop": "Café|Tienda de café", +"shop-fabric|@shop": "Tienda textil|3Mercería|Textil|Tela|Telas", +"shop-money_lender": "Entidad de crédito|Entidad de préstamo|4Prestamista|Préstamo|Préstamos|Crédito|Empeños", +"shop-music|@shop": "Tienda de música|Disquería|Tienda de discos|Discos|Música", +"shop-musical_instrument|@shop": "4Instrumentos musicales|Tienda de instrumentos musicales", +"shop-tea|@shop": "Tienda de té|Casa de té|Tetería", "shop-antiques|@category_shopping|@shop|@category_secondhand": "Antigüedades", -"shop-art|@category_shopping|@shop": "Tienda de artes", +"shop-art|@category_shopping|@shop": "Tienda de arte", "shop-baby_goods|@category_children|@shop": "Tienda de niños|Tienda de bebés", -"shop-bag|@category_shopping|@shop": "Tienda de bolsos", -"shop-cheese|@category_food|@shop": "Tienda de queso|Quesería", +"shop-bag|@category_shopping|@shop": "Tienda de bolsos|Bolsos", +"shop-cheese|@category_food|@shop": "Tienda de queso|Quesería|Quesos", "shop-dairy|@category_food|@shop": "Productos lácteos", "shop-electrical|@shop": "Tienda de electricidad", -"shop-fishing|@shop": "Tienda de pesca", -"shop-interior_decoration|@shop": "Decoraciones interiores", -"shop-lottery|@gambling": "Boletos de lotería", +"shop-fishing|@shop": "Tienda de pesca|Pesca", +"shop-interior_decoration|@shop": "Decoración de interiores", +"shop-lighting|@shop": "Tienda de iluminación|5Iluminación|5Lámparas", +"shop-lottery|@gambling": "Boletos de lotería|Lotería", "shop-medical_supply|@shop": "Suministros médicos", -"shop-nutrition_supplements|@shop": "Suplementos Nutricionales", -"shop-paint|@shop": "Pinturas|Pinturería", -"shop-perfumery|@category_shopping|@shop": "Perfumería", -"shop-sewing|@shop": "Materiales de costura|Mercería", +"shop-nutrition_supplements|@shop": "Suplementos nutricionales|Suplementos", +"shop-paint|@shop": "Pintura|Pinturas|Pinturería|Tienda de pintura", +"shop-perfumery|@category_shopping|@shop": "Perfumería|Tienda de perfumes|Perfumes|Colonias", +"shop-sewing|@shop": "Materiales de costura|3Mercería|Costura", "shop-storage_rental": "Alquiler de almacenamiento", -"shop-tobacco|@shop": "Tabaco", +"shop-tobacco|@shop": "Tabaco|Tienda de tabaco|Cigarro|Cigarros|Cigarrillo|Cigarrillos", "shop-trade|@shop": "Suministros comerciales", -"shop-watches|@category_shopping|@shop": "Relojes", -"shop-wholesale|@shop": "Almacén al por mayor", +"shop-watches|@category_shopping|@shop": "Relojes|Tienda de relojes|Relojería", +"shop-wholesale|@shop": "Venta al por mayor|Mayorista", "leisure-track": "Pista deportiva", -"power-plant": "Planta de energía", +"power-plant": "Central eléctrica", "shop-auction|@category_secondhand": "Subasta|Remate", -"shop-collector|@category_shopping|@category_secondhand": "Colector|Coleccionables", -"wheelchair-yes": "Silla de ruedas", +"shop-collector|@category_shopping|@category_secondhand": "Colector|Coleccionables|Coleccionista", +"man_made-cairn": "Hito|Mojón|Montículo|Cairn", +"wheelchair-yes": "Silla de ruedas|accesible|discapacitados", "amenity-social_facility": "Servicio social", -"leisure-sports_hall": "Pabellón deportivo", +"leisure-sports_hall": "Pabellón deportivo|Sala deportiva|Salón deportivo|Deporte", "amenity-arts_centre|@category_tourism": "Centro de arte", -"amenity-prison": "prisión|cárcel", +"amenity-prison": "prisión|cárcel|penitenciario|retén", "amenity-exhibition_centre": "Centro de exposiciones", -"shop-bathroom_furnishing|@shop": "Equipamiento de baño", -"shop-bed|@shop": "Tienda de camas", +"shop-bathroom_furnishing|@shop": "Equipamiento de baño|Muebles de baño", +"shop-bed|@shop": "Tienda de camas|camas|colchón|colchones", "shop-boutique|@shop": "Boutique", -"amenity-food_court": "Zona de comidas", -"shop-curtain|@shop": "Cortinas", -"shop-gas|@shop": "Tienda de gasolina", -"leisure-hackerspace": "Espacio para hackers", -"shop-pet_grooming": "Aseo de mascotas", +"amenity-food_court": "Zona de comida|Zona de resturantes|Feria de comida", +"shop-curtain|@shop": "Cortinas|Tienda de cortinas", +"shop-gas|@shop": "Tienda de gas|Venta de gas|Gas|Gas doméstico|Botella de gas|Botellas de gas|Bombona de gas|Bombona de gas|Bombona|Bombona", +"shop-pet_grooming": "Peluquería canina|Peluquería de mascotas", "shop-hifi|@shop": "Audio de alta fidelidad", "amenity-conference_centre": "Centro de conferencias", "shop-herbalist|@shop": "Herbolario", "shop-appliance|@shop": "Tienda de electrodomésticos", "shop-agrarian|@shop": "Tienda agrícola", -"shop-fashion_accessories|@shop": "Accesorios de moda", -"amenity-waste_transfer_station": "Estación de transferencia de residuos", -"shop-carpet|@shop": "Alfombras", -"shop-craft|@shop": "Artesanía", +"shop-fashion_accessories|@shop": "4Accesorios de moda|Accesorios", +"amenity-waste_transfer_station": "Estación de transferencia de residuos|Residuos", +"shop-carpet|@shop": "Alfombras|Tienda de alfombras", +"shop-craft|@shop": "Artesanía|Manualidades", "shop-pasta|@shop": "Pasta|Pastería", -"amenity-luggage_locker": "Consigna de equipajes|Guardaequipaje", -"amenity-studio": "Estudio", -"natural-peak|@mountain": "Pico", -"shop-cannabis|@shop": "Cannabis", -"healthcare-sample_collection": "Recolección de muestras", -"man_made-cross": "Cruz", -"amenity-animal_shelter": "Refugio de animales", -"man_made-crane": "Grúa", -"shop-coffee|@category_food|@shop": "Café", -"shop-money_lender": "Prestamista", -"leisure-dance|@category_entertainment": "4Danza|Escuela de danza", -"leisure-firepit": "3Fogón|Fogata", -"amenity-love_hotel": "5Albergue transitorio" +"attraction-amusement_ride|attraction-carousel|attraction-roller_coaster|attraction-maze|attraction-historic|attraction-big_wheel|attraction-bumper_car|@category_children": "Atracción", +"amenity-luggage_locker": "4Consigna|Consigna de equipajes|Guardaequipaje|Casillero|Locker|Lockers|Equipaje", +"office-security": "Oficina de seguridad", +"building-guardhouse": "Garita|Puesto de guardia|Puesto de vigilancia|Vigilancia", +"tourism-picnic_site|amenity-bbq|leisure-picnic_table": "3Pícnic|4Barbacoa|BBQ|Parrilla|Parrillera|Asador|Mesa de pícnic" } diff --git a/data/categories-strings/fr.json/localize.json b/data/categories-strings/fr.json/localize.json index e0477a70d..179563418 100644 --- a/data/categories-strings/fr.json/localize.json +++ b/data/categories-strings/fr.json/localize.json @@ -492,5 +492,7 @@ "building-guardhouse": "Garde", "leisure-dance|@category_entertainment": "4Danse|École de danse", "shop-money_lender": "Prêteur d'argent", -"attraction-amusement_ride|attraction-carousel|attraction-roller_coaster|attraction-maze|attraction-historic|attraction-big_wheel|attraction-bumper_car|@category_children": "Attraction|Labyrinthe" +"attraction-amusement_ride|attraction-carousel|attraction-roller_coaster|attraction-maze|attraction-historic|attraction-big_wheel|attraction-bumper_car|@category_children": "Attraction|Labyrinthe", +"amenity-animal_shelter": "Refuge pour animaux", +"amenity-vending_machine-fuel|@category_fuel": "Pompe à gaz" } diff --git a/data/categories-strings/hu.json/localize.json b/data/categories-strings/hu.json/localize.json index a20c2bed2..8749b02bc 100644 --- a/data/categories-strings/hu.json/localize.json +++ b/data/categories-strings/hu.json/localize.json @@ -1,37 +1,37 @@ { -"@category_eat": "Hol lehet enni valamit|Élelmiszer", +"@category_eat": "Hol lehet enni valamit|Étkezés|Étterem|Étel|Kaja", "@category_food": "Élelmiszer|Ennivaló|Üzlet", "@category_transport": "Közlekedés|Tömegközlekedés", -"@category_fuel": "Benzinkút", +"@category_fuel": "Benzinkút|Üzemanyag|Benzin|Gázolaj", "@category_parking": "4Parkoló", "@category_shopping": "Bevásárlás", "@category_hotel": "Szálloda|Szállodák|Hotel|Hotelek", "@category_tourism": "4Látnivalók|4Túrizmus", "@category_entertainment": "Szórakozás", -"@category_nightlife": "Éjjeli élet", -"@category_children": "Családi kiruccanás", -"@category_atm": "4Pénzautomata", -"@category_rv": "Lakókocsis létesítmények", -"amenity-atm|@category_atm": "pénz|ATM|Bankautomata", +"@category_nightlife": "Éjjeli élet|Éjszakai élet", +"@category_children": "Családi kiruccanás|kirándulás", +"@category_atm": "ATM|4Pénzautomata", +"@category_rv": "Lakókocsis létesítmények|lakókocsi|lakóautó", +"amenity-atm|@category_atm": "pénz|ATM|Bankautomata|U+1F3E7|U+1F4B2|U+1F4B3|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7", "@category_bank": "3Bank", -"@category_secondhand": "Second-hand|Használt cikk", -"amenity-bank|@category_bank": "pénz", +"@category_secondhand": "4Használt cikk", +"amenity-bank|@category_bank": "pénz|U+1F3E6|U+1F4B0|U+1F4B2|U+1F4B3|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7", "@category_recycling": "Újrahasznosítás|Hulladékhasznosítás|Újrahasznosítható|Elkülönített hulladékgyűjtés|Hulladék válogatás|Újrafelhasználás", -"amenity-bureau_de_change": "3Pénzváltó|pénz", -"amenity-bar|amenity-pub|@category_eat|@category_nightlife": "2Bár|2kocsma|sör|ital|élelmiszer", -"amenity-cafe|@category_eat": "3Kávézó|3étterem|3élelmiszer", -"amenity-fast_food|@category_eat": "4Gyorsétterem|3étterem|3kávézó|3élelmiszer", -"amenity-restaurant|@category_eat": "3Étterem|3kávézó|3élelmiszer", -"amenity-fuel|@category_fuel": "3Benzinkút|benzin", -"@shop": "Bolt", -"shop-bakery|shop-pastry|@category_eat|@category_food|@shop": "3Pékség|Cukrászda", +"amenity-bureau_de_change": "3Pénzváltó|pénz|U+1F4B1|U+1F4B2|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7", +"amenity-bar|amenity-pub|@category_eat|@category_nightlife": "2Bár|2kocsma|sör|ital|U+1F37A|U+1F37B|U+1F376", +"amenity-cafe|@category_eat": "3Kávézó|3étterem|3kávé|U+2615|U+1F356|U+1F357|U+1F35A|U+1F35B|U+1F35C|U+1F35D|U+1F363|U+1F366|U+1F367|U+1F368|U+1F369|U+1F370|U+1F372|U+1F374|U+1F377|U+1F60B|U+1F375", +"amenity-fast_food|@category_eat": "4Gyorsétterem|3étterem|3kávé|elvitel|U+1F354|U+1F355|U+1F35F|U+1F363|U+1F366|U+1F367|U+1F368|U+1F369|U+1F370|U+1F372|U+1F374", +"amenity-restaurant|@category_eat": "3Étterem|3kávé|U+1F356|U+1F357|U+1F35A|U+1F35B|U+1F35C|U+1F35D|U+1F363|U+1F366|U+1F367|U+1F368|U+1F369|U+1F370|U+1F372|U+1F374|U+1F377|U+1F60B", +"amenity-fuel|@category_fuel": "3Benzinkút|benzin|U+26FD", +"@shop": "Bolt|Üzlet|U+1F3EA|U+1F3EC", +"shop-bakery|shop-pastry|@category_eat|@category_food|@shop": "3Pékség|Cukrászda|sütemény|U+1F35E", "shop-cosmetics|@category_shopping|@shop": "4Kozmetikum|házi gondozás|Kozmetikai üzlet", "shop-convenience|@category_food|@shop": "Csemegebolt|ábécé", "shop-deli|@category_food|@shop": "Csemege", "shop-garden_centre|@shop": "Kertészet|Kertészeti áruház", "shop-hearing_aids|@shop": "Hallókészülékek", -"shop-mobile_phone|@shop": "Mobiltelefon üzlet|elektronikai szaküzlet", -"shop-florist|@shop": "Virágbolt|virágárus|Virágüzlet", +"shop-mobile_phone|@shop": "Mobiltelefon üzlet|elektronikai szaküzlet|okostelefon|U+1F4F1|U+1F4F2", +"shop-florist|@shop": "Virágbolt|virágárus|Virágüzlet|virág|U+1F337|U+1F338|U+1F339|U+1F33A|U+1F33B|U+1F33C|U+1F490|U+1F33E", "shop-butcher|@category_food|@shop": "Hentes|Mészáros", "shop-furniture|@shop": "Bútoráruház", "shop-kitchen|@shop": "Konyhabolt", @@ -44,96 +44,96 @@ "shop-jewelry|@category_shopping|@shop": "Ékszer", "shop-optician|@shop": "4Optika", "shop-gift|@category_shopping|@shop": "Ajándékbolt|4Souvenir|Szuvenír", -"shop-beauty": "Szépségszalon", -"shop-greengrocer|@category_food|@shop": "Zöldséges|Zöldség-gyümölcs", -"shop-sports|@category_shopping|@shop": "4Sporteszközök", +"shop-beauty": "Szépségszalon|fodrász|U+1F484|haj|hajvágás", +"shop-greengrocer|@category_food|@shop": "Zöldséges|Zöldség-gyümölcs|U+1F345|U+1F346|U+1F33D|U+1F360|U+1F348|U+1F347|U+1F349|U+1F34A|U+1F34C|U+1F34D|U+1F34E|U+1F34F|U+1F350|U+1F351|U+1F353", +"shop-sports|@category_shopping|@shop": "4Sporteszközök|U+1F3BF|U+1F3A3|U+1F3C2|U+1F6B4|U+26BD|U+1F3C0|U+1F3C8|U+26BE|U+1F3BE|U+1F3C9|U+26F3", "shop-supermarket|@category_food|@shop": "3Szupermarket", "shop-mall|@category_shopping|@shop": "Bevásárlóközpont", "shop-department_store|@category_shopping|@shop": "Áruház|Nagyáruház", -"shop-beverages|@category_food|@shop": "Italok|üdítők", -"shop-computer|@shop": "Számítógépüzlet|Számítógép üzlet", -"shop-confectionery|craft-confectionery|@category_food|@shop": "Cukrászüzlet|édességbolt|Cukrászműhely", +"shop-beverages|@category_food|@shop": "Italok|üdítők|U+1F379", +"shop-computer|@shop": "Számítógépüzlet|Számítógép üzlet|U+1F4BB", +"shop-confectionery|craft-confectionery|@category_food|@shop": "Cukrászüzlet|édességbolt|Cukrászműhely|U+1F36C|U+1F36D", "shop-laundry": "4Mosoda", -"shop-toys|@category_children|@shop": "Játékbolt", -"amenity-marketplace|@category_food": "2Piac|vásárlás", -"amenity-money_transfer": "Pénz átutalás", -"shop-clothes|@category_shopping|@shop": "Ruhabolt|Ruházati bolt|4ruhák", -"shop-car|@shop": "Autókereskedés|Autószalon|Kocsi", -"shop-bicycle|@shop": "4Kerékpárüzlet|Kerékpár üzlet", -"shop-kiosk": "Trafik", -"highway-bus_stop|@category_transport": "2Buszmegálló|2busz|megálló", -"railway-tram_stop|@category_transport": "4Villamosmegálló|3villamos|megálló", -"amenity-bus_station|@category_transport": "2Buszpályaudvar|Buszállomás|2busz|megálló", -"railway-station|railway-halt|building-train_station|@category_transport": "3Vasútállomás|Vasúti megálló|Vonatmegálló|4vonat|4megálló", -"railway-station-funicular": "Funicular|Sikló", -"railway-station-subway|@category_transport": "3Metró|Földalatti", -"amenity-ferry_terminal|@category_transport": "4Kompkikötő", -"amenity-taxi|@category_transport": "3Taxiállomás", +"shop-toys|@category_children|@shop": "Játékbolt|játék|gyerekjáték", +"amenity-marketplace|@category_food": "2Piac|piactér", +"amenity-money_transfer": "Pénzátutalás|átutalás", +"shop-clothes|@category_shopping|@shop": "Ruhabolt|Ruházati bolt|4ruhák|U+1F45A|U+1F457|U+1F456|U+1F455|ruha", +"shop-car|@shop": "Autókereskedés|Autószalon|Kocsi|U+1F697|U+1F698|U+1F699", +"shop-bicycle|@shop": "4Kerékpárüzlet|U+1F6B2|U+1F6B4|U+1F6B5|bicikli", +"shop-kiosk": "Trafik|U+1F4F0", +"highway-bus_stop|@category_transport": "2Buszmegálló|2busz|megálló|U+1F68C|U+1F68F|U+1F68E|U+1F690", +"railway-tram_stop|@category_transport": "4Villamosmegálló|3villamos|megálló|U+1F683", +"amenity-bus_station|@category_transport": "2Buszpályaudvar|Buszállomás|2busz|megálló|U+1F68C|U+1F68F|U+1F68D", +"railway-station|railway-halt|building-train_station|@category_transport": "3Vasútállomás|Vasúti megálló|Vonatmegálló|4vonat|4megálló|U+1F684|U+1F685|U+1F689|U+1F682|U+1F686|U+1F688|U+1F68A|U+1F68B", +"railway-station-funicular": "Siklóvasút|kötélpálya", +"railway-station-subway|@category_transport": "3Metró|Földalatti|U+1F687", +"amenity-ferry_terminal|@category_transport": "3Komp|U+1F6A2|U+1F6A4|U+2693", +"amenity-taxi|@category_transport": "3Taxiállomás|taxi|U+1F695|U+1F696", "amenity-townhall": "3Városháza|Községháza|Önkormányzat", -"tourism-attraction|@category_tourism": "3Látnivaló|3látványosság", -"tourism-artwork": "3Műalkotás", +"tourism-attraction|@category_tourism": "3Látnivaló|3látványosság|U+1F3A0|U+1F3A1|U+1F3A2|U+1F3AA", +"tourism-artwork": "3Műalkotás|U+1F3A8", "tourism-viewpoint|@category_tourism": "4Kilátó|Panoráma", -"tourism-information": "4Turistainformáció|4információ|Turisztikai tájékoztatás", -"tourism-picnic_site|amenity-bbq|leisure-picnic_table": "3Piknikezőhely|Grillezőhely", -"amenity-place_of_worship": "3Templom|Istentiszteleti hely", -"amenity-place_of_worship-christian": "Templom|Székesegyház|Katedrális|Dóm|Bazilika|Istentiszteleti hely", -"amenity-place_of_worship-muslim": "Mecset", -"amenity-place_of_worship-buddhist": "Buddhista szentély", -"amenity-place_of_worship-hindu": "Hindu szentély", -"amenity-place_of_worship-shinto": "Sintó szentély", -"amenity-place_of_worship-jewish": "4Zsinagóga|imaház", -"amenity-place_of_worship-taoist": "Taoista szentély", -"tourism-museum|@category_tourism": "2Múzeum|kiállítás|3galéria|látványosság", +"tourism-information": "4Turistainformáció|4információ|Turisztikai tájékoztatás|U+1F481", +"tourism-picnic_site|amenity-bbq|leisure-picnic_table": "3Piknikezőhely|Grillezőhely|piknik", +"amenity-place_of_worship": "3Templom|Istentiszteleti hely|U+1F64F", +"amenity-place_of_worship-christian": "Templom|Székesegyház|Katedrális|Dóm|Bazilika|Istentiszteleti hely|U+1F64F|U+26EA|U+271D|U+2626", +"amenity-place_of_worship-muslim": "Mecset|U+1F64F|U+262A|U+1F54B|U+1F54C|U+262A", +"amenity-place_of_worship-buddhist": "Buddhista szentély|U+1F64F|U+26EA|U+2638", +"amenity-place_of_worship-hindu": "Hindu szentély|U+1F64F|U+1F549", +"amenity-place_of_worship-shinto": "Szentély|U+1F64F|U+26E9", +"amenity-place_of_worship-jewish": "4Zsinagóga|imaház|U+1F64F|U+1F54D|U+2721", +"amenity-place_of_worship-taoist": "Taoista szentély|U+1F64F|U+262F", +"tourism-museum|@category_tourism": "2Múzeum|kiállítás|3galéria|látványosság|U+1F3A8", "waterway-waterfall|@category_tourism": "2Vízesés", "historic-archaeological_site|@category_tourism": "Ásatás", "historic-battlefield": "Csatatér", "historic-stone": "Történelmi kő", "historic-boundary_stone": "Határkő", -"historic-castle|@category_tourism": "Vár|Kastély|Erőd|Palota|Castrum|Erősített templom|Erődrendszer|Földvár|Kreml|Udvarház", -"historic-city_gate|@category_tourism": "Városi kapu", +"historic-castle|@category_tourism": "Vár|Kastély|Erőd|Palota|Castrum|Erősített templom|Erődrendszer|Földvár|Kreml|Udvarház|U+1F3EF|U+1F3F0|U+1F451|U+1F478", +"historic-city_gate|@category_tourism": "Városkapu", "historic-citywalls|@category_tourism": "Városi fal|Városfal", -"historic-fort|@category_tourism": "Fort|Erőd", +"historic-fort|@category_tourism": "Erőd", "historic-gallows|@category_tourism": "Akasztófa", -"historic-memorial|@category_tourism": "3Emlékmű|Monumentális emlékmű", +"historic-memorial|@category_tourism": "3Emlékmű|Monumentális emlékmű|U+1F5FC|U+1F5FD|U+1F5FF", "historic-memorial-cross": "Emlékkereszt", "historic-memorial-plaque": "Emlékmű|Emléktábla", "historic-memorial-sculpture|@category_tourism": "Emlékmű|Absztrakt szobor", "historic-memorial-statue|@category_tourism": "Emlékmű|Szobor", "historic-memorial-stolperstein": "Botlatókő", "historic-memorial-war_memorial|@category_tourism": "Háborús emlékmű", -"historic-monument|@category_tourism": "4Monumentális emlékmű|Monumentális, épületszerű műemlék", +"historic-monument|@category_tourism": "4Monumentális emlékmű|Monumentális, épületszerű műemlék|U+1F5FD|U+1F5FF", "historic-pillory|@category_tourism": "Pellengér", "historic-cannon": "Ágyú", "historic-anchor": "Történelmi horgony", -"historic-ruins|@category_tourism": "Romok|Történelmi rom", -"historic-mine": "Történelmi Bánya", -"historic-ship|@category_tourism": "Túrizmus|Hajó", +"historic-ruins|@category_tourism": "Romok|Történelmi rom|U+1F5FF", +"historic-mine": "Történelmi bánya", +"historic-ship|@category_tourism": "Turizmus|Hajó|Csónak", "historic-wreck": "Hajóroncs", -"historic-locomotive|@category_tourism": "Történelmi mozdony", -"historic-tank|@category_tourism": "Történelmi Tank", -"historic-aircraft|@category_tourism": "Történelmi Repülőgép", -"historic-tomb|@category_tourism": "Sír", +"historic-locomotive|@category_tourism": "Történelmi mozdony|Vonat", +"historic-tank|@category_tourism": "Történelmi tank|Tank", +"historic-aircraft|@category_tourism": "Történelmi repülőgép|Repülőgép", +"historic-tomb|@category_tourism": "Történelmi sír|Sírhely|Sír", "historic-wayside_cross": "Útszéli kereszt", -"historic-wayside_shrine": "Útmenti szentély", +"historic-wayside_shrine": "Útmenti szentély|Szentély", "leisure-garden": "2Kert", "amenity-bench": "Pad", -"amenity-bicycle_rental": "4Kerékpárkölcsönző|kerékpár|3bérlés", +"amenity-bicycle_rental": "4Kerékpárkölcsönző|kerékpár|3bérlés|U+1F6B2|U+1F6B4|U+1F6B5|Kölcsönző", "amenity-bicycle_repair_station": "4Kerékpár javítás|kerékpár", -"amenity-car_sharing": "Gépjárműmegosztás", -"amenity-car_rental": "3Gépkocsikölcsönző|kocsi|bérlés", -"amenity-motorcycle_rental": "Motorkerékpár bérlés", -"amenity-cinema|@category_entertainment": "3Mozi", +"amenity-car_sharing": "Gépjárműmegosztás|U+1F697|U+1F698|U+1F699|telekocsi", +"amenity-car_rental": "3Gépkocsikölcsönző|kocsi|bérlés|U+1F697|U+1F698|U+1F699", +"amenity-motorcycle_rental": "Motorkerékpár bérlés|Motor|Bérlés|Roller", +"amenity-cinema|@category_entertainment": "3Mozi|U+1F3A6|U+1F3AC", "leisure-bowling_alley|@category_entertainment": "Tekepálya", -"amenity-theatre|@category_entertainment": "3Színház", -"amenity-nightclub|@category_entertainment|@category_nightlife": "3Éjszakai mulató|3diszkó|tánc", -"amenity-brothel": "Bordély", +"amenity-theatre|@category_entertainment": "3Színház|U+1F3AD", +"amenity-nightclub|@category_entertainment|@category_nightlife": "3Éjszakai mulató|3diszkó|tánc|U+1F378|U+1F379|U+1F46F|U+1F483|Éjszakai", +"amenity-brothel": "Bordély|U+1F3E9", "@gambling": "Szerencsejáték", -"amenity-casino|@category_entertainment|@category_nightlife|@gambling": "Kaszinó", +"amenity-casino|@category_entertainment|@category_nightlife|@gambling": "Kaszinó|U+1F3B0|U+1F3B2|U+1F3B4|Szerencsejáték", "leisure-adult_gaming_centre|@gambling": "Felnőtt Játékközpont", -"leisure-amusement_arcade|@category_entertainment": "Árkád", -"amenity-college": "Főiskola", -"amenity-fire_station": "Tűzoltóság", -"amenity-fountain": "Szökőkút", +"leisure-amusement_arcade|@category_entertainment": "Árkád|U+1F47E|U+1F579|U+1F3AE|Játékterem", +"amenity-college": "Főiskola|U+1F3EB", +"amenity-fire_station": "Tűzoltóság|U+1F692", +"amenity-fountain": "Szökőkút|U+26F2", "amenity-grave_yard|landuse-cemetery": "Temető", "shop-funeral_directors": "Temetkezési vállalkozó", "@category_hospital": "4Kórház", @@ -195,7 +195,7 @@ "highway-path|highway-footway|highway-steps|highway-cycleway": "Ösvény", "highway-pedestrian|highway-primary|highway-primary_link|highway-residential|highway-secondary|highway-secondary_link|highway-tertiary|highway-tertiary_link|highway-service|highway-road|highway-track|highway-trunk|highway-trunk_link|highway-living_street|highway-unclassified|highway-motorway_link|highway-motorway|highway-cycleway": "Utca", "highway-motorway_junction": "4Kijárat|4csatlakozás", -"@mountain": "Csúcs|hegy", +"@mountain": "Csúcs|hegy|U+1F5FB|U+1F304", "natural-strait": "Szoros", "landuse-forest": "Erdő", "leisure-park": "Park", @@ -204,28 +204,28 @@ "tourism-hotel|@category_hotel": "Szálloda|hotel|motel|szállás", "tourism-guest_house|@category_hotel": "Vendégház|panzió", "tourism-motel|@category_hotel": "3Motel|szállás", -"tourism-alpine_hut|@category_hotel": "Hegyi menedék|kabin|hotel|szálloda", -"shop-hairdresser": "3Fodrász", -"aeroway-aerodrome": "3Repülőtér|3repülő", -"leisure-stadium": "4Stadion|4sport", +"tourism-alpine_hut|@category_hotel": "5Hegyi menedékház|5hegyvidéki kunyhó|kunyhó|menedékház|alpesi kunyhó", +"shop-hairdresser": "3Fodrász|U+2702|U+1F488|hajvágás|hajnyírás|hajfestés|borbély", +"aeroway-aerodrome": "3Repülőtér|3repülő|U+2708", +"leisure-stadium": "4Stadion|4sport|U+26BD|U+26BE|U+1F3BE|U+1F3C0|U+1F3C8|U+1F4AA|U+1F3C9|aréna|olimpiai stadion", "leisure-playground|@category_children": "Játszótér", -"leisure-sports_centre": "4Sportközpont|sport", -"leisure-golf_course": "Golfpálya", +"leisure-sports_centre": "4Sportközpont|sport|U+26BD|U+26BE|U+1F3BE|U+1F4AA|U+1F3C8|U+1F3C0|U+1F3C9", +"leisure-golf_course": "Golfpálya|U+26F3", "leisure-miniature_golf": "Minigolf", "leisure-escape_game": "Szabadulószoba", -"leisure-pitch": "4Sportpálya|sport", -"leisure-swimming_pool": "4Úszómedence|Uszoda|sport", +"leisure-pitch": "4Sportpálya|sport|U+26BD|U+26BE|U+1F3BE|U+1F3C0|U+1F3C8|U+1F3C9|U+1F3C3", +"leisure-swimming_pool": "4Úszómedence|Uszoda|sport|U+1F3CA", "sport-american_football": "Amerikai foci", "sport-archery": "Íjászat", "sport-athletics": "Atlétika", "sport-australian_football": "Ausztrál futball", "sport-baseball": "Baseball", "sport-basketball": "Kosárlabda", -"sport-beachvolleyball": "Strandröplabda", +"sport-beachvolleyball": "Strandröplabda|Röplabda", "sport-chess": "Sakk", "sport-cricket": "Krikett", "sport-curling": "Curling", -"sport-equestrian": "Lovassportok|Lovas sportok", +"sport-equestrian": "Lovas sportok|Lovaglás", "sport-golf": "Golf", "sport-gymnastics": "Gimnasztika|Torna", "sport-handball": "Kézilabda", @@ -240,13 +240,13 @@ "sport-padel": "Padel", "sport-volleyball": "Röplabda", "sport-9pin|sport-10pin": "Teke|Bowling", -"building": "Épület", +"building": "Épület|U+1F3E0|U+1F3E1|U+1F3E2|Ház", "building-address": "Cím", -"@category_police": "4Rendőrség", +"@category_police": "4Rendőrség|Rendőr", "office-diplomatic": "4Nagykövetség|Külképviselet", "natural-bay": "Öböl", -"@category_water": "3Víz", -"amenity-drinking_water|drinking_water-yes|@category_water": "4Ivóvíz", +"@category_water": "3Víz|Vízforrás|Ivóvíz", +"amenity-drinking_water|drinking_water-yes|@category_water": "4Ivóvíz|U+1F6B0", "natural-hot_spring|@category_water": "Melegvizű forrás|Termálvíz", "natural-spring|@category_water": "Forrás", "man_made-water_well|@category_water": "Kút", @@ -255,31 +255,31 @@ "natural-water-basin|landuse-basin|@waterbody": "Vízgyűjtő", "natural-water-pond|@waterbody": "Tavacska", "natural-water-lake|@waterbody": "Tó", -"natural-water-reservoir|landuse-reservoir|@waterbody": "5Rezervoár", +"natural-water-reservoir|landuse-reservoir|@waterbody": "5Víztározó", "waterway-river|waterway-stream|natural-water-river": "Folyó", -"waterway-canal": "Csatorna", -"shop-car_repair": "3Autószerelő|Autószerviz|Gépkocsiszerviz|Autójavító|4javítóműhely|kocsi", -"tourism-camp_site|@category_hotel": "4Kemping|sátrazóhely", -"tourism-caravan_site|@category_rv||@category_hotel": "4Lakókocsihely|kemping", -"office": "Iroda|Hivatal|cég|vállalat", +"waterway-canal": "Csatorna|Kanális", +"shop-car_repair": "3Autószerelő|Autószerviz|Gépkocsiszerviz|Autójavító|4javítóműhely|kocsi|U+1F527", +"tourism-camp_site|@category_hotel": "4Kemping|sátrazóhely|U+26FA", +"tourism-caravan_site|@category_rv||@category_hotel": "4Lakókocsihely|kemping|U+1F69A|U+26FA|U+1F69B", +"office": "Iroda|Hivatal|cég|vállalat|U+1F454|U+1F4BC|U+1F3E2", "office-company": "Vállalati iroda", "office-government": "Kormányzati iroda|Állami iroda", "office-lawyer": "Ügyvéd|Ügyvédi iroda", "office-telecommunication": "Mobiltelefon-társaság|Távközlési cég", "craft-beekeeper": "Méhész", "craft-blacksmith": "Kovácsműhely", -"craft-brewery": "Sörfőzde|sör", -"craft-caterer": "Catering|Rendezvényszervező", -"craft-carpenter": "Ács", +"craft-brewery": "Sörfőzde|sörwkézműves sör|sörfőzde", +"craft-caterer": "Rendezvényszervező|Rendezvény|Szervező", +"craft-carpenter": "Ács|Asztalos", "craft-confectionery": "Cukrászda|Cukrászműhely", "craft-electrician": "Villanyszerelő", "craft-electronics_repair": "Elektronikai javítás", "craft-gardener": "Kertész", "craft-grinding_mill": "Malom", "craft-handicraft": "Kézművesség", -"craft-hvac": "Hűtés-fűtés szerelő", -"craft-metal_construction": "Lakatos|szerelő", -"craft-key_cutter": "Kulcsvágás", +"craft-hvac": "Hűtés|fűtés|légkondicionálás", +"craft-metal_construction": "Lakatos", +"craft-key_cutter": "4kulcsmásolás|másolás|kulcs", "craft-locksmith": "Lakatos", "craft-painter": "Festő", "craft-photographer": "Fényképész|fényképész stúdió", @@ -289,79 +289,79 @@ "craft-winery": "Pincészet|Borászat", "craft-tailor": "Szabó", "area:highway-footway|area:highway-pedestrian|area:highway-steps|place-square": "Tér", -"place-sea": "Tenger", -"place-ocean": "Óceán", +"place-sea": "Tenger|U+1F30A", +"place-ocean": "Óceán|U+1F30A", "@category_wifi": "WiFi|Wi-Fi", -"internet_access|internet_access-wlan|@category_wifi": "3Internet", -"natural-beach|natural-beach-sand|natural-beach-gravel|leisure-beach_resort": "Strand|Homokos part", +"internet_access|internet_access-wlan|@category_wifi": "3Internet|U+1F4F6", +"natural-beach|natural-beach-sand|natural-beach-gravel|leisure-beach_resort": "Strand|Homokos part|U+1F459|Part", "man_made-lighthouse": "Világítótorony", "man_made-communications_tower|man_made-tower-communication": "Kommunikációs torony", "man_made-petroleum_well": "Olajkút", -"organic-only|organic-yes": "eco|bio|egészséges|biológiai|környezeti|természetes|organikus", -"shop-copyshop": "Fénymásoló üzlet|Nyomda|Fénymásoló", -"shop-photo|@shop": "4Fotósüzlet|Fényképüzlet|Fénykép üzlet|keretek|Fotóüzlet", -"shop-camera|@shop": "Fényképezőgép bolt", -"shop-travel_agency": "Utazási iroda|utazás|túra|utak|utazásközvetítő|utazásszervező|last minute", -"shop-outdoor|@shop": "Túrafelszerelés|trekking|mászás|kemping|üzlet", +"organic-only|organic-yes": "öko|bio|egészséges|biológiai|környezeti|természetes|organikus", +"shop-copyshop": "Fénymásoló|Nyomda|Fénymásoló|másoló", +"shop-photo|@shop": "4Fotósüzlet|Fényképüzlet|Fénykép üzlet|keretek|Fotóüzlet|Keret|Képkeret|Fotó", +"shop-camera|@shop": "Fényképezőgép bolt|Kamera", +"shop-travel_agency": "Utazási iroda|utazás|túra|utak|utazásközvetítő|utazásszervező", +"shop-outdoor|@shop": "Túrafelszerelés|mászás|kempingezés|üzlet", "shop-dry_cleaning": "Ruhatisztító|vegytisztító|patyolat|tisztító", "shop-tyres|@shop": "Gumiszaküzlet|Gumi szaküzlet|Autógumi-szaküzlet", "amenity-car_wash": "4Autómosó", "amenity-veterinary": "Állatorvos", "@charging_station": "Töltőállomás|töltés", -"amenity-charging_station-bicycle|@charging_station": "Kerékpár töltés", +"amenity-charging_station-bicycle|@charging_station": "Kerékpártöltés", "amenity-childcare": "Bölcsőde|Gyermekgondozás|Gyermekfelügyelet", "amenity-bicycle_parking": "Kerékpártároló", -"amenity-waste_basket": "Szemétkosár", -"emergency-phone": "Segélyhívó telefon", -"leisure-fitness_centre": "Edzőterem|Konditerem|Fitneszterem", +"amenity-waste_basket": "Szemétkosár|Szemetes", +"emergency-phone": "Segélyhívó telefon|Segélyhívó", +"leisure-fitness_centre": "Edzőterem|Konditerem|Fitneszterem|U+1F4AA", "leisure-sauna": "3Szauna", "shop-car_repair-tyres|shop-car_repair": "Gumiszerviz|Gumijavítás", "shop-chemist|@shop": "4Drogéria", -"shop-pet|@shop": "Házikedvenc-üzlet", +"shop-pet|@shop": "Házikedvenc-üzlet|Kisállat", "tourism-zoo|@category_tourism|@category_children": "Állatkert", -"attraction-animal": "Állatok tartása|Kifutó", +"attraction-animal": "Állattartás|Kifutó|Karám", "tourism-information-office|amenity-ranger_station|@category_tourism": "3Tourinform iroda|Idegenforgalmi iroda", -"tourism-information-visitor_centre|amenity-ranger_station|@category_tourism": "Látogatóközpont", -"amenity-community_centre": "Közösségi ház", -"amenity-compressed_air": "Sűrített levegő", -"amenity-courthouse": "Bíróság", -"amenity-vending_machine-cigarettes": "Cigarettaautomata", +"tourism-information-visitor_centre|amenity-ranger_station|@category_tourism": "3Látogatóközpont", +"amenity-community_centre": "4Közösségi ház", +"amenity-compressed_air": "Sűrített levegő|Kompresszor", +"amenity-courthouse": "4Bíróság", +"amenity-vending_machine-cigarettes": "4Cigarettaautomata", "amenity-vending_machine-drinks": "Italautomata", "amenity-vending_machine-parking_tickets|@category_parking": "4Parkolóautomata", -"amenity-vending_machine-public_transport_tickets|@category_transport": "Automata jegykiadó tömegközlekedési eszközökhöz", -"shop-outpost": "Felvevő pont|Interneten megrendelt áru átvevőhelye", +"amenity-vending_machine-public_transport_tickets|@category_transport": "Jegykiadó|tömegközlekedés|Jegy|Bérlet", +"shop-outpost": "4Felvevő pont|Csomag|Automata|Csomagautomata", "building-garage": "Garázs", "highway-rest_area|highway-services": "Pihenőzóna|Pihenőhely", "man_made-tower|man_made-flare": "Torony", "shop-bookmaker|@gambling": "Fogadóiroda", -"shop-seafood|@category_food|@shop": "Halüzlet|Halkereskedés", +"shop-seafood|@category_food|@shop": "Halüzlet|Halkereskedés|Hal", "shop-charity|@shop|@category_secondhand": "Jótékonysági Bolt", -"shop-ticket": "Jegyiroda|Jegypénztár", -"shop-wine|@category_food|@shop": "Borkereskedés", -"shop-car_parts|@shop": "Autóalkatrész", -"tourism-chalet|@category_hotel": "Nyaraló házikó|Nyaralóház", +"shop-ticket": "Jegyiroda|Jegypénztár|Szállásfoglalás", +"shop-wine|@category_food|@shop": "4Borkereskedés", +"shop-car_parts|@shop": "4Autóalkatrész", +"tourism-chalet|@category_hotel": "5Nyaraló|Nyaralóház", "tourism-information-board": "Tájékoztató tábla", "tourism-information-map": "Turistatérkép|Turisztikai térkép", -"aerialway-station": "Felvonóállomás", +"aerialway-station": "Felvonóállomás|Felvonó", "aeroway-helipad": "Helikopterleszálló", -"barrier-border_control": "Határátkelő", +"barrier-border_control": "4Határátkelő", "leisure-water_park|@category_tourism|@category_children": "Strand|Élményfürdő|3Aquapark", "man_made-water_tower": "Víztorony", "man_made-windmill": "Szélmalom", "natural-cave_entrance": "Barlang", "natural-volcano|@mountain": "Tűzhányó|4Vulkán", -"office-estate_agent": "Ingatlaniroda", +"office-estate_agent": "Ingatlaniroda|Ügynök", "waterway-lock_gate": "Zsilipkapu", "amenity-public_bookcase": "Nyilvános könyvespolc|könyvcsere", -"sport-climbing": "Hegymászóközpont|Hegymászó központ", -"sport-yoga": "Jógastúdió", +"sport-climbing": "Hegymászóközpont|Hegymászás", +"sport-yoga": "Jóga", "tourism-apartment|@category_hotel": "5Apartmanok|Apartman", "leisure-resort|@category_hotel": "Strand|Üdülőhely", "amenity-biergarten|@category_eat|@category_nightlife": "Sörkert", "amenity-driving_school": "4Autósiskola", "amenity-music_school": "Zeneiskola", "amenity-language_school": "Nyelviskola", -"amenity-ice_cream": "5Fagylaltárus", +"amenity-ice_cream": "5Fagylaltárus|Fagylalt|Fagyi", "amenity-internet_cafe": "3Internetkávézó", "amenity-motorcycle_parking": "4Motorkerékpár-parkoló", "amenity-parking_space-disabled|@category_parking": "Mozgássérült parkolóhely", @@ -369,34 +369,34 @@ "amenity-payment_terminal": "Fizetőterminál", "amenity-public_bath": "Közfürdő", "amenity-shower": "Zuhany|tusoló", -"emergency-assembly_point": "Sürgősségi gyülekezési pont", +"emergency-assembly_point": "Vészhelyzeti gyülekezőhely", "emergency-defibrillator": "4Defibrillátor", -"emergency-fire_hydrant": "Tűzcsap", -"emergency-lifeguard": "Sürgősségi vízimentő|Életmentő", -"emergency-mountain_rescue": "Hegyi mentőszolgálat sürgősségi", +"emergency-fire_hydrant": "4Tűzcsap", +"emergency-lifeguard": "Vízimentő|Életmentő|Mentőszolgálat", +"emergency-mountain_rescue": "Hegyi mentőszolgálat|Mentőszolgálat", "leisure-fitness_station": "3Fitneszpark", -"office-insurance": "Biztosító", -"office-ngo": "Civil szervezet irodája", +"office-insurance": "4Biztosító", +"office-ngo": "Civil szervezet irodája|iroda|civil", "shop-erotic|@shop": "4Erotikus bolt", -"shop-massage": "4Masszázsszalon", +"shop-massage": "4Masszázsszalon|Masszázs", "shop-motorcycle|@shop": "4Motorkerékpár-üzlet|Motorkerékpár-szaküzlet", "shop-motorcycle_repair": "Motorkerékpár javítás", "shop-newsagent": "Újságárus", "shop-pawnbroker": "Zálogház", -"shop-stationery|@shop": "Írószerbolt", -"shop-tattoo": "4Tetováló szalon|Tetoválószalon", +"shop-stationery|@shop": "Írószerbolt|Papírbolt|Papír írószer", +"shop-tattoo": "4Tetováló szalon|Tetoválószalon|Tetoválás", "shop-variety_store|@category_shopping|@shop": "Vegyesbolt", -"shop-video|@shop": "4Videotéka", -"shop-video_games|@shop": "4Videojáték bolt", +"shop-video|@shop": "4Videotéka|Videokölcsönzés|Kölcsönzés|DVD", +"shop-video_games|@shop": "4Videojáték szaküzlet|U+1F47E|U+1F579|U+1F3AE", "tourism-wilderness_hut|@category_hotel": "Menedékház", "boundary-national_park|@category_tourism": "Nemzeti park", -"leisure-nature_reserve|@category_tourism": "Védett terület", +"leisure-nature_reserve|@category_tourism": "Természetvédelmi terület|Természetvédelem", "natural-cape": "Fok|Hegytető", "natural-geyser": "3Gejzír", "natural-glacier|@category_tourism": "Gleccser", "highway-ford": "Gázló", "piste:type-downhill|piste:type-nordic": "Síelés|Sífutás", -"amenity-events_venue": "Rendezvények helyszíne", +"amenity-events_venue": "Rendezvényhelyszín|Rendezvénytér|Rendezvény", "shop-antiques|@category_shopping|@shop|@category_secondhand": "Régiségek|Régiségkereskedés", "shop-art|@category_shopping|@shop": "Művészeti Bolt|Műkereskedés", "shop-baby_goods|@category_children|@shop": "Gyermekbolt|Bababolt", @@ -442,5 +442,27 @@ "shop-pasta|@shop": "Tészta", "amenity-luggage_locker": "Poggyászmegőrző", "leisure-dance|@category_entertainment": "tánc|tánciskola", -"amenity-love_hotel": "4szeretőszálló|szexhotel" +"amenity-love_hotel": "4szeretőszálló|szexhotel", +"shop-grocery|@category_food|@shop": "Élelmiszerbolt|zöldséges", +"shop-health_food|@category_food|@shop": "Bio|bioélelmiszer", +"shop-cannabis|@shop": "Kanabisz|Marihuana", +"shop-caravan|@category_rv|@shop": "Lakóautó kereskedés|lakóautó|lakókocsi", +"leisure-dog_park": "3kutyapark", +"leisure-firepit": "5tűzrakóhely|tűz", +"leisure-hackerspace": "Hackerspace", +"sport-bowls": "Teke|Bowling|gyepteke", +"amenity-police|@category_police": "U+1F693|U+1F46E|U+1F694|U+1F482|U+1F6A8|rendőrség", +"@waterbody": "Víztest|vízfelület", +"man_made-mast": "Árboc|oszlop", +"amenity-charging_station-motorcar|@charging_station": "4Autó töltés", +"amenity-vending_machine-coffee": "Kávéadagoló|Kávé", +"amenity-vending_machine-newspapers": "4Újságos|Újságok|újság", +"amenity-vending_machine-sweets": "4édesség adagoló|Édességek|4Cukorkák|Nyalókák", +"amenity-vending_machine-excrement_bags": "kutyaürülék-zacskó|zacskó|tasak|ürülék", +"amenity-parcel_locker|@category_post": "4Csomagszekrény", +"amenity-vending_machine-fuel|@category_fuel": "Üzemanyag-adagoló|Benzinkút", +"shop-second_hand|@category_shopping|@shop|@category_secondhand": "Bolhapiac", +"tourism-theme_park|@category_tourism|@category_children": "Vidámpark", +"shop-fabric|@shop": "Szövet|vászon|szőttes", +"highway-elevator": "Lift" } diff --git a/data/categories-strings/nb.json/localize.json b/data/categories-strings/nb.json/localize.json index ec71ba7a1..44e4a9db8 100644 --- a/data/categories-strings/nb.json/localize.json +++ b/data/categories-strings/nb.json/localize.json @@ -443,5 +443,6 @@ "shop-fashion_accessories|@shop": "Motetilbehør", "shop-carpet|@shop": "Tepper", "shop-pasta|@shop": "Pasta", -"amenity-luggage_locker": "Bagasjeskap" +"amenity-luggage_locker": "Bagasjeskap", +"amenity-bank|@category_bank": "penger" } diff --git a/data/categories-strings/nl.json/localize.json b/data/categories-strings/nl.json/localize.json index c0c6d0b23..e782a0958 100644 --- a/data/categories-strings/nl.json/localize.json +++ b/data/categories-strings/nl.json/localize.json @@ -100,7 +100,7 @@ "historic-memorial-plaque": "Gedenkplaat", "historic-memorial-sculpture|@category_tourism": "Sculptuur", "historic-memorial-statue|@category_tourism": "Standbeeld", -"historic-memorial-stolperstein": "Stolperstein", +"historic-memorial-stolperstein": "Struikelsteen|Struikelsteentje", "historic-memorial-war_memorial|@category_tourism": "Oorlogsmonument", "historic-monument|@category_tourism": "4Monument|attractie", "historic-pillory|@category_tourism": "Schandpaal", @@ -307,7 +307,7 @@ "man_made-communications_tower|man_made-tower-communication": "Communicatietoren|Telefoniemast|mast", "man_made-petroleum_well": "4Oliebron", "organic-only|organic-yes": "4Organisch|bio|biologisch|eco|ecologisch|gezond", -"shop-copyshop": "4Copy shop|Kopieerwinkel|printer|4drukker", +"shop-copyshop": "4Kopieerwinkel|Kopieerwinkel|4afdrukken|4kopiëren", "shop-photo|@shop": "4Fotowinkel|foto|lijsten", "shop-camera|@shop": "Camerawinkel", "shop-travel_agency": "Reisbureau|reisagentschap|reizen", @@ -348,30 +348,30 @@ "shop-charity|@shop|@category_secondhand": "Kringloopwinkel", "shop-ticket": "Kaartverkoop|Kaartjesverkoop|kaartjes", "shop-wine|@category_food|@shop": "Slijterij|Wijn", -"shop-car_parts|@shop": "Auto onderdelen", +"shop-car_parts|@shop": "Auto-onderdelen", "tourism-chalet|@category_hotel": "Vakantiehuis", "tourism-information-board": "Informatiebord", "tourism-information-map": "Toeristische kaart|toeristenkaart", -"aerialway-station": "Kabelwagenstation", -"aeroway-helipad": "Heliplatform|helikopterplatform|helipad", +"aerialway-station": "Gondelstation|Kabelwagenstation", +"aeroway-helipad": "Heliplatform|helikopterplatform", "barrier-border_control": "Grenscontrole", -"leisure-water_park|@category_tourism|@category_children": "5Waterpark", +"leisure-water_park|@category_tourism|@category_children": "5Waterpretpark", "man_made-water_tower": "Watertoren", "man_made-windmill": "Windmolen", "natural-cave_entrance": "Grot", "natural-volcano|@mountain": "4Vulkaan", "office-estate_agent": "Makelaar", -"waterway-lock_gate": "Gesloten poort", +"waterway-lock_gate": "Waterkering", "amenity-public_bookcase": "Boekenkast|Boekuitwisseling", "sport-climbing": "Klimhal", "sport-yoga": "Yogastudio", "tourism-apartment|@category_hotel": "5Appartementen|Appartement", "leisure-resort|@category_hotel": "Resort|Complex", "amenity-biergarten|@category_eat|@category_nightlife": "5Biergarten|Biertuin", -"amenity-driving_school": "Rijschool", +"amenity-driving_school": "Autorijschool", "amenity-music_school": "Muziekschool", "amenity-language_school": "Taalschool", -"amenity-ice_cream": "4Ijskraam|Ijsstand", +"amenity-ice_cream": "4Ijskraam|IJswinkel", "amenity-internet_cafe": "3Internetcafé", "amenity-motorcycle_parking": "4Motorfiets Parkeerplaats|Parking Motorfietsen", "amenity-parking_space-disabled|@category_parking": "Invalide parkeerplaats", @@ -470,5 +470,23 @@ "recycling-cans|@category_recycling": "4Blikrecycling|4Aluminium blikjesrecycling|Blikjes", "recycling-shoes|@category_recycling": "4Recycling van schoenen|Schoenenrecycling|Schoendonatie|schoenen", "highway-elevator": "Lift|Elevator", -"natural-saddle|mountain_pass": "4Doorgang|Pas" +"natural-saddle|mountain_pass": "4Doorgang|Pas", +"amenity-animal_shelter": "Dierenopvang|dierenasiel", +"amenity-charging_station-motorcar|@charging_station": "4Autolaadstation", +"amenity-vending_machine-condoms": "4Condoomsmachine|Condooms", +"amenity-vending_machine-food|@category_food": "4Snoepmachine|Snoep|Snacks", +"amenity-vending_machine-newspapers": "4Krantenmachine|Kranten", +"amenity-vending_machine-sweets": "4Snoepmachine|Snoep", +"amenity-vending_machine-excrement_bags": "5Uitwerpselenzakjes|4Poepzakjes|3Hondenpoepzakjes|Dierenafval", +"amenity-vending_machine-fuel|@category_fuel": "Brandstofpomp", +"man_made-chimney": "Schoorsteen", +"man_made-crane": "Hijskraan", +"leisure-marina": "5Jachthaven", +"amenity-vending_machine-coffee": "4Koffieautomaat|Koffie", +"attraction-amusement_ride|attraction-carousel|attraction-roller_coaster|attraction-maze|attraction-historic|attraction-big_wheel|attraction-bumper_car|@category_children": "Attractie|Doolhof", +"shop-money_lender": "Pandjeswinkel", +"shop-lighting|@shop": "4Verlichting|Verlichtingsarmaturen|4Lampen", +"amenity-food_court": "Voedselplein", +"office-security": "4Beveiligingskantoor", +"building-guardhouse": "4Wacht" } diff --git a/data/categories-strings/pt-BR.json/localize.json b/data/categories-strings/pt-BR.json/localize.json index f1230407b..7b9cfe102 100644 --- a/data/categories-strings/pt-BR.json/localize.json +++ b/data/categories-strings/pt-BR.json/localize.json @@ -404,5 +404,9 @@ "shop-cannabis|@shop": "Cannabis|Maconha|Marijuana|THX|Haxixe|CBD", "shop-farm|@category_food|@shop": "Quitanda|Granja", "shop-grocery|@category_food|@shop": "Loja de comida|Armazém|Não-perecível", -"shop-health_food|@category_food|@shop": "Alimentos saudáveis|Saudável" +"shop-health_food|@category_food|@shop": "Alimentos saudáveis|Saudável", +"shop-hearing_aids|@shop": "Aparelhos Auditivos", +"railway-station-funicular": "Funicular", +"historic-citywalls|@category_tourism": "Muralha da Cidade", +"historic-fort|@category_tourism": "Fortaleza" } diff --git a/data/countries-strings/ar.json/localize.json b/data/countries-strings/ar.json/localize.json index e9922a550..386fdd27f 100644 --- a/data/countries-strings/ar.json/localize.json +++ b/data/countries-strings/ar.json/localize.json @@ -68,8 +68,8 @@ "Bermuda":"جزر برمودا", "Bhutan":"بوتان", "Bolivia":"بوليفيا", -"Bolivia_North":"بوليفيا – الشمال", -"Bolivia_South":"بوليفيا – الجنوب", +"Bolivia_North":"بوليفيا - الشمال", +"Bolivia_South":"بوليفيا - الجنوب", "Bosnia and Herzegovina":"البوسنة والهرسك", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"مقاطعة بركو", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"اتحاد البوسنة والهرسك", @@ -80,7 +80,7 @@ "Brazil_Goias":"غوياس", "Brazil_Mato Grosso":"ماتو غروسو", "Brazil_Mato Grosso Do Sul":"ماتو غروسو دو سول", -"Brazil_North Region":"المنطقة الشمالية – البرازيل", +"Brazil_North Region":"المنطقة الشمالية - البرازيل", "Brazil_Northeast Region":"منطقة شمال الشرق", "Brazil_Paraiba":"بارايبا", "Brazil_Parana":"بارانا", @@ -423,8 +423,8 @@ "Germany_North Rhine-Westphalia_Regierungsbezirk Dusseldorf_Dusseldorf":"دوسلدورف — دوسلدورف", "Germany_North Rhine-Westphalia_Regierungsbezirk Dusseldorf_Mulheim":"دوسلدورف — مولهايم", "Germany_North Rhine-Westphalia_Regierungsbezirk Dusseldorf_Wesel":"دوسلدورف — فيزل", -"Germany_North Rhine-Westphalia_Regierungsbezirk Koln_Aachen":"منطقة حكومة كولونيا – آخن", -"Germany_North Rhine-Westphalia_Regierungsbezirk Koln_Koln":"منطقة حكومة كولونيا – كولونيا", +"Germany_North Rhine-Westphalia_Regierungsbezirk Koln_Aachen":"منطقة حكومة كولونيا - آخن", +"Germany_North Rhine-Westphalia_Regierungsbezirk Koln_Koln":"منطقة حكومة كولونيا - كولونيا", "Germany_North Rhine-Westphalia_Regierungsbezirk Munster_Munster":"مونستر — مونستر", "Germany_North Rhine-Westphalia_Regierungsbezirk Munster_Recklinghausen":"مونستر — رايكلنغوسن", "Germany_Rhineland-Palatinate_Koblenz":"راينلند بالاتينات — كوبلنس", @@ -729,7 +729,7 @@ "New Zealand North_Auckland":"شمال — أوكلاند", "New Zealand North_Wellington":"شمال — ويلينغتون", "New Zealand South_Canterbury":"جنوب -منطقة كانتربري", -"New Zealand South_Southland":"الجنوب – منطقة ساوثلاند", +"New Zealand South_Southland":"الجنوب - منطقة ساوثلاند", "Nicaragua":"نيكاراجوا", "Niger":"النيجر", "Nigeria":"نيجيريا", @@ -942,10 +942,10 @@ "Spain_Cantabria":"منطقة كانتابريا", "Spain_Castile and Leon":"منطقة قـشتالة وليون", "Spain_Castile-La Mancha":"منطقة كاستيا لا مانتشا", -"Spain_Catalonia_Provincia de Barcelona":"كاتالونيا – برشلونة", -"Spain_Catalonia_Provincia de Girona":"كاتالونيا – جرندة", -"Spain_Catalonia_Provincia de Lleida":"كاتالونيا – لاردة", -"Spain_Catalonia_Provincia de Tarragona":"كاتالونيا – طراغونة", +"Spain_Catalonia_Provincia de Barcelona":"كاتالونيا - برشلونة", +"Spain_Catalonia_Provincia de Girona":"كاتالونيا - جرندة", +"Spain_Catalonia_Provincia de Lleida":"كاتالونيا - لاردة", +"Spain_Catalonia_Provincia de Tarragona":"كاتالونيا - طراغونة", "Spain_Ceuta":"سبتة", "Spain_Community of Madrid":"منطقة مدريد", "Spain_Comunidad Foral de Navarra":"منطقة نافارا", @@ -1009,8 +1009,8 @@ "UK_England_North East England":"شمال شرق إنجلترا", "UK_England_North West England":"شمال غرب إنجلترا", "UK_England_South East_Brighton":"جنوب شرق إنجلترا - برايتون", -"UK_England_South East_Oxford":"جنوب شرق إنجلترا – أكسفورد", -"UK_England_South West England_Bristol":"جنوب غرب انجلترا – بريستول", +"UK_England_South East_Oxford":"جنوب شرق إنجلترا - أكسفورد", +"UK_England_South West England_Bristol":"جنوب غرب انجلترا - بريستول", "UK_England_South West England_Cornwall":"مقاطعة كورنوال -جنوب غرب انجلترا", "UK_England_West Midlands":"منطقة ميدلاند الغربية", "UK_England_Yorkshire and the Humber":"يوركشاير وهامبر", @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"كاثماندو, كاثماندو", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/ast.json/localize.json b/data/countries-strings/ast.json/localize.json index fbff3d28c..7616b25d7 100644 --- a/data/countries-strings/ast.json/localize.json +++ b/data/countries-strings/ast.json/localize.json @@ -82,43 +82,43 @@ "US_Delaware":"Delaware", "US_Florida_Miami":"Miami", "US_Pennsylvania_Reading":"Llectura", -"Nauru":"nauru", +"Nauru":"Nauru", "Tokelau Description":"Tokeláu", -"Abkhazia":"abkhazianu", +"Abkhazia":"Abkhazianu", "Bolivia":"Boliviana", -"Croatia":"croata", -"Estonia":"estoniu", +"Croatia":"Croata", +"Estonia":"Estoniu", "Indiana":"India", -"Indonesia":"indonesiu", -"Latvia":"letón", -"Romania":"rumanu", -"Spain_Extremadura":"estremeñu", -"Spain_Galicia_North Short":"gallegu", -"Spain_Galicia_South Short":"gallegu", +"Indonesia":"Indonesiu", +"Latvia":"Letón", +"Romania":"Rumanu", +"Spain_Extremadura":"Estremeñu", +"Spain_Galicia_North Short":"Gallegu", +"Spain_Galicia_South Short":"Gallegu", "Canada_Ontario_Bame":"Barrier", -"Germany":"alemán", -"Germany_Free State of Bavaria":"bávaru", +"Germany":"Alemán", +"Germany_Free State of Bavaria":"Bávaru", "Germany_Free State of Bavaria_Swabia":"Swabian", "India_Chhattisgarh":"Chhattisgarhi", -"India_Gujarat":"guyaratí", -"Italy_Sardinia":"sardu", -"Slovenia":"eslovenu", -"Somalia":"somalín", -"Georgia":"xeorxanu", +"India_Gujarat":"Guyaratí", +"Italy_Sardinia":"Sardu", +"Slovenia":"Eslovenu", +"Somalia":"Somalín", +"Georgia":"Xeorxanu", "Pakistan":"Paquistanina", -"France_Corsica":"corsu", -"Georgia Region":"xeorxanu", -"India_Manipur":"manipuri", -"India_Punjab":"punyabí", +"France_Corsica":"Corsu", +"Georgia Region":"Xeorxanu", +"India_Manipur":"Manipuri", +"India_Punjab":"Punyabí", "India_Rajasthan":"Rajasthani", "Italy_Liguria":"Ligurian", "Italy_Lombardy":"Lombard", -"Lithuania":"lituanu", +"Lithuania":"Lituanu", "Malaysia":"Malasia", -"Serbia":"serbiu", -"Spain_Galicia":"gallegu", -"US_Georgia":"xeorxanu", -"Luxembourg":"luxemburgués", +"Serbia":"Serbiu", +"Spain_Galicia":"Gallegu", +"US_Georgia":"Xeorxanu", +"Luxembourg":"Luxemburgués", "Austria_Lower Austria_West Description":"Mostviertel, Waldviertel", "Argentina_Patagonia":"Patagonia", "Belarus_Maglieu Region":"Provincia de Maguilov", diff --git a/data/countries-strings/az.json/localize.json b/data/countries-strings/az.json/localize.json index d1d08575f..5be9a163c 100644 --- a/data/countries-strings/az.json/localize.json +++ b/data/countries-strings/az.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Katmandu", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/be.json/localize.json b/data/countries-strings/be.json/localize.json index eb6fc3111..f6f8a408f 100644 --- a/data/countries-strings/be.json/localize.json +++ b/data/countries-strings/be.json/localize.json @@ -68,7 +68,7 @@ "Bermuda":"Бермуды", "Bhutan":"Бутан", "Bolivia":"Балівія", -"Bolivia_North":"Балівія – Поўнач", +"Bolivia_North":"Балівія - Поўнач", "Bolivia_South":"Балівія - Поўдзень", "Bosnia and Herzegovina":"Боснія і Герцагавіна", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"Акруга Брчко", @@ -942,10 +942,10 @@ "Spain_Cantabria":"Cantabria", "Spain_Castile and Leon":"Castile and León", "Spain_Castile-La Mancha":"Castile-La Mancha", -"Spain_Catalonia_Provincia de Barcelona":"Каталонія – правінцыя Барселона", -"Spain_Catalonia_Provincia de Girona":"Каталонія – правінцыя Жирона", -"Spain_Catalonia_Provincia de Lleida":"Каталонія – правінцыя Лерыда", -"Spain_Catalonia_Provincia de Tarragona":"Каталонія – правінцыя Таррагона", +"Spain_Catalonia_Provincia de Barcelona":"Каталонія - правінцыя Барселона", +"Spain_Catalonia_Provincia de Girona":"Каталонія - правінцыя Жирона", +"Spain_Catalonia_Provincia de Lleida":"Каталонія - правінцыя Лерыда", +"Spain_Catalonia_Provincia de Tarragona":"Каталонія - правінцыя Таррагона", "Spain_Ceuta":"Ceuta", "Spain_Community of Madrid":"Community of Madrid", "Spain_Comunidad Foral de Navarra":"Navarre", @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Kathmandu, Kathmandu, Patan", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/ca.json/localize.json b/data/countries-strings/ca.json/localize.json index e98fcff45..f4d25a317 100644 --- a/data/countries-strings/ca.json/localize.json +++ b/data/countries-strings/ca.json/localize.json @@ -68,8 +68,8 @@ "Bermuda":"Bermuda", "Bhutan":"Bhutan", "Bolivia":"Bolívia", -"Bolivia_North":"Bolívia – nord", -"Bolivia_South":"Bolívia – sud", +"Bolivia_North":"Bolívia - nord", +"Bolivia_South":"Bolívia - sud", "Bosnia and Herzegovina":"Bòsnia i Hercegovina", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"Districte Brčko", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"Federació de Bòsnia i Hercegovina", @@ -942,10 +942,10 @@ "Spain_Cantabria":"Cantàbria", "Spain_Castile and Leon":"Castella i Lleó", "Spain_Castile-La Mancha":"Castella-la Manxa", -"Spain_Catalonia_Provincia de Barcelona":"Catalunya – Barcelona", -"Spain_Catalonia_Provincia de Girona":"Catalunya – Girona", -"Spain_Catalonia_Provincia de Lleida":"Catalunya – Lleida", -"Spain_Catalonia_Provincia de Tarragona":"Catalunya – Tarragona", +"Spain_Catalonia_Provincia de Barcelona":"Catalunya - Barcelona", +"Spain_Catalonia_Provincia de Girona":"Catalunya - Girona", +"Spain_Catalonia_Provincia de Lleida":"Catalunya - Lleida", +"Spain_Catalonia_Provincia de Tarragona":"Catalunya - Tarragona", "Spain_Ceuta":"Ceuta", "Spain_Community of Madrid":"Comunitat de Madrid", "Spain_Comunidad Foral de Navarra":"Navarra", @@ -1230,8 +1230,8 @@ "India_Karnataka_North":"Karnataka — nord", "India_Karnataka_South":"Karnataka — sud", "Iran_East":"Iran — est", -"Iraq_North":"nord de l'Iraq", -"Iraq_South":"centre i sud de l'Iraq", +"Iraq_North":"Nord de l'Iraq", +"Iraq_South":"Centre i sud de l'Iraq", "Japan_Chubu Region_Aichi_Nagoya":"Aichi — Nagoya", "Japan_Chubu Region_Aichi_Toyohashi":"Aichi — Toyohashi", "Japan_Hokkaido Region_Sapporo":"Sapporo", diff --git a/data/countries-strings/cs.json/localize.json b/data/countries-strings/cs.json/localize.json index 3af78356c..51165ec11 100644 --- a/data/countries-strings/cs.json/localize.json +++ b/data/countries-strings/cs.json/localize.json @@ -68,8 +68,8 @@ "Bermuda":"Bermudy", "Bhutan":"Bhútán", "Bolivia":"Bolívie", -"Bolivia_North":"Bolívie – Sever", -"Bolivia_South":"Bolívie – Jih", +"Bolivia_North":"Bolívie - Sever", +"Bolivia_South":"Bolívie - Jih", "Bosnia and Herzegovina":"Bosna a Hercegovina", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"Brčko", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"Federace Bosny a Hercegoviny", @@ -942,10 +942,10 @@ "Spain_Cantabria":"Kantábrie", "Spain_Castile and Leon":"Kastilie a León", "Spain_Castile-La Mancha":"Kastilie-La Mancha", -"Spain_Catalonia_Provincia de Barcelona":"Katalánsko – Provincie Barcelona", -"Spain_Catalonia_Provincia de Girona":"Katalánsko – Provincie Girona", -"Spain_Catalonia_Provincia de Lleida":"Katalánsko – Provincie Lleida", -"Spain_Catalonia_Provincia de Tarragona":"Katalánsko – Provincie Tarragona", +"Spain_Catalonia_Provincia de Barcelona":"Katalánsko - Provincie Barcelona", +"Spain_Catalonia_Provincia de Girona":"Katalánsko - Provincie Girona", +"Spain_Catalonia_Provincia de Lleida":"Katalánsko - Provincie Lleida", +"Spain_Catalonia_Provincia de Tarragona":"Katalánsko - Provincie Tarragona", "Spain_Ceuta":"Ceuta", "Spain_Community of Madrid":"Madrid", "Spain_Comunidad Foral de Navarra":"Navarra", diff --git a/data/countries-strings/da.json/localize.json b/data/countries-strings/da.json/localize.json index e9d4c7e67..bc2b61ba1 100644 --- a/data/countries-strings/da.json/localize.json +++ b/data/countries-strings/da.json/localize.json @@ -68,8 +68,8 @@ "Bermuda":"Bermuda", "Bhutan":"Bhutan", "Bolivia":"Bolivia", -"Bolivia_North":"Bolivia – Nord", -"Bolivia_South":"Bolivia – Syd", +"Bolivia_North":"Bolivia - Nord", +"Bolivia_South":"Bolivia - Syd", "Bosnia and Herzegovina":"Bosnien-Hercegovina", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"Brčko", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"Føderationen Bosnien og Hercegovina", @@ -942,10 +942,10 @@ "Spain_Cantabria":"Kantabrien", "Spain_Castile and Leon":"Castilla y León", "Spain_Castile-La Mancha":"Castilla-La Mancha", -"Spain_Catalonia_Provincia de Barcelona":"Catalonien – Barcelona", -"Spain_Catalonia_Provincia de Girona":"Catalonien – Girona", -"Spain_Catalonia_Provincia de Lleida":"Catalonien – Lleida", -"Spain_Catalonia_Provincia de Tarragona":"Catalonien – Tarragona", +"Spain_Catalonia_Provincia de Barcelona":"Catalonien - Barcelona", +"Spain_Catalonia_Provincia de Girona":"Catalonien - Girona", +"Spain_Catalonia_Provincia de Lleida":"Catalonien - Lleida", +"Spain_Catalonia_Provincia de Tarragona":"Catalonien - Tarragona", "Spain_Ceuta":"Ceuta", "Spain_Community of Madrid":"Madrid", "Spain_Comunidad Foral de Navarra":"Navarra", diff --git a/data/countries-strings/de.json/localize.json b/data/countries-strings/de.json/localize.json index 55eff9c9d..601958741 100644 --- a/data/countries-strings/de.json/localize.json +++ b/data/countries-strings/de.json/localize.json @@ -68,8 +68,8 @@ "Bermuda":"Bermuda", "Bhutan":"Bhutan", "Bolivia":"Bolivien", -"Bolivia_North":"Bolivien – Norden", -"Bolivia_South":"Bolivien – Süden", +"Bolivia_North":"Bolivien - Norden", +"Bolivia_South":"Bolivien - Süden", "Bosnia and Herzegovina":"Bosnien und Herzegowina", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"Distrikt Brčko", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"Föderation Bosnien und Herzegowina", @@ -942,10 +942,10 @@ "Spain_Cantabria":"Kantabrien", "Spain_Castile and Leon":"Kastilien und León", "Spain_Castile-La Mancha":"Kastilien-La Mancha", -"Spain_Catalonia_Provincia de Barcelona":"Katalonien – Provinz Barcelona", -"Spain_Catalonia_Provincia de Girona":"Katalonien – Provinz Girona", -"Spain_Catalonia_Provincia de Lleida":"Katalonien – Provinz Lleida", -"Spain_Catalonia_Provincia de Tarragona":"Katalonien – Provinz Tarragona", +"Spain_Catalonia_Provincia de Barcelona":"Katalonien - Provinz Barcelona", +"Spain_Catalonia_Provincia de Girona":"Katalonien - Provinz Girona", +"Spain_Catalonia_Provincia de Lleida":"Katalonien - Provinz Lleida", +"Spain_Catalonia_Provincia de Tarragona":"Katalonien - Provinz Tarragona", "Spain_Ceuta":"Ceuta", "Spain_Community of Madrid":"Autonome Gemeinschaft Madrid", "Spain_Comunidad Foral de Navarra":"Navarra", diff --git a/data/countries-strings/el.json/localize.json b/data/countries-strings/el.json/localize.json index b82f109a4..81221e601 100644 --- a/data/countries-strings/el.json/localize.json +++ b/data/countries-strings/el.json/localize.json @@ -68,8 +68,8 @@ "Bermuda":"Βερμούδες", "Bhutan":"Μπουτάν", "Bolivia":"Βολιβία", -"Bolivia_North":"Βολιβία – Βορράς", -"Bolivia_South":"Βολιβία – Νότος", +"Bolivia_North":"Βολιβία - Βορράς", +"Bolivia_South":"Βολιβία - Νότος", "Bosnia and Herzegovina":"Βοσνία Ερζεγοβίνη", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"Περιοχή Μπρισκο", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"Ομοσπονδία της Βοσνίας και Ερζεγοβίνης", @@ -389,7 +389,7 @@ "Germany_Baden-Wurttemberg":"Βάδη-Βυρτεμβέργη", "Germany_Baden-Wurttemberg_Regierungsbezirk Freiburg":"Φράιμπουργκ ιμ Μπράισγκαου", "Germany_Baden-Wurttemberg_Regierungsbezirk Karlsruhe":"Καρλσρούη", -"Germany_Baden-Wurttemberg_Regierungsbezirk Stuttgart_Heilbronn":"Στουτγάρδη – Χέιλμπρον", +"Germany_Baden-Wurttemberg_Regierungsbezirk Stuttgart_Heilbronn":"Στουτγάρδη - Χέιλμπρον", "Germany_Baden-Wurttemberg_Regierungsbezirk Stuttgart_Stuttgart":"Στουτγκάρδη - Στουτγκάρδη", "Germany_Baden-Wurttemberg_Regierungsbezirk Tubingen":"Τούμπινγκεν", "Germany_Berlin":"Βερολίνο", @@ -942,10 +942,10 @@ "Spain_Cantabria":"Κανταβρία", "Spain_Castile and Leon":"Καστίλλη και Λεόν", "Spain_Castile-La Mancha":"Καστίλη - Λα Μάντσα", -"Spain_Catalonia_Provincia de Barcelona":"Καταλονία – Επαρχία της Βαρκελώνης", -"Spain_Catalonia_Provincia de Girona":"Καταλονία – Επαρχία της Γκιρόνα", -"Spain_Catalonia_Provincia de Lleida":"Καταλονία – Επαρχία Λέιντα", -"Spain_Catalonia_Provincia de Tarragona":"Καταλονία – Επαρχία Ταραγόνα", +"Spain_Catalonia_Provincia de Barcelona":"Καταλονία - Επαρχία της Βαρκελώνης", +"Spain_Catalonia_Provincia de Girona":"Καταλονία - Επαρχία της Γκιρόνα", +"Spain_Catalonia_Provincia de Lleida":"Καταλονία - Επαρχία Λέιντα", +"Spain_Catalonia_Provincia de Tarragona":"Καταλονία - Επαρχία Ταραγόνα", "Spain_Ceuta":"Θέουτα", "Spain_Community of Madrid":"Κοινότητα της Μαδρίτης", "Spain_Comunidad Foral de Navarra":"Ναβάρρα", @@ -1008,7 +1008,7 @@ "UK_England_Greater London":"Ευρύτερο Λονδίνο", "UK_England_North East England":"Βόρεια Ανατολική Αγγλία", "UK_England_North West England":"Βορειοδυτική Αγγλία", -"UK_England_South East_Brighton":"Νότια ανατολική Αγγλία – Μπράιτον", +"UK_England_South East_Brighton":"Νότια ανατολική Αγγλία - Μπράιτον", "UK_England_South East_Oxford":"Νότια Ανατολική Αγγλίας — Όξφορντ", "UK_England_South West England_Bristol":"Νοτιοδυτική Αγγλία — Μπρίστολ", "UK_England_South West England_Cornwall":"Νοτιοδυτική Αγγλία - Κορνουάλη", @@ -1197,7 +1197,7 @@ "Australia_Sydney":"Σίδνεϊ", "Austria_Styria_Graz":"Στυρία - Γκρατς", "Austria_Styria_Leoben":"Στυρία — Λεόμπεν", -"Austria_Upper Austria_Linz":"Άνω Αυστρία – Λινζ", +"Austria_Upper Austria_Linz":"Άνω Αυστρία - Λινζ", "Austria_Upper Austria_Wels":"Άνω Αυστρία — Βελς", "Brazil_Goias_Brasilia":"Γκόιας - Μπραζίλια", "Brazil_Goias_North":"Γκόιας - Βόρεια", @@ -1286,7 +1286,7 @@ "Taiwan_North":"Ταϊβάν - Βόρειο", "Taiwan_South":"Ταϊβάν — Νότιο", "Thailand_Central":"Ταϊλάνδη - κέντρο", -"Turkey_Central Anatolia Region_Ankara":"Κεντρική Ανατολία – Άγκυρα", +"Turkey_Central Anatolia Region_Ankara":"Κεντρική Ανατολία - Άγκυρα", "Turkey_Central Anatolia Region_Kayseri":"Κεντρική Ανατολία — Καυσέρι", "Turkey_Marmara Region_Bursa":"Περιοχή Μαρμαρά - Μπούρσα", "Turkey_Marmara Region_Istanbul":"Περιοχή Μαρμαρά - Κωνσταντινούπολη", diff --git a/data/countries-strings/es.json/localize.json b/data/countries-strings/es.json/localize.json index 38381935f..898debadc 100644 --- a/data/countries-strings/es.json/localize.json +++ b/data/countries-strings/es.json/localize.json @@ -834,7 +834,7 @@ "Russia_Krasnodar Krai_Adygeya":"Krai de Krasnodar, Adigueya", "Russia_Krasnoyarsk Krai":"Krasnoyarsk", "Russia_Kurgan Oblast":"Kurgán", -"Russia_Kursk Oblast":"óblast de Kursk", +"Russia_Kursk Oblast":"Óblast de Kursk", "Russia_Leningradskaya Oblast_Karelsky":"Óblast de Leningrado — Norte", "Russia_Leningradskaya Oblast_Southeast":"Óblast de Leningrado — Sur", "Russia_Lipetsk Oblast":"Óblast de Lípetsk", @@ -942,10 +942,10 @@ "Spain_Cantabria":"Cantabria", "Spain_Castile and Leon":"Castilla y León", "Spain_Castile-La Mancha":"Castilla-La Mancha", -"Spain_Catalonia_Provincia de Barcelona":"Cataluña – Provincia de Barcelona", -"Spain_Catalonia_Provincia de Girona":"Cataluña – Provincia de Gerona", -"Spain_Catalonia_Provincia de Lleida":"Cataluña – Provincia de Lérida", -"Spain_Catalonia_Provincia de Tarragona":"Cataluña – Provincia de Tarragona", +"Spain_Catalonia_Provincia de Barcelona":"Cataluña - Provincia de Barcelona", +"Spain_Catalonia_Provincia de Girona":"Cataluña - Provincia de Gerona", +"Spain_Catalonia_Provincia de Lleida":"Cataluña - Provincia de Lérida", +"Spain_Catalonia_Provincia de Tarragona":"Cataluña - Provincia de Tarragona", "Spain_Ceuta":"Ceuta", "Spain_Community of Madrid":"Comunidad de Madrid", "Spain_Comunidad Foral de Navarra":"Navarra", @@ -1245,7 +1245,7 @@ "Mexico_Sonora":"Sonora", "Nepal_Kathmandu":"Katmandú", "Nepal_Madhyamanchal":"Región Central", -"Nepal_Purwanchal":"región de desarrollo Este", +"Nepal_Purwanchal":"Región de desarrollo Este", "Nigeria_North":"Nigeria — Norte", "Nigeria_South":"Nigeria — Sur", "Norway_Hordaland":"Hordaland", diff --git a/data/countries-strings/et.json/localize.json b/data/countries-strings/et.json/localize.json index 769239cc1..d6df38453 100644 --- a/data/countries-strings/et.json/localize.json +++ b/data/countries-strings/et.json/localize.json @@ -427,8 +427,8 @@ "Germany_North Rhine-Westphalia_Regierungsbezirk Koln_Koln":"Köln — Köln", "Germany_North Rhine-Westphalia_Regierungsbezirk Munster_Munster":"Münsteri ringkond — Münster", "Germany_North Rhine-Westphalia_Regierungsbezirk Munster_Recklinghausen":"Münsteri ringkond — Recklinghausen", -"Germany_Rhineland-Palatinate_Koblenz":"Rheinland-Pfalz – Koblenz", -"Germany_Rhineland-Palatinate_South":"Rheinland-Pfalz – Mainz", +"Germany_Rhineland-Palatinate_Koblenz":"Rheinland-Pfalz - Koblenz", +"Germany_Rhineland-Palatinate_South":"Rheinland-Pfalz - Mainz", "Germany_Saarland":"Saarland", "Germany_Saxony-Anhalt":"Saksimaa-Anhalt", "Germany_Saxony_Dresden":"Saksimaa - Dresden", @@ -534,7 +534,7 @@ "Italy_Emilia-Romagna_Ravenna":"Ravenna maakond", "Italy_Emilia-Romagna_Reggio Emilia":"Reggio Emilia maakond", "Italy_Emilia-Romagna_Rimini":"Rimini maakond", -"Italy_Friuli":"Friuli–Venezia Giulia", +"Italy_Friuli":"Friuli-Venezia Giulia", "Italy_Friuli-Venezia Giulia_Gorizia":"Gorizia maakond", "Italy_Friuli-Venezia Giulia_Pordenone":"Pordenone maakond", "Italy_Friuli-Venezia Giulia_Trieste":"Trieste maakond", @@ -941,11 +941,11 @@ "Spain_Canary Islands":"Kanaari saared", "Spain_Cantabria":"Kantaabria", "Spain_Castile and Leon":"Kastiilia ja León", -"Spain_Castile-La Mancha":"Kastiilia – La Mancha", -"Spain_Catalonia_Provincia de Barcelona":"Kataloonia – Barcelona maakond", -"Spain_Catalonia_Provincia de Girona":"Kataloonia – Girona maakond", -"Spain_Catalonia_Provincia de Lleida":"Kataloonia – Lleida maakond", -"Spain_Catalonia_Provincia de Tarragona":"Kataloonia – Tarragona maakond", +"Spain_Castile-La Mancha":"Kastiilia - La Mancha", +"Spain_Catalonia_Provincia de Barcelona":"Kataloonia - Barcelona maakond", +"Spain_Catalonia_Provincia de Girona":"Kataloonia - Girona maakond", +"Spain_Catalonia_Provincia de Lleida":"Kataloonia - Lleida maakond", +"Spain_Catalonia_Provincia de Tarragona":"Kataloonia - Tarragona maakond", "Spain_Ceuta":"Ceuta", "Spain_Community of Madrid":"Madridi kogukond", "Spain_Comunidad Foral de Navarra":"Navarra", @@ -1195,8 +1195,8 @@ "Argentina_Santa Fe":"Santa Fe maakond", "Australia_Brisbane":"Brisbane", "Australia_Sydney":"Sydney", -"Austria_Styria_Graz":"Steiermark – Graz", -"Austria_Styria_Leoben":"Steiermark – Leoben", +"Austria_Styria_Graz":"Steiermark - Graz", +"Austria_Styria_Leoben":"Steiermark - Leoben", "Austria_Upper Austria_Linz":"Ülem-Austria — Linz", "Austria_Upper Austria_Wels":"Ülem-Austria - Wels", "Brazil_Goias_Brasilia":"Goiás — Brasilia", @@ -1274,8 +1274,8 @@ "Slovenia_West":"Sloveenia - Lääs", "Spain_Andalusia_Granada":"Andaluusia - Granada", "Spain_Andalusia_Sevilla":"Andaluusia - Sevilla", -"Spain_Castile and Leon_East":"Kastiilia ja León – Ida", -"Spain_Castile and Leon_West":"Kastiilia ja León – Lääs", +"Spain_Castile and Leon_East":"Kastiilia ja León - Ida", +"Spain_Castile and Leon_West":"Kastiilia ja León - Lääs", "Spain_Galicia_North":"Galicia - Põhi", "Spain_Galicia_South":"Galicia — Lõuna", "Sudan_East":"Sudaan - Ida", @@ -1337,8 +1337,8 @@ "Germany_Schleswig-Holstein_Flensburg":"Schleswig-Holstein — Flensburg", "Germany_Schleswig-Holstein_Kiel":"Schleswig-Holstein — Kiel", "Portugal_Porto":"Porto", -"UK_England_North West England_Lancaster":"Loode-Inglismaa – Lancaster", -"UK_England_North West England_Manchester":"Loode-Inglismaa – Manchester", +"UK_England_North West England_Lancaster":"Loode-Inglismaa - Lancaster", +"UK_England_North West England_Manchester":"Loode-Inglismaa - Manchester", "US_Florida_Gainesville":"Gainesville", "US_Texas_Victoria":"Victoria", "US_Virginia_Norfolk":"Norfolk", @@ -1395,7 +1395,7 @@ "Belarus_Vitebsk Region Description":"Viciebsk, Orša, Navapolatsk", "Belgium_Antwerp Description":"Antwerpen, Zwijndrecht, Berchem", "Belgium_East Flanders Description":"Ghent, Deinze, Sint-Martens-Latem", -"Belgium_Flemish Brabant Description":"Brüssel, Schaerbeek – Schaarbeek, Anderlecht", +"Belgium_Flemish Brabant Description":"Brüssel, Schaerbeek - Schaarbeek, Anderlecht", "Belgium_Hainaut Description":"Mons, Charleroi, La Louvière", "Belgium_Liege Description":"Liège, Seraing, Verviers", "Belgium_Limburg Description":"Houthalen-Helchteren, Maasmechelen, Hasselt", diff --git a/data/countries-strings/eu.json/localize.json b/data/countries-strings/eu.json/localize.json index 28dcdfbda..641b5b587 100644 --- a/data/countries-strings/eu.json/localize.json +++ b/data/countries-strings/eu.json/localize.json @@ -68,8 +68,8 @@ "Bermuda":"Bermudak", "Bhutan":"Bhutan", "Bolivia":"Bolivia", -"Bolivia_North":"Bolivia – North", -"Bolivia_South":"Bolivia – South", +"Bolivia_North":"Bolivia - North", +"Bolivia_South":"Bolivia - South", "Bosnia and Herzegovina":"Bosnia eta Herzegovina", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"Brčko District", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"Federation of Bosnia and Herzegovina", @@ -534,7 +534,7 @@ "Italy_Emilia-Romagna_Ravenna":"Province of Ravenna", "Italy_Emilia-Romagna_Reggio Emilia":"Province of Reggio Emilia", "Italy_Emilia-Romagna_Rimini":"Province of Rimini", -"Italy_Friuli":"Friuli–Venezia Giulia", +"Italy_Friuli":"Friuli-Venezia Giulia", "Italy_Friuli-Venezia Giulia_Gorizia":"Province of Gorizia", "Italy_Friuli-Venezia Giulia_Pordenone":"Province of Pordenone", "Italy_Friuli-Venezia Giulia_Trieste":"Province of Trieste", @@ -942,10 +942,10 @@ "Spain_Cantabria":"Kantabria", "Spain_Castile and Leon":"Gaztela eta Leon", "Spain_Castile-La Mancha":"Gaztela-Mantxa", -"Spain_Catalonia_Provincia de Barcelona":"Katalunia – Bartzelonako probintzia", -"Spain_Catalonia_Provincia de Girona":"Katalunia – Gironako probintzia", -"Spain_Catalonia_Provincia de Lleida":"Katalunia – Lleidako probintzia", -"Spain_Catalonia_Provincia de Tarragona":"Katalunia – Tarragonako probintzia", +"Spain_Catalonia_Provincia de Barcelona":"Katalunia - Bartzelonako probintzia", +"Spain_Catalonia_Provincia de Girona":"Katalunia - Gironako probintzia", +"Spain_Catalonia_Provincia de Lleida":"Katalunia - Lleidako probintzia", +"Spain_Catalonia_Provincia de Tarragona":"Katalunia - Tarragonako probintzia", "Spain_Ceuta":"Ceuta", "Spain_Community of Madrid":"Madrilgo Erkidegoa", "Spain_Comunidad Foral de Navarra":"Nafarroa", @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Kathmandu, Kathmandu, Patan", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/fi.json/localize.json b/data/countries-strings/fi.json/localize.json index f6842793c..7d4b59bdf 100644 --- a/data/countries-strings/fi.json/localize.json +++ b/data/countries-strings/fi.json/localize.json @@ -68,8 +68,8 @@ "Bermuda":"Bermuda", "Bhutan":"Bhutan", "Bolivia":"Bolivia", -"Bolivia_North":"Bolivia – Maan pohjoisosa", -"Bolivia_South":"Bolivia – Maan eteläosa", +"Bolivia_North":"Bolivia - Maan pohjoisosa", +"Bolivia_South":"Bolivia - Maan eteläosa", "Bosnia and Herzegovina":"Bosnia ja Hertsegovina", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"Brčkon alue", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"Bosnia ja Hertsegovinan federaatio", @@ -942,10 +942,10 @@ "Spain_Cantabria":"Kantabria", "Spain_Castile and Leon":"Kastilia ja León", "Spain_Castile-La Mancha":"Kastilia- La Mancha", -"Spain_Catalonia_Provincia de Barcelona":"Katalonia – Barcelona", -"Spain_Catalonia_Provincia de Girona":"Katalonia – Girona", -"Spain_Catalonia_Provincia de Lleida":"Katalonia – leida", -"Spain_Catalonia_Provincia de Tarragona":"Katalonia – Tarragona", +"Spain_Catalonia_Provincia de Barcelona":"Katalonia - Barcelona", +"Spain_Catalonia_Provincia de Girona":"Katalonia - Girona", +"Spain_Catalonia_Provincia de Lleida":"Katalonia - leida", +"Spain_Catalonia_Provincia de Tarragona":"Katalonia - Tarragona", "Spain_Ceuta":"Ceuta", "Spain_Community of Madrid":"Madrid", "Spain_Comunidad Foral de Navarra":"Navarra", diff --git a/data/countries-strings/fr.json/localize.json b/data/countries-strings/fr.json/localize.json index 984c8c27a..02b0e6308 100644 --- a/data/countries-strings/fr.json/localize.json +++ b/data/countries-strings/fr.json/localize.json @@ -68,8 +68,8 @@ "Bermuda":"Bermudes", "Bhutan":"Bhoutan", "Bolivia":"Bolivie", -"Bolivia_North":"Bolivie – Nord", -"Bolivia_South":"Bolivie – Sud", +"Bolivia_North":"Bolivie - Nord", +"Bolivia_South":"Bolivie - Sud", "Bosnia and Herzegovina":"Bosnie-Herzégovine", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"District de Brčko", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"Fédération de Bosnie-et-Herzégovine", @@ -105,7 +105,7 @@ "Cameroon":"Cameroun", "Cameroon_Central":"Cameroun — Centre", "Cameroon_West":"Cameroun — Ouest", -"Campo de Hielo Sur":"champ de glace Sud de Patagonie", +"Campo de Hielo Sur":"Champ de glace Sud de Patagonie", "Canada":"Canada", "Canada_Alberta":"Alberta", "Canada_Alberta_Edmonton":"Edmonton", @@ -261,7 +261,7 @@ "Estonia_East":"Estonie — Est", "Estonia_West":"Estonie — Ouest", "Ethiopia":"Éthiopie", -"Falkland Islands":"îles Malouines", +"Falkland Islands":"Îles Malouines", "Faroe Islands":"Îles Féroé", "Federated States of Micronesia":"États fédérés de Micronésie", "Fiji":"Fidji", @@ -409,7 +409,7 @@ "Germany_Hesse":"Hesse", "Germany_Hesse_Regierungsbezirk Darmstadt":"District de Darmstadt", "Germany_Hesse_Regierungsbezirk Giessen":"District de Giessen", -"Germany_Hesse_Regierungsbezirk Kassel":"district de Cassel", +"Germany_Hesse_Regierungsbezirk Kassel":"District de Cassel", "Germany_Lower Saxony":"Basse-Saxe", "Germany_Lower Saxony_Bremen_Bremen":"Brême", "Germany_Lower Saxony_Bremen_Munster":"Lunebourg", @@ -584,7 +584,7 @@ "Japan_Chubu Region":"Région du Chūbu", "Japan_Chubu Region_Aichi":"Préfecture d’Aichi", "Japan_Chubu Region_Fukui":"Préfecture de Fukui", -"Japan_Chubu Region_Gifu":"préfecture de Gifu", +"Japan_Chubu Region_Gifu":"Préfecture de Gifu", "Japan_Chubu Region_Ishikawa":"Préfecture d’Ishikawa", "Japan_Chubu Region_Nagano":"Préfecture de Nagano", "Japan_Chubu Region_Niigata":"Préfecture de Niigata", @@ -738,7 +738,7 @@ "North Dakota":"Dakota du Nord", "North Korea":"Corée du Nord", "Norway":"Norvège", -"Norway_Bouvet Island":"île Bouvet", +"Norway_Bouvet Island":"Île Bouvet", "Norway_Central":"Oslo", "Norway_Hedmark":"Comté de Hedmark", "Norway_Jan Mayen":"Jan Mayen", @@ -837,7 +837,7 @@ "Russia_Kursk Oblast":"Oblast de Koursk", "Russia_Leningradskaya Oblast_Karelsky":"Oblast de Léningrad — Nord", "Russia_Leningradskaya Oblast_Southeast":"Oblast de Léningrad — Sud", -"Russia_Lipetsk Oblast":"oblast de Lipetsk", +"Russia_Lipetsk Oblast":"Oblast de Lipetsk", "Russia_Magadan Oblast":"Oblast de Magadan", "Russia_Mari El":"République des Maris", "Russia_Moscow":"Moscou", @@ -942,10 +942,10 @@ "Spain_Cantabria":"Cantabrie", "Spain_Castile and Leon":"Castille-et-León", "Spain_Castile-La Mancha":"Castille-La Manche", -"Spain_Catalonia_Provincia de Barcelona":"Catalogne – Province de Barcelone", -"Spain_Catalonia_Provincia de Girona":"Catalogne – Province de Gérone", -"Spain_Catalonia_Provincia de Lleida":"Catalogne – Province de Lérida", -"Spain_Catalonia_Provincia de Tarragona":"Catalogne – Province de Tarragone", +"Spain_Catalonia_Provincia de Barcelona":"Catalogne - Province de Barcelone", +"Spain_Catalonia_Provincia de Girona":"Catalogne - Province de Gérone", +"Spain_Catalonia_Provincia de Lleida":"Catalogne - Province de Lérida", +"Spain_Catalonia_Provincia de Tarragona":"Catalogne - Province de Tarragone", "Spain_Ceuta":"Ceuta", "Spain_Community of Madrid":"Communauté de Madrid", "Spain_Comunidad Foral de Navarra":"Communauté forale de Navarre", @@ -1226,7 +1226,7 @@ "France_Free County_South":"Franche-Comté — Sud", "France_Pays de la Loire_Loire-Atlantique_Nantes":"Loire-Atlantique — Nantes", "France_Pays de la Loire_Loire-Atlantique_Saint-Nazaire":"Loire-Atlantique — Saint-Nazaire", -"Germany_Free State of Bavaria_Upper Bavaria_South":"district de Haute-Bavière — Sud", +"Germany_Free State of Bavaria_Upper Bavaria_South":"District de Haute-Bavière — Sud", "India_Karnataka_North":"Karnataka — Nord", "India_Karnataka_South":"Karnataka — Sud", "Iran_East":"Iran — Est", @@ -1248,8 +1248,8 @@ "Nepal_Purwanchal":"Région de développement Est", "Nigeria_North":"Nigeria — Nord", "Nigeria_South":"Nigeria — Sud", -"Norway_Hordaland":"comté de Hordaland", -"Norway_Nordland":"comté de Nordland", +"Norway_Hordaland":"Comté de Hordaland", +"Norway_Nordland":"Comté de Nordland", "Norway_North Trondelag":"Comté de Nord-Trøndelag", "Norway_Rogaland":"Comté de Rogaland", "Norway_South Trondelag":"Comté de Sør-Trøndelag", diff --git a/data/countries-strings/he.json/localize.json b/data/countries-strings/he.json/localize.json index cbffd1d3f..995a28a5d 100644 --- a/data/countries-strings/he.json/localize.json +++ b/data/countries-strings/he.json/localize.json @@ -68,8 +68,8 @@ "Bermuda":"ברמודה", "Bhutan":"בהוטן", "Bolivia":"בוליביה", -"Bolivia_North":"Bolivia – North", -"Bolivia_South":"Bolivia – South", +"Bolivia_North":"Bolivia - North", +"Bolivia_South":"Bolivia - South", "Bosnia and Herzegovina":"בוסניה והרצגובינה", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"מחוז ברצ'קו", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"הפדרציה של בוסניה והרצגובינה", @@ -942,10 +942,10 @@ "Spain_Cantabria":"קנטבריה", "Spain_Castile and Leon":"קסטיליה ולאון", "Spain_Castile-La Mancha":"קסטיליה-לה מנצ'ה", -"Spain_Catalonia_Provincia de Barcelona":"קטלוניה – מחוז ברצלונה", -"Spain_Catalonia_Provincia de Girona":"קטלוניה – מחוז ז'ירונה", -"Spain_Catalonia_Provincia de Lleida":"קטלוניה – מחוז ג'ירונה", -"Spain_Catalonia_Provincia de Tarragona":"קטלוניה – מחוז טרגונה", +"Spain_Catalonia_Provincia de Barcelona":"קטלוניה - מחוז ברצלונה", +"Spain_Catalonia_Provincia de Girona":"קטלוניה - מחוז ז'ירונה", +"Spain_Catalonia_Provincia de Lleida":"קטלוניה - מחוז ג'ירונה", +"Spain_Catalonia_Provincia de Tarragona":"קטלוניה - מחוז טרגונה", "Spain_Ceuta":"סאוטה", "Spain_Community of Madrid":"מדריד", "Spain_Comunidad Foral de Navarra":"נווארה", @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"קטמנדו, קטמנדו", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/hu.json/localize.json b/data/countries-strings/hu.json/localize.json index 713a6bcc9..57bc43e3b 100644 --- a/data/countries-strings/hu.json/localize.json +++ b/data/countries-strings/hu.json/localize.json @@ -5,15 +5,15 @@ "Albania":"Albánia", "Algeria":"Algéria", "Algeria_Central":"Algéria - Közép", -"Algeria_Coast":"Algéria – észak", +"Algeria_Coast":"Algéria - észak", "Andorra":"Andorra", "Angola":"Angola", "Anguilla":"Anguilla", "Antarctica":"Antarktisz", "Antigua and Barbuda":"Antigua és Barbuda", "Argentina":"Argentína", -"Argentina_Buenos Aires_North":"Buenos Aires tartomány – észak", -"Argentina_Buenos Aires_South":"Buenos Aires tartomány – dél", +"Argentina_Buenos Aires_North":"Buenos Aires tartomány - észak", +"Argentina_Buenos Aires_South":"Buenos Aires tartomány - dél", "Argentina_Cuyo":"Cuyo", "Argentina_Mesopotamia":"Mezopotámia", "Argentina_Northwest":"Északnyugat-Argentína", @@ -33,7 +33,7 @@ "Austria":"Ausztria", "Austria_Burgenland":"Burgenland", "Austria_Carinthia":"Karintia", -"Austria_Lower Austria_West":"Alsó-Ausztria – nyugat", +"Austria_Lower Austria_West":"Alsó-Ausztria - nyugat", "Austria_Lower Austria_Wien":"Bécs és alsó-Ausztria kelet", "Austria_Salzburg":"Salzburg", "Austria_Styria":"Stájerország", @@ -68,8 +68,8 @@ "Bermuda":"Bermuda", "Bhutan":"Bhután", "Bolivia":"Bolívia", -"Bolivia_North":"Bolívia – észak", -"Bolivia_South":"Bolívia – dél", +"Bolivia_North":"Bolívia - észak", +"Bolivia_South":"Bolívia - dél", "Bosnia and Herzegovina":"Bosznia-Hercegovina", "Bosnia and Herzegovina_Brcko district of Bosnia and Herzegowina":"Brčkói körzet", "Bosnia and Herzegovina_Entity Federation of Bosnia and Herzegovina":"Bosznia-hercegovinai Föderáció", @@ -89,7 +89,7 @@ "Brazil_South Region":"Dél-Brazília", "Brazil_Southeast Region_Espirito Santo":"Espírito Santo", "Brazil_Southeast Region_Minas Gerais_Contagem":"Minas Gerais - Contagem", -"Brazil_Southeast Region_Minas Gerais_North":"Minas Gerais – észak", +"Brazil_Southeast Region_Minas Gerais_North":"Minas Gerais - észak", "Brazil_Southeast Region_Rio de Janeiro":"Rio de Janeiro", "Brazil_Southeast Region_Sao Paulo_Campinas":"São Paulo - Campinas", "Brazil_Southeast Region_Sao Paulo_City":"São Paulo - Santos", @@ -104,46 +104,46 @@ "Cambodia":"Kambodzsa", "Cameroon":"Kamerun", "Cameroon_Central":"Kamerun - Közép", -"Cameroon_West":"Kamerun – nyugat", +"Cameroon_West":"Kamerun - nyugat", "Campo de Hielo Sur":"Dél-patagóniai jégmező", "Canada":"Kanada", "Canada_Alberta":"Alberta", "Canada_Alberta_Edmonton":"Edmonton", -"Canada_Alberta_North":"Alberta – észak", -"Canada_Alberta_South":"Alberta – dél", +"Canada_Alberta_North":"Alberta - észak", +"Canada_Alberta_South":"Alberta - dél", "Canada_British Columbia":"Brit Columbia", "Canada_British Columbia_Central":"Brit Columbia - Közép", -"Canada_British Columbia_Far_North":"Brit Columbia – kelet", +"Canada_British Columbia_Far_North":"Brit Columbia - kelet", "Canada_British Columbia_Islands":"Vancouver-sziget", -"Canada_British Columbia_North":"Brit Columbia – nyugat", -"Canada_British Columbia_Northeast":"Brit Columbia – észak", +"Canada_British Columbia_North":"Brit Columbia - nyugat", +"Canada_British Columbia_Northeast":"Brit Columbia - észak", "Canada_British Columbia_Southeast":"Kelowna", "Canada_British Columbia_Vancouver":"Vancouver", "Canada_Labrador":"Labrador", -"Canada_Labrador_North":"Labrador – észak", -"Canada_Labrador_South":"Labrador – dél", -"Canada_Labrador_West":"Labrador – nyugat", +"Canada_Labrador_North":"Labrador - észak", +"Canada_Labrador_South":"Labrador - dél", +"Canada_Labrador_West":"Labrador - nyugat", "Canada_Manitoba":"Manitoba", -"Canada_Manitoba_Northeast":"Manitoba – észak", -"Canada_Manitoba_Northwest":"Manitoba – nyugat", +"Canada_Manitoba_Northeast":"Manitoba - észak", +"Canada_Manitoba_Northwest":"Manitoba - nyugat", "Canada_Manitoba_South":"Brandon", "Canada_Manitoba_Winnipeg":"Winnipeg", "Canada_New Brunswick":"Új-Brunswick", "Canada_Newfoundland":"Új-Fundland", -"Canada_Newfoundland_East":"Új-Fundland – kelet", -"Canada_Newfoundland_North":"Új-Fundland – észak", -"Canada_Newfoundland_South":"Új-Fundland – dél", -"Canada_Newfoundland_West":"Új-Fundland – nyugat", +"Canada_Newfoundland_East":"Új-Fundland - kelet", +"Canada_Newfoundland_North":"Új-Fundland - észak", +"Canada_Newfoundland_South":"Új-Fundland - dél", +"Canada_Newfoundland_West":"Új-Fundland - nyugat", "Canada_Northwest Territories":"Északnyugati területek", -"Canada_Northwest Territories_East":"Északnyugati területek – kelet", -"Canada_Northwest Territories_North":"Északnyugati területek – észak", +"Canada_Northwest Territories_East":"Északnyugati területek - kelet", +"Canada_Northwest Territories_North":"Északnyugati területek - észak", "Canada_Northwest Territories_Yellowknife":"Yellowknife", "Canada_Nova Scotia":"Új-Skócia", "Canada_Nova Scotia_Halifax":"Halifax", "Canada_Nova Scotia_Sydney":"Sydney", "Canada_Nunavut":"Nunavut", -"Canada_Nunavut_North":"Nunavut – észak", -"Canada_Nunavut_South":"Nunavut – dél", +"Canada_Nunavut_North":"Nunavut - észak", +"Canada_Nunavut_South":"Nunavut - dél", "Canada_Ontario":"Ontario", "Canada_Ontario_Bame":"Barrie", "Canada_Ontario_Kingston":"Kingston", @@ -155,12 +155,12 @@ "Canada_Ontario_Northeastern_SW":"Sault Ste. Marie", "Canada_Ontario_Northeastern_Wawa":"Wawa", "Canada_Ontario_Northern":"Thunder Bay", -"Canada_Ontario_Northwestern":"Ontario – észak", +"Canada_Ontario_Northwestern":"Ontario - észak", "Canada_Ontario_Toronto":"Toronto", "Canada_Prince Edward Island":"Prince Edward-sziget", "Canada_Quebec":"Québec", "Canada_Quebec_Quebec":"Québec City", -"Canada_Quebek_Far North":"Québec – észak", +"Canada_Quebek_Far North":"Québec - észak", "Canada_Quebek_Montreal":"Montréal", "Canada_Quebek_North":"Sept-Îles", "Canada_Quebek_Southeast_Rimouski":"Rimouski", @@ -168,10 +168,10 @@ "Canada_Quebek_West_Chibougamau":"Chibougamau", "Canada_Quebek_West_Rouyn-Noranda":"Rouyn-Noranda", "Canada_Saskatchewan":"Saskatchewan", -"Canada_Saskatchewan_North":"Saskatchewan – észak", -"Canada_Saskatchewan_South":"Saskatchewan – dél", +"Canada_Saskatchewan_North":"Saskatchewan - észak", +"Canada_Saskatchewan_South":"Saskatchewan - dél", "Canada_Yukon":"Yukon", -"Canada_Yukon_North":"Yukon – észak", +"Canada_Yukon_North":"Yukon - észak", "Canada_Yukon_Whitehorse":"Whitehorse", "Cape Verde":"Zöld-foki Köztársaság", "Caribees":"Kis-Antillák", @@ -181,8 +181,8 @@ "Central Anatolia Region":"Közép-anatóliai régió", "Chad":"Csád", "Chile":"Chile", -"Chile_North":"Chile – észak", -"Chile_South":"Chile – dél", +"Chile_North":"Chile - észak", +"Chile_South":"Chile - dél", "China_Anhui":"Anhui", "China_Chongqing":"Csungking", "China_Fujian":"Fucsien", @@ -212,9 +212,9 @@ "China_Yunnan":"Jünnan", "China_Zhejiang":"Csöcsiang", "Colombia":"Kolumbia", -"Colombia_East":"Kolumbia – kelet", -"Colombia_North":"Kolumbia – észak", -"Colombia_West":"Kolumbia – nyugat", +"Colombia_East":"Kolumbia - kelet", +"Colombia_North":"Kolumbia - észak", +"Colombia_West":"Kolumbia - nyugat", "Colorado":"Colorado", "Comoros":"Comore-szigetek", "Congo-Brazzaville":"Kongói Köztársaság", @@ -238,8 +238,8 @@ "Czech_Severovychod_Kralovehradecky kraj":"Hradec Králové-i kerület", "Czech_Severovychod_Liberecky kraj":"Libereci kerület", "Czech_Severovychod_Pardubicky kraj":"Pardubicei kerület", -"Czech_Stredni Cechy_East":"Közép-csehországi kerület – kelet", -"Czech_Stredni Cechy_West":"Közép-csehországi kerület – nyugat", +"Czech_Stredni Cechy_East":"Közép-csehországi kerület - kelet", +"Czech_Stredni Cechy_West":"Közép-csehországi kerület - nyugat", "Czech_Ustecky kraj":"Ústí nad Labem-i kerület", "Czech_Zlinsky Kraj":"Zlíni kerület", "Denmark":"Dánia", @@ -258,8 +258,8 @@ "Equatorial Guinea":"Egyenlítői-Guinea", "Eritrea":"Eritrea", "Estonia":"Észtország", -"Estonia_East":"Észtország – kelet", -"Estonia_West":"Észtország – nyugat", +"Estonia_East":"Észtország - kelet", +"Estonia_West":"Észtország - nyugat", "Ethiopia":"Etiópia", "Falkland Islands":"Falkland-szigetek", "Faroe Islands":"Feröer-szigetek", @@ -393,14 +393,14 @@ "Germany_Baden-Wurttemberg_Regierungsbezirk Stuttgart_Stuttgart":"Stuttgart - Stuttgart", "Germany_Baden-Wurttemberg_Regierungsbezirk Tubingen":"Tübingen", "Germany_Berlin":"Berlin", -"Germany_Brandenburg_North":"Brandenburg – észak", -"Germany_Brandenburg_South":"Brandenburg – dél", +"Germany_Brandenburg_North":"Brandenburg - észak", +"Germany_Brandenburg_South":"Brandenburg - dél", "Germany_Free State of Bavaria":"Bajorország", "Germany_Free State of Bavaria_Lower Bavaria":"Alsó-Bajorország", "Germany_Free State of Bavaria_Lower Franconia":"Alsó-Frankföld", "Germany_Free State of Bavaria_Middle Franconia":"Közép-Frankföld", "Germany_Free State of Bavaria_Swabia":"Svábföld", -"Germany_Free State of Bavaria_Upper Bavaria_East":"Felső-Bajorország – kelet", +"Germany_Free State of Bavaria_Upper Bavaria_East":"Felső-Bajorország - kelet", "Germany_Free State of Bavaria_Upper Bavaria_Ingolstadt":"Felső-Bajorország - Ingolstadt", "Germany_Free State of Bavaria_Upper Bavaria_Munchen":"Felső-Bajorország - München", "Germany_Free State of Bavaria_Upper Franconia":"Felső-Frankföld", @@ -457,8 +457,8 @@ "Honduras":"Honduras", "Hungary":"Magyarország", "Hungary_Kozep-Magyarorszag":"Közép-Magyarország", -"Hungary_Northern Great Plain":"Magyarország – kelet (Észak Alföld és észak)", -"Hungary_Transdanubia":"Magyarország – nyugat (Dunántúl)", +"Hungary_Northern Great Plain":"Magyarország - kelet (Észak Alföld és észak)", +"Hungary_Transdanubia":"Magyarország - nyugat (Dunántúl)", "Iceland":"Izland", "Illinois":"Illinois", "India":"India", @@ -498,7 +498,7 @@ "Indiana":"Indiana", "Indonesia":"Indonézia", "Indonesia_Central":"Sulawesi, Kalimantan", -"Indonesia_East":"Indonézia – kelet", +"Indonesia_East":"Indonézia - kelet", "Indonesia_Jawa Barat":"Nyugat-Jáva tartomány", "Indonesia_Jawa Tengah":"Közép-Jáva tartomány", "Indonesia_Jawa Timur":"Kelet-Jáva tartomány", @@ -506,8 +506,8 @@ "Indonesia_West":"Szumátra", "Iowa":"Iowa", "Iran":"Irán", -"Iran_North":"Irán – észak", -"Iran_South":"Irán – dél", +"Iran_North":"Irán - észak", +"Iran_South":"Irán - dél", "Iraq":"Irak", "Ireland":"Írország", "Ireland_Connacht":"Connacht", @@ -568,8 +568,8 @@ "Italy_Sardinia":"Szardínia", "Italy_Sicily":"Szicília", "Italy_Trentino-Alto Adige Sudtirol":"Trentino-Dél-Tirol", -"Italy_Tuscany_Grosseto":"Toszkána – délkelet", -"Italy_Tuscany_Massa e Carrara":"Toszkána – északnyugat", +"Italy_Tuscany_Grosseto":"Toszkána - délkelet", +"Italy_Tuscany_Massa e Carrara":"Toszkána - északnyugat", "Italy_Umbria":"Umbria", "Italy_Veneto":"Veneto", "Italy_Veneto_Belluno":"Belluno megye", @@ -598,9 +598,9 @@ "Japan_Chugoku Region_Tottori":"Tottori prefektúra", "Japan_Chugoku Region_Yamaguchi":"Jamagucsi prefektúra", "Japan_Hokkaido Region":"Hokkaidó", -"Japan_Hokkaido Region_East":"Hokkaidó – kelet", -"Japan_Hokkaido Region_North":"Hokkaidó – észak", -"Japan_Hokkaido Region_West":"Hokkaidó – nyugat", +"Japan_Hokkaido Region_East":"Hokkaidó - kelet", +"Japan_Hokkaido Region_North":"Hokkaidó - észak", +"Japan_Hokkaido Region_West":"Hokkaidó - nyugat", "Japan_Kanto":"Kantó régió", "Japan_Kanto_Chiba":"Csiba prefektúra", "Japan_Kanto_Gunma":"Gunma prefektúra", @@ -673,10 +673,10 @@ "Mexico_California":"Alsó-Kalifornia", "Mexico_Central_East":"Nuevo León", "Mexico_Central_West":"Nayarit", -"Mexico_East":"Mexikó – kelet", +"Mexico_East":"Mexikó - kelet", "Mexico_Mexico":"Mexikóváros", -"Mexico_North":"Mexikó – észak", -"Mexico_South":"Mexikó – dél", +"Mexico_North":"Mexikó - észak", +"Mexico_South":"Mexikó - dél", "Michigan":"Michigan", "Minnesota":"Minnesota", "Missouri":"Missouri", @@ -688,7 +688,7 @@ "Morocco":"Marokkó", "Morocco_Doukkala-Abda":"Doukkala-Abda", "Morocco_Rabat-Sale-Zemmour-Zaer":"Rabat-Salé-Zemmour-Zaer", -"Morocco_Southern":"Marokkó – dél", +"Morocco_Southern":"Marokkó - dél", "Morocco_Western Sahara":"Nyugat-Szahara", "Mozambique":"Mozambik", "Myanmar":"Mianmar", @@ -696,8 +696,8 @@ "Namibia":"Namíbia", "Nauru":"Nauru", "Nepal":"Nepál", -"Nepal_East":"Nepál – kelet", -"Nepal_West":"Nepál – nyugat", +"Nepal_East":"Nepál - kelet", +"Nepal_West":"Nepál - nyugat", "Netherlands":"Hollandia", "Netherlands_Drenthe":"Drenthe", "Netherlands_Flevoland":"Flevoland", @@ -762,12 +762,12 @@ "Pennsylvania":"Pennsylvania", "People's Republic of China":"Kína", "Peru":"Peru", -"Peru_North":"Peru – észak", -"Peru_South":"Peru – dél", +"Peru_North":"Peru - észak", +"Peru_South":"Peru - dél", "Philippines":"Fülöp-szigetek", "Philippines_Luzon_Manila":"Manila", -"Philippines_Luzon_North":"Luzon – észak", -"Philippines_Luzon_South":"Luzon – dél", +"Philippines_Luzon_North":"Luzon - észak", +"Philippines_Luzon_South":"Luzon - dél", "Philippines_Mindanao":"Mindanao", "Philippines_Visayas":"Visayas", "Pitcairn Islands":"Pitcairn", @@ -789,8 +789,8 @@ "Poland_Warmian-Masurian Voivodeship":"Varmia-Mazúria vajdaság", "Poland_West Pomeranian Voivodeship":"Nyugat-Pomerániai vajdaság", "Portugal":"Portugália", -"Portugal_North":"Portugália – észak", -"Portugal_South":"Portugália – dél", +"Portugal_North":"Portugália - észak", +"Portugal_South":"Portugália - dél", "Qatar":"Katar", "Republic of Kosovo":"Koszovó", "Romania":"Románia", @@ -805,7 +805,7 @@ "Russia_Altai Republic":"Altaji Köztársaság", "Russia_Amur Oblast":"Amuri terület", "Russia_Arkhangelsk Oblast_Central":"Arhangelszki terület - Közép", -"Russia_Arkhangelsk Oblast_North":"Arhangelszki terület – észak", +"Russia_Arkhangelsk Oblast_North":"Arhangelszki terület - észak", "Russia_Astrakhan Oblast":"Asztraháni terület", "Russia_Bashkortostan":"Baskír Köztársaság", "Russia_Belgorod Oblast":"Belgorodi terület", @@ -830,13 +830,13 @@ "Russia_Kirov Oblast":"Kirovi terület", "Russia_Komi Republic":"Komi Köztársaság", "Russia_Kostroma Oblast":"Kosztromai terület", -"Russia_Krasnodar Krai":"Krasznodari határterület – észak", +"Russia_Krasnodar Krai":"Krasznodari határterület - észak", "Russia_Krasnodar Krai_Adygeya":"Krasznodari határterület, Adige Köztársaság", "Russia_Krasnoyarsk Krai":"Krasznojarszki határterület", "Russia_Kurgan Oblast":"Kurgani terület", "Russia_Kursk Oblast":"Kurszki terület", -"Russia_Leningradskaya Oblast_Karelsky":"Leningrádi terület – észak", -"Russia_Leningradskaya Oblast_Southeast":"Leningrádi terület – dél", +"Russia_Leningradskaya Oblast_Karelsky":"Leningrádi terület - észak", +"Russia_Leningradskaya Oblast_Southeast":"Leningrádi terület - dél", "Russia_Lipetsk Oblast":"Lipecki terület", "Russia_Magadan Oblast":"Magadani terület", "Russia_Mari El":"Mari Köztársaság", @@ -845,7 +845,7 @@ "Russia_Murmansk Oblast":"Murmanszki terület", "Russia_Nenets Autonomous Okrug":"Nyenyec autonóm körzet", "Russia_Nizhny Novgorod Oblast":"Nyizsnyij Novgorodi terület", -"Russia_North Ossetia-Alania":"Észak-Oszét Köztársaság – Alánia", +"Russia_North Ossetia-Alania":"Észak-Oszét Köztársaság - Alánia", "Russia_Novgorod Oblast":"Novgorodi terület", "Russia_Novosibirsk Oblast":"Novoszibirszki terület", "Russia_Omsk Oblast":"Omszki terület", @@ -929,8 +929,8 @@ "South Carolina":"Dél-Karolina", "South Georgia and the South Sandwich Islands":"Dél-Georgia és Déli-Sandwich-szigetek", "South Korea":"Dél-Korea", -"South Korea_North":"Dél-Korea – észak", -"South Korea_South":"Dél-Korea – dél", +"South Korea_North":"Dél-Korea - észak", +"South Korea_South":"Dél-Korea - dél", "South Ossetia":"Dél-Oszétia", "South Sudan":"Dél-Szudán", "Spain":"Spanyolország", @@ -983,8 +983,8 @@ "Tennessee":"Tennessee", "Texas":"Texas", "Thailand":"Thaiföld", -"Thailand_North":"Thaiföld – észak", -"Thailand_South":"Thaiföld – dél", +"Thailand_North":"Thaiföld - észak", +"Thailand_South":"Thaiföld - dél", "The Bahamas":"Bahama-szigetek", "The Gambia":"Gambia", "Togo":"Togo", @@ -1029,7 +1029,7 @@ "US_California_Bakersfield_Lancaster":"Lancaster", "US_California_Chico":"Chico", "US_California_LA":"Los Angeles", -"US_California_LA North":"Los Angeles – észak", +"US_California_LA North":"Los Angeles - észak", "US_California_Redding":"Redding", "US_California_Sacramento_Fresno":"Fresno", "US_California_Sacramento_Sacramento":"Sacramento", @@ -1039,7 +1039,7 @@ "US_California_Santa_Clara_Santa Cruz":"Santa Cruz", "US_Colorado_Aspen":"Aspen", "US_Colorado_Denver":"Denver", -"US_Colorado_South":"Colorado – dél", +"US_Colorado_South":"Colorado - dél", "US_Connecticut":"Connecticut", "US_Delaware":"Delaware", "US_Florida_Jacksonville":"Jacksonville", @@ -1049,56 +1049,56 @@ "US_Georgia":"Georgia", "US_Georgia_Atlanta":"Atlanta", "US_Georgia_Macon":"Macon", -"US_Georgia_North":"Georgia – észak", -"US_Georgia_South":"Georgia – dél", +"US_Georgia_North":"Georgia - észak", +"US_Georgia_South":"Georgia - dél", "US_Guam":"Guam", "US_Hawaii":"Hawaii", "US_Idaho":"Idaho", "US_Illinois_Chickago":"Chicago", "US_Illinois_Elgin":"Elgin", "US_Illinois_Rockford":"Rockford", -"US_Illinois_South":"Illinois – dél", +"US_Illinois_South":"Illinois - dél", "US_Illinois_Springfield":"Springfield", -"US_Indiana_North":"Indiana – észak", -"US_Indiana_South":"Indiana – dél", +"US_Indiana_North":"Indiana - észak", +"US_Indiana_South":"Indiana - dél", "US_Iowa_Des Moines":"Des Moines", "US_Iowa_Waterloo":"Waterloo", -"US_Iowa_West":"Iowa – nyugat", -"US_Kansas_East":"Kansas – kelet", -"US_Kansas_West":"Kansas – nyugat", -"US_Kentucky_East":"Kentucky – kelet", -"US_Kentucky_West":"Kentucky – nyugat", -"US_Louisiana_Central":"Louisiana – nyugat", +"US_Iowa_West":"Iowa - nyugat", +"US_Kansas_East":"Kansas - kelet", +"US_Kansas_West":"Kansas - nyugat", +"US_Kentucky_East":"Kentucky - kelet", +"US_Kentucky_West":"Kentucky - nyugat", +"US_Louisiana_Central":"Louisiana - nyugat", "US_Louisiana_New Orleans":"New Orleans", "US_Maine":"Maine", "US_Maryland_Baltimore":"Baltimore", -"US_Maryland_and_DC":"Washington D.C. – nyugat", +"US_Maryland_and_DC":"Washington D.C. - nyugat", "US_Massachusetts_Boston":"Boston", "US_Massachusetts_Central":"Worcester", "US_Massachusetts_Plymouth":"Plymouth", "US_Massachusetts_Southeastern":"Barnstable", "US_Massachusetts_West":"Springfield", "US_Michigan_Detroit":"Detroit", -"US_Michigan_North":"Michigan – észak", -"US_Michigan_South":"Michigan – dél", +"US_Michigan_North":"Michigan - észak", +"US_Michigan_South":"Michigan - dél", "US_Minnesota_Minneapolis":"Minneapolis", -"US_Minnesota_North":"Minnesota – észak", +"US_Minnesota_North":"Minnesota - észak", "US_Minnesota_Rochester":"Rochester", "US_Minnesota_Saint Cloud":"St. Cloud", "US_Mississippi":"Mississippi", -"US_Missouri_East":"Missouri – kelet", -"US_Missouri_West":"Missouri – nyugat", +"US_Missouri_East":"Missouri - kelet", +"US_Missouri_West":"Missouri - nyugat", "US_Montana":"Montana", "US_Nebraska":"Nebraska", "US_Nevada":"Nevada", "US_New Hampshire":"New Hampshire", -"US_New Jersey_North":"New Jersey – észak", -"US_New Jersey_South":"New Jersey – dél", +"US_New Jersey_North":"New Jersey - észak", +"US_New Jersey_South":"New Jersey - dél", "US_New Mexico":"Új-Mexikó", "US_New York_East":"New York - Long Island", "US_New York_New York":"New York - New York City", -"US_New York_North":"New York – észak", -"US_New York_West":"New York – nyugat", +"US_New York_North":"New York - észak", +"US_New York_West":"New York - nyugat", "US_North Carolina_Asheville":"Asheville", "US_North Carolina_Charlotte":"Charlotte", "US_North Carolina_Greensboro":"Greensboro", @@ -1110,11 +1110,11 @@ "US_North Dakota_Minot":"Minot", "US_Ohio_Cleveland":"Cleveland", "US_Ohio_Dayton":"Dayton", -"US_Oklahoma_East":"Oklahoma – kelet", -"US_Oklahoma_West":"Oklahoma – nyugat", +"US_Oklahoma_East":"Oklahoma - kelet", +"US_Oklahoma_West":"Oklahoma - nyugat", "US_Oregon_Eugene":"Eugene", "US_Oregon_Portland":"Portland", -"US_Oregon_West":"Oregon – kelet", +"US_Oregon_West":"Oregon - kelet", "US_Pennsylvania_Central":"Altoona", "US_Pennsylvania_Pittsburgh":"Pittsburgh", "US_Pennsylvania_Reading":"Reading", @@ -1124,8 +1124,8 @@ "US_South Carolina_Columbia":"Columbia", "US_South Carolina_Florence":"Florence", "US_South Dakota":"Dél-Dakota", -"US_Tennessee_East":"Tennessee – kelet", -"US_Tennessee_West":"Tennessee – nyugat", +"US_Tennessee_East":"Tennessee - kelet", +"US_Tennessee_West":"Tennessee - nyugat", "US_Texas_Austin":"Austin", "US_Texas_Dallas":"Dallas", "US_Texas_Houston":"Houston", @@ -1200,54 +1200,54 @@ "Austria_Upper Austria_Linz":"Felső-Ausztria - Linz", "Austria_Upper Austria_Wels":"Felső-Ausztria - Wels", "Brazil_Goias_Brasilia":"Goiás - Brazíliaváros", -"Brazil_Goias_North":"Goiás – észak", -"Brazil_North Region_East":"Északi régió – kelet", -"Brazil_North Region_West":"Északi régió – nyugat", -"Brazil_Northeast Region_East":"Északkeleti régió – kelet", -"Brazil_Northeast Region_West":"Északkeleti régió – nyugat", -"Brazil_Parana_East":"Paraná – kelet", -"Brazil_Parana_West":"Paraná – nyugat", -"Brazil_South Region_East":"Déli régió – kelet", -"Brazil_South Region_West":"Déli régió – nyugat", -"Bulgaria_East":"Bulgária – kelet", -"Bulgaria_West":"Bulgária – nyugat", +"Brazil_Goias_North":"Goiás - észak", +"Brazil_North Region_East":"Északi régió - kelet", +"Brazil_North Region_West":"Északi régió - nyugat", +"Brazil_Northeast Region_East":"Északkeleti régió - kelet", +"Brazil_Northeast Region_West":"Északkeleti régió - nyugat", +"Brazil_Parana_East":"Paraná - kelet", +"Brazil_Parana_West":"Paraná - nyugat", +"Brazil_South Region_East":"Déli régió - kelet", +"Brazil_South Region_West":"Déli régió - nyugat", +"Bulgaria_East":"Bulgária - kelet", +"Bulgaria_West":"Bulgária - nyugat", "Chile_Central":"Chile - Közép", "Congo-Kinshasa_Kivu":"Kivu", -"Congo-Kinshasa_West":"Kongó – nyugat", +"Congo-Kinshasa_West":"Kongó - nyugat", "Croatia_Central":"Horvátország - Közép", -"Croatia_West":"Horvátország – nyugat", -"Ecuador_East":"Ecuador – kelet", -"Ecuador_West":"Ecuador – nyugat", -"Finland_Eastern Finland_North":"Kelet-Finnország – észak", -"Finland_Eastern Finland_South":"Kelet-Finnország – dél", +"Croatia_West":"Horvátország - nyugat", +"Ecuador_East":"Ecuador - kelet", +"Ecuador_West":"Ecuador - nyugat", +"Finland_Eastern Finland_North":"Kelet-Finnország - észak", +"Finland_Eastern Finland_South":"Kelet-Finnország - dél", "Finland_Western Finland_Jyvaskyla":"Nyugat-Finnország - Jyväskylä", "Finland_Western Finland_Tampere":"Nyugat-Finnország - Tampere", -"France_Free County_North":"Franche-Comté – észak", -"France_Free County_South":"Franche-Comté – dél", +"France_Free County_North":"Franche-Comté - észak", +"France_Free County_South":"Franche-Comté - dél", "France_Pays de la Loire_Loire-Atlantique_Nantes":"Loire-Atlantique - Nantes", "France_Pays de la Loire_Loire-Atlantique_Saint-Nazaire":"Loire-Atlantique - Saint-Nazaire", -"Germany_Free State of Bavaria_Upper Bavaria_South":"Felső-Bajorország – dél", -"India_Karnataka_North":"Karnátaka – észak", -"India_Karnataka_South":"Karnátaka – dél", -"Iran_East":"Irán – kelet", +"Germany_Free State of Bavaria_Upper Bavaria_South":"Felső-Bajorország - dél", +"India_Karnataka_North":"Karnátaka - észak", +"India_Karnataka_South":"Karnátaka - dél", +"Iran_East":"Irán - kelet", "Iraq_North":"Észak-Irak", "Iraq_South":"Közép- és Dél-Irak", "Japan_Chubu Region_Aichi_Nagoya":"Aicsi - Nagoja", "Japan_Chubu Region_Aichi_Toyohashi":"Aicsi - Tojohasi", "Japan_Hokkaido Region_Sapporo":"Szapporo", "Japan_Kinki Region_Osaka_Osaka":"Oszaka", -"Japan_Kinki Region_Osaka_West":"Oszaka – nyugat", -"Kazakhstan_North":"Kazahsztán – észak", -"Kazakhstan_South":"Kazahsztán – dél", -"Lithuania_East":"Litvánia – kelet", -"Lithuania_West":"Litvánia – nyugat", +"Japan_Kinki Region_Osaka_West":"Oszaka - nyugat", +"Kazakhstan_North":"Kazahsztán - észak", +"Kazakhstan_South":"Kazahsztán - dél", +"Lithuania_East":"Litvánia - kelet", +"Lithuania_West":"Litvánia - nyugat", "Mexico_Chihuahua":"Chihuahua", "Mexico_Sonora":"Sonora", "Nepal_Kathmandu":"Katmandu", "Nepal_Madhyamanchal":"Központi fejlesztési térség", "Nepal_Purwanchal":"Keleti fejlesztési térség", -"Nigeria_North":"Nigéria – észak", -"Nigeria_South":"Nigéria – dél", +"Nigeria_North":"Nigéria - észak", +"Nigeria_South":"Nigéria - dél", "Norway_Hordaland":"Hordaland", "Norway_Nordland":"Nordland", "Norway_North Trondelag":"Nord-Trøndelag", @@ -1256,25 +1256,25 @@ "Peru_Lima":"Lima", "Portugal_Islands":"Portugál szigetek", "Portugal_Viseu":"Viseu", -"Russia_Krasnoyarsk Krai_North":"Krasznojarszki határterület – észak", -"Russia_Krasnoyarsk Krai_South":"Krasznojarszki határterület – dél", -"Russia_Moscow Oblast_East":"Moszkvai terület – kelet", -"Russia_Moscow Oblast_West":"Moszkvai terület – nyugat", -"Russia_Perm Krai_North":"Permi határterület – észak", -"Russia_Perm Krai_South":"Permi határterület – dél", -"Russia_Republic of Karelia_North":"Karél Köztársaság – észak", -"Russia_Republic of Karelia_South":"Karél Köztársaság – dél", -"Russia_Sverdlovsk Oblast_North":"Szverdlovszki terület – észak", +"Russia_Krasnoyarsk Krai_North":"Krasznojarszki határterület - észak", +"Russia_Krasnoyarsk Krai_South":"Krasznojarszki határterület - dél", +"Russia_Moscow Oblast_East":"Moszkvai terület - kelet", +"Russia_Moscow Oblast_West":"Moszkvai terület - nyugat", +"Russia_Perm Krai_North":"Permi határterület - észak", +"Russia_Perm Krai_South":"Permi határterület - dél", +"Russia_Republic of Karelia_North":"Karél Köztársaság - észak", +"Russia_Republic of Karelia_South":"Karél Köztársaság - dél", +"Russia_Sverdlovsk Oblast_North":"Szverdlovszki terület - észak", "Russia_Sverdlovsk Oblast_Ekaterinburg":"Szverdlovszki terület - Jekatyerinburg", "Russia_Yugra_Khanty":"Hanti- és Manysiföld", "Russia_Yugra_Surgut":"Hanti- és Manysiföld - Szurgut", -"Saudi Arabia_North":"Szaúd-Arábia – észak", -"Saudi Arabia_South":"Szaúd-Arábia – dél", -"Slovenia_East":"Szlovénia – kelet", -"Slovenia_West":"Szlovénia – nyugat", +"Saudi Arabia_North":"Szaúd-Arábia - észak", +"Saudi Arabia_South":"Szaúd-Arábia - dél", +"Slovenia_East":"Szlovénia - kelet", +"Slovenia_West":"Szlovénia - nyugat", "Spain_Andalusia_Granada":"Andalúzia - Granada", "Spain_Andalusia_Sevilla":"Andalúzia - Sevilla", -"Spain_Castile and Leon_East":"Kasztília és León – kelet", +"Spain_Castile and Leon_East":"Kasztília és León - kelet", "Spain_Castile and Leon_West":"Kasztília és León – nyugat", "Spain_Galicia_North":"Galícia – észak", "Spain_Galicia_South":"Galícia – dél", diff --git a/data/countries-strings/ia.json/localize.json b/data/countries-strings/ia.json/localize.json index 9e876ab49..8b6571c6d 100644 --- a/data/countries-strings/ia.json/localize.json +++ b/data/countries-strings/ia.json/localize.json @@ -1,11 +1,11 @@ { "Russian Federation":"Russia", -"Tuvalu":"tuvaluano", +"Tuvalu":"Tuvaluano", "Antarctica":"Antarctica", "Australia":"Australia", "Canada":"Canada", "Japan":"Japan", -"Nauru":"nauru", +"Nauru":"Nauru", "Armenia":"Armenian", "Croatia":"Croatian", "Georgia Region":"Georgian", @@ -23,10 +23,10 @@ "Azerbaijan Region":"Azerbaijani", "Bulgaria":"Bulgarian", "Estonia":"Estonian", -"France_Corsica":"corso", +"France_Corsica":"Corso", "Italy_Lombardy":"Lombard", -"Somalia":"somali", -"Abkhazia":"abkhazo", +"Somalia":"Somali", +"Abkhazia":"Abkhazo", "India_Punjab":"Punjabi", "Indonesia":"Indonesian", "Albania":"Albanian", @@ -34,8 +34,8 @@ "India_Gujarat":"Gujarati", "Lithuania":"Lithuanian", "Mongolia":"Mongolian", -"Serbia":"serbo", -"India_Manipur":"manipuri", +"Serbia":"Serbo", +"India_Manipur":"Manipuri", "Italy_Sardinia":"Sardinian", "Luxembourg":"Luxembourgish", "Austria_Lower Austria_West Description":"Mostviertel, Waldviertel", diff --git a/data/countries-strings/id.json/localize.json b/data/countries-strings/id.json/localize.json index eeab6b70e..bb22ef523 100644 --- a/data/countries-strings/id.json/localize.json +++ b/data/countries-strings/id.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Kathmandu, Kathmandu, Patan", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/ja.json/localize.json b/data/countries-strings/ja.json/localize.json index 236f57752..7d8e154d8 100644 --- a/data/countries-strings/ja.json/localize.json +++ b/data/countries-strings/ja.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"カトマンズ, カトマンズ, パタン", "Nepal_Madhyamanchal Description":"バラトプル, ビールガンジ", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"ブトワル, ポカラ", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"ドロンテン", diff --git a/data/countries-strings/ko.json/localize.json b/data/countries-strings/ko.json/localize.json index 8a03236a7..ca0ec6d0e 100644 --- a/data/countries-strings/ko.json/localize.json +++ b/data/countries-strings/ko.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"카트만두, 카트만두", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/lt.json/localize.json b/data/countries-strings/lt.json/localize.json index c45b6300b..d3e3c5a9d 100644 --- a/data/countries-strings/lt.json/localize.json +++ b/data/countries-strings/lt.json/localize.json @@ -17,7 +17,7 @@ "India":"Indija", "Ireland":"Airija", "Italy":"Italija", -"Nauru":"naurų", +"Nauru":"Naurų", "Poland":"Lenkija", "Romania":"Rumunija", "Slovakia":"Slovakija", @@ -55,9 +55,9 @@ "Azerbaijan":"Azerbaidžanas", "Italy_Lombardy":"Lombardų", "Jamaica":"Jamaikiečių", -"Spain_Extremadura":"ispanų kalbos Ekstremadūros tarmė", +"Spain_Extremadura":"Ispanų kalbos Ekstremadūros tarmė", "US_Georgia":"Georgian", -"Spain_Galicia_North Short":"galisų", +"Spain_Galicia_North Short":"Galisų", "Azerbaijan Region":"Azerbaidžanas", "Bolivia":"Bolivija", "Canada_Ontario_Bame":"Baris", @@ -65,20 +65,20 @@ "Georgia Region":"Sakartvelas", "Georgia":"Sakartvelas", "Indiana":"Indian", -"Spain_Galicia":"galisų", -"Spain_Galicia_South Short":"galisų", +"Spain_Galicia":"Galisų", +"Spain_Galicia_South Short":"Galisų", "Ethiopia":"Etiopija", -"Germany_Free State of Bavaria":"Bavarian", -"Italy_Liguria":"ligūrų", -"Italy_Sardinia":"sardiniečių", +"Germany_Free State of Bavaria":"Bavarija", +"Italy_Liguria":"Ligūrų", +"Italy_Sardinia":"Sardiniečių", "Malaysia":"Malaysian", "Mongolia":"Mongolų", "Pakistan":"Pakistano", -"Serbia":"serbų", -"Somalia":"somaliečių", +"Serbia":"Serbų", +"Somalia":"Somaliečių", "India_Gujarat":"Gudžaratų", -"India_Manipur":"manipurių", -"India_Punjab":"pendžabų", +"India_Manipur":"Manipurių", +"India_Punjab":"Pendžabų", "India_Rajasthan":"Radžastano", "Indonesia":"Indonesian", "Anguilla":"Angilija", @@ -547,5 +547,54 @@ "France_Rhone-Alpes_Loire":"Luara", "France_Rhone-Alpes_Rhone":"Rona", "France_Rhone-Alpes_Savoie":"Savoja", -"France_Southern Islands":"Prancūzijos Pietų ir Antarkties sritys" +"France_Southern Islands":"Prancūzijos Pietų ir Antarkties sritys", +"Canada_Ontario_Northeastern_North":"Mūs Fektoris", +"Germany_Baden-Wurttemberg":"Badenas-Viurtembergas", +"Germany_Baden-Wurttemberg_Regierungsbezirk Freiburg":"Breisgau Freiburgas", +"Germany_Baden-Wurttemberg_Regierungsbezirk Karlsruhe":"Karlsrūhė", +"Germany_Baden-Wurttemberg_Regierungsbezirk Stuttgart_Heilbronn":"Štutgartas – Heilbronas", +"Germany_Baden-Wurttemberg_Regierungsbezirk Stuttgart_Stuttgart":"Štutgartas – Štutgartas", +"Germany_Baden-Wurttemberg_Regierungsbezirk Tubingen":"Tiubingenas", +"Germany_Berlin":"Berlynas", +"Germany_Brandenburg_North":"Brandenburgas – Šiaurė", +"Germany_Brandenburg_South":"Brandenburgas – Pietūs", +"Germany_Free State of Bavaria_Lower Bavaria":"Žemutinė Bavarija", +"Germany_Free State of Bavaria_Lower Franconia":"Žemutinė Frankonija", +"Germany_Free State of Bavaria_Middle Franconia":"Vidurinė Frankonija", +"Germany_Free State of Bavaria_Swabia":"Švabija", +"Germany_Free State of Bavaria_Upper Bavaria_East":"Aukštutinė Bavarija – Rytai", +"Germany_Free State of Bavaria_Upper Bavaria_Ingolstadt":"Aukštutinė Bavarija – Ingolštatas", +"Germany_Free State of Bavaria_Upper Bavaria_Munchen":"Aukštutinė Bavarija – Miunchenas", +"Germany_Free State of Bavaria_Upper Franconia":"Aukštutinė Frankonija", +"Germany_Free State of Bavaria_Upper Palatinate":"Aukštutinis Pfalcas", +"Germany_Hamburg_main":"Hamburgas", +"Germany_Hesse":"Hesenas", +"Germany_Hesse_Regierungsbezirk Darmstadt":"Darmštatas", +"Germany_Hesse_Regierungsbezirk Giessen":"Gysenas", +"Germany_Hesse_Regierungsbezirk Kassel":"Kaselis", +"Germany_Lower Saxony":"Žemutinė Saksonija", +"Germany_Lower Saxony_Bremen_Bremen":"Brėmenas", +"Germany_Lower Saxony_Bremen_Munster":"Liuneburgas", +"Germany_Lower Saxony_Hannover":"Hanoveris", +"Germany_Lower Saxony_Oldenburg":"Oldenburgas", +"Germany_Mecklenburg-Vorpommern":"Meklenburgas-Pomeranija", +"Germany_North Rhine-Westphalia":"Šiaurės Reinas-Vestfalija", +"Germany_North Rhine-Westphalia_Regierungsbezirk Arnsberg_Arnsberg":"Arnsbergas – Arnsbergas", +"Germany_North Rhine-Westphalia_Regierungsbezirk Arnsberg_Dortmund":"Arnsbergas – Dortmundas", +"Germany_North Rhine-Westphalia_Regierungsbezirk Detmold":"Detmoldas", +"Germany_North Rhine-Westphalia_Regierungsbezirk Dusseldorf_Dusseldorf":"Diuseldorfas – Diuseldorfas", +"Germany_North Rhine-Westphalia_Regierungsbezirk Dusseldorf_Mulheim":"Diuseldorfas – Miulheimas prie Ruro", +"Germany_North Rhine-Westphalia_Regierungsbezirk Dusseldorf_Wesel":"Diuseldorfas – Vezelis", +"Germany_North Rhine-Westphalia_Regierungsbezirk Koln_Aachen":"Kelnas – Achenas", +"Germany_North Rhine-Westphalia_Regierungsbezirk Koln_Koln":"Kelnas – Kelnas", +"Germany_North Rhine-Westphalia_Regierungsbezirk Munster_Munster":"Miunsteris – Miunsteris", +"Germany_North Rhine-Westphalia_Regierungsbezirk Munster_Recklinghausen":"Miunsteris – Reklinghauzenas", +"Germany_Rhineland-Palatinate_Koblenz":"Reino kraštas-Pfalcas – Koblencas", +"Germany_Rhineland-Palatinate_South":"Reino kraštas-Pfalcas – Maincas", +"Germany_Saarland":"Saras", +"Germany_Saxony-Anhalt":"Saksonija-Anhaltas", +"Germany_Saxony_Dresden":"Saksonija – Dresdenas", +"Germany_Saxony_Leipzig":"Saksonija – Leipcigas", +"Germany_Schleswig-Holstein":"Šlėzvigas-Holšteinas", +"Germany_Thuringia":"Tiuringija" } diff --git a/data/countries-strings/mr.json/localize.json b/data/countries-strings/mr.json/localize.json index 87f8aebcf..aad24c291 100644 --- a/data/countries-strings/mr.json/localize.json +++ b/data/countries-strings/mr.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Kathmandu, Kathmandu, Patan", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/nb.json/localize.json b/data/countries-strings/nb.json/localize.json index 1430cc024..9b4271f4c 100644 --- a/data/countries-strings/nb.json/localize.json +++ b/data/countries-strings/nb.json/localize.json @@ -34,7 +34,7 @@ "Austria_Burgenland":"Burgenland", "Austria_Carinthia":"Kärnten", "Austria_Lower Austria_West":"Niederösterreich — Vest", -"Austria_Lower Austria_Wien":"Wien", +"Austria_Lower Austria_Wien":"Wien og Niederösterreich — Øst", "Austria_Salzburg":"Salzburg", "Austria_Styria":"Steiermark", "Austria_Tyrol":"Tirol", @@ -568,8 +568,8 @@ "Italy_Sardinia":"Sardinia", "Italy_Sicily":"Sicilia", "Italy_Trentino-Alto Adige Sudtirol":"Trentino-Alto Adige", -"Italy_Tuscany_Grosseto":"Toscana — Grosseto", -"Italy_Tuscany_Massa e Carrara":"Toscana — Massa-Carrara", +"Italy_Tuscany_Grosseto":"Toscana — Sørøst", +"Italy_Tuscany_Massa e Carrara":"Toscana — Nordvest", "Italy_Umbria":"Umbria", "Italy_Veneto":"Veneto", "Italy_Veneto_Belluno":"Provinsen Belluno", @@ -1244,8 +1244,8 @@ "Mexico_Chihuahua":"Chihuahua", "Mexico_Sonora":"Sonora", "Nepal_Kathmandu":"Katmandu", -"Nepal_Madhyamanchal":"Den sentrale region", -"Nepal_Purwanchal":"Den østlige region", +"Nepal_Madhyamanchal":"Sentrale utviklingsregion", +"Nepal_Purwanchal":"Østlige utviklingsregion", "Nigeria_North":"Nigeria — Nord", "Nigeria_South":"Nigeria — Sør", "Norway_Hordaland":"Hordaland", @@ -1375,7 +1375,7 @@ "Austria_Burgenland Description":"Oberpullendorf, Eisenstadt, Mattersburg", "Austria_Carinthia Description":"Klagenfurt, Villach, Wolfsberg", "Austria_Lower Austria_West Description":"Mostviertel, Waldviertel", -"Austria_Lower Austria_Wien Description":"Vienna, Wiener Neustadt", +"Austria_Lower Austria_Wien Description":"Wien, Industrieviertel, Weinviertel", "Austria_Salzburg Description":"Salzburg, Oberndorf bei Salzburg, Abtenau", "Austria_Styria_Graz Description":"Graz, Feldbach, Voitsberg", "Austria_Styria_Leoben Description":"Eisenerz, Mariazell, Knittelfeld", @@ -1514,7 +1514,7 @@ "China_Chongqing Description":"Chongqing, Changshou, Kai", "China_Fujian Description":"Longyan, Sanming, Shaowu", "China_Gansu Description":"Lanzhou, Hongliuwan, Dangchengwan", -"China_Guangdong Description":"Guangzhou, Shenzhen, Jiāngmén", +"China_Guangdong Description":"Guangzhou, Shenzhen, Jiangmen", "China_Guangxi Description":"Guigang, Dongxing, Wuzhou", "China_Guizhou Description":"Guiyang, Liupanshui, Weining", "China_Hebei Description":"Beijing, Tianjin, Shijiazhuang", @@ -1582,7 +1582,7 @@ "Egypt Description":"Cairo, Alexandria, Giza", "El Salvador Description":"San Salvador, Ahuachapan, Sonsonate", "Equatorial Guinea Description":"Malabo, Mongomo, Bata", -"Eritrea Description":"ኣስመራ, Keren, Omhajer", +"Eritrea Description":"Asmara, Keren, Omhajer", "Estonia_East Description":"Põltsamaa linn, Võru, Tartu", "Estonia_West Description":"Tallinn, Pärnu, Maardu", "Ethiopia Description":"Addis Ababa, Asella, Bahir Dar", @@ -1781,7 +1781,7 @@ "India_Karnataka_North Description":"Belagavi, Hubballi, Mangaluru", "India_Karnataka_South Description":"Bengaluru, Mysuru, Kolar Gold Fields", "India_Kerala Description":"Thiruvananthapuram, Ernakulam, Thrissur", -"India_Lakshadweep Description":"Kavaratti, Minicoy, agatti village center", +"India_Lakshadweep Description":"Kavaratti, Minicoy, Agatti", "India_Madhya Pradesh Description":"Indore, Bhopal, Gwalior", "India_Maharashtra Description":"Mumbai, Pune, Nagpur", "India_Manipur Description":"Imphal, Imphal, Jiribam", @@ -1817,7 +1817,7 @@ "Isle of Man Description":"Douglas, Onchan", "Israel Description":"Tel Aviv-Yafo, Herzliya, Modiin-Maccabim-Reut", "Italy_Abruzzo Description":"Pescara, Rosciolo, Pineto", -"Italy_Aosta Valley Description":"Quart, Aosta, Aosta", +"Italy_Aosta Valley Description":"Quart, Aosta", "Italy_Apulia Description":"Bari, Taranto, Foggia", "Italy_Basilicata Description":"Potenza, Matera, Melfi", "Italy_Calabria Description":"Reggio di Calabria, Catanzaro, Cosenza", @@ -1839,21 +1839,21 @@ "Italy_Liguria Description":"Genoa, La Spezia, La Spezia", "Italy_Lombardy_Bergamo Description":"Bergamo, Tagliuno, Treviglio", "Italy_Lombardy_Brescia Description":"Brescia, Bossotti, Lumezzane", -"Italy_Lombardy_Como Description":"Como, Como, Cantù", -"Italy_Lombardy_Cremona Description":"Cremona, Cremona, Trescore Cremasco", +"Italy_Lombardy_Como Description":"Como, Cantù", +"Italy_Lombardy_Cremona Description":"Cremona, Trescore Cremasco", "Italy_Lombardy_Lecco Description":"Lecco, Merate, Calolziocorte", "Italy_Lombardy_Lodi Description":"Lodi, Codogno, Casalpusterlengo", -"Italy_Lombardy_Mantua Description":"Mantua, Mantua, Suzzara", +"Italy_Lombardy_Mantua Description":"Mantua, Suzzara", "Italy_Lombardy_Milan Description":"Milan, Sesto San Giovanni, Cinisello Balsamo", "Italy_Lombardy_Monza and Brianza Description":"Monza, Besana in Brianza, Seregno", "Italy_Lombardy_Pavia Description":"Pavia, Vigevano, Buscarella", -"Italy_Lombardy_Sondrio Description":"Sondrio, Sondrio, Morbegno", +"Italy_Lombardy_Sondrio Description":"Sondrio, Morbegno", "Italy_Lombardy_Varese Description":"Busto Arsizio, Varese, Gallarate", "Italy_Marche Description":"Ancona, Pesaro", "Italy_Molise Description":"Campobasso, Termoli, Isernia", "Italy_Piemont_Alessandria Description":"Alessandria, Casale Monferrato, Novi Ligure", "Italy_Piemont_Asti Description":"Asti, Canelli, Nizza Monferrato", -"Italy_Piemont_Biella Description":"Biella, Biella, Cossato", +"Italy_Piemont_Biella Description":"Biella, Cossato", "Italy_Piemont_Cuneo Description":"Cuneo, Verduno, Bergolo", "Italy_Piemont_Novara Description":"Novara, Borgomanero, Trecate", "Italy_Piemont_Torino Description":"Turin, Moncalieri, Rivoli", @@ -1862,8 +1862,8 @@ "Italy_Sardinia Description":"Casteddu/Cagliari, Sassari, Cuartu Sant'Aleni/Quartu Sant'Elena", "Italy_Sicily Description":"Palermo, Catania, Messina", "Italy_Trentino-Alto Adige Sudtirol Description":"Trento, Bolzano, Rovereto", -"Italy_Tuscany_Grosseto Description":"Arezzo, Monteriggioni, Grosseto", -"Italy_Tuscany_Massa e Carrara Description":"Lucca, Florence, Prato", +"Italy_Tuscany_Grosseto Description":"Arezzo, Grosseto, Siena", +"Italy_Tuscany_Massa e Carrara Description":"Firenze, Livorno, Lucca, Pisa, Prato, Pistoia, Carrara, Massa", "Italy_Umbria Description":"Perugia, Terni, Foligno", "Italy_Veneto_Belluno Description":"Belluno, Feltre, Sedico", "Italy_Veneto_Padova Description":"Padua, Cittadella, Selvazzano Dentro", @@ -1975,9 +1975,9 @@ "Nagorno-Karabakh Description":"Khankendi, Shusha, Lachin", "Namibia Description":"Windhoek, Opuwo, Eenhana", "Nauru Description":"Yaren, Buada, Orro", -"Nepal_Kathmandu Description":"Kathmandu, Kathmandu, Patan", +"Nepal_Kathmandu Description":"Katmandu, Patan", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang Pada, Campa Bazzar, Kerkha Bazar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", @@ -2079,8 +2079,8 @@ "Russia_Astrakhan Oblast Description":"Astrakhan, Gospitomnika, Akhtubinsk", "Russia_Bashkortostan Description":"Ufa, Sterlitamak, Salavat", "Russia_Belgorod Oblast Description":"Belgorod, Stary Oskol, Gubkin", -"Russia_Bryansk Oblast Description":"Bryansk, Novozybkov, Клинцы", -"Russia_Buryatia Description":"Ulan-Ude, Selenduma, Джида", +"Russia_Bryansk Oblast Description":"Bryansk, Novozybkov, Klintsy", +"Russia_Buryatia Description":"Ulan-Ude, Selenduma, Dzhida", "Russia_Chechen Republic Description":"Grozny, Urus-Martan, Shali", "Russia_Chelyabinsk Oblast Description":"Chelyabinsk, Magnitogorsk, Zlatoust", "Russia_Chukotka Autonomous Okrug Description":"Anadyr, Bilibino, Pevek", @@ -2088,7 +2088,7 @@ "Russia_Ingushetia Description":"Nazran, Ordzhonikidzevskaya, Karabulak", "Russia_Irkutsk Oblast Description":"Irkutsk, Bratsk, Angarsk", "Russia_Ivanovo Oblast Description":"Ivanovo, Kineshma, Shuya", -"Russia_Jewish Autonomous Oblast Description":"Birobidzhan, Облучье, Николаевка", +"Russia_Jewish Autonomous Oblast Description":"Birobidzhan, Obluchye, Nikolayevka", "Russia_Kabardino-Balkaria Description":"Nalchik, Prokhladny, Baksan", "Russia_Kaliningrad Oblast Description":"Kaliningrad, Sovetsk, Chernyakhovsk", "Russia_Kaluga Oblast Description":"Kaluga, Obninsk, Babynino", @@ -2102,9 +2102,9 @@ "Russia_Kostroma Oblast Description":"Kostroma, Buy, Sharya", "Russia_Krasnodar Krai Description":"Krasnodar, Novorossiysk, Armavir", "Russia_Krasnodar Krai_Adygeya Description":"Sochi, Maykop, Gelendzhik", -"Russia_Krasnoyarsk Krai_North Description":"Norilsk, Dudinka, Северо-Енисейский", +"Russia_Krasnoyarsk Krai_North Description":"Norilsk, Dudinka, Severo-Yeniseyskiy", "Russia_Krasnoyarsk Krai_South Description":"Krasnoyarsk, Achinsk, Kansk", -"Russia_Kurgan Oblast Description":"Kurgan, Shadrinsk, Варгаши", +"Russia_Kurgan Oblast Description":"Kurgan, Shadrinsk, Vargashi", "Russia_Kursk Oblast Description":"Kursk, Железногорск, Kurchatov", "Russia_Leningradskaya Oblast_Karelsky Description":"Vyborg, Vsevolozhsk, Sertolovo", "Russia_Leningradskaya Oblast_Southeast Description":"Gatchina, Sosnoviy Bor, Tikhvin", @@ -2120,7 +2120,7 @@ "Russia_North Ossetia-Alania Description":"Vladikavkaz, Mozdok, Beslan", "Russia_Novgorod Oblast Description":"Veliky Novgorod, Borovichi, Staraya Russa", "Russia_Novosibirsk Oblast Description":"Novosibirsk, Berdsk, Iskitim", -"Russia_Omsk Oblast Description":"Omsk, Tara, Исилькуль", +"Russia_Omsk Oblast Description":"Omsk, Tara, Isilkul", "Russia_Orenburg Oblast Description":"Orenburg, Orsk, Novotroitsk", "Russia_Oryol Oblast Description":"Oryol, Livny, Mtsensk", "Russia_Penza Oblast Description":"Penza, Kuznetsk, Zarecnyy", @@ -2140,7 +2140,7 @@ "Russia_Sakhalin Oblast Description":"Yuzhno-Sakhalinsk, Korsakov, Kholmsk", "Russia_Samara Oblast Description":"Samara, Tolyatti, Syzran", "Russia_Saratov Oblast Description":"Saratov, Engels, Balakovo", -"Russia_Smolensk Oblast Description":"Smolensk", +"Russia_Smolensk Oblast Description":"Smolensk, Vyazma, Roslavl", "Russia_Stavropol Krai Description":"Stavropol, Pyatigorsk, Kislovodsk", "Russia_Sverdlovsk Oblast_Ekaterinburg Description":"Yekaterinburg, Kamensk-Uralsky, Pervouralsk", "Russia_Sverdlovsk Oblast_North Description":"Nizhny Tagil, Serov, Novouralsk", @@ -2300,7 +2300,7 @@ "US_Alabama_Montgomery Description":"Creola, Centreville, Valley", "US_Alaska Description":"Scammon Bay, McGrath, Fort Wainright", "US_Arizona_Flagstaff Description":"Cottonwood, Holbrook, Show Low", -"US_Arizona_Phoenix Description":"Phoenix, Mesa, Mesa", +"US_Arizona_Phoenix Description":"Phoenix, Mesa", "US_Arizona_Tucson Description":"Tucson, South Tucson, Bisbee", "US_Arkansas_North Description":"Ward, Cabot, Des Arc", "US_Arkansas_South Description":"Stamps, Rockport", @@ -2470,13 +2470,13 @@ "Ukraine_Rivne Oblast Description":"Rivne, Varash (Kuznetsovsk), Dubno", "Ukraine_Sumy Oblast Description":"Sumy, Konotop, Shostka", "Ukraine_Ternopil Oblast Description":"Ternopil, Chortkiv, Kremenets", -"Ukraine_Vinnytsia Oblast Description":"Vinnytsia, Ворошиловка, Zhmerynka", +"Ukraine_Vinnytsia Oblast Description":"Vinnytsia, Voroshylivka, Zhmerynka", "Ukraine_Volyn Oblast Description":"Lutsk, Kovel, Novovolynsk", "Ukraine_Zakarpattia Oblast Description":"Uzhhorod, Mukacheve, Khust", "Ukraine_Zaporizhia Oblast Description":"Zaporizhzhia, Melitopol, Berdiansk", "Ukraine_Zhytomyr Oblast Description":"Zhytomyr, Berdychiv, Korosten", "United Arab Emirates Description":"Abu Dhabi, Dubai, Ajman", -"United States Virgin Islands Description":"Frederiksted, Christiansted, Christiansted", +"United States Virgin Islands Description":"Frederiksted, Christiansted", "Uruguay Description":"Montevideo, Ciudad de la Costa, Salto", "Uzbekistan Description":"Tashkent, Kokand, Namangan", "Vanuatu Description":"Port Vila, Vao Mainland, Saratamata", @@ -2484,7 +2484,7 @@ "Venezuela_South Description":"Maracaibo, Ciudad Guayana, San Cristóbal", "Vietnam Description":"Hanoi, Ho Chi Minh City, Vung Tau", "Wallis and Futuna Description":"Mata-Utu, Fiua, Tavai", -"Yemen Description":"Sana'a, Sanʿaʾ, Aden", +"Yemen Description":"Sana'a, Aden", "Zambia Description":"Lusaka, Kitwe, Ndola", "Zimbabwe Description":"Harare, Hwange, Masvingo", "United States of America Short":"USA", diff --git a/data/countries-strings/nl.json/localize.json b/data/countries-strings/nl.json/localize.json index 8cbd92c21..b2a128eb0 100644 --- a/data/countries-strings/nl.json/localize.json +++ b/data/countries-strings/nl.json/localize.json @@ -972,7 +972,7 @@ "Switzerland_Central":"Centraal Zwitserland", "Switzerland_Eastern":"Oost Zwitserland", "Switzerland_Espace Mittelland":"Espace Mittelland", -"Switzerland_Lake Geneva region":"regio Meer van Genève", +"Switzerland_Lake Geneva region":"Regio Meer van Genève", "Switzerland_Northwestern":"Noordwest Zwitserland", "Switzerland_Ticino":"Ticino", "Switzerland_Zurich":"Zurich stadscentrum", diff --git a/data/countries-strings/pl.json/localize.json b/data/countries-strings/pl.json/localize.json index ae9aa2605..84398adae 100644 --- a/data/countries-strings/pl.json/localize.json +++ b/data/countries-strings/pl.json/localize.json @@ -47,7 +47,7 @@ "Barbados":"Barbados", "Belarus":"Białoruś", "Belarus_Brest Region":"Obwód brzeski", -"Belarus_Homiel Region":"obwód homelski", +"Belarus_Homiel Region":"Obwód homelski", "Belarus_Hrodna Region":"Obwód grodzieński", "Belarus_Maglieu Region":"Obwód mohylewski", "Belarus_Minsk Region":"Obwód miński", @@ -772,22 +772,22 @@ "Philippines_Visayas":"Visayas", "Pitcairn Islands":"Pitcairn", "Poland":"Polska", -"Poland_Greater Poland Voivodeship":"województwo wielkopolskie", -"Poland_Kuyavian-Pomeranian Voivodeship":"województwo kujawsko-pomorskie", -"Poland_Lesser Poland Voivodeship":"województwo małopolskie", -"Poland_Lodz Voivodeship":"województwo łódzkie", -"Poland_Lower Silesian Voivodeship":"województwo dolnośląskie", -"Poland_Lublin Voivodeship":"województwo lubelskie", -"Poland_Lubusz Voivodeship":"województwo lubuskie", -"Poland_Masovian Voivodeship":"województwo mazowieckie", -"Poland_Opole Voivodeship":"województwo opolskie", -"Poland_Podlaskie Voivodeship":"województwo podlaskie", -"Poland_Pomeranian Voivodeship":"województwo pomorskie", -"Poland_Silesian Voivodeship":"województwo śląskie", -"Poland_Subcarpathian Voivodeship":"województwo podkarpackie", -"Poland_Swietokrzyskie Voivodeship":"województwo świętokrzyskie", -"Poland_Warmian-Masurian Voivodeship":"województwo warmińsko-mazurskie", -"Poland_West Pomeranian Voivodeship":"województwo zachodniopomorskie", +"Poland_Greater Poland Voivodeship":"Województwo wielkopolskie", +"Poland_Kuyavian-Pomeranian Voivodeship":"Województwo kujawsko-pomorskie", +"Poland_Lesser Poland Voivodeship":"Województwo małopolskie", +"Poland_Lodz Voivodeship":"Województwo łódzkie", +"Poland_Lower Silesian Voivodeship":"Województwo dolnośląskie", +"Poland_Lublin Voivodeship":"Województwo lubelskie", +"Poland_Lubusz Voivodeship":"Województwo lubuskie", +"Poland_Masovian Voivodeship":"Województwo mazowieckie", +"Poland_Opole Voivodeship":"Województwo opolskie", +"Poland_Podlaskie Voivodeship":"Województwo podlaskie", +"Poland_Pomeranian Voivodeship":"Województwo pomorskie", +"Poland_Silesian Voivodeship":"Województwo śląskie", +"Poland_Subcarpathian Voivodeship":"Województwo podkarpackie", +"Poland_Swietokrzyskie Voivodeship":"Województwo świętokrzyskie", +"Poland_Warmian-Masurian Voivodeship":"Województwo warmińsko-mazurskie", +"Poland_West Pomeranian Voivodeship":"Województwo zachodniopomorskie", "Portugal":"Portugalia", "Portugal_North":"Portugalia — Północ", "Portugal_South":"Portugalia — Południe", @@ -1244,8 +1244,8 @@ "Mexico_Chihuahua":"Chihuahua", "Mexico_Sonora":"Sonora", "Nepal_Kathmandu":"Katmandu", -"Nepal_Madhyamanchal":"Central Development Region", -"Nepal_Purwanchal":"Eastern Development Region", +"Nepal_Madhyamanchal":"Madhjamańćal Wikas Kszetr", +"Nepal_Purwanchal":"Purwańćal Wikas Kszetr", "Nigeria_North":"Nigeria — Północ", "Nigeria_South":"Nigeria — Południe", "Norway_Hordaland":"Hordaland", diff --git a/data/countries-strings/pt.json/localize.json b/data/countries-strings/pt.json/localize.json index e2da478a7..6ac43f1cd 100644 --- a/data/countries-strings/pt.json/localize.json +++ b/data/countries-strings/pt.json/localize.json @@ -1166,7 +1166,7 @@ "Ukraine_Lviv Oblast":"Oblast de Lviv", "Ukraine_Mykolaiv Oblast":"Oblast de Mikolaiv", "Ukraine_Odessa Oblast":"Oblast de Odessa", -"Ukraine_Poltava Oblast":"oblast de Poltava", +"Ukraine_Poltava Oblast":"Oblast de Poltava", "Ukraine_Rivne Oblast":"Oblast de Rivne", "Ukraine_Sumy Oblast":"Oblast de Sumi", "Ukraine_Ternopil Oblast":"Oblast de Ternopil", diff --git a/data/countries-strings/ro.json/localize.json b/data/countries-strings/ro.json/localize.json index 3a3025848..479331210 100644 --- a/data/countries-strings/ro.json/localize.json +++ b/data/countries-strings/ro.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Kathmandu, Kathmandu, Patan", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/ru.json/localize.json b/data/countries-strings/ru.json/localize.json index c723deb73..a48e7c1ba 100644 --- a/data/countries-strings/ru.json/localize.json +++ b/data/countries-strings/ru.json/localize.json @@ -972,7 +972,7 @@ "Switzerland_Central":"Центральная Швейцария", "Switzerland_Eastern":"Восточная Швейцария", "Switzerland_Espace Mittelland":"Центральная Швейцария", -"Switzerland_Lake Geneva region":"регион Женевского озера", +"Switzerland_Lake Geneva region":"Pегион Женевского озера", "Switzerland_Northwestern":"Северо-западная Швейцария", "Switzerland_Ticino":"Тичино", "Switzerland_Zurich":"Цюрих", @@ -1187,7 +1187,7 @@ "Virginia":"Виргиния", "Wallis and Futuna":"Уоллис и Футуна", "Washington":"Вашингтон", -"Willis Island":"остров Виллис", +"Willis Island":"Oстров Виллис", "Wisconsin":"Висконсин", "Yemen":"Йемен", "Zambia":"Замбия", @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Катманду, Катманду", "Nepal_Madhyamanchal Description":"Бхаратпур, Биргандж", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Покхара", "Netherlands_Drenthe Description":"Ассен, Эммен", "Netherlands_Flevoland Description":"Алмере, Лелистад, Дронтен", diff --git a/data/countries-strings/sk.json/localize.json b/data/countries-strings/sk.json/localize.json index bc84de574..37bbe0aba 100644 --- a/data/countries-strings/sk.json/localize.json +++ b/data/countries-strings/sk.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Káthmandu, Káthmandu", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/sv.json/localize.json b/data/countries-strings/sv.json/localize.json index f1937a68b..f96cdc649 100644 --- a/data/countries-strings/sv.json/localize.json +++ b/data/countries-strings/sv.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Katmandu, Katmandu", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/th.json/localize.json b/data/countries-strings/th.json/localize.json index 394d4f76f..177915331 100644 --- a/data/countries-strings/th.json/localize.json +++ b/data/countries-strings/th.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"กาฐมาณฑุ, กาฐมาณฑุ", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/tr.json/localize.json b/data/countries-strings/tr.json/localize.json index ac7e5443a..570aa82ca 100644 --- a/data/countries-strings/tr.json/localize.json +++ b/data/countries-strings/tr.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Katmandu, Katmandu", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/uk.json/localize.json b/data/countries-strings/uk.json/localize.json index 37eaa0aa7..e02d93f87 100644 --- a/data/countries-strings/uk.json/localize.json +++ b/data/countries-strings/uk.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Катманду, Катманду", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Алмере", diff --git a/data/countries-strings/vi.json/localize.json b/data/countries-strings/vi.json/localize.json index ff1ce352f..89af58261 100644 --- a/data/countries-strings/vi.json/localize.json +++ b/data/countries-strings/vi.json/localize.json @@ -222,7 +222,7 @@ "Cook Islands":"Quần đảo Cook", "Costa Rica":"Costa Rica", "Cote dIvoire":"Bờ Biển Ngà", -"Crimea":"bán đảo Krym", +"Crimea":"Bán đảo Krym", "Croatia":"Croatia", "Cuba":"Cuba", "Cyprus":"Cộng hòa Síp", @@ -1016,7 +1016,7 @@ "UK_England_Yorkshire and the Humber":"Yorkshire and the Humber, Vương quốc Anh", "UK_Northern Ireland":"Bắc Ireland", "UK_Scotland_North":"Bắc Scotland", -"UK_Scotland_South":"miền nam Scotland", +"UK_Scotland_South":"Miền nam Scotland", "UK_Wales":"Wales", "US_Alabama_Birmingham":"Birmingham", "US_Alabama_Montgomery":"Montgomery, Alabama", @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Kathmandu, Kathmandu", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/zh-Hans.json/localize.json b/data/countries-strings/zh-Hans.json/localize.json index d462d94e2..cf078efec 100644 --- a/data/countries-strings/zh-Hans.json/localize.json +++ b/data/countries-strings/zh-Hans.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"Kathmandu, Kathmandu, Patan", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/countries-strings/zh-Hant.json/localize.json b/data/countries-strings/zh-Hant.json/localize.json index 7919fe9ae..874f930f8 100644 --- a/data/countries-strings/zh-Hant.json/localize.json +++ b/data/countries-strings/zh-Hant.json/localize.json @@ -1977,7 +1977,7 @@ "Nauru Description":"Yaren, Buada, Orro", "Nepal_Kathmandu Description":"帕坦", "Nepal_Madhyamanchal Description":"Bharatpur, Birganj", -"Nepal_Purwanchal Description":"sarang pada, campa bazzar, Kerkha bajar", +"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar", "Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City", "Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen", "Netherlands_Flevoland Description":"Almere, Lelystad, Dronten", diff --git a/data/editor.config b/data/editor.config index ce667ff45..56c782b2b 100644 --- a/data/editor.config +++ b/data/editor.config @@ -160,7 +160,26 @@ + + + + + + + + + + + + + + + + + + + @@ -226,6 +245,7 @@ + @@ -294,6 +314,7 @@ + @@ -350,6 +371,7 @@ + @@ -430,6 +452,7 @@ + @@ -459,7 +482,9 @@ - + + + @@ -1103,9 +1128,12 @@ - - + + + + + @@ -1120,7 +1148,6 @@ - @@ -1172,9 +1199,12 @@ + - + + + @@ -1223,6 +1253,9 @@ + + + @@ -1234,6 +1267,8 @@ + + @@ -1256,9 +1291,7 @@ - - - + @@ -1479,6 +1512,7 @@ + diff --git a/data/sound-strings/de.json/localize.json b/data/sound-strings/de.json/localize.json index 7675697ac..439ecf4e6 100644 --- a/data/sound-strings/de.json/localize.json +++ b/data/sound-strings/de.json/localize.json @@ -9,7 +9,7 @@ "enter_the_roundabout":"Fahren Sie in den Kreisverkehr ein.", "enter_the_roundabout_street":"NULL", "enter_the_roundabout_street_verb":"NULL", -"leave_the_roundabout":"Fahren Sie aus dem Kreisverkehr aus.", +"leave_the_roundabout":"Verlassen Sie den Kreisverkehr.", "leave_the_roundabout_street":"NULL", "leave_the_roundabout_street_verb":"NULL", "make_a_slight_left_turn":"Halten Sie sich links.", @@ -28,7 +28,7 @@ "take_exit_number":"Nehmen Sie die Ausfahrt auf", "take_exit_number_street_verb":"NULL", "route_recalculating":"Neuberechnung der Route", -"destination":"Werden Sie ankommen.", +"destination":"Sie werden ankommen.", "you_have_reached_the_destination":"Sie sind angekommen.", "in_50_meters":"In fünfzig Metern", "in_100_meters":"In einhundert Metern", @@ -43,7 +43,7 @@ "in_800_meters":"In achthundert Metern", "in_900_meters":"In neunhundert Metern", "in_1_kilometer":"In einem Kilometer", -"in_1_5_kilometers":"In anderthalb Kilometern", +"in_1_5_kilometers":"In eineinhalb Kilometern", "in_2_kilometers":"In zwei Kilometern", "in_2_5_kilometers":"In zweieinhalb Kilometern", "in_3_kilometers":"In drei Kilometern", @@ -102,7 +102,7 @@ "in_4500_feet":"In viertausendfünfhundert Fuß", "in_5000_feet":"In fünftausend Fuß", "in_1_mile":"In einer Meile", -"in_1_5_miles":"In anderthalb Meilen", +"in_1_5_miles":"In eineinhalb Meilen", "in_2_miles":"In zwei Meilen", "unknown_camera":"Blitzer voraus" } diff --git a/data/styles/default/dark/symbols/buses-m.svg b/data/styles/default/dark/symbols/buses-m.svg new file mode 100644 index 000000000..6e6e14a95 --- /dev/null +++ b/data/styles/default/dark/symbols/buses-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/styles/default/dark/symbols/buses-s.svg b/data/styles/default/dark/symbols/buses-s.svg new file mode 100644 index 000000000..a0d66c7f5 --- /dev/null +++ b/data/styles/default/dark/symbols/buses-s.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/styles/default/include/Icons.mapcss b/data/styles/default/include/Icons.mapcss index 63fbf06bb..6bd328fe8 100644 --- a/data/styles/default/include/Icons.mapcss +++ b/data/styles/default/include/Icons.mapcss @@ -293,23 +293,23 @@ node|z18-[railway=tram_stop], /* 3.4 Bus Station */ node|z13[amenity=bus_station], -{icon-image: bus-s.svg;icon-min-distance: 1;} +{icon-image: buses-s.svg;icon-min-distance: 1;} node|z14[amenity=bus_station], -{icon-image: bus-s.svg;text-offset: 1;font-size: 10;text-halo-opacity: 0.8;} +{icon-image: buses-s.svg;text-offset: 1;font-size: 10;text-halo-opacity: 0.8;} node|z15-16[amenity=bus_station], -{icon-image: bus-m.svg;text-offset: 1;font-size: 11;text-halo-opacity: 0.8;} +{icon-image: buses-m.svg;text-offset: 1;font-size: 11;text-halo-opacity: 0.8;} node|z15-16[amenity=bus_station]::int_name, {text-offset: 1;font-size: 9;text-halo-opacity: 0.8;} node|z17[amenity=bus_station], -{icon-image: bus-m.svg;text-offset: 1;font-size: 11;} +{icon-image: buses-m.svg;text-offset: 1;font-size: 11;} node|z17[amenity=bus_station]::int_name, {text-offset: 1;font-size: 9;} node|z18[amenity=bus_station], -{icon-image: bus-m.svg;text-offset: 1;font-size: 12;} +{icon-image: buses-m.svg;text-offset: 1;font-size: 12;} node|z18[amenity=bus_station]::int_name, {text-offset: 1;font-size: 10;} node|z19-[amenity=bus_station], -{icon-image: bus-m.svg;text-offset: 1;font-size: 12;} +{icon-image: buses-m.svg;text-offset: 1;font-size: 12;} node|z19-[amenity=bus_station]::int_name, {text-offset: 1;font-size: 10;} diff --git a/data/styles/default/light/symbols/buses-m.svg b/data/styles/default/light/symbols/buses-m.svg new file mode 100644 index 000000000..34ebde38d --- /dev/null +++ b/data/styles/default/light/symbols/buses-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/styles/default/light/symbols/buses-s.svg b/data/styles/default/light/symbols/buses-s.svg new file mode 100644 index 000000000..b97adc74f --- /dev/null +++ b/data/styles/default/light/symbols/buses-s.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/symbols-svg/charging_sockets/ic_charge_socket_chademo.svg b/data/symbols-svg/charging_sockets/ic_charge_socket_chademo.svg new file mode 100644 index 000000000..af56bbf0d --- /dev/null +++ b/data/symbols-svg/charging_sockets/ic_charge_socket_chademo.svg @@ -0,0 +1,53 @@ + + + + + + + image/svg+xml + + + + + + + diff --git a/data/symbols-svg/charging_sockets/ic_charge_socket_nacs.svg b/data/symbols-svg/charging_sockets/ic_charge_socket_nacs.svg new file mode 100644 index 000000000..212bedfce --- /dev/null +++ b/data/symbols-svg/charging_sockets/ic_charge_socket_nacs.svg @@ -0,0 +1,54 @@ + + + + + + + image/svg+xml + + + + + + + diff --git a/data/symbols-svg/charging_sockets/ic_charge_socket_type1.svg b/data/symbols-svg/charging_sockets/ic_charge_socket_type1.svg new file mode 100644 index 000000000..25c3886fe --- /dev/null +++ b/data/symbols-svg/charging_sockets/ic_charge_socket_type1.svg @@ -0,0 +1,54 @@ + + + + + + + image/svg+xml + + + + + + + diff --git a/data/symbols-svg/charging_sockets/ic_charge_socket_type2.svg b/data/symbols-svg/charging_sockets/ic_charge_socket_type2.svg new file mode 100644 index 000000000..0d2566f77 --- /dev/null +++ b/data/symbols-svg/charging_sockets/ic_charge_socket_type2.svg @@ -0,0 +1,54 @@ + + + + + + + image/svg+xml + + + + + + + diff --git a/data/symbols-svg/charging_sockets/ic_charge_socket_type2_cable.svg b/data/symbols-svg/charging_sockets/ic_charge_socket_type2_cable.svg new file mode 100644 index 000000000..40b14cc5d --- /dev/null +++ b/data/symbols-svg/charging_sockets/ic_charge_socket_type2_cable.svg @@ -0,0 +1,53 @@ + + + + + + + image/svg+xml + + + + + + + diff --git a/data/symbols-svg/charging_sockets/ic_charge_socket_type2_combo.svg b/data/symbols-svg/charging_sockets/ic_charge_socket_type2_combo.svg new file mode 100644 index 000000000..66e1f396d --- /dev/null +++ b/data/symbols-svg/charging_sockets/ic_charge_socket_type2_combo.svg @@ -0,0 +1,53 @@ + + + + + + + image/svg+xml + + + + + + + diff --git a/data/symbols-svg/charging_sockets/ic_charge_socket_unknown.svg b/data/symbols-svg/charging_sockets/ic_charge_socket_unknown.svg new file mode 100644 index 000000000..95bc60cfd --- /dev/null +++ b/data/symbols-svg/charging_sockets/ic_charge_socket_unknown.svg @@ -0,0 +1,52 @@ + + + + + + + image/svg+xml + + + + + + + diff --git a/docs/TRANSLATIONS.md b/docs/TRANSLATIONS.md index 75a2ff84f..14c749c2c 100644 --- a/docs/TRANSLATIONS.md +++ b/docs/TRANSLATIONS.md @@ -16,8 +16,8 @@ The project consists of multiple components, each with its own translation files | [iOS Plurals][ios_plurals_weblate] | UI strings (plurals) | [iphone/Maps/LocalizedStrings/\*.lproj/Localizable.stringsdict][ios_git] ([en][ios_plurals_git_en]) | | [iOS Plist][ios_plist_weblate] | UI strings (system-level) | [iphone/Maps/LocalizedStrings/\*.lproj/InfoPlist.strings][ios_git] ([en][ios_plist_git_en]) | | [TTS][tts_weblate] | Voice announcement strings for navigation directions (TTS) | [data/sound-strings/\*.json][tts_git] ([en][tts_git_en]) | -| [Countries][countries_weblate] | Country names for downloader | [data/country-strings/\*.json][countries_git] ([en][countries_git_en]) | -| Search keywords | Search keywords/aliases/synonyms | [data/categories.txt][categories_git] | +| [Countries][countries_weblate] | Country names for downloader | [data/countries-strings/\*.json][countries_git] ([en][countries_git_en]) | +| [Search keywords](https://translate.codeberg.org/projects/comaps/search-synonyms-aliases/) | Search keywords/aliases/synonyms | [data/categories-strings/](https://codeberg.org/comaps/comaps/src/branch/main/data/categories-strings) | | Search keywords (cuisines) | Search keywords for cuisine types | [data/categories_cuisines.txt][categories_cuisines_git] | | [AppStore Descriptions][appstore_weblate] | AppStore descriptions | [iphone/metadata][appstore_git] ([en][appstore_git_en]) | | [Android Stores Descriptions][googleplay_weblate] | Google, Huawei store descriptions | [android/app/src/google/play/listings][googleplay_git] ([en][googleplay_git_en]) | @@ -38,9 +38,13 @@ Android and iOS share most of the strings. Codeberg Translate automatically sync ### Categories strings +Search categories synonyms/aliases usually shouldn't be just direct translations from English, but rather adaptations - e.g. some specific terms could be used in your language to search for a certain feature and they might not have English equivalents. + +Some translations are borrowed from the common category (`@` in the key). Please do not duplicate translations if a category in the key already includes it. + Syntax: -| - used to separate synonyms. -1-9 - digits in front of a synonym indicate the number of symbols that need to be +- | - used to separate synonyms. +- 1-9 - digits in front of a synonym indicate the number of symbols that need to be typed in a search query to make this synonym appear in the list of suggestions. Located immediately at the start of a synonym. At most one digit per synonym is allowed. @@ -58,7 +62,6 @@ Searcing for "магазин мебели" will also match the category name (1 Exact treshold may be different for different languages. For Serbian, error correction kicks in only for 8-letter or longer words. - ## Machine Translation Codeberg Translate is configured to generate machine translations using the best available tools. Auto-translated entries are added as suggestions. diff --git a/generator/osm2meta.cpp b/generator/osm2meta.cpp index a13b6e35e..1c7f5876e 100644 --- a/generator/osm2meta.cpp +++ b/generator/osm2meta.cpp @@ -84,191 +84,6 @@ bool Prefix2Double(std::string const & str, double & d) } } // namespace -void MetadataTagProcessorImpl::AggregateChargeSocket(std::string const & k, std::string const & v) -{ - auto keys = strings::Tokenize(k, ":"); - ASSERT(keys[0] == "socket", ()); // key must start with "socket:" - if (keys.size() < 2 || keys.size() > 3) - { - LOG(LWARNING, ("Invalid socket key:", k)); - return; - } - - std::string type(keys[1]); - - bool isOutput = false; - if (keys.size() == 3) - { - if (keys[2] == "output") - isOutput = true; - else - return; // ignore other suffixes - } - - // normalize type if needed - // based on recommandations from https://wiki.openstreetmap.org/wiki/Key:socket:* - static std::unordered_map const kTypeMap = { - {"tesla_supercharger", "nacs"}, // also used in EU for 'type2_combo' -> needs fix in OSM tagging - {"tesla_destination", "nacs"}, - {"tesla_standard", "nacs"}, - {"tesla", "nacs"}, - {"tesla_supercharger_ccs", "type2_combo"}, - {"ccs", "type2_combo"}, - {"type1_cable", "type1"}, - }; - - auto itMap = kTypeMap.find(type); - if (itMap != kTypeMap.end()) - type = itMap->second; - - // only store sockets type that are relevant to EV charging - static std::unordered_set const SUPPORTED_TYPES = { - "type1", "type1_combo", "type2", "type2_cable", "type2_combo", "chademo", "nacs", - "gb_ac", "gb_dc", "chaoji", "type3a", "type3c", "mcs"}; - - if (SUPPORTED_TYPES.find(type) == SUPPORTED_TYPES.end()) - return; // unknown type -> ignore - - // find or create descriptor - auto it = std::find_if(m_chargeSockets.begin(), m_chargeSockets.end(), - [&](ChargeSocketDescriptor const & d) { return d.type == type; }); - - if (it == m_chargeSockets.end()) - { - m_chargeSockets.push_back({type, "y", ""}); - it = std::prev(m_chargeSockets.end()); - } - - ASSERT(v.size() > 0, ("empty value for socket key!")); - - if (!isOutput) - { - if (v == "yes") - { - it->count = "y"; - } - else - { - // try to parse count as a number - try - { - auto count = std::stoi(v); - if (count <= 0) - { - LOG(LWARNING, ("Invalid socket count. Removing this socket.", "")); - m_chargeSockets.pop_back(); - return; - } - } - catch (...) - { - // ignore sockets with invalid counts (ie, can not be parsed to int) - // note that if a valid power output is later set for this socket, - // the socket will be re-created with a default count of 'y' - LOG(LWARNING, ("Invalid count of charging socket. Removing it.", v)); - m_chargeSockets.pop_back(); - return; - } - it->count = v; - } - } - else // isOutput == true => parse output power - { - // example value string: "44;22kW;11kva;7400w" - - std::string powerValues = strings::MakeLowerCase(v); - - // replace all occurances of 'VA' by the more standard 'W' unit - size_t pos = powerValues.find("va"); - while (pos != powerValues.npos) - { - powerValues.replace(pos, 2, "w"); - pos = powerValues.find("va", pos + 1); - } - - // if a given socket type is present several times in the same charging - // station with different power outputs, the power outputs would be concatenated - // with ';' - auto powerTokens = strings::Tokenize(powerValues, ";/"); - - // TODO: for now, we only handle the *first* provided - // power output. - std::string num(powerTokens[0]); - strings::Trim(num); - - if (num == "unknown") - { - it->output_kW = ""; - return; - } - - enum PowerUnit - { - WATT, - KILOWATT, - MEGAWATT - }; - PowerUnit unit = KILOWATT; // if no unit, kW are assumed - - if (num.size() > 2) - { - // do we have a unit? - if (num.back() == 'w') - { - unit = WATT; - num.pop_back(); - if (num.back() == 'k') - { - unit = KILOWATT; - num.pop_back(); - } - else if (num.back() == 'm') - { - unit = MEGAWATT; - num.pop_back(); - } - } - } - - strings::Trim(num); - try - { - double value = std::stod(num); - std::ostringstream oss; - switch (unit) - { - case WATT: oss << value / 1000.; break; - case MEGAWATT: oss << value * 1000; break; - case KILOWATT: oss << value; break; - } - num = oss.str(); - } - catch (...) - { - LOG(LWARNING, ("Invalid charging socket power value:", v)); - num = ""; - } - - it->output_kW = num; - } -} - -std::string MetadataTagProcessorImpl::StringifyChargeSockets() const -{ - std::ostringstream oss; - - for (size_t i = 0; i < m_chargeSockets.size(); ++i) - { - auto const & desc = m_chargeSockets[i]; - - oss << desc.type << "|" << desc.count << "|" << desc.output_kW; - - if (i + 1 < m_chargeSockets.size()) - oss << ";"; - } - return oss.str(); -} - std::string MetadataTagProcessorImpl::ValidateAndFormat_stars(std::string const & v) { if (v.empty()) @@ -709,9 +524,9 @@ MetadataTagProcessor::~MetadataTagProcessor() if (!m_description.IsEmpty()) m_params.GetMetadata().Set(feature::Metadata::FMD_DESCRIPTION, m_description.GetBuffer()); - if (!m_chargeSockets.empty()) + if (!m_chargeSockets.GetSockets().empty()) { - auto socketsList = StringifyChargeSockets(); + auto socketsList = m_chargeSockets.ToString(); m_params.GetMetadata().Set(feature::Metadata::FMD_CHARGE_SOCKETS, socketsList); } } @@ -821,7 +636,7 @@ void MetadataTagProcessor::operator()(std::string const & k, std::string const & case Metadata::FMD_SELF_SERVICE: valid = ValidateAndFormat_self_service(v); break; case Metadata::FMD_OUTDOOR_SEATING: valid = ValidateAndFormat_outdoor_seating(v); break; case Metadata::FMD_NETWORK: valid = ValidateAndFormat_operator(v); break; - case Metadata::FMD_CHARGE_SOCKETS: AggregateChargeSocket(k, v); break; + case Metadata::FMD_CHARGE_SOCKETS: m_chargeSockets.AggregateChargeSocketKey(k, v); break; // Metadata types we do not get from OSM. case Metadata::FMD_CUISINE: diff --git a/generator/osm2meta.hpp b/generator/osm2meta.hpp index 028cbb2d9..e2dec8d43 100644 --- a/generator/osm2meta.hpp +++ b/generator/osm2meta.hpp @@ -1,5 +1,6 @@ #pragma once +#include "indexer/feature_charge_sockets.hpp" #include "indexer/feature_data.hpp" #include "indexer/validate_and_format_contacts.hpp" @@ -9,23 +10,6 @@ struct MetadataTagProcessorImpl { MetadataTagProcessorImpl(FeatureBuilderParams & params) : m_params(params) {} - /** Parse OSM attributes for socket types and add them to m_chargeSockets. - * - * Examples of (k,v) pairs: - * ("socket:type2_combo", "2") - * ("socket:type2_combo:output", "150 kW") - * ("socket:chademo", "1") - * ("socket:chademo:output", "50") // assumes kW - */ - void AggregateChargeSocket(std::string const & k, std::string const & v); - - /** Output the list of all sockets for a given charging station in the format - * ||[];... - * - * For instance: - * "type2_combo|2|150;chademo|1|50;type2|2|" - */ - std::string StringifyChargeSockets() const; std::string ValidateAndFormat_maxspeed(std::string const & v) const; static std::string ValidateAndFormat_stars(std::string const & v); std::string ValidateAndFormat_operator(std::string const & v) const; @@ -62,20 +46,8 @@ struct MetadataTagProcessorImpl static std::string ValidateAndFormat_outdoor_seating(std::string v); protected: - // struct to store the representation of a charging station socket - struct ChargeSocketDescriptor - { - std::string type; // https://wiki.openstreetmap.org/wiki/Key:socket:* - // e.g. "type1" - std::string count; // number of sockets or 'y' if OSM tag was set to 'yes'. - // ("" if unknown) - std::string output_kW; // optional power output, in kW ("" if unknown) - }; - typedef std::vector ChargeSocketDescriptors; - // stores information about charge sockets in charging stations. - // Incrementally completed in AggregateChargeSocket - ChargeSocketDescriptors m_chargeSockets; + ChargeSocketsHelper m_chargeSockets; FeatureBuilderParams & m_params; }; diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm index 3b2bacea1..9155eeab3 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm @@ -9,7 +9,7 @@ - (instancetype)initWithRawData:(place_page::Info const &)rawData { self = [super init]; if (self) { - _showAddPlace = rawData.ShouldShowAddPlace() || rawData.ShouldShowAddBusiness(); + _showAddPlace = rawData.ShouldShowAddPlace(); _showEditPlace = rawData.ShouldShowEditPlace(); _enableAddPlace = rawData.ShouldEnableAddPlace(); _enableEditPlace = rawData.ShouldEnableEditPlace(); diff --git a/iphone/Maps/Classes/CarPlay/Template Builders/SettingsTemplateBuilder.swift b/iphone/Maps/Classes/CarPlay/Template Builders/SettingsTemplateBuilder.swift index 8638544d6..6b6f73589 100644 --- a/iphone/Maps/Classes/CarPlay/Template Builders/SettingsTemplateBuilder.swift +++ b/iphone/Maps/Classes/CarPlay/Template Builders/SettingsTemplateBuilder.swift @@ -15,6 +15,7 @@ final class SettingsTemplateBuilder { return [createUnpavedButton(options: options), createTollButton(options: options), createFerryButton(options: options), + createStepsButton(options: options), createSpeedcamButton()] } @@ -72,6 +73,24 @@ final class SettingsTemplateBuilder { } return ferryButton } + + private class func createStepsButton(options: RoutingOptions) -> CPGridButton { + var stepsIconName = "options.steps" + if options.avoidSteps { stepsIconName += ".slash" } + let configuration = UIImage.SymbolConfiguration(textStyle: .title1) + var image = UIImage(named: stepsIconName, in: nil, with: configuration)! + if #unavailable(iOS 26) { + image = image.withTintColor(.white, renderingMode: .alwaysTemplate) + image = UIImage(data: image.pngData()!)!.withRenderingMode(.alwaysTemplate) + } + let stepsButton = CPGridButton(titleVariants: [L("avoid_steps")], image: image) { _ in + options.avoidSteps = !options.avoidSteps + options.save() + CarPlayService.shared.updateRouteAfterChangingSettings() + CarPlayService.shared.popTemplate(animated: true) + } + return stepsButton + } private class func createSpeedcamButton() -> CPGridButton { var speedcamIconName = "options.speedcamera" diff --git a/iphone/Maps/Classes/Components/MWMAddPlaceNavigationBar.xib b/iphone/Maps/Classes/Components/MWMAddPlaceNavigationBar.xib index e681ce077..4e6725231 100644 --- a/iphone/Maps/Classes/Components/MWMAddPlaceNavigationBar.xib +++ b/iphone/Maps/Classes/Components/MWMAddPlaceNavigationBar.xib @@ -1,9 +1,9 @@ - + - + @@ -15,14 +15,14 @@ - + - + - + + @@ -125,8 +126,12 @@ - + + + + + diff --git a/iphone/Maps/Classes/CustomAlert/MWMPlaceDoesntExistAlert.xib b/iphone/Maps/Classes/CustomAlert/MWMPlaceDoesntExistAlert.xib index 5659ac7e5..b7a902616 100644 --- a/iphone/Maps/Classes/CustomAlert/MWMPlaceDoesntExistAlert.xib +++ b/iphone/Maps/Classes/CustomAlert/MWMPlaceDoesntExistAlert.xib @@ -42,7 +42,7 @@ - + diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/TrafficButton/MWMTrafficButtonViewController.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/TrafficButton/MWMTrafficButtonViewController.mm index 28ce4fe03..ec7aad922 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/TrafficButton/MWMTrafficButtonViewController.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/TrafficButton/MWMTrafficButtonViewController.mm @@ -89,11 +89,9 @@ NSArray *imagesWithName(NSString *name) { auto const fitInAvailableArea = CGRectGetMaxY(self.view.frame) < CGRectGetMaxY(availableArea) + kTopOffset; auto const shouldHide = self.hidden || !fitInAvailableArea; auto const leftOffset = shouldHide ? -self.view.width : availableArea.origin.x + kViewControlsOffsetToBounds; - [self.view.superview animateConstraintsWithAnimations:^{ - self.topOffset.constant = availableArea.origin.y + kTopOffset; - self.leftOffset.constant = leftOffset; - self.view.alpha = shouldHide ? 0 : 1; - }]; + self.topOffset.constant = availableArea.origin.y + kTopOffset; + self.leftOffset.constant = leftOffset; + self.view.alpha = shouldHide ? 0 : 1; }); } diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index c681bd86d..77958f63e 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -32,7 +32,6 @@ namespace dp // It's possible when we add/remove subviews (bookmark balloons) and it hangs the map without this check CGRect m_lastViewSize; bool m_presentAvailable; - double main_visualScale; } @property(nonatomic, readwrite) BOOL graphicContextInitialized; @end @@ -221,13 +220,14 @@ double getExactDPI(double contentScaleFactor) return _widgetsManager; } -- (void)updateVisualScaleTo:(CGFloat)visualScale { - main_visualScale = df::VisualParams::Instance().GetVisualScale(); +- (void)updateVisualScaleTo:(CGFloat)visualScale +{ GetFramework().UpdateVisualScale(visualScale); } -- (void)updateVisualScaleToMain { - GetFramework().UpdateVisualScale(main_visualScale); +- (void)updateVisualScaleToMain +{ + GetFramework().UpdateVisualScale(UIScreen.mainScreen.scale); } @end diff --git a/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm b/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm index fea31d613..0efd182b9 100644 --- a/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm +++ b/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm @@ -37,11 +37,14 @@ BOOL canAutoDownload(storage::CountryId const &countryId) { using namespace storage; @interface MWMMapDownloadDialog () +@property(strong, nonatomic) IBOutlet UILabel *explanationTitle; +@property(strong, nonatomic) IBOutlet UILabel *explanationText; @property(strong, nonatomic) IBOutlet UILabel *parentNode; @property(strong, nonatomic) IBOutlet UILabel *node; @property(strong, nonatomic) IBOutlet UILabel *nodeSize; -@property(strong, nonatomic) IBOutlet NSLayoutConstraint *nodeTopOffset; +@property(strong, nonatomic) IBOutlet NSLayoutConstraint *nodeTop; @property(strong, nonatomic) IBOutlet UIButton *downloadButton; +@property(strong, nonatomic) IBOutlet NSLayoutConstraint *explanationHeight; @property(strong, nonatomic) IBOutlet UIView *progressWrapper; @property(weak, nonatomic) MapViewController *controller; @@ -51,6 +54,8 @@ using namespace storage; @end +NSString * const kOfflineMapsExplained = @"OfflineMapsExplained"; + @implementation MWMMapDownloadDialog { CountryId m_countryId; CountryId m_autoDownloadCountryId; @@ -75,8 +80,10 @@ using namespace storage; BOOL const noParrent = (nodeAttrs.m_parentInfo[0].m_id == s.GetRootId()); BOOL const hideParent = (noParrent || isMultiParent); self.parentNode.hidden = hideParent; - self.nodeTopOffset.priority = hideParent ? UILayoutPriorityDefaultHigh : UILayoutPriorityDefaultLow; - if (!hideParent) { + if (hideParent) { + [NSLayoutConstraint activateConstraints:@[self.nodeTop]]; + } else { + [NSLayoutConstraint deactivateConstraints:@[self.nodeTop]]; self.parentNode.text = @(nodeAttrs.m_topmostParentInfo[0].m_localName.c_str()); self.parentNode.textColor = [UIColor blackSecondaryText]; } @@ -86,6 +93,13 @@ using namespace storage; self.nodeSize.textColor = [UIColor blackSecondaryText]; self.nodeSize.text = formattedSize(nodeAttrs.m_mwmSize); self.nodeSize.font = [UIFont medium14].monospaced; + if ([NSUserDefaults.standardUserDefaults integerForKey:kOfflineMapsExplained] > 1) { + [NSLayoutConstraint activateConstraints:@[self.explanationHeight]]; + } else { + [NSLayoutConstraint deactivateConstraints:@[self.explanationHeight]]; + } + self.explanationTitle.text = L(@"offline_explanation_title"); + self.explanationText.text = L(@"offline_explanation_text"); switch (nodeAttrs.m_status) { case NodeStatus::NotDownloaded: @@ -93,6 +107,10 @@ using namespace storage; MapViewController *controller = self.controller; BOOL const isMapVisible = [controller.navigationController.topViewController isEqual:controller]; if (isMapVisible && !self.isAutoDownloadCancelled && canAutoDownload(m_countryId)) { + NSUserDefaults *userDefaults = NSUserDefaults.standardUserDefaults; + NSInteger offlineMapsExplained = [userDefaults integerForKey:kOfflineMapsExplained] + 1; + [userDefaults setInteger:offlineMapsExplained forKey:kOfflineMapsExplained]; + m_autoDownloadCountryId = m_countryId; [[MWMStorage sharedStorage] downloadNode:@(m_countryId.c_str()) onSuccess:^{ @@ -254,6 +272,10 @@ using namespace storage; #pragma mark - Actions - (IBAction)downloadAction { + NSUserDefaults *userDefaults = NSUserDefaults.standardUserDefaults; + NSInteger offlineMapsExplained = [userDefaults integerForKey:kOfflineMapsExplained] + 1; + [userDefaults setInteger:offlineMapsExplained forKey:kOfflineMapsExplained]; + [[MWMStorage sharedStorage] downloadNode:@(m_countryId.c_str()) onSuccess:^{ [self showInQueue]; }]; } diff --git a/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.xib b/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.xib index 4ed59bf8b..c7f6a7244 100644 --- a/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.xib +++ b/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.xib @@ -1,19 +1,63 @@ - + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -66,17 +110,21 @@ - + + + + + @@ -89,6 +137,7 @@ + @@ -106,12 +155,21 @@ + + + + - + + + + + + diff --git a/iphone/Maps/Core/Routing/MWMRouter.h b/iphone/Maps/Core/Routing/MWMRouter.h index c7a9f0c2c..86d8f5798 100644 --- a/iphone/Maps/Core/Routing/MWMRouter.h +++ b/iphone/Maps/Core/Routing/MWMRouter.h @@ -5,7 +5,8 @@ typedef NS_ENUM(NSInteger, MWMRoadType) { MWMRoadTypeToll, MWMRoadTypeDirty, MWMRoadTypeFerry, - MWMRoadTypeMotorway + MWMRoadTypeMotorway, + MWMRoadTypeSteps }; typedef void (^MWMImageHeightBlock)(UIImage *, NSString *, NSString *); diff --git a/iphone/Maps/Core/Routing/MWMRouter.mm b/iphone/Maps/Core/Routing/MWMRouter.mm index e1acb63ef..9d2bdaceb 100644 --- a/iphone/Maps/Core/Routing/MWMRouter.mm +++ b/iphone/Maps/Core/Routing/MWMRouter.mm @@ -598,6 +598,9 @@ char const *kRenderAltitudeImagesQueueLabel = "mapsme.mwmrouter.renderAltitudeIm case MWMRoadTypeMotorway: options.avoidMotorway = YES; break; + case MWMRoadTypeSteps: + options.avoidSteps = YES; + break; } [options save]; [self rebuildWithBestRouter:YES]; diff --git a/iphone/Maps/Core/Settings/MWMRoutingOptions.h b/iphone/Maps/Core/Settings/MWMRoutingOptions.h index d1251fa38..b45daf049 100644 --- a/iphone/Maps/Core/Settings/MWMRoutingOptions.h +++ b/iphone/Maps/Core/Settings/MWMRoutingOptions.h @@ -9,6 +9,7 @@ NS_SWIFT_NAME(RoutingOptions) @property(nonatomic) BOOL avoidDirty; @property(nonatomic) BOOL avoidFerry; @property(nonatomic) BOOL avoidMotorway; +@property(nonatomic) BOOL avoidSteps; @property(nonatomic, readonly) BOOL hasOptions; - (void)save; diff --git a/iphone/Maps/Core/Settings/MWMRoutingOptions.mm b/iphone/Maps/Core/Settings/MWMRoutingOptions.mm index 2906b6cb0..c05892a7f 100644 --- a/iphone/Maps/Core/Settings/MWMRoutingOptions.mm +++ b/iphone/Maps/Core/Settings/MWMRoutingOptions.mm @@ -51,8 +51,16 @@ [self setOption:(routing::RoutingOptions::Road::Motorway) enabled:avoid]; } +- (BOOL)avoidSteps { + return _options.Has(routing::RoutingOptions::Road::Steps); +} + +- (void)setAvoidSteps:(BOOL)avoid { + [self setOption:(routing::RoutingOptions::Road::Steps) enabled:avoid]; +} + - (BOOL)hasOptions { - return self.avoidToll || self.avoidDirty || self.avoidFerry || self.avoidMotorway; + return self.avoidToll || self.avoidDirty || self.avoidFerry || self.avoidMotorway || self.avoidSteps; } - (void)save { @@ -73,7 +81,7 @@ } MWMRoutingOptions *another = (MWMRoutingOptions *)object; return another.avoidToll == self.avoidToll && another.avoidDirty == self.avoidDirty && - another.avoidFerry == self.avoidFerry && another.avoidMotorway == self.avoidMotorway; + another.avoidFerry == self.avoidFerry && another.avoidMotorway == self.avoidMotorway && another.avoidSteps == self.avoidSteps; } @end diff --git a/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.slash.symbolset/Contents.json b/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.slash.symbolset/Contents.json new file mode 100644 index 000000000..9053da09a --- /dev/null +++ b/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.slash.symbolset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "filename" : "options.steps.slash.svg", + "idiom" : "universal" + } + ] +} diff --git a/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.slash.symbolset/options.steps.slash.svg b/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.slash.symbolset/options.steps.slash.svg new file mode 100644 index 000000000..bfebf73e2 --- /dev/null +++ b/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.slash.symbolset/options.steps.slash.svg @@ -0,0 +1,121 @@ + + + + + + + + + + Weight/Scale Variations + Ultralight + Thin + Light + Regular + Medium + Semibold + Bold + Heavy + Black + + + + + + + + + + + Design Variations + Symbols are supported in up to nine weights and three scales. + For optimal layout with text and other symbols, vertically align + symbols with the adjacent text. + + + + + + Margins + Leading and trailing margins on the left and right side of each symbol + can be adjusted by modifying the x-location of the margin guidelines. + Modifications are automatically applied proportionally to all + scales and weights. + + + + Exporting + Symbols should be outlined when exporting to ensure the + design is preserved when submitting to Xcode. + Template v.7.0 + Requires Xcode 17 or greater + Generated from + Typeset at 100.0 points + Small + Medium + Large + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.symbolset/Contents.json b/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.symbolset/Contents.json new file mode 100644 index 000000000..50bd67954 --- /dev/null +++ b/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.symbolset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "filename" : "options.steps.svg", + "idiom" : "universal" + } + ] +} diff --git a/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.symbolset/options.steps.svg b/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.symbolset/options.steps.svg new file mode 100644 index 000000000..23f474dcd --- /dev/null +++ b/iphone/Maps/Images.xcassets/Interface/Symbols/options.steps.symbolset/options.steps.svg @@ -0,0 +1,109 @@ + + + + + + + + + + Weight/Scale Variations + Ultralight + Thin + Light + Regular + Medium + Semibold + Bold + Heavy + Black + + + + + + + + + + + Design Variations + Symbols are supported in up to nine weights and three scales. + For optimal layout with text and other symbols, vertically align + symbols with the adjacent text. + + + + + + Margins + Leading and trailing margins on the left and right side of each symbol + can be adjusted by modifying the x-location of the margin guidelines. + Modifications are automatically applied proportionally to all + scales and weights. + + + + Exporting + Symbols should be outlined when exporting to ensure the + design is preserved when submitting to Xcode. + Template v.7.0 + Requires Xcode 17 or greater + Generated from options.steps + Typeset at 100.0 points + Small + Medium + Large + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iphone/Maps/Images.xcassets/Interface/Symbols/track.symbolset/Contents.json b/iphone/Maps/Images.xcassets/Interface/Symbols/track.symbolset/Contents.json new file mode 100644 index 000000000..bd3ebb561 --- /dev/null +++ b/iphone/Maps/Images.xcassets/Interface/Symbols/track.symbolset/Contents.json @@ -0,0 +1,15 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "symbol-rendering-intent" : "multicolor" + }, + "symbols" : [ + { + "filename" : "track.svg", + "idiom" : "universal" + } + ] +} diff --git a/iphone/Maps/Images.xcassets/Interface/Symbols/track.symbolset/track.svg b/iphone/Maps/Images.xcassets/Interface/Symbols/track.symbolset/track.svg new file mode 100644 index 000000000..dedc393e5 --- /dev/null +++ b/iphone/Maps/Images.xcassets/Interface/Symbols/track.symbolset/track.svg @@ -0,0 +1,103 @@ + + + + + + + + + + Weight/Scale Variations + Ultralight + Thin + Light + Regular + Medium + Semibold + Bold + Heavy + Black + + + + + + + + + + + Design Variations + Symbols are supported in up to nine weights and three scales. + For optimal layout with text and other symbols, vertically align + symbols with the adjacent text. + + + + + + Margins + Leading and trailing margins on the left and right side of each symbol + can be adjusted by modifying the x-location of the margin guidelines. + Modifications are automatically applied proportionally to all + scales and weights. + + + + Exporting + Symbols should be outlined when exporting to ensure the + design is preserved when submitting to Xcode. + Template v.7.0 + Requires Xcode 17 or greater + Generated from track + Typeset at 100.0 points + Small + Medium + Large + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iphone/Maps/LocalizedStrings/bg.lproj/LocalizableTypes.strings b/iphone/Maps/LocalizedStrings/bg.lproj/LocalizableTypes.strings index dea32c977..44d1b5079 100644 --- a/iphone/Maps/LocalizedStrings/bg.lproj/LocalizableTypes.strings +++ b/iphone/Maps/LocalizedStrings/bg.lproj/LocalizableTypes.strings @@ -463,7 +463,6 @@ /* These translations are used for all type.highway.*.bridge. */ "type.highway.pedestrian.bridge" = "Мост"; - "type.highway.pedestrian.square" = "Площад"; /* These translations are used for all type.highway.*.tunnel. */ @@ -643,8 +642,8 @@ "type.historic.wayside_cross" = "Крайпътен кръст"; "type.historic.wayside_shrine" = "Крайпътно светилище"; "type.historic.wreck" = "корабокрушение"; -"type.internet_access" = "Internet"; -"type.internet_access.wlan" = "Internet"; +"type.internet_access" = "Интернет"; +"type.internet_access.wlan" = "Интернет"; "type.junction" = "Съединение"; "type.junction.circular" = "Кръгово"; "type.junction.roundabout" = "Кръгово"; @@ -1201,7 +1200,7 @@ "type.shop.car_parts" = "Магазин за авточасти"; "type.shop.car_repair" = "Сервиз за коли"; "type.shop.car_repair.tyres" = "Гумаджия"; -"type.shop.caravan" = "Автокъща на домове на колела"; +"type.shop.caravan" = "Автокъща за кемпери"; "type.shop.carpet" = "Килими"; "type.shop.chemist" = "Битова химия"; "type.shop.chocolate" = "Магазин за шоколад"; @@ -1220,7 +1219,7 @@ "type.shop.electronics" = "Магазин за електроника"; "type.shop.erotic" = "Еротичен магазин"; "type.shop.fabric" = "Магазин за платове"; -"type.shop.farm" = "Магазин за селскостопански храни"; +"type.shop.farm" = "Фермерски магазин"; "type.shop.fashion_accessories" = "Модни аксесоари"; "type.shop.florist" = "Цветарски магазин"; "type.shop.funeral_directors" = "Погребални директори"; @@ -1485,7 +1484,7 @@ "type.amenity.luggage_locker" = "Шкафче за багаж"; "type.amenity.bicycle_parking.covered" = "Покрит паркинг за колела"; "type.barrier.wicket_gate" = "Wicket gate"; -"type.amenity.animal_shelter" = "Animal Shelter"; +"type.amenity.animal_shelter" = "Приют за животни"; "type.office.security" = "Security Guards Office"; "type.power.portal" = "Power Portal"; "type.building.guardhouse" = "Security Booth"; diff --git a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings index 9ec54cccd..de9a56ec6 100644 --- a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings @@ -1097,3 +1097,5 @@ "pref_maplanguage_local" = "Místní jazyk"; "existence_confirmed_time_ago" = "Existence potvrzena %@"; "hours_confirmed_time_ago" = "Potvrzeno %@"; +"offline_explanation_text" = "Pro prohlížení a navigaci v dané oblasti je nutné stáhnout mapu.\nStáhnout mapy oblastí, které chcete navštívit."; +"offline_explanation_title" = "Offline mapy"; diff --git a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings index e9bf28d2b..3e05e432d 100644 --- a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings @@ -10,7 +10,7 @@ "download_maps" = "Karten herunterladen"; /* Settings/Downloader - info for country which started downloading */ -"downloading" = "Wird heruntergeladen…"; +"downloading" = "Wird heruntergeladen …"; /* Choose measurement on first launch alert - choose metric system button */ "kilometres" = "Kilometer"; @@ -825,6 +825,7 @@ "avoid_unpaved" = "Unbefest. Straßen vermeiden"; /* Recommended length for CarPlay and Android Auto is around 25-27 characters */ +"avoid_steps" = "Treppen vermeiden"; "avoid_ferry" = "Fähren vermeiden"; "avoid_motorways" = "Autobahnen vermeiden"; "unable_to_calc_alert_title" = "Route kann nicht berechnet werden"; @@ -1097,3 +1098,4 @@ "pref_maplanguage_local" = "Lokale Sprache"; "existence_confirmed_time_ago" = "Existenz bestätigt %@"; "hours_confirmed_time_ago" = "Bestätigt %@"; +"offline_explanation_title" = "Offline Karten"; diff --git a/iphone/Maps/LocalizedStrings/de.lproj/LocalizableTypes.strings b/iphone/Maps/LocalizedStrings/de.lproj/LocalizableTypes.strings index bb17b609f..38f7e04aa 100644 --- a/iphone/Maps/LocalizedStrings/de.lproj/LocalizableTypes.strings +++ b/iphone/Maps/LocalizedStrings/de.lproj/LocalizableTypes.strings @@ -22,7 +22,7 @@ "type.amenity.atm" = "Geldautomat"; "type.amenity.bank" = "Bankfiliale"; "type.amenity.bar" = "Bar"; -"type.amenity.bbq" = "Grillplatz"; +"type.amenity.bbq" = "Grillstelle"; "type.amenity.bench" = "Sitzbank"; "type.amenity.bicycle_parking" = "Fahrradständer"; "type.amenity.bicycle_rental" = "Fahrradverleih"; @@ -38,8 +38,8 @@ "type.amenity.car_wash" = "Autowaschanlage"; "type.amenity.casino" = "Kasino"; "type.amenity.gambling" = "Glücksspiel"; -"type.leisure.adult_gaming_centre" = "Gaming-Zentrum für Erwachsene"; -"type.leisure.amusement_arcade" = "Arkade"; +"type.leisure.adult_gaming_centre" = "Spielhalle für Erwachsene"; +"type.leisure.amusement_arcade" = "Spielhalle für Unterhaltungsspiele"; "type.amenity.charging_station" = "Ladestation"; "type.amenity.charging_station.bicycle" = "Fahrrad-Ladestation"; "type.amenity.charging_station.motorcar" = "Kfz-Ladestation"; @@ -47,11 +47,11 @@ "type.amenity.cinema" = "Kino"; "type.leisure.bowling_alley" = "Bowlingbahn"; "type.amenity.clinic" = "Klinik"; -"type.amenity.college" = "Hochschule"; -"type.amenity.community_centre" = "Bürgerhaus"; +"type.amenity.college" = "Bildungseinrichtung"; +"type.amenity.community_centre" = "Gemeinschaftszentrum"; "type.amenity.compressed_air" = "Druckluft"; "type.amenity.conference_centre" = "Konferenzzentrum"; -"type.amenity.courthouse" = "Justizgebäude"; +"type.amenity.courthouse" = "Gericht"; "type.amenity.dentist" = "Zahnarzt"; "type.amenity.doctors" = "Arztpraxis"; "type.amenity.drinking_water" = "Trinkwasser"; @@ -65,7 +65,7 @@ "type.amenity.fast_food" = "Fast-Food"; "type.amenity.ferry_terminal" = "Fähranleger"; "type.amenity.fire_station" = "Feuerwehr"; -"type.amenity.food_court" = "Gastronomiebereich"; +"type.amenity.food_court" = "Food Court"; "type.amenity.fountain" = "Springbrunnen"; "type.amenity.fuel" = "Tankstelle"; @@ -99,9 +99,9 @@ "type.amenity.parking.street_side" = "Parkbucht"; "type.amenity.parking.street_side.fee" = "Parkbucht"; "type.amenity.parking.street_side.private" = "Private Parkbucht"; -"type.amenity.parking.lane" = "Fahrspur parken"; -"type.amenity.parking.lane.fee" = "Fahrspur parken"; -"type.amenity.parking.lane.private" = "Privatspur parken"; +"type.amenity.parking.lane" = "Parkstreifen"; +"type.amenity.parking.lane.fee" = "Parkstreifen"; +"type.amenity.parking.lane.private" = "Privater Parkstreifen"; "type.amenity.parking_entrance" = "Parkplatzeinfahrt"; "type.amenity.parking_entrance.private" = "Private Parkplatzeinfahrt"; "type.amenity.parking_entrance.permissive" = "Parkplatzeinfahrt"; @@ -120,8 +120,8 @@ "type.amenity.place_of_worship.hindu" = "Hinduistischer Tempel"; "type.amenity.place_of_worship.jewish" = "Synagoge"; "type.amenity.place_of_worship.muslim" = "Moschee"; -"type.amenity.place_of_worship.shinto" = "Schrein"; -"type.amenity.place_of_worship.taoist" = "Tempel"; +"type.amenity.place_of_worship.shinto" = "Shintō-Schrein"; +"type.amenity.place_of_worship.taoist" = "Daoistischer Tempel"; "type.amenity.police" = "Polizeistation"; "type.amenity.post_box" = "Briefkasten"; "type.amenity.post_office" = "Postfiliale"; @@ -133,7 +133,7 @@ "type.amenity.recycling.container" = "Wertstoffcontainer"; "type.recycling.batteries" = "Batterien"; "type.recycling.clothes" = "Altkleider"; -"type.recycling.glass_bottles" = "Glas"; +"type.recycling.glass_bottles" = "Glasflaschen"; "type.recycling.paper" = "Papier"; "type.recycling.plastic" = "Kunststoff"; "type.recycling.plastic_bottles" = "Plastikflaschen"; @@ -187,8 +187,8 @@ "type.amenity.waste_basket" = "Abfalleimer"; "type.amenity.waste_disposal" = "Müllcontainer"; "type.amenity.waste_transfer_station" = "Müllumladestation"; -"type.amenity.water_point" = "Wasseranschluss"; -"type.amenity.water_point.drinking_water_no" = "Wasseranschluss"; +"type.amenity.water_point" = "Wassertank-Auffüllstation"; +"type.amenity.water_point.drinking_water_no" = "Wassertank-Auffüllstation"; "type.barrier" = "Barriere"; "type.barrier.yes" = "Barriere"; "type.barrier.block" = "Block"; @@ -198,7 +198,7 @@ "type.barrier.city_wall" = "Stadtmauer"; "type.barrier.cycle_barrier" = "Umlaufschranke"; "type.waterway.ditch" = "Entwässerungsgraben"; -"type.natural.water.moat" = "Graben"; +"type.natural.water.moat" = "Verteidigungsgraben"; "type.natural.water.wastewater" = "Abwasser"; "type.barrier.entrance" = "Durchgang"; "type.barrier.fence" = "Zaun"; @@ -224,14 +224,14 @@ /* Country's primary subdivision borders, e.g. between regions, provinces, states.. */ "type.boundary.administrative.4" = "Regionale Grenze"; "type.boundary.national_park" = "Nationalpark"; -"type.boundary.aboriginal_lands" = "Indigene länder"; -"type.boundary.protected_area" = "Geschützter Bereich"; -"type.boundary.protected_area.1" = "Geschützter Bereich"; -"type.boundary.protected_area.2" = "Geschützter Bereich"; -"type.boundary.protected_area.3" = "Geschützter Bereich"; -"type.boundary.protected_area.4" = "Geschützter Bereich"; -"type.boundary.protected_area.5" = "Geschützter Bereich"; -"type.boundary.protected_area.6" = "Geschützter Bereich"; +"type.boundary.aboriginal_lands" = "Indigenes Gebiet"; +"type.boundary.protected_area" = "Schutzgebiet"; +"type.boundary.protected_area.1" = "Schutzgebiet"; +"type.boundary.protected_area.2" = "Schutzgebiet"; +"type.boundary.protected_area.3" = "Schutzgebiet"; +"type.boundary.protected_area.4" = "Schutzgebiet"; +"type.boundary.protected_area.5" = "Schutzgebiet"; +"type.boundary.protected_area.6" = "Schutzgebiet"; "type.building" = "Gebäude"; /* Duplicates [address] in strings.txt */ @@ -246,9 +246,9 @@ "type.craft.beekeeper" = "Imker"; "type.craft.blacksmith" = "Schmied"; "type.craft.brewery" = "Brauerei"; -"type.craft.caterer" = "Partyservice"; +"type.craft.caterer" = "Caterer"; "type.craft.carpenter" = "Zimmermann"; -"type.craft.confectionery" = "Süßwarenladen"; +"type.craft.confectionery" = "Süßwaren-Manufaktur"; "type.craft.electrician" = "Elektriker"; "type.craft.electronics_repair" = "Elektrogerätereparatur"; "type.craft.gardener" = "Landschaftsgärtner"; @@ -299,7 +299,7 @@ "type.cuisine.filipino" = "Philippinisch"; "type.cuisine.fine_dining" = "Gehoben"; "type.cuisine.fish" = "Fisch"; -"type.cuisine.fish_and_chips" = "Fisch und Chips"; +"type.cuisine.fish_and_chips" = "Fish and Chips"; "type.cuisine.french" = "Französisch"; "type.cuisine.friture" = "Pommes"; "type.cuisine.georgian" = "Georgisch"; @@ -315,7 +315,7 @@ "type.cuisine.international" = "International"; "type.cuisine.irish" = "Irisch"; "type.cuisine.italian" = "Italienisch"; -"type.cuisine.italian_pizza" = "Italienisch; Pizza"; +"type.cuisine.italian_pizza" = "Italienische Pizza"; "type.cuisine.japanese" = "Japanisch"; "type.cuisine.kebab" = "Kebap"; "type.cuisine.korean" = "Koreanisch"; @@ -393,7 +393,7 @@ /* These translations are used for all type.highway.*.tunnel. */ "type.highway.bridleway.tunnel" = "Tunnel"; -"type.highway.busway" = "Eigene Busstraße"; +"type.highway.busway" = "Busstraße"; /* These translations are used for all type.highway.*.bridge. */ "type.highway.busway.bridge" = "Brücke"; @@ -417,7 +417,7 @@ "type.highway.footway.area" = "Fußweg"; /* These translations are used for all type.highway.*.bridge. */ -"type.highway.footway.bridge" = "Brücke"; +"type.highway.footway.bridge" = "Fußgängerbrücke"; /* These translations are used for all type.highway.*.tunnel. */ "type.highway.footway.tunnel" = "Fußgängertunnel"; @@ -483,7 +483,7 @@ /* These translations are used for all type.highway.*.tunnel. */ "type.highway.primary_link.tunnel" = "Tunnel"; -"type.highway.raceway" = "Rennbahn"; +"type.highway.raceway" = "Rennstrecke"; "type.highway.residential" = "Wohnstraße"; "type.highway.residential.area" = "Wohnstraße"; @@ -584,10 +584,10 @@ /* These translations are used for all type.highway.*.tunnel. */ "type.highway.unclassified.tunnel" = "Straßentunnel"; "type.area_highway.cycleway" = "Radweg"; -"type.area_highway.footway" = "Weg"; -"type.area_highway.living_street" = "Wohnstraße"; +"type.area_highway.footway" = "Fußweg"; +"type.area_highway.living_street" = "Spielstraße"; "type.area_highway.motorway" = "Autobahn"; -"type.area_highway.path" = "Weg"; +"type.area_highway.path" = "Pfad"; "type.area_highway.pedestrian" = "Fußgängerzone"; "type.area_highway.primary" = "Hauptstraße"; "type.area_highway.residential" = "Wohnstraße"; @@ -602,7 +602,7 @@ "type.historic.aircraft" = "Historisches Flugzeug"; "type.historic.anchor" = "Historischer Anker"; "type.historic.archaeological_site" = "Ausgrabungsstätte"; -"type.historic.battlefield" = "Schlachtfeld"; +"type.historic.battlefield" = "Historisches Schlachtfeld"; "type.historic.boundary_stone" = "Grenzstein"; "type.historic.cannon" = "Kanone"; "type.historic.castle" = "Burg"; @@ -659,7 +659,7 @@ /* In most (European) countries, сemeteries are usually independent of places of worship (e.g. military cemeteries), while grave yards are usually the yard of a place of worship. */ "type.landuse.cemetery.christian" = "Friedhof"; -"type.landuse.religious" = "Religiöses Land"; +"type.landuse.religious" = "Religiöses Gelände"; "type.landuse.commercial" = "Gewerbegebiet"; "type.landuse.construction" = "Baustelle"; "type.landuse.education" = "Bildungseinrichtung"; @@ -673,7 +673,7 @@ "type.landuse.forest.mixed" = "Mischwald"; "type.landuse.garages" = "Garagen"; "type.landuse.grass" = "Wiese"; -"type.landuse.greenfield" = "Rohbauland"; +"type.landuse.greenfield" = "Bauland"; "type.landuse.greenhouse_horticulture" = "Gewächshaus-Fläche"; "type.landuse.industrial" = "Industriegebiet"; "type.landuse.landfill" = "Müllhalde"; @@ -687,10 +687,10 @@ "type.landuse.residential" = "Wohngebiet"; "type.landuse.retail" = "Einzelhandelsgebiet"; "type.landuse.salt_pond" = "Saline"; -"type.landuse.village_green" = "Dorfplatz"; +"type.landuse.village_green" = "Grünfläche"; "type.landuse.vineyard" = "Weinberg"; "type.leisure" = "Freizeit"; -"type.leisure.common" = "öffentliche Grünfläche"; +"type.leisure.common" = "Öffentliche Grünfläche"; "type.leisure.dog_park" = "Hundeauslauffläche"; "type.leisure.fitness_centre" = "Fitnessstudio"; "type.leisure.fitness_station" = "Fitnessstation"; @@ -699,15 +699,15 @@ "type.leisure.garden.residential" = "Garten"; "type.leisure.golf_course" = "Golfplatz"; "type.leisure.miniature_golf" = "Minigolf"; -"type.leisure.hackerspace" = "Hackerraum"; +"type.leisure.hackerspace" = "Hackerspace"; "type.leisure.ice_rink" = "Eislaufplatz"; "type.leisure.marina" = "Jachthafen"; "type.leisure.nature_reserve" = "Naturschutzgebiet"; -"type.leisure.outdoor_seating" = "Außengastronomie"; +"type.leisure.outdoor_seating" = "Außenbestuhlung"; "type.leisure.park" = "Park"; -"type.leisure.park.no.access" = "Park"; +"type.leisure.park.no.access" = "Privater Park"; "type.leisure.park.permissive" = "Park"; -"type.leisure.park.private" = "Park"; +"type.leisure.park.private" = "Privater Park"; "type.leisure.picnic_table" = "Picknicktisch"; "type.leisure.pitch" = "Sportplatz"; "type.leisure.playground" = "Spielplatz"; @@ -723,8 +723,8 @@ "type.leisure.track" = "Laufbahn"; "type.leisure.track.area" = "Laufbahn"; "type.leisure.water_park" = "Aquapark"; -"type.leisure.beach_resort" = "Badestrand"; -"type.man_made" = "künstliche Anlage"; +"type.leisure.beach_resort" = "Strandbad"; +"type.man_made" = "Künstliche Anlage"; "type.man_made.breakwater" = "Wellenbrecher"; "type.man_made.cairn" = "Steinmännchen"; "type.man_made.chimney" = "Fabrikschornstein"; @@ -1229,7 +1229,7 @@ "type.shop.garden_centre" = "Gartencenter"; "type.shop.gas" = "Gas-Geschäft"; "type.shop.gift" = "Geschenkeladen"; -"type.shop.greengrocer" = "Gemüseladen"; +"type.shop.greengrocer" = "Obst- und Gemüseladen"; "type.shop.grocery" = "Lebensmittelkonserven"; "type.shop.hairdresser" = "Friseur"; "type.shop.hardware" = "Eisenwarengeschäft"; @@ -1382,7 +1382,7 @@ "type.tourism.motel" = "Motel"; "type.tourism.museum" = "Museum"; "type.tourism.picnic_site" = "Picknickplatz"; -"type.leisure.resort" = "Freizeitanlage"; +"type.leisure.resort" = "Resort"; "type.tourism.theme_park" = "Freizeitpark"; "type.tourism.viewpoint" = "Aussichtspunkt"; @@ -1391,11 +1391,11 @@ "type.tourism.zoo" = "Zoo"; "type.tourism.zoo.petting" = "Streichelzoo"; "type.traffic_calming" = "Verkehrsberuhigung"; -"type.traffic_calming.bump" = "kurze Bodenwelle"; -"type.traffic_calming.hump" = "lange Bodenwelle"; +"type.traffic_calming.bump" = "Kurze Bodenwelle"; +"type.traffic_calming.hump" = "Lange Bodenwelle"; "type.waterway" = "Wasserweg"; "type.waterway.canal" = "Kanal"; -"type.waterway.canal.tunnel" = "Kanal"; +"type.waterway.canal.tunnel" = "Kanal-Tunnel"; "type.waterway.fish_pass" = "Fischtreppe"; "type.waterway.dam" = "Staudamm"; "type.barrier.ditch" = "Graben"; @@ -1431,7 +1431,7 @@ "type.piste_type.downhill.easy.area" = "Leichte Ski-Abfahrt"; "type.piste_type.downhill.expert" = "Profi-Ski-Abfahrt"; "type.piste_type.downhill.expert.area" = "Profi-Ski-Abfahrt"; -"type.piste_type.downhill.freeride" = "Ski-Abfahrt"; +"type.piste_type.downhill.freeride" = "Freeride Ski-Abfahrt"; "type.piste_type.downhill.intermediate" = "Mittelschwere Ski-Abfahrt"; "type.piste_type.downhill.intermediate.area" = "Mittelschwere Ski-Abfahrt"; "type.piste_type.downhill.novice" = "Anfängerfreundliche Ski-Abfahrt"; @@ -1439,10 +1439,10 @@ "type.piste_type.nordic" = "Langlaufloipe"; "type.piste_type.sled" = "Rodelbahn"; "type.piste_type.sled.area" = "Rodelbahn"; -"type.piste_type.snow_park" = "Schneepark"; -"type.piste_type.hike" = "Schneewanderweg"; -"type.piste_type.connection" = "Pistenanschluss"; -"type.piste_type.skitour" = "Skitour Pfad"; +"type.piste_type.snow_park" = "Funpark"; +"type.piste_type.hike" = "Winterwanderweg"; +"type.piste_type.connection" = "Verbindungs Ski-Abfahrt"; +"type.piste_type.skitour" = "Skitouren-Route"; "type.amenity.events_venue" = "Veranstaltungszentrum"; "type.shop.auction" = "Auktion"; "type.shop.collector" = "Sammlerartikel"; @@ -1455,7 +1455,7 @@ "type.amenity.social_facility" = "Soziale Einrichtung"; /* https://wiki.openstreetmap.org/wiki/Tag:emergency=emergency_ward_entrance */ -"type.emergency.emergency_ward_entrance" = "Eingang der Notfallstation"; +"type.emergency.emergency_ward_entrance" = "Notaufnahme"; /* https://wiki.openstreetmap.org/wiki/Tag:amenity=dojo */ "type.amenity.dojo" = "Dojo"; @@ -1476,7 +1476,7 @@ "type.natural.wetland.fen" = "Fenn"; "type.natural.wetland.reedbed" = "Schilfgürtel"; "type.natural.wetland.swamp" = "Sumpf"; -"type.natural.wetland.mangrove" = "Mangrove"; +"type.natural.wetland.mangrove" = "Mangroven"; "type.natural.wetland.tidalflat" = "Watt"; "type.leisure.escape_game" = "Escape Room"; "type.amenity.luggage_locker" = "Gepäckschließfach"; @@ -1485,7 +1485,7 @@ "type.post_office.post_partner" = "Postpartner"; "type.barrier.wicket_gate" = "Schlupfpforte"; "type.amenity.animal_shelter" = "Tierheim"; -"type.office.security" = "Büro des Sicherheitsdienstes"; +"type.office.security" = "Sicherheitsdienst"; "type.power.portal" = "Abspannportal"; "type.building.guardhouse" = "Pförtnerhäuschen"; "type.shop.lighting" = "Lampenladen"; diff --git a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings index b5d5cfd58..b6c79d712 100644 --- a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings @@ -12,6 +12,12 @@ /* Settings/Downloader - info for country which started downloading */ "downloading" = "Downloading…"; +/* Title of offline maps explanation */ +"offline_explanation_title" = "Offline Maps"; + +/* Text of offline maps explanation */ +"offline_explanation_text" = "A map needs to be downloaded to view and navigate the area.\nDownload maps for areas you want to travel."; + /* Choose measurement on first launch alert - choose metric system button */ "kilometres" = "Kilometres"; @@ -848,6 +854,7 @@ "avoid_unpaved" = "Avoid unpaved roads"; /* Recommended length for CarPlay and Android Auto is around 25-27 characters */ +"avoid_steps" = "Avoid steps"; "avoid_ferry" = "Avoid ferries"; "avoid_motorways" = "Avoid motorways"; "unable_to_calc_alert_title" = "Unable to calculate route"; diff --git a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.stringsdict b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.stringsdict index 49d72ca18..02970426f 100644 --- a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.stringsdict +++ b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.stringsdict @@ -12,6 +12,8 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + zero + Zero bookmarks one %d bookmark other diff --git a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings index 840e642c6..96bd17c37 100644 --- a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings @@ -16,6 +16,12 @@ /* Settings/Downloader - info for country which started downloading */ "downloading" = "Downloading…"; +/* Title of offline maps explanation */ +"offline_explanation_title" = "Offline Maps"; + +/* Text of offline maps explanation */ +"offline_explanation_text" = "A map needs to be downloaded to view and navigate the area.\nDownload maps for areas you want to travel."; + /* Choose measurement on first launch alert - choose metric system button */ "kilometres" = "Kilometers"; @@ -724,6 +730,7 @@ "editor_remove_place_message" = "Delete added place?"; "editor_remove_place_button" = "Delete"; "editor_place_doesnt_exist" = "Place does not exist"; +"editor_place_doesnt_exist_description" = "Describe what the place looks like now to send an error note to the OpenStreetMap community"; "text_more_button" = "…more"; /* Live traffic data */ @@ -870,6 +877,7 @@ "avoid_unpaved" = "Avoid unpaved roads"; /* Recommended length for CarPlay and Android Auto is around 25-27 characters */ +"avoid_steps" = "Avoid steps"; "avoid_ferry" = "Avoid ferries"; "avoid_motorways" = "Avoid freeways"; "unable_to_calc_alert_title" = "Unable to calculate route"; diff --git a/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings index 031c1c1ec..38d131d5c 100644 --- a/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings @@ -1095,3 +1095,5 @@ "pref_maplanguage_local" = "Kohalik keel"; "existence_confirmed_time_ago" = "Olemasolu on kontrollitud %@"; "hours_confirmed_time_ago" = "Kontrollitud %@"; +"offline_explanation_text" = "Selles piirkonnas liikumiseks ja teekonna juhatamiseks pead vajaliku kaardi alla laadima.\nVali allalaaditav kaart selle piirkonna kohta."; +"offline_explanation_title" = "Ilma võrguühenduseta toimivad kaardid"; diff --git a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.stringsdict b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.stringsdict index 04bd0ba77..3171bdd90 100644 --- a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.stringsdict +++ b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.stringsdict @@ -30,6 +30,8 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + zero + %d tiedostoa löydettiin. one %d tiedosto löydettiin. Näet sen muunnoksen jälkeen. other @@ -46,6 +48,8 @@ NSStringPluralRuleType NSStringFormatValueTypeKey d + zero + %d reittiä one %d reitti other diff --git a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings index a422e878b..b2327a28f 100644 --- a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings @@ -1097,3 +1097,5 @@ "pref_maplanguage_local" = "Langue locale"; "existence_confirmed_time_ago" = "Existence confirmée %@"; "hours_confirmed_time_ago" = "Confirmées %@"; +"offline_explanation_title" = "Cartes hors-ligne"; +"avoid_steps" = "Éviter les escaliers"; diff --git a/iphone/Maps/LocalizedStrings/gsw.lproj/LocalizableTypes.strings b/iphone/Maps/LocalizedStrings/gsw.lproj/LocalizableTypes.strings index e8b2d69db..250c6a259 100644 --- a/iphone/Maps/LocalizedStrings/gsw.lproj/LocalizableTypes.strings +++ b/iphone/Maps/LocalizedStrings/gsw.lproj/LocalizableTypes.strings @@ -404,7 +404,7 @@ "type.highway.cycleway" = "Veloweg"; "type.highway.cycleway.bridge" = "Brugg"; "type.highway.cycleway.permissive" = "Veloweg"; -"type.highway.cycleway.tunnel" = "Tunnel"; +"type.highway.cycleway.tunnel" = "Velotunnel"; "type.highway.elevator" = "Lift"; "type.highway.footway" = "Fuessweg"; "type.highway.footway.sidewalk" = "Trottoir"; @@ -415,14 +415,14 @@ "type.highway.ford" = "Furt"; "type.highway.living_street" = "Begegnigszone"; "type.highway.living_street.bridge" = "Brugg"; -"type.highway.living_street.tunnel" = "Tunnel"; +"type.highway.living_street.tunnel" = "Begegnigszonetunnel"; "type.highway.motorway" = "Autobahn"; "type.highway.motorway.bridge" = "Autobahnbrugg"; "type.highway.motorway.tunnel" = "Autobahntunnel"; "type.highway.motorway_junction" = "Autobahnuusfahrt"; "type.highway.motorway_link" = "Autobahnuffahrt"; "type.highway.motorway_link.bridge" = "Brugg"; -"type.highway.motorway_link.tunnel" = "Tunnel"; +"type.highway.motorway_link.tunnel" = "Autobahnaaschlusstunnel"; "type.highway.path" = "Pfad"; "type.highway.path.difficult" = "Schwierige oder chum erchennbare Pfad"; "type.highway.path.expert" = "Alpinwanderweg oder weglose Pfad"; @@ -441,7 +441,7 @@ "type.highway.primary.tunnel" = "Hauptstrassetunnel"; "type.highway.primary_link" = "Hauptstrass"; "type.highway.primary_link.bridge" = "Brugg"; -"type.highway.primary_link.tunnel" = "Tunnel"; +"type.highway.primary_link.tunnel" = "Strassetunnel"; "type.highway.raceway" = "Rennbahn"; "type.highway.residential" = "Quartierstrass"; "type.highway.residential.area" = "Quartierstrass"; @@ -451,48 +451,48 @@ "type.highway.road" = "Strass"; "type.highway.road.bridge" = "Brugg"; "type.man_made.bridge" = "Brugg"; -"type.highway.road.tunnel" = "Tunnel"; +"type.highway.road.tunnel" = "Strassetunnel"; "type.highway.secondary" = "Kantons-/Staatstrass"; "type.highway.secondary.bridge" = "Brugg"; -"type.highway.secondary.tunnel" = "Tunnel"; +"type.highway.secondary.tunnel" = "Strassetunnel"; "type.highway.secondary_link" = "Strass"; "type.highway.secondary_link.bridge" = "Brugg"; -"type.highway.secondary_link.tunnel" = "Tunnel"; +"type.highway.secondary_link.tunnel" = "Strassetunnel"; "type.highway.service" = "Zuefahrtsweg"; "type.highway.service.area" = "Zuefahrtsweg"; "type.highway.service.bridge" = "Brugg"; "type.highway.service.driveway" = "Grundstückszuefahrt"; "type.highway.service.parking_aisle" = "Zuefahrtsweg"; -"type.highway.service.tunnel" = "Tunnel"; +"type.highway.service.tunnel" = "Strassetunnel"; "type.highway.services" = "Raschtstätt"; "type.highway.speed_camera" = "Blitzer"; "type.highway.steps" = "Stäge"; "type.highway.ladder" = "Leitere"; "type.highway.steps.bridge" = "Brugg"; -"type.highway.steps.tunnel" = "Tunnel"; +"type.highway.steps.tunnel" = "Treppetunnel"; "type.highway.tertiary" = "Gmeindsstrass"; "type.highway.tertiary.bridge" = "Brugg"; -"type.highway.tertiary.tunnel" = "Tunnel"; +"type.highway.tertiary.tunnel" = "Strassetunnel"; "type.highway.tertiary_link" = "Strass"; "type.highway.tertiary_link.bridge" = "Brugg"; -"type.highway.tertiary_link.tunnel" = "Tunnel"; +"type.highway.tertiary_link.tunnel" = "Strassetunnel"; "type.highway.track" = "Forst-/Feldweg"; "type.highway.track.area" = "Forst-/Feldweg"; "type.highway.track.bridge" = "Brugg"; "type.highway.track.grade1" = "Forst-/Feldweg"; "type.highway.track.no.access" = "Forst-/Feldweg"; -"type.highway.track.tunnel" = "Tunnel"; +"type.highway.track.tunnel" = "Feld-/Waldwegtunnel"; "type.highway.traffic_signals" = "Liechtsignal"; "type.highway.trunk" = "Autostrass"; "type.highway.trunk.bridge" = "Autostrassebrugg"; "type.highway.trunk.tunnel" = "Autostrassetunnel"; "type.highway.trunk_link" = "Autostrass"; "type.highway.trunk_link.bridge" = "Brugg"; -"type.highway.trunk_link.tunnel" = "Tunnel"; +"type.highway.trunk_link.tunnel" = "Strassetunnel"; "type.highway.unclassified" = "Näbestrass"; "type.highway.unclassified.area" = "Näbestrass"; "type.highway.unclassified.bridge" = "Brugg"; -"type.highway.unclassified.tunnel" = "Tunnel"; +"type.highway.unclassified.tunnel" = "Strassetunnel"; "type.area_highway.cycleway" = "Veloweg"; "type.area_highway.footway" = "Fuessweg"; "type.area_highway.living_street" = "Begegnigszone"; @@ -680,7 +680,7 @@ "type.natural.water.lake" = "See"; "type.natural.water.lock" = "Schlüüsechammere"; "type.natural.water.pond" = "Teich"; -"type.natural.water.reservoir" = "Reservoir"; +"type.natural.water.reservoir" = "Stausee"; "type.natural.water.basin" = "Bassin"; "type.natural.water.river" = "Fluss"; "type.natural.land" = "Land"; @@ -1184,7 +1184,7 @@ "type.sport.tennis" = "Tennisplatz"; "type.sport.volleyball" = "Volleyball"; "type.sport.10pin" = "Bowling"; -"type.sport.9pin" = "Bowling"; +"type.sport.9pin" = "Chegle"; "type.sport.padel" = "Padel"; "type.sport.futsal" = "Futsal"; "type.sport.ice_hockey" = "Iishockey"; diff --git a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings index 23939cf36..8e99fd7a8 100644 --- a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings @@ -250,7 +250,7 @@ "pref_tts_language_title" = "Talespråk"; /* Settings «Route» category: «Test Voice Directions» title */ -"pref_tts_test_voice_title" = "Test taleanvisninger (TTS, tekst-til-tale)"; +"pref_tts_test_voice_title" = "Test taleanvisninger"; /* Title for "Other" section in TTS settings. */ "pref_tts_other_section_title" = "Andre"; @@ -567,7 +567,7 @@ "add_language" = "Legg til et språk"; /* Editable House Number text field (in address block). */ -"house_number" = "Et husnummer"; +"house_number" = "Husnummer"; "details" = "Detaljer"; /* Text field to enter non-existing street name, below list of known streets around */ @@ -575,8 +575,8 @@ "choose_language" = "Velg et språk"; "choose_street" = "Velg en gate"; "postal_code" = "Postnummer"; -"cuisine" = "Matrett"; -"select_cuisine" = "Velg matrett"; +"cuisine" = "Kjøkken"; +"select_cuisine" = "Velg kjøkken"; /* login text field */ "email_or_username" = "E-postadresse eller brukernavn"; @@ -595,7 +595,7 @@ "editor_add_select_category" = "Velg kategori"; "editor_add_select_category_popular_subtitle" = "Populære"; "editor_add_select_category_all_subtitle" = "Alle kategorier"; -"editor_edit_place_title" = "Redigerer"; +"editor_edit_place_title" = "Redigering"; "editor_add_place_title" = "Legger til"; "editor_edit_place_name_hint" = "Navn på stedet"; @@ -823,7 +823,7 @@ "avoid_ferry" = "Unngå fergeoverganger"; "avoid_motorways" = "Unngå motorveien"; "unable_to_calc_alert_title" = "Kan ikke beregne rute"; -"unable_to_calc_alert_subtitle" = "Dessverre kunne vi ikke finne en rute sannsynligvis på grunn av dine definerte alternativer. Vennligst endre innstillingene og prøv igjen"; +"unable_to_calc_alert_subtitle" = "Kan ikke finne en rute. Dette kan skyldes dine rutealternativer eller ufullstendige OpenStreetMap-data. Endre dine rutealternativer og prøv igjen."; "define_to_avoid_btn" = "Definer veier som skal unngås"; "change_driving_options_btn" = "Kjørealternativer aktivert"; "toll_road" = "Bompengevei"; @@ -905,8 +905,8 @@ "transit_not_found" = "T-bane navigasjon er ikke tilgjengelig i denne regionen ennå"; "dialog_pedestrian_route_is_long_header" = "T-bane rute ikke funnet"; "dialog_pedestrian_route_is_long_message" = "Velg utgangspunkt eller destinasjon som befinner seg nærmere en T-bane stasjon"; -"button_layer_isolines" = "Høyder"; -"isolines_activation_error_dialog" = "For å bruke høydekurver oppdater eller last opp kartet til nødvendig område"; +"button_layer_isolines" = "Høydekurver"; +"isolines_activation_error_dialog" = "Aktivering av høydekurver krever nedlasting av kartdata for dette området"; "isolines_location_error_dialog" = "Høydekurver er ikke tilgjengelige i dette området ennå"; "elevation_profile_diff_level" = "Vanskelighetsgrad"; "elevation_profile_diff_level_easy" = "Lett"; diff --git a/iphone/Maps/LocalizedStrings/nb.lproj/LocalizableTypes.strings b/iphone/Maps/LocalizedStrings/nb.lproj/LocalizableTypes.strings index 965bebbf2..3adef13de 100644 --- a/iphone/Maps/LocalizedStrings/nb.lproj/LocalizableTypes.strings +++ b/iphone/Maps/LocalizedStrings/nb.lproj/LocalizableTypes.strings @@ -15,7 +15,7 @@ "type.aeroway.gate" = "Gate"; "type.aeroway.helipad" = "Helipad"; "type.aeroway.runway" = "Rullebane"; -"type.aeroway.taxiway" = "Taxibane"; +"type.aeroway.taxiway" = "Taksebane"; "type.aeroway.terminal" = "Terminal"; "type.amenity" = "Fasilitet"; "type.amenity.arts_centre" = "Kunstsenter"; @@ -65,7 +65,7 @@ "type.amenity.fast_food" = "Hurtigmat"; "type.amenity.ferry_terminal" = "Ferje"; "type.amenity.fire_station" = "Brannstasjon"; -"type.amenity.food_court" = "Food Court"; +"type.amenity.food_court" = "Mathall"; "type.amenity.fountain" = "Fontene"; "type.amenity.fuel" = "Bensinstasjon"; @@ -141,7 +141,7 @@ "type.recycling.small_appliances" = "Elektronisk avfall"; "type.recycling.cardboard" = "Cardboard"; "type.recycling.cans" = "Cans"; -"type.recycling.shoes" = "Shoes"; +"type.recycling.shoes" = "Sko"; "type.recycling.green_waste" = "Green/Organic Waste"; "type.recycling.cartons" = "Cartons"; "type.amenity.restaurant" = "Restaurant"; @@ -158,7 +158,7 @@ "type.amenity.shelter.basic_hut" = "Bivuakkhytte"; /* A traditional 3-walled shelter (one side open), suitable for overnight camping. */ -"type.amenity.shelter.lean_to" = "Lean-to Shelter"; +"type.amenity.shelter.lean_to" = "Gapahuk"; "type.amenity.public_bath" = "Offentlig bad"; "type.amenity.shower" = "Dusj"; "type.amenity.stripclub" = "Stripklubb"; @@ -171,16 +171,16 @@ "type.amenity.university" = "Universitet"; "type.amenity.vending_machine" = "Vending Machine"; "type.amenity.vending_machine.cigarettes" = "Sigarettautomat"; -"type.amenity.vending_machine.coffee" = "Coffee Dispenser"; +"type.amenity.vending_machine.coffee" = "Kaffeautomat"; "type.amenity.vending_machine.condoms" = "Condoms Dispenser"; "type.amenity.vending_machine.drinks" = "Drikkeautomat"; -"type.amenity.vending_machine.food" = "Food Dispenser"; -"type.amenity.vending_machine.newspapers" = "Newspaper Dispenser"; +"type.amenity.vending_machine.food" = "Matautomat"; +"type.amenity.vending_machine.newspapers" = "Avisautomat"; "type.amenity.vending_machine.parking_tickets" = "Parkeringsautomat"; "type.amenity.vending_machine.public_transport_tickets" = "Billettmaskin for offentlig transport"; -"type.amenity.vending_machine.sweets" = "Sweets Dispenser"; +"type.amenity.vending_machine.sweets" = "Godteriautomat"; "type.amenity.vending_machine.excrement_bags" = "Excrement Bags Dispenser"; -"type.amenity.parcel_locker" = "Parcel Locker"; +"type.amenity.parcel_locker" = "Pakkeboks"; "type.amenity.vehicle_inspection" = "Inspeksjon av kjøretøy"; "type.amenity.vending_machine.fuel" = "Fuel Pump"; "type.amenity.veterinary" = "Veterinær"; @@ -196,33 +196,33 @@ "type.barrier.border_control" = "Grensekontroll"; "type.barrier.chain" = "Chain"; "type.barrier.city_wall" = "Bymur"; -"type.barrier.cycle_barrier" = "Cycle Barrier"; +"type.barrier.cycle_barrier" = "Sykkelbarriere"; "type.waterway.ditch" = "Dreneringsgrøft"; "type.natural.water.moat" = "Vollgrav"; "type.natural.water.wastewater" = "Avløpsvann"; "type.barrier.entrance" = "Inngangspassasje"; "type.barrier.fence" = "Gjerde"; "type.barrier.gate" = "Port"; -"type.barrier.hedge" = "Hedge"; +"type.barrier.hedge" = "Hekk"; "type.barrier.kissing_gate" = "Port"; "type.barrier.lift_gate" = "Bom"; "type.barrier.retaining_wall" = "Retaining Wall"; "type.barrier.stile" = "Gjerdeklyver"; -"type.barrier.turnstile" = "Turnstile"; +"type.barrier.turnstile" = "Rotasjonsport"; "type.barrier.swing_gate" = "Bom"; "type.barrier.toll_booth" = "Bomstasjon"; -"type.barrier.wall" = "Wall"; -"type.boundary" = "Boundary"; -"type.boundary.administrative" = "Administrative Boundary"; +"type.barrier.wall" = "Mur"; +"type.boundary" = "Grense"; +"type.boundary.administrative" = "Administrativ grense"; /* Borders between countries. */ -"type.boundary.administrative.2" = "National Border"; +"type.boundary.administrative.2" = "Landegrense"; /* Country's primary subdivision borders, e.g. between regions, provinces, states.. */ -"type.boundary.administrative.3" = "Regional Boundary"; +"type.boundary.administrative.3" = "Regiongrense"; /* Country's primary subdivision borders, e.g. between regions, provinces, states.. */ -"type.boundary.administrative.4" = "Regional Boundary"; +"type.boundary.administrative.4" = "Regiongrense"; "type.boundary.national_park" = "Nasjonalpark"; "type.boundary.aboriginal_lands" = "Urfolksland"; "type.boundary.protected_area" = "Vernet område"; @@ -240,7 +240,7 @@ "type.building_part" = "Bygning"; "type.building.garage" = "Garasje"; "type.building.train_station" = "Stasjonsbygningen"; -"type.building.warehouse" = "Warehouse"; +"type.building.warehouse" = "Lagerbygning"; "type.cemetery.grave" = "Grav"; "type.craft" = "Håndverk"; "type.craft.beekeeper" = "Birøkter"; @@ -354,7 +354,7 @@ "type.cuisine.vegan" = "Vegansk"; "type.cuisine.vegetarian" = "Vegetarisk"; "type.cuisine.vietnamese" = "Vietnamesisk mat"; -"type.emergency" = "Emergency"; +"type.emergency" = "Nødstilfelle"; "type.emergency.assembly_point" = "Nødsamlingssted"; "type.emergency.defibrillator" = "Hjertestarter"; "type.emergency.fire_hydrant" = "Brannhydrant"; @@ -384,7 +384,7 @@ "type.healthcare.psychotherapist" = "Psykoterapi"; "type.healthcare.sample_collection" = "Prøvetaking"; "type.healthcare.speech_therapist" = "Snakketerapi"; -"type.highway" = "Highway"; +"type.highway" = "Vei"; "type.highway.bridleway" = "Ridevei"; /* These translations are used for all type.highway.*.bridge. */ @@ -410,7 +410,7 @@ /* These translations are used for all type.highway.*.tunnel. */ "type.highway.cycleway.tunnel" = "Tunnel"; -"type.highway.elevator" = "Elevator"; +"type.highway.elevator" = "Heis"; "type.highway.footway" = "Gangvei"; "type.highway.footway.sidewalk" = "Fortau"; "type.highway.footway.crossing" = "Fotgjengerovergang"; @@ -465,7 +465,6 @@ /* These translations are used for all type.highway.*.bridge. */ "type.highway.pedestrian.bridge" = "Bru"; - "type.highway.pedestrian.square" = "Torg"; /* These translations are used for all type.highway.*.tunnel. */ @@ -645,11 +644,11 @@ "type.historic.wayside_cross" = "Veikantkors"; "type.historic.wayside_shrine" = "Helligdom ved veikanten"; "type.historic.wreck" = "Skipsvrak"; -"type.internet_access" = "Internet"; -"type.internet_access.wlan" = "Internet"; -"type.junction" = "Junction"; -"type.junction.circular" = "Roundabout"; -"type.junction.roundabout" = "Roundabout"; +"type.internet_access" = "Internett"; +"type.internet_access.wlan" = "Internett"; +"type.junction" = "Veikryss"; +"type.junction.circular" = "Rundkjøring"; +"type.junction.roundabout" = "Rundkjøring"; "type.landuse" = "Landuse"; "type.landuse.allotments" = "Allotments"; "type.landuse.basin" = "Basseng"; @@ -678,19 +677,19 @@ "type.landuse.greenhouse_horticulture" = "Greenhouse"; "type.landuse.industrial" = "Industrial Area"; "type.landuse.landfill" = "Land-deponi"; -"type.landuse.meadow" = "Meadow"; +"type.landuse.meadow" = "Eng"; "type.landuse.military" = "Military Area"; "type.landuse.orchard" = "Orchard"; "type.landuse.quarry" = "Quarry"; "type.landuse.railway" = "Jernbaneområde"; -"type.landuse.recreation_ground" = "Recreation Ground"; +"type.landuse.recreation_ground" = "Rekreasjonsområde"; "type.landuse.reservoir" = "Vann"; -"type.landuse.residential" = "Residential Area"; +"type.landuse.residential" = "Boligområde"; "type.landuse.retail" = "Retail Area"; "type.landuse.salt_pond" = "Salt Pond"; "type.landuse.village_green" = "Land"; "type.landuse.vineyard" = "Vineyard"; -"type.leisure" = "Leisure"; +"type.leisure" = "Fritid"; "type.leisure.common" = "Public Land"; "type.leisure.dog_park" = "Hundeområde"; "type.leisure.fitness_centre" = "Treningssenter"; @@ -712,7 +711,7 @@ "type.leisure.picnic_table" = "Piknikbord"; "type.leisure.pitch" = "Idrettsplass"; "type.leisure.playground" = "Lekeplass"; -"type.leisure.recreation_ground" = "Recreation Ground"; +"type.leisure.recreation_ground" = "Rekreasjonsområde"; "type.leisure.sauna" = "Badstue"; "type.leisure.slipway" = "Slipway"; "type.leisure.sports_centre" = "Sportssenter"; @@ -726,15 +725,15 @@ "type.leisure.water_park" = "Vannpark"; "type.leisure.beach_resort" = "Beach Resort"; "type.man_made" = "Man Made"; -"type.man_made.breakwater" = "Breakwater"; +"type.man_made.breakwater" = "Molo"; "type.man_made.cairn" = "Cairn"; "type.man_made.chimney" = "Fabrikkpipe"; "type.man_made.cutline" = "Cutline"; "type.man_made.survey_point" = "Survey Point"; -"type.man_made.flagpole" = "Flagpole"; +"type.man_made.flagpole" = "Flaggstang"; "type.man_made.lighthouse" = "Fyr"; "type.man_made.mast" = "Mast"; -"type.man_made.pier" = "Pier"; +"type.man_made.pier" = "Pir"; "type.man_made.pipeline" = "Pipeline"; "type.man_made.pipeline.overground" = "Overground Pipeline"; "type.man_made.silo" = "Silo"; @@ -763,7 +762,7 @@ "type.man_made.works" = "Industrial Works"; "type.military" = "Military"; "type.military.bunker" = "Bunker"; -"type.mountain_pass" = "Mountain Pass"; +"type.mountain_pass" = "Fjellpass"; "type.natural" = "Natur"; /* A rocky land cover. */ @@ -822,8 +821,8 @@ "type.office.lawyer" = "Advokatkontor"; "type.office.ngo" = "NGO-kontor"; "type.office.telecommunication" = "Mobiloperatør"; -"type.organic.only" = "Organic"; -"type.organic.yes" = "Organic"; +"type.organic.only" = "Økologisk"; +"type.organic.yes" = "Økologisk"; "type.place.city" = "By"; "type.place.city.capital" = "Hovedstad"; "type.place.city.capital.10" = "By"; @@ -888,13 +887,13 @@ /* A single pole supporting various public utilities, such as lighting or telephony. */ "type.man_made.utility_pole" = "Utility Pole"; "type.public_transport" = "Offentlig transport"; -"type.public_transport.platform" = "Platform"; +"type.public_transport.platform" = "Plattform"; "type.railway" = "Jernbane"; "type.railway.abandoned" = "Abandoned Railway"; "type.railway.abandoned.bridge" = "Abandoned Railway Bridge"; "type.railway.abandoned.tunnel" = "Abandoned Railway Tunnel"; "type.railway.construction" = "Railway Construction"; -"type.railway.crossing" = "Railway Crossing"; +"type.railway.crossing" = "Jernbaneovergang"; "type.railway.disused" = "Disused Railway"; "type.railway.funicular" = "Kabelbane"; "type.railway.funicular.bridge" = "Funicular Bridge"; @@ -904,7 +903,7 @@ "type.railway.light_rail" = "Light Rail"; "type.railway.light_rail.bridge" = "Light Rail Bridge"; "type.railway.light_rail.tunnel" = "Light Rail Tunnel"; -"type.railway.monorail" = "Monorail"; +"type.railway.monorail" = "Énskinnebane"; "type.railway.monorail.bridge" = "Monorail Bridge"; "type.railway.monorail.tunnel" = "Monorail Tunnel"; "type.railway.narrow_gauge" = "Smalsporet jernbane"; @@ -1065,7 +1064,7 @@ "type.railway.station.subway.wuhan" = "T-bane"; "type.railway.station.subway.yerevan" = "T-bane"; "type.railway.station.subway.yokohama" = "T-bane"; -"type.railway.subway" = "Subway Line"; +"type.railway.subway" = "T-banelinje"; "type.railway.subway.bridge" = "Subway Line Bridge"; "type.railway.subway.tunnel" = "Subway Line Tunnel"; "type.railway.subway_entrance" = "T-bane inngang"; @@ -1186,15 +1185,15 @@ "type.railway.tram.bridge" = "Tram Line Bridge"; "type.railway.tram.tunnel" = "Tram Line Tunnel"; "type.railway.tram_stop" = "Trikkestopp"; -"type.route" = "Route"; -"type.route.ferry" = "Ferry"; +"type.route" = "Rute"; +"type.route.ferry" = "Ferge"; "type.shop" = "Butikk"; "type.shop.alcohol" = "Vinmonopol"; "type.shop.bakery" = "Bakeri"; "type.shop.bathroom_furnishing" = "Baderomsmøbler"; "type.shop.beauty" = "Skjønnhetssalong"; "type.shop.beverages" = "Drinker"; -"type.shop.bicycle" = "Sykkel"; +"type.shop.bicycle" = "Sykkelbutikk"; "type.shop.bookmaker" = "Bookmaker"; "type.shop.books" = "Bokhandel"; "type.shop.butcher" = "Slakter"; @@ -1415,7 +1414,7 @@ "type.waterway.stream.tunnel" = "Elv"; "type.waterway.waterfall" = "Foss"; "type.waterway.weir" = "Weir"; -"type.wheelchair" = "Wheelchair"; +"type.wheelchair" = "Rullestol"; "type.wheelchair.limited" = "Begrenset tilgang for rullestol"; "type.wheelchair.no" = "Ingen tilgang for rullestol"; "type.wheelchair.yes" = "Full tilgang for rullestol"; @@ -1437,10 +1436,10 @@ "type.piste_type.downhill.intermediate.area" = "Downhill Ski Run"; "type.piste_type.downhill.novice" = "Downhill Ski Run"; "type.piste_type.downhill.novice.area" = "Downhill Ski Run"; -"type.piste_type.nordic" = "Nordic Ski Trail"; +"type.piste_type.nordic" = "Langrennsløype"; "type.piste_type.sled" = "Sledding Piste"; "type.piste_type.sled.area" = "Sledding Piste"; -"type.piste_type.snow_park" = "Snow Park"; +"type.piste_type.snow_park" = "Snøpark"; "type.piste_type.hike" = "Tursti i snø"; "type.piste_type.connection" = "Pisteforbindelse"; "type.piste_type.skitour" = "Skitour-stien"; @@ -1463,26 +1462,26 @@ /* https://wiki.openstreetmap.org/wiki/Tag:leisure=sports_hall */ "type.leisure.sports_hall" = "Idrettshall"; -"type.leisure.firepit" = "Firepit"; -"type.natural.wetland.tidalflat" = "Tidal Flat"; +"type.leisure.firepit" = "Bålplass"; +"type.natural.wetland.tidalflat" = "Tidevannslette"; "type.sport.diving" = "High Diving"; -"type.highway.ladder" = "Ladder"; -"type.natural.wetland.swamp" = "Swamp"; +"type.highway.ladder" = "Stige"; +"type.natural.wetland.swamp" = "Sumpskog"; "type.man_made.crane" = "Crane"; "type.natural.wetland.saltmarsh" = "Salt Marsh"; "type.natural.wetland.mangrove" = "Mangrove"; -"type.barrier.guard_rail" = "Guard Rail"; +"type.barrier.guard_rail" = "Autovern"; "type.amenity.studio" = "Studio"; "type.natural.wetland.fen" = "Fen"; "type.natural.wetland.saltmarsh.tidal" = "Tidal Salt Marsh"; "type.natural.wetland.reedbed" = "Reed Bed"; -"type.railway.station.subway.qingdao" = "Subway Station"; +"type.railway.station.subway.qingdao" = "T-banestasjon"; "type.landuse.plant_nursery" = "Plant Nursery"; "type.amenity.love_hotel" = "Love Hotel"; "type.leisure.escape_game" = "Escape Room"; -"type.amenity.luggage_locker" = "Luggage Locker"; +"type.amenity.luggage_locker" = "Bagasjeoppbevaring"; "type.amenity.ranger_station" = "Ranger Station"; -"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking"; +"type.amenity.bicycle_parking.covered" = "Overbygd sykkelparkering"; "type.post_office.post_partner" = "Post Partner"; "type.barrier.wicket_gate" = "Wicket gate"; "type.amenity.animal_shelter" = "Animal Shelter"; diff --git a/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings index 6c540d8a5..4043fea42 100644 --- a/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings @@ -1097,3 +1097,4 @@ "pref_maplanguage_local" = "Idioma local"; "existence_confirmed_time_ago" = "Existência confirmada %@"; "hours_confirmed_time_ago" = "Confirmado %@"; +"avoid_steps" = "Evitar degraus"; diff --git a/iphone/Maps/LocalizedStrings/ro.lproj/LocalizableTypes.strings b/iphone/Maps/LocalizedStrings/ro.lproj/LocalizableTypes.strings index fff888c46..21e7544e9 100644 --- a/iphone/Maps/LocalizedStrings/ro.lproj/LocalizableTypes.strings +++ b/iphone/Maps/LocalizedStrings/ro.lproj/LocalizableTypes.strings @@ -10,7 +10,7 @@ "type.aerialway.station" = "Stație de teleferic"; "type.aeroway" = "Infrastructura spațiului aerian"; "type.aeroway.aerodrome" = "Aeroport"; -"type.aeroway.aerodrome.international" = "Aeroport"; +"type.aeroway.aerodrome.international" = "Aeroport Internațional"; "type.aeroway.apron" = "Parcare aeronave"; "type.aeroway.gate" = "Poartă"; "type.aeroway.helipad" = "Heliport"; @@ -1397,7 +1397,7 @@ "type.waterway.canal" = "Canal"; "type.waterway.canal.tunnel" = "Tunel de canal"; "type.waterway.fish_pass" = "Scară de pește"; -"type.waterway.dam" = "Dam"; +"type.waterway.dam" = "Baraj"; "type.barrier.ditch" = "Șanț"; "type.natural.water.ditch" = "Șanț de drenaj"; "type.waterway.ditch.tunnel" = "Canal de scurgere"; diff --git a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings index 20c3f2533..3341ff9d3 100644 --- a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings @@ -558,7 +558,7 @@ "osm_profile_remove" = "Убрать аккаунт OpenStreetMap"; "osm_profile_register_promt" = "Не зарегистрированы в OpenStreetMap?"; "osm_profile_register" = "Зарегистрироваться"; -"osm_profile_verfied_changes" = "Учтённые правки"; +"osm_profile_verfied_changes" = "Учтенные правки"; "osm_profile_logout" = "Выйти из аккаунта OpenStreetMap"; "osm_profile_delete" = "Удалить аккаунт OpenStreetMap"; @@ -593,7 +593,7 @@ "common_check_internet_connection_dialog" = "Проверьте настройки и убедитесь, что устройство подключено к интернету."; "downloader_no_space_title" = "Недостаточно места"; "downloader_no_space_message" = "Удалите ненужные данные"; -"editor_profile_changes" = "Учтённые правки"; +"editor_profile_changes" = "Учтенные правки"; "editor_focus_map_on_location" = "Перетащите карту, чтобы поместить крестик на место расположения добавляемого объекта или заведения."; "editor_add_select_category" = "Выбрать категорию"; "editor_add_select_category_popular_subtitle" = "Популярные"; diff --git a/iphone/Maps/LocalizedStrings/sl.lproj/InfoPlist.strings b/iphone/Maps/LocalizedStrings/sl.lproj/InfoPlist.strings index 0bed6ab4c..e6a3b6925 100644 --- a/iphone/Maps/LocalizedStrings/sl.lproj/InfoPlist.strings +++ b/iphone/Maps/LocalizedStrings/sl.lproj/InfoPlist.strings @@ -1,2 +1,3 @@ "search" = "Išči"; "route" = "Pot"; +"bookmarks_and_tracks" = "Zaznamki in poti"; diff --git a/iphone/Maps/LocalizedStrings/sl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sl.lproj/Localizable.strings index f8265f68a..31fa18866 100644 --- a/iphone/Maps/LocalizedStrings/sl.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/sl.lproj/Localizable.strings @@ -3,3 +3,331 @@ "delete" = "Izbriši"; "core_my_places" = "Moji kraji"; "core_my_position" = "Moj položaj"; +"kilometres" = "Kilometri"; +"downloading" = "Prenašam …"; +"miles" = "Milje"; +"download_maps" = "Prenesi zemljevide"; +"later" = "Kasneje"; +"close" = "Blizu"; +"about_headline" = "Odprt projekt, ki ga vzdržuje skupnost"; +"country_status_download_failed" = "Prenos ni uspel"; +"zoom_to_country" = "Pokaži na zemljevidu"; +"download" = "Prenesi"; +"dialog_routing_location_turn_on" = "Omogoči lokacijske storitve"; +"add_new_set" = "Dodaj nov seznam"; +"continue_button" = "Nadaljuj"; +"error_enter_correct_house_number" = "Vnesite veljavno številko stavbe"; +"bookmark_set_name" = "Ime seznama zaznamkov"; +"bookmarks" = "Zaznamki"; +"category_toilet" = "Stranišče"; +"category_shopping" = "Nakupovanje"; +"category_post" = "Pošta"; +"category_eat" = "Kje jesti"; +"category_water" = "Voda"; +"category_rv" = "Prostori za avtodome"; +"category_recycling" = "Ekološki otok"; +"load_kmz_failed" = "Zaznamkov ni bilo mogoče naložiti. Datoteka je morda okvarjena."; +"category_parking" = "Parkiranje"; +"category_children" = "Družinske počitnice"; +"unknown_current_position" = "Vaša lokacija še ni znana"; +"edit" = "Uredi"; +"category_bank" = "Banka"; +"category_transport" = "Javni prevoz"; +"category_nightlife" = "Nočno življenje"; +"load_kmz_successful" = "Zaznamki so uspešno naloženi! Najdete jih lahko na zemljevidu ali v upravitelju zaznamkov."; +"category_food" = "Špecerija"; +"category_pharmacy" = "Lekarna"; +"category_secondhand" = "Rabljeno blago"; +"category_police" = "Policija"; +"category_atm" = "Bankomat"; +"measurement_units" = "Merske enote"; +"category_hospital" = "Bolnišnica"; +"address" = "Naslov"; +"category_entertainment" = "Zabava"; +"category_tourism" = "Znamenitosti"; +"settings" = "Nastavitve"; +"category_hotel" = "Hotel"; +"category_fuel" = "Gorivo"; +"load_kmz_title" = "Nalagam zaznamke"; +"share_my_location" = "Deli mojo lokacijo"; +"save" = "Shrani"; +"my_position_share_email_subject" = "Živjo, poglej si mojo trenutno lokacijo na zemljevidu CoMaps!"; +"placepage_distance" = "Razdalja"; +"downloader_status_maps" = "Zemljevidi"; +"rate_the_app" = "Ocenite aplikacijo"; +"downloader_retry" = "Poskusi znova"; +"brown" = "Rjava"; +"pref_tts_street_names_title" = "Najavi imena ulic"; +"website" = "Spletišče"; +"prefs_group_route" = "Navigacija"; +"news" = "Novice"; +"gray" = "Siva"; +"downloader_downloading" = "Prenašam:"; +"pink" = "Rožnata"; +"on" = "Vklopljeno"; +"email" = "E-pošta"; +"routing_download_maps_along" = "Prenesite vse zemljevide, čez katere gre vaša relacija"; +"downloader_update_all_button" = "Posodobi vse"; +"search_show_on_map" = "Poglej na zemljevidu"; +"off" = "Izklopljeno"; +"help" = "Pomoč"; +"pref_zoom_title" = "Gumbi za povečavo"; +"downloader_near_me_subtitle" = "V moji bližini"; +"pref_map_3d_title" = "Pogled iz perspektive"; +"faq" = "Pogosta vprašanja"; +"bookmark_share_email_subject" = "Živjo, oglej si tale kraj na CoMaps!"; +"pref_map_3d_buildings_disabled_summary" = "3D stavbe so onemogočene v načinu varčevanja z energijo"; +"pref_map_3d_buildings_title" = "3D stavbe"; +"downloader_download_map" = "Prenesite zemljevid"; +"deep_orange" = "Temno oranžna"; +"pref_tts_street_names_description" = "Ko je to omogočeno, bodo na glas izgovorjena imena ulic ali izvozov, na katere morate zaviti."; +"deep_purple" = "Temno vijolična"; +"orange" = "Oranžna"; +"pref_tts_test_voice_title" = "Preizkusi glasovne napotke"; +"green" = "Zelena"; +"yellow" = "Rumena"; +"downloader_queued" = "V čakalni vrsti"; +"light_blue" = "Svetlo modra"; +"downloader_delete_map" = "Izbriši zemljevid"; +"red" = "Rdeča"; +"lime" = "Rumenozelena"; +"cyan" = "Cijan"; +"teal" = "Zelenomodra"; +"pref_map_auto_zoom" = "Samodejno približaj"; +"pref_tts_language_title" = "Jezik glasu"; +"auto" = "Samodejno"; +"donate" = "Doniraj"; +"downloader_download_all_button" = "Prenesi vse"; +"dialog_routing_disclaimer_title" = "Ko potujete po relaciji, imejte v mislih, da:"; +"tracks_title" = "Poti"; +"long_tap_toast" = "Spet za dlje časa pritisnite na zemljevid, da se prikaže vmesnik"; +"routing_failed_cross_mwm_building" = "Lahko ustvarite samo relacije, ki so vsebovane v zemljevidu enega območja."; +"blue_gray" = "Modrosiva"; +"report_a_bug" = "Prijavite napako"; +"copyright" = "Avtorske pravice"; +"length" = "Dolžina"; +"purple" = "Vijolična"; +"bookmarks_and_tracks" = "Zaznamki in poti"; +"downloader_downloaded_subtitle" = "Preneseni zemljevidi"; +"blue" = "Modra"; +"done" = "Končano"; +"routing_requires_all_map" = "Preden lahko ustvarite relacijo, morate prenesti in posodobiti vse zemljevide med vašo lokacijo in končnim ciljem."; +"dialog_routing_disclaimer_priority" = "— imajo stanje na cesti, cestnoprometni predpisi in prometni znaki vedno prednost pred navigacijskimi predlogi;"; +"dialog_routing_disclaimer_precision" = "— je lahko zemljevid nenatančen in predlagana pot ni vedno najbolj optimalna;"; +"dialog_routing_disclaimer_recommendations" = "— so predlagane relacije zgolj in samo priporočila;"; +"dialog_routing_check_gps" = "Preveri signal GPS"; +"dialog_routing_location_turn_wifi" = "Preverite svoj signal GPS. Vašo lokacijo se bo dalo natančneje določiti, če omogočite Wi-Fi."; +"dialog_routing_error_location_not_found" = "Relacije ni bilo mogoče ustvariti. Ne morem določiti trenutnih koordinat GPS."; +"dialog_routing_disclaimer_borders" = "— morate biti previdni ob mejah: poti, ki jih začrta naša aplikacija, lahko včasih peljejo čez državne meje na nedovoljenih krajih."; +"dialog_routing_disclaimer_beware" = "Na cesti bodite pozorni in poskrbite za varnost!"; +"dialog_routing_location_unknown_turn_on" = "Ni bilo mogoče določiti trenutnih koordinat GPS. Za izračun relacije morate vklopiti lokacijske storitve."; +"categories" = "Kategorije"; +"p2p_from_here" = "Relacija iz"; +"dialog_routing_download_cross_route" = "Prenesite dodatne zemljevide, da ustvarite boljšo relacijo, ki vodi izven tega zemljevida."; +"editor_time_title" = "Obratovalni čas"; +"select_cuisine" = "Izberite vrsto kuhinje"; +"day_off" = "Zaprto"; +"editor_time_delete" = "Izbriši urnik"; +"p2p_start" = "Začetek"; +"p2p_reroute_from_current" = "Ali želite sestaviti načrt poti z vaše trenutne lokacije?"; +"p2p_your_location" = "Vaša lokacija"; +"add_language" = "Dodaj jezik"; +"editor_time_advanced" = "Napredni način"; +"add_street" = "Dodaj ulico"; +"editor_example_values" = "Primeri vrednosti"; +"dialog_routing_change_start_or_end" = "Prilagodite svoje izhodišče ali cilj."; +"dialog_routing_change_end" = "Prilagodi cilj"; +"choose_street" = "Izberite ulico"; +"p2p_to_here" = "Relacija v"; +"read_in_wikipedia" = "Wikipedija"; +"editor_report_problem_send_button" = "Pošlji"; +"editor_time_allday" = "Ves dan (24 ur)"; +"daily" = "Vsak dan"; +"editor_hours_closed" = "Dela prost čas"; +"dialog_routing_end_not_determined" = "Relacija ni bila ustvarjena. Ne morem najti cilja."; +"details" = "Podrobnosti"; +"editor_add_select_location" = "Izberi lokacijo"; +"hide" = "Skrij"; +"dialog_routing_select_closer_start" = "Izberite izhodišče, ki je bližje cesti."; +"level" = "Nadstropje"; +"day_off_today" = "Danes zaprto"; +"history" = "Zgodovina"; +"closed" = "Zaprto"; +"editor_time_close" = "Zaprto"; +"editor_time_add" = "Dodaj urnik"; +"autodownload" = "Samodejno prenesi zemljevide"; +"dialog_routing_system_error" = "Sistemska napaka"; +"dialog_routing_download_and_build_cross_route" = "Bi želeli prenesti zemljevid, da izračunam ugodnejšo relacijo, ki vodi čez več kot en zemljevid?"; +"dialog_routing_start_not_determined" = "Relacija ni bila ustvarjena. Ne morem najti izhodišča."; +"dialog_routing_unable_locate_route" = "Ni bilo mogoče najti relacije"; +"cuisine" = "Kuhinja"; +"twentyfour_seven" = "24/7"; +"editor_time_add_closed" = "Dodaj dela prost čas"; +"dialog_routing_try_again" = "Poskusite znova"; +"clear_search" = "Počisti zgodovino iskanja"; +"edit_place" = "Uredi kraj"; +"search_history_title" = "Zgodovina iskanja"; +"house_number" = "Hišna številka"; +"show" = "Pokaži"; +"choose_language" = "Izberite jezik"; +"dialog_routing_change_start" = "Prilagodi izhodišče"; +"wikimedia_commons" = "Wikimedijina zbirka"; +"search_not_found_query" = "Prenesite območje, po katerem iščete, ali poskusite dodati ime bližnjega mesta/naselja."; +"editor_time_open" = "Odprto"; +"editor_time_simple" = "Preprosti način"; +"downloader_no_space_message" = "Prosimo, izbrišite vse nepotrebne podatke"; +"downloader_search_field_hint" = "Najdi zemljevid"; +"downloader_no_space_title" = "Ni dovolj prostora"; +"downloader_update_maps" = "Posodobi zemljevide"; +"editor_profile_changes" = "Potrjene spremembe"; +"message_invalid_feature_position" = "Tukaj ni mogoče postaviti objekta"; +"editor_edit_place_title" = "Urejanje"; +"editor_default_language_hint" = "Kot je zapisano v lokalnem jeziku"; +"editor_edit_place_category_title" = "Kategorija"; +"editor_focus_map_on_location" = "Povlecite zemljevid tako, da bo križ na lokaciji kraja ali podjetja."; +"editor_edit_place_name_hint" = "Ime kraja"; +"editor_add_place_title" = "Dodajanje"; +"editor_more_about_osm" = "Več o OpenStreetMap"; +"editor_other_info" = "Komentar za prostovoljce na OpenStreetMap (neobvezno)"; +"error_enter_correct_zip_code" = "Vnesite veljavno poštno številko"; +"downloader_of" = "%1$d od %2$d"; +"editor_operator" = "Izvajalec"; +"error_enter_correct_storey_number" = "Število nadstropij ne sme preseči %d"; +"download_over_mobile_header" = "Naj prenesem prek povezave mobilnega omrežja?"; +"editor_zip_code" = "Poštna številka"; +"editor_category_unsuitable_title" = "Ne najdete primerne kategorije?"; +"editor_category_unsuitable_text" = "CoMaps dovoljuje dodajanje preprostih točkovnih kategorij, ne pa mest, cest, jezer, obrisov stavb itd. Tovrstne kategorije dodajte neposredno na OpenStreetMap.org. Natančna navodila si preberite v vodiču."; +"routing_add_start_point" = "Uporabite iskanje ali pritisnite točko na zemljevidu, da dodate izhodišče relacije"; +"export_file" = "Izvozi KMZ"; +"editor_reset_edits_button" = "Zavrzi"; +"power_managment_setting_never" = "Nikoli"; +"pref_tts_speedcams_always" = "Vedno opozori"; +"placepage_personal_notes_hint" = "Zasebne beležke (besedilo ali HTML)"; +"placepage_add_place_button" = "Dodaj kraj na OpenStreetMap"; +"enable_logging" = "Omogoči dnevniške zapise"; +"mobile_data" = "Mobilni internet"; +"delete_list" = "Izbriši seznam"; +"terms_of_use" = "Pogoji uporabe"; +"saved" = "Shranjeno"; +"hour" = "h"; +"bookmarks_import" = "Uvozi zaznamke in poti"; +"bookmark_lists_hide_all" = "Skrij vse"; +"restore" = "Obnovi"; +"power_managment_title" = "Način varčevanja z energijo"; +"mobile_data_dialog" = "Naj pridobim podrobne informacije prek mobilnega interneta?"; +"mobile_data_option_ask" = "Vedno vprašaj"; +"mobile_data_option_always" = "Vedno uporabi"; +"decline" = "Zavrni"; +"downloader_no_downloaded_maps_title" = "Prenesli niste nobenih zemljevidov"; +"export_file_gpx" = "Izvozi GPX"; +"bookmarks_error_title_share_empty" = "Napaka pri deljenju"; +"planning_route_manage_route" = "Upravljaj relacijo"; +"navigation_stop_button" = "Ustavi"; +"power_managment_setting_manual_max" = "Vedno"; +"bookmark_lists" = "Seznami"; +"kilometers_per_hour" = "km/h"; +"editor_remove_place_button" = "Izbriši"; +"editor_share_to_all_dialog_title" = "Ali to želite poslati vsem uporabnikom?"; +"mobile_data_option_not_today" = "Ne uporabi danes"; +"error_enter_correct_web" = "Vnesite veljaven spletni naslov"; +"editor_place_doesnt_exist" = "Kraj ne obstaja"; +"pref_tts_speedcams_auto" = "Opozori pri prehitri vožnji"; +"privacy_policy" = "Politika zasebnosti"; +"routing_add_finish_point" = "Uporabite iskanje ali pritisnite točko na zemljevidu, da dodate cilj"; +"mobile_data_option_today" = "Samo danes"; +"miles_per_hour" = "mph"; +"bookmarks_error_title_list_name_already_taken" = "To ime je že zasedeno"; +"placepage_add_stop" = "Dodaj postanek"; +"bookmarks_create_new_group" = "Ustvarite nov seznam"; +"placepage_edit_bookmark_button" = "Uredi zaznamek"; +"error_enter_correct_phone" = "Vnesite veljavno telefonsko številko"; +"error_enter_correct_name" = "Vnesite pravilno ime"; +"pref_tts_speedcams_never" = "Nikoli ne opozori"; +"place_description_title" = "Opis kraja"; +"placepage_remove_stop" = "Odstrani postanek"; +"editor_comment_hint" = "Komentar …"; +"layers_title" = "Slogi in plasti zemljevida"; +"power_managment_setting_auto" = "Kadar zmanjkuje energije"; +"bookmarks_error_message_empty_list_name" = "Vnesite ime seznama"; +"error_enter_correct_email" = "Vnesite veljaven e-poštni naslov"; +"accept" = "Potrdi"; +"editor_remove_place_message" = "Naj izbrišem dodane kraje?"; +"editor_reset_edits_message" = "Naj zavržem vse krajevne spremembe?"; +"day" = "d"; +"bookmarks_error_message_share_empty" = "Ni mogoče deliti praznega seznama"; +"big_font" = "Povečajte velikost oznak na zemljevidu"; +"button_plan" = "Načrtuj"; +"bookmarks_error_message_share_general" = "Ni bilo mogoče deliti zaradi aplikacijske napake"; +"traffic_data_unavailable" = "Prometni podatki niso na voljo"; +"mobile_data_option_never" = "Nikoli ne uporabi"; +"profile" = "Profil OpenStreetMap"; +"transliteration_title" = "Prečrkuj v latinico"; +"speedcams_alert_title" = "Radarji"; +"placepage_more_button" = "Več"; +"minute" = "min"; +"bookmark_lists_show_all" = "Pokaži vse"; +"trip_finished" = "Prispeli ste na cilj!"; +"downloader_loading_ios" = "Prenašam"; +"money" = "Denar"; +"avoid_tolls" = "Brez cestnin"; +"isolines_activation_error_dialog" = "Plastnice lahko omogočite šele, ko prenesete kartografske podatke za to območje"; +"shops" = "Trgovine"; +"isolines_location_error_dialog" = "Plastnice za to območje še niso na voljo"; +"transit_not_found" = "V tem območju navigacija s podzemno železnico še ni na voljo"; +"food_places" = "Hrana"; +"avoid_motorways" = "Brez avtocest"; +"parks" = "Parki"; +"no" = "Ne"; +"moremonth_ago_sorttype" = "Pred več kot mesecem"; +"unable_to_calc_alert_subtitle" = "Ni bilo mogoče najti relacije. Mogoče so krive vaše zahteve za pot ali pa nepopolni podatki OpenStreetMap. Prosimo, spremenite možnosti relacije in poskusite ponovno."; +"medicine" = "Zdravstvo"; +"ferry_crossing" = "Plovba s trajektom"; +"others_sorttype" = "Drugo"; +"parkings" = "Parkiranje"; +"yes" = "Da"; +"dialog_pedestrian_route_is_long_header" = "Ne najdem relacije s podzemno železnico"; +"unpaved_road" = "Netlakovana cesta"; +"search_in_the_list" = "Išči po seznamu"; +"elevation_profile_ascent" = "Vzpon"; +"animals" = "Živali"; +"ok" = "V redu"; +"isolines_toast_zooms_1_10" = "Približajte, da si ogledate izočrte"; +"elevation_profile_descent" = "Spust"; +"hotels" = "Hoteli"; +"unable_to_calc_alert_title" = "Ne morem izračunati poti"; +"near_me_sorttype" = "V moji bližini"; +"change_driving_options_btn" = "Možnosti relacije so omogočene"; +"enable_logging_warning_message" = "Začasno omogočite to možnost, da zabeležite in nam ročno pošljete podrobne diagnostične podatke o svoji težave prek gumba \"Prijavite napako\" v dialogu za pomoč. Beleženi podatki lahko vključujejo tudi informacije o lokaciji."; +"elevation_profile_max_elevation" = "Maks. višina"; +"week_ago_sorttype" = "Pred enim tednom"; +"driving_options_title" = "Možnosti relacije"; +"avoid_unpaved" = "Brez netlakovanih cest"; +"mountains" = "Gore"; +"buildings" = "Stavbe"; +"month_ago_sorttype" = "Pred enim mesecem"; +"museums" = "Muzeji"; +"sort" = "Uredi …"; +"swim_places" = "Plavanje"; +"no_available" = "Ne"; +"fuel_places" = "Bencinske črpalke"; +"dialog_pedestrian_route_is_long_message" = "Izberite začetno ali končno točko, ki je bližje postaji podzemne železnice"; +"avoid_ferry" = "Brez trajektov"; +"elevation_profile_min_elevation" = "Min. višina"; +"tourist_places" = "Znamenitosti"; +"define_to_avoid_btn" = "Definirajte, katerim cestam naj se izognemo"; +"toll_road" = "Cesta s cestnino"; +"moreyear_ago_sorttype" = "Pred več kot letom"; +"religious_places" = "Verski kraji"; +"button_layer_isolines" = "Plastnice"; +"yes_available" = "Da"; +"app_tip_05" = "Ali ste vedeli, da lahko na zemljevidu izberete svojo trenutno lokacijo?"; +"app_tip_03" = "Če poznate kakega_o razvijalca_ko programske opreme, ga_jo lahko prosite, da implementira funkcionalnost, ki jo potrebujete."; +"app_tip_09" = "Naš cilj je ustvariti učinkovite in enostavne zemljevide, ki spoštujejo zasebnost in vam koristijo."; +"app_tip_08" = "Enostavno lahko popravite in izboljšate kartografske podatke."; +"app_tip_07" = "Našo aplikacijo razvija nekaj zanesenjakov in skupnost."; +"app_tip_06" = "Lahko nam pomagate prevesti našo aplikacijo v svoj jezik."; +"car_used_on_the_phone_screen" = "CoMaps zdaj uporabljate na zaslonu telefona"; +"app_tip_02" = "Ali vam je naša aplikacija všeč? Vabimo vas, da finančno podprete njen razvoj! Ali niste zadovoljni z njo? Prosimo, da nam sporočite, zakaj, in jo bomo popravili!"; +"app_tip_04" = "S kratkim pritiskom na zemljevid lahko izberete kateri koli element. Z dolgim pritiskom lahko skrijete ali pokažete vmesnik."; +"app_tip_01" = "Z vašo podporo lahko ustvarimo najboljše zemljevide na svetu!"; +"app_tip_00" = "Hvala, ker uporabljate naše javno narejene zemljevide!"; diff --git a/iphone/Maps/LocalizedStrings/sl.lproj/Localizable.stringsdict b/iphone/Maps/LocalizedStrings/sl.lproj/Localizable.stringsdict index aabb70586..dd86d45cc 100644 --- a/iphone/Maps/LocalizedStrings/sl.lproj/Localizable.stringsdict +++ b/iphone/Maps/LocalizedStrings/sl.lproj/Localizable.stringsdict @@ -5,7 +5,7 @@ bookmarks_places NSStringLocalizedFormatKey - bookmarks_places + %#@value@ diff --git a/iphone/Maps/LocalizedStrings/sl.lproj/LocalizableTypes.strings b/iphone/Maps/LocalizedStrings/sl.lproj/LocalizableTypes.strings index dc9452498..8d565e07f 100644 --- a/iphone/Maps/LocalizedStrings/sl.lproj/LocalizableTypes.strings +++ b/iphone/Maps/LocalizedStrings/sl.lproj/LocalizableTypes.strings @@ -1,2 +1,5 @@ "type.aerialway" = "Žičnica"; "type.addr_interpolation.odd" = "Naslov/blok"; +"type.addr_interpolation" = "Naslov/blok"; +"type.aerialway.cable_car" = "Žičnica"; +"type.cuisine.noodles" = "Nudli"; diff --git a/iphone/Maps/LocalizedStrings/tr.lproj/LocalizableTypes.strings b/iphone/Maps/LocalizedStrings/tr.lproj/LocalizableTypes.strings index 4542c2199..72239643a 100644 --- a/iphone/Maps/LocalizedStrings/tr.lproj/LocalizableTypes.strings +++ b/iphone/Maps/LocalizedStrings/tr.lproj/LocalizableTypes.strings @@ -1476,8 +1476,8 @@ "type.railway.station.subway.qingdao" = "Metro İstasyonu"; "type.natural.wetland.swamp" = "Bataklık"; "type.natural.wetland.mangrove" = "Mangrove"; -"type.natural.wetland.reedbed" = "Reed Bed"; -"type.leisure.escape_game" = "Escape Room"; +"type.natural.wetland.reedbed" = "Sazlık"; +"type.leisure.escape_game" = "Kaçış odası"; "type.amenity.luggage_locker" = "Emanet Eşya Dolabı"; "type.amenity.bicycle_parking.covered" = "Üstü kapalı bisiklet park alanı"; "type.post_office.post_partner" = "Posta Ortağı"; @@ -1488,3 +1488,4 @@ "type.office.security" = "Güvenlik Görevlisi Ofisi"; "type.power.portal" = "Elektrik Portalı"; "type.building.guardhouse" = "Güvenlik Kulübesi"; +"type.shop.lighting" = "Aydınlatma dükkanı"; diff --git a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings index 277a1cd0c..319f51396 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings @@ -205,7 +205,7 @@ "share_my_location" = "分享我的位置"; "prefs_group_route" = "导航"; "pref_zoom_title" = "缩放按钮"; -"pref_left_button_type" = "Left Main Button"; +"pref_left_button_type" = "左侧主按钮"; /* Settings «Map» category: «Appearance» title */ "pref_appearance_title" = "外观"; diff --git a/iphone/Maps/Model/Settings Types/LeftButtonType.swift b/iphone/Maps/Model/Settings Types/LeftButtonType.swift index b34837acd..11f32d348 100644 --- a/iphone/Maps/Model/Settings Types/LeftButtonType.swift +++ b/iphone/Maps/Model/Settings Types/LeftButtonType.swift @@ -39,7 +39,7 @@ extension Settings { case .addPlace: return UIImage(systemName: "plus", withConfiguration: configuration)! case .recordTrack: - return UIImage.MainButtons.LeftButton.recordTrack.withConfiguration(configuration) + return UIImage(named: "track", in: nil, with: configuration)! case .settings: return UIImage(systemName: "gearshape.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 22, weight: .semibold))! case .help: diff --git a/iphone/Maps/Model/Settings.swift b/iphone/Maps/Model/Settings.swift index b5e59c74e..e72ae6941 100644 --- a/iphone/Maps/Model/Settings.swift +++ b/iphone/Maps/Model/Settings.swift @@ -407,6 +407,21 @@ import Combine } + /// If steps should be avoided during routing + @objc static var shouldAvoidStepsWhileRouting: Bool { + get { + return RoutingOptions().avoidSteps + } + set { + let routingOptions = RoutingOptions() + routingOptions.avoidSteps = newValue + routingOptions.save() + + NotificationCenter.default.post(name: routingOptionsChangedNotificationName, object: nil) + } + } + + /// If live traffic data should be used @objc static var hasLiveTraffic: Bool { get { diff --git a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift index 7c0346d3c..9fdcc3879 100644 --- a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift +++ b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift @@ -116,13 +116,7 @@ extension BottomMenuPresenter { title: L("placepage_add_place_button"), enabled: enabled) case .recordTrack: - switch trackRecorder.recordingState { - case .inactive: - cell.configure(imageName: "track_recorder_inactive", title: L("start_track_recording")) - case .active: - cell.configure(imageName: "track_recorder_active", title: L("stop_track_recording")) - } - return cell + cell.configure(imageName: "track", title: L("start_track_recording")) case .downloadMaps: cell.configure(imageName: "ic_menu_download", title: L("download_maps"), diff --git a/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuItemCell.swift b/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuItemCell.swift index 17f3479ac..fd22814f8 100644 --- a/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuItemCell.swift +++ b/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuItemCell.swift @@ -21,7 +21,9 @@ class BottomMenuItemCell: UITableViewCell { icon.image = Settings.LeftButtonType.help.image } else if imageName == "plus" { icon.image = Settings.LeftButtonType.addPlace.image - } else if imageName == "track_recorder_inactive" || imageName == "track_recorder_active" || imageName == "ic_menu_download" || imageName == "ic_menu_donate" { + } else if imageName == "track" { + icon.image = Settings.LeftButtonType.recordTrack.image + } else if imageName == "ic_menu_download" || imageName == "ic_menu_donate" { icon.image = UIImage(named: imageName) } else { let configuration = UIImage.SymbolConfiguration(pointSize: 22, weight: .semibold) diff --git a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarButton.swift b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarButton.swift index cad9aef3b..18fb21e61 100644 --- a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarButton.swift +++ b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarButton.swift @@ -24,9 +24,6 @@ class BottomTabBarButtonRenderer { if let coloring = style.coloring { control.coloring = coloring } - if let imageName = style.mwmImage { - control.imageName = imageName - } if let backgroundColor = style.backgroundColor { control.backgroundColor = backgroundColor } diff --git a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarInteractor.swift b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarInteractor.swift index c980a55d8..36d001298 100644 --- a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarInteractor.swift +++ b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarInteractor.swift @@ -1,7 +1,6 @@ protocol BottomTabBarInteractorProtocol: AnyObject { func openSearch() func openLeftButton() - func openFaq() func openBookmarks() func openMenu() } @@ -55,10 +54,6 @@ extension BottomTabBarInteractor: BottomTabBarInteractorProtocol { } } - func openFaq() { - mapViewController?.openAbout() - } - func openBookmarks() { mapViewController?.bookmarksCoordinator.open() } diff --git a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarPresenter.swift b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarPresenter.swift index d51a40d78..0785b144b 100644 --- a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarPresenter.swift +++ b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarPresenter.swift @@ -1,7 +1,7 @@ protocol BottomTabBarPresenterProtocol: AnyObject { func configure() + func onLeftButtonPressed() func onSearchButtonPressed() - func onLeftButtonPressed(withBadge: Bool) func onBookmarksButtonPressed() func onMenuButtonPressed() } @@ -17,15 +17,15 @@ class BottomTabBarPresenter: NSObject { extension BottomTabBarPresenter: BottomTabBarPresenterProtocol { func configure() { } + + func onLeftButtonPressed() { + interactor.openLeftButton() + } func onSearchButtonPressed() { interactor.openSearch() } - func onLeftButtonPressed(withBadge: Bool) { - withBadge ? interactor.openFaq() : interactor.openLeftButton() - } - func onBookmarksButtonPressed() { interactor.openBookmarks() } diff --git a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.swift b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.swift index cae58191b..0c586f5e2 100644 --- a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.swift +++ b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.swift @@ -1,19 +1,16 @@ -private let kUDDidShowFirstTimeRoutingEducationalHint = "kUDDidShowFirstTimeRoutingEducationalHint" - class BottomTabBarViewController: UIViewController { var presenter: BottomTabBarPresenterProtocol! - - @IBOutlet var searchButton: MWMButton! - @IBOutlet var searchConstraintWithLeftButton: NSLayoutConstraint! - @IBOutlet var searchConstraintWithoutLeftButton: NSLayoutConstraint! - @IBOutlet var leftButton: MWMButton! - @IBOutlet var bookmarksButton: MWMButton! - @IBOutlet var bookmarksConstraintWithLeftButton: NSLayoutConstraint! - @IBOutlet var bookmarksConstraintWithoutLeftButton: NSLayoutConstraint! - @IBOutlet var moreButton: MWMButton! - @IBOutlet var downloadBadge: UIView! - @IBOutlet var leftButtonBadge: UIView! + + @IBOutlet var leftButton: MWMButton? + @IBOutlet var searchButton: MWMButton? + @IBOutlet var searchConstraintWithLeftButton: NSLayoutConstraint? + @IBOutlet var searchConstraintWithoutLeftButton: NSLayoutConstraint? + @IBOutlet var bookmarksButton: MWMButton? + @IBOutlet var bookmarksConstraintWithLeftButton: NSLayoutConstraint? + @IBOutlet var bookmarksConstraintWithoutLeftButton: NSLayoutConstraint? + @IBOutlet var moreButton: MWMButton? + @IBOutlet var downloadBadge: UIView? private var avaliableArea = CGRect.zero @objc var isHidden: Bool = false { @@ -47,7 +44,7 @@ class BottomTabBarViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - leftButton.imageView?.contentMode = .scaleAspectFit + leftButton?.imageView?.contentMode = .scaleAspectFit updateBadge() } @@ -65,12 +62,7 @@ class BottomTabBarViewController: UIViewController { } @IBAction func onLeftButtonPressed(_ sender: Any) { - if !leftButtonBadge.isHidden { - presenter.onLeftButtonPressed(withBadge: true) - setLeftButtonBadgeShown() - } else { - presenter.onLeftButtonPressed(withBadge: false) - } + presenter.onLeftButtonPressed() } @IBAction func onBookmarksButtonPressed(_ sender: Any) { @@ -113,41 +105,27 @@ class BottomTabBarViewController: UIViewController { private func updateLeftButton() { let leftButtonType = Settings.leftButtonType if leftButtonType == .hidden { - leftButton.isHidden = true - leftButtonBadge.isHidden = true + leftButton?.isHidden = true if let searchConstraintWithLeftButton, let searchConstraintWithoutLeftButton, let bookmarksConstraintWithLeftButton, let bookmarksConstraintWithoutLeftButton { - NSLayoutConstraint.deactivate([searchConstraintWithLeftButton, bookmarksConstraintWithLeftButton]) NSLayoutConstraint.activate([searchConstraintWithoutLeftButton, bookmarksConstraintWithoutLeftButton]) + NSLayoutConstraint.deactivate([searchConstraintWithLeftButton, bookmarksConstraintWithLeftButton]) } } else { - leftButton.isHidden = false - leftButtonBadge.isHidden = !needsToShowleftButtonBadge() + leftButton?.isHidden = false - leftButton.setTitle(nil, for: .normal) - leftButton.setImage(leftButtonType.image, for: .normal) - leftButton.accessibilityLabel = leftButtonType.description; + leftButton?.setTitle(nil, for: .normal) + leftButton?.setImage(leftButtonType.image, for: .normal) + leftButton?.accessibilityLabel = leftButtonType.description; if let searchConstraintWithLeftButton, let searchConstraintWithoutLeftButton, let bookmarksConstraintWithLeftButton, let bookmarksConstraintWithoutLeftButton { - NSLayoutConstraint.deactivate([searchConstraintWithoutLeftButton, bookmarksConstraintWithoutLeftButton]) NSLayoutConstraint.activate([searchConstraintWithLeftButton, bookmarksConstraintWithLeftButton]) + NSLayoutConstraint.deactivate([searchConstraintWithoutLeftButton, bookmarksConstraintWithoutLeftButton]) } } } private func updateBadge() { - downloadBadge.isHidden = isApplicationBadgeHidden - leftButtonBadge.isHidden = !needsToShowleftButtonBadge() || Settings.leftButtonType == .hidden - } -} - -// MARK: - Help badge -private extension BottomTabBarViewController { - private func needsToShowleftButtonBadge() -> Bool { - !UserDefaults.standard.bool(forKey: kUDDidShowFirstTimeRoutingEducationalHint) - } - - private func setLeftButtonBadgeShown() { - UserDefaults.standard.set(true, forKey: kUDDidShowFirstTimeRoutingEducationalHint) + downloadBadge?.isHidden = isApplicationBadgeHidden } } diff --git a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.xib b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.xib index 4794d09f2..2a76e2c30 100644 --- a/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.xib +++ b/iphone/Maps/UI/BottomMenu/TabBar/BottomTabBarViewController.xib @@ -1,9 +1,9 @@ - + - + @@ -15,7 +15,6 @@ - @@ -39,7 +38,7 @@ - + @@ -94,37 +93,21 @@ - - - - - - - - - - - - - - - - + - - + @@ -157,9 +140,9 @@ - + diff --git a/iphone/Maps/UI/CarPlay/CarPlayMapViewController.swift b/iphone/Maps/UI/CarPlay/CarPlayMapViewController.swift index 65881c05c..fb01ee0e6 100644 --- a/iphone/Maps/UI/CarPlay/CarPlayMapViewController.swift +++ b/iphone/Maps/UI/CarPlay/CarPlayMapViewController.swift @@ -173,32 +173,20 @@ final class CarPlayMapViewController: MWMViewController { } private func updateVisibleViewPortToPreviewState() { - let viewBounds = view.bounds - let previewWidth = self.view.frame.width * 0.45 - let navigationHeight: CGFloat = 45.0 - var frame = CGRect.zero - let origin = isLeftWheelCar ? CGPoint(x: previewWidth, y: navigationHeight) : CGPoint(x: 0, y: navigationHeight) - frame.origin = origin - frame.size = CGSize(width: viewBounds.width - origin.x, - height: viewBounds.height - origin.y) - FrameworkHelper.setVisibleViewport(frame, scaleFactor: mapView?.contentScaleFactor ?? 1) + updateVisibleViewPort(frame: view.frame.inset(by: view.safeAreaInsets)) } private func updateVisibleViewPortToNavigationState() { - let viewBounds = view.bounds - let previewWidth = viewBounds.width * 0.45 - let mapControlsWidth = viewBounds.width * 0.15 - let navigationHeight: CGFloat = 45.0 - var frame = CGRect.zero - let origin = isLeftWheelCar ? CGPoint(x: previewWidth, y: navigationHeight) : CGPoint(x: 0, y: navigationHeight) - frame.origin = origin - frame.size = CGSize(width: viewBounds.width - (origin.x + mapControlsWidth), - height: viewBounds.height - origin.y) - FrameworkHelper.setVisibleViewport(frame, scaleFactor: mapView?.contentScaleFactor ?? 1) + updateVisibleViewPort(frame: view.frame.inset(by: view.safeAreaInsets)) } private func updateVisibleViewPortToDefaultState() { - FrameworkHelper.setVisibleViewport(view.bounds, scaleFactor: mapView?.contentScaleFactor ?? 1) + updateVisibleViewPort(frame: view.bounds) + } + + private func updateVisibleViewPort(frame: CGRect) { + guard CarPlayService.shared.isCarplayActivated else { return } + FrameworkHelper.setVisibleViewport(frame, scaleFactor: mapView?.contentScaleFactor ?? 1) } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMActionBarButton.m b/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMActionBarButton.m index 3ead4b7d5..02c4c33ce 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMActionBarButton.m +++ b/iphone/Maps/UI/PlacePage/PlacePageLayout/ActionBar/MWMActionBarButton.m @@ -114,7 +114,7 @@ NSString *titleForButton(MWMActionBarButtonType type, BOOL isSelected) { self.button.coloring = MWMButtonColoringRed; break; case MWMActionBarButtonTypeSaveTrackRecording: - [self.button setImage:[UIImage imageNamed:@"ic_placepage_save_track_recording"] forState:UIControlStateNormal]; + [self.button setImage:[UIImage systemImageNamed:@"square.and.arrow.down" withConfiguration:[UIImageSymbolConfiguration configurationWithPointSize:22 weight:UIImageSymbolWeightSemibold]] forState:UIControlStateNormal]; break; case MWMActionBarButtonTypeNotSaveTrackRecording: [self.button setImage:[UIImage systemImageNamed:@"trash.fill" withConfiguration:[UIImageSymbolConfiguration configurationWithPointSize:22 weight:UIImageSymbolWeightSemibold]] forState:UIControlStateNormal]; diff --git a/iphone/Maps/UI/Routing/RoutingOptionsView.swift b/iphone/Maps/UI/Routing/RoutingOptionsView.swift index 9941d275d..8559e8010 100644 --- a/iphone/Maps/UI/Routing/RoutingOptionsView.swift +++ b/iphone/Maps/UI/Routing/RoutingOptionsView.swift @@ -24,6 +24,10 @@ struct RoutingOptionsView: View { @State var shouldAvoidMotorwaysWhileRouting: Bool = false + /// If steps should be avoided during routing + @State var shouldAvoidStepsWhileRouting: Bool = false + + /// The actual view var body: some View { NavigationView { @@ -40,6 +44,9 @@ struct RoutingOptionsView: View { Toggle("avoid_motorways", isOn: $shouldAvoidMotorwaysWhileRouting) .tint(.accent) + + Toggle("avoid_steps", isOn: $shouldAvoidStepsWhileRouting) + .tint(.accent) } } .navigationTitle(String(localized: "driving_options_title")) @@ -60,6 +67,7 @@ struct RoutingOptionsView: View { shouldAvoidUnpavedRoadsWhileRouting = Settings.shouldAvoidUnpavedRoadsWhileRouting shouldAvoidFerriesWhileRouting = Settings.shouldAvoidFerriesWhileRouting shouldAvoidMotorwaysWhileRouting = Settings.shouldAvoidMotorwaysWhileRouting + shouldAvoidStepsWhileRouting = Settings.shouldAvoidStepsWhileRouting } .onChange(of: shouldAvoidTollRoadsWhileRouting) { changedShouldAvoidTollRoadsWhileRouting in Settings.shouldAvoidTollRoadsWhileRouting = changedShouldAvoidTollRoadsWhileRouting @@ -76,6 +84,9 @@ struct RoutingOptionsView: View { .onChange(of: shouldAvoidMotorwaysWhileRouting) { changedShouldAvoidMotorwaysWhileRouting in Settings.shouldAvoidMotorwaysWhileRouting = changedShouldAvoidMotorwaysWhileRouting } + .onChange(of: shouldAvoidStepsWhileRouting) { changedShouldAvoidStepsWhileRouting in + Settings.shouldAvoidStepsWhileRouting = changedShouldAvoidStepsWhileRouting + } .accentColor(.toolbarAccent) } } diff --git a/iphone/Maps/UI/Search/SearchOnMap/SearchOnMapHeaderView.swift b/iphone/Maps/UI/Search/SearchOnMap/SearchOnMapHeaderView.swift index de11d0772..3ab904c65 100644 --- a/iphone/Maps/UI/Search/SearchOnMap/SearchOnMapHeaderView.swift +++ b/iphone/Maps/UI/Search/SearchOnMap/SearchOnMapHeaderView.swift @@ -68,6 +68,7 @@ final class SearchOnMapHeaderView: UIView { searchBar.searchTextField.clearButtonMode = .always searchBar.returnKeyType = .search searchBar.searchTextField.enablesReturnKeyAutomatically = true + searchBar.backgroundImage = UIImage() } private func setupCancelButton() { diff --git a/iphone/Maps/UI/Settings/SettingsNavigationView.swift b/iphone/Maps/UI/Settings/SettingsNavigationView.swift index abb308849..b32c3be09 100644 --- a/iphone/Maps/UI/Settings/SettingsNavigationView.swift +++ b/iphone/Maps/UI/Settings/SettingsNavigationView.swift @@ -44,6 +44,10 @@ struct SettingsNavigationView: View { @State var shouldAvoidMotorwaysWhileRouting: Bool = false + /// If steps should be avoided during routing + @State var shouldAvoidStepsWhileRouting: Bool = false + + /// If live traffic data should be used @State var hasLiveTraffic: Bool = false @@ -128,6 +132,9 @@ struct SettingsNavigationView: View { Toggle("avoid_motorways", isOn: $shouldAvoidMotorwaysWhileRouting) .tint(.accent) + + Toggle("avoid_steps", isOn: $shouldAvoidStepsWhileRouting) + .tint(.accent) } header: { Text("driving_options_title") } @@ -164,6 +171,7 @@ struct SettingsNavigationView: View { shouldAvoidUnpavedRoadsWhileRouting = Settings.shouldAvoidUnpavedRoadsWhileRouting shouldAvoidFerriesWhileRouting = Settings.shouldAvoidFerriesWhileRouting shouldAvoidMotorwaysWhileRouting = Settings.shouldAvoidMotorwaysWhileRouting + shouldAvoidStepsWhileRouting = Settings.shouldAvoidStepsWhileRouting hasLiveTraffic = Settings.hasLiveTraffic liveTrafficServerUrlString = Settings.liveTrafficServerUrl?.absoluteString ?? "" } @@ -202,6 +210,8 @@ struct SettingsNavigationView: View { .onChange(of: shouldAvoidMotorwaysWhileRouting) { changedShouldAvoidMotorwaysWhileRouting in Settings.shouldAvoidMotorwaysWhileRouting = changedShouldAvoidMotorwaysWhileRouting } + .onChange(of: shouldAvoidStepsWhileRouting) { changedShouldAvoidStepsWhileRouting in + Settings.shouldAvoidStepsWhileRouting = changedShouldAvoidStepsWhileRouting .onChange(of: hasLiveTraffic) { changedHasLiveTraffic in Settings.hasLiveTraffic = changedHasLiveTraffic } diff --git a/iphone/Maps/UI/Storyboard/Main.storyboard b/iphone/Maps/UI/Storyboard/Main.storyboard index 8737418b5..f88a312cd 100644 --- a/iphone/Maps/UI/Storyboard/Main.storyboard +++ b/iphone/Maps/UI/Storyboard/Main.storyboard @@ -1,9 +1,10 @@ - + - + + @@ -264,7 +265,7 @@ - + @@ -648,7 +649,7 @@ - + @@ -659,7 +660,7 @@ - + @@ -670,7 +671,7 @@ - + @@ -719,7 +720,7 @@ - + @@ -730,8 +731,8 @@ - - + + @@ -740,14 +741,19 @@ - - + + - + - + + + + + + diff --git a/iphone/metadata/de-DE/description.txt b/iphone/metadata/de-DE/description.txt index 34c61cb11..8ae8a6243 100644 --- a/iphone/metadata/de-DE/description.txt +++ b/iphone/metadata/de-DE/description.txt @@ -25,4 +25,4 @@ Hauptfunktionen: • Unterstützung für CarPlay Freiheit beginnt hier -Entdecke deine Reise – navigiere in der Welt mit Datenschutz! \ No newline at end of file +Entdecke deine Reise – navigiere in der Welt mit Datenschutz! diff --git a/iphone/metadata/de-DE/keywords.txt b/iphone/metadata/de-DE/keywords.txt index 50b3ef21a..9a96129be 100644 --- a/iphone/metadata/de-DE/keywords.txt +++ b/iphone/metadata/de-DE/keywords.txt @@ -1 +1 @@ -comaps,karten,open street maps,osm,wandern,unterwegs,fahrrad,auto,offline,datenschutz,navigieren,gps \ No newline at end of file +comaps,karten,open street maps,osm,reisen,wandern,fahrrad,auto,offline,datenschutz,navigieren,gps diff --git a/iphone/metadata/de-DE/marketing_url.txt b/iphone/metadata/de-DE/marketing_url.txt index cd347f7e8..24872f898 100644 --- a/iphone/metadata/de-DE/marketing_url.txt +++ b/iphone/metadata/de-DE/marketing_url.txt @@ -1 +1 @@ -https://comaps.app/de/ \ No newline at end of file +https://comaps.app/de/ diff --git a/iphone/metadata/de-DE/privacy_url.txt b/iphone/metadata/de-DE/privacy_url.txt index 43a14f534..2b9b80768 100644 --- a/iphone/metadata/de-DE/privacy_url.txt +++ b/iphone/metadata/de-DE/privacy_url.txt @@ -1 +1 @@ -https://comaps.app/de/privacy \ No newline at end of file +https://comaps.app/de/privacy diff --git a/iphone/metadata/de-DE/subtitle.txt b/iphone/metadata/de-DE/subtitle.txt index 61c93e130..e95072d62 100644 --- a/iphone/metadata/de-DE/subtitle.txt +++ b/iphone/metadata/de-DE/subtitle.txt @@ -1 +1 @@ -Navigiere mit Privatsphäre \ No newline at end of file +Navigiere mit Privatsphäre diff --git a/iphone/metadata/de-DE/support_url.txt b/iphone/metadata/de-DE/support_url.txt index 3b3b80f3d..f93b754b6 100644 --- a/iphone/metadata/de-DE/support_url.txt +++ b/iphone/metadata/de-DE/support_url.txt @@ -1 +1 @@ -https://codeberg.org/comaps/comaps/issues \ No newline at end of file +https://codeberg.org/comaps/comaps/issues diff --git a/libs/base/internal/message.hpp b/libs/base/internal/message.hpp index 5c820f5cb..a43bafa9e 100644 --- a/libs/base/internal/message.hpp +++ b/libs/base/internal/message.hpp @@ -47,6 +47,8 @@ std::string DebugPrint(char32_t * t) = delete; template inline std::string DebugPrint(std::pair const & p); +template +inline std::string DebugPrint(std::tuple const & p); template inline std::string DebugPrint(std::list const & v); template @@ -136,6 +138,14 @@ std::string DebugPrint(std::pair const & p) return out.str(); } +template +std::string DebugPrint(std::tuple const & p) +{ + std::ostringstream out; + out << "(" << DebugPrint(get<0>(p)) << ", " << DebugPrint(get<1>(p)) << ", " << DebugPrint(get<2>(p)) << ")"; + return out.str(); +} + template std::string DebugPrintSequence(IterT beg, IterT end) { diff --git a/libs/drape_frontend/frontend_renderer.cpp b/libs/drape_frontend/frontend_renderer.cpp index 2005e514c..641bf0a8f 100644 --- a/libs/drape_frontend/frontend_renderer.cpp +++ b/libs/drape_frontend/frontend_renderer.cpp @@ -825,7 +825,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) AddUserEvent(make_unique_dp(msg->GetRect())); m_myPositionController->SetVisibleViewport(msg->GetRect()); m_myPositionController->UpdatePosition(); - PullToBoundArea(false /* randomPlace */, false /* applyZoom */); + // PullToBoundArea(false /* randomPlace */, false /* applyZoom */); break; } @@ -2056,7 +2056,7 @@ void FrontendRenderer::OnScaleEnded() void FrontendRenderer::OnAnimatedScaleEnded() { m_myPositionController->ResetBlockAutoZoomTimer(); - PullToBoundArea(false /* randomPlace */, false /* applyZoom */); + // PullToBoundArea(false /* randomPlace */, false /* applyZoom */); m_firstLaunchAnimationInterrupted = true; m_selectionTrackInfo.reset(); } diff --git a/libs/editor/editor_config.cpp b/libs/editor/editor_config.cpp index 53b6c6fc0..4c4cbec3c 100644 --- a/libs/editor/editor_config.cpp +++ b/libs/editor/editor_config.cpp @@ -46,7 +46,12 @@ static std::unordered_map const kNamesToFMD = { {"drive_through", EType::FMD_DRIVE_THROUGH}, {"website_menu", EType::FMD_WEBSITE_MENU}, {"self_service", EType::FMD_SELF_SERVICE}, - {"outdoor_seating", EType::FMD_OUTDOOR_SEATING} + {"outdoor_seating", EType::FMD_OUTDOOR_SEATING}, + // TODO(skadge): this won't work, obv + {"socket_type1_count", EType::FMD_CHARGE_SOCKETS}, + {"socket_type1_output", EType::FMD_CHARGE_SOCKETS}, + {"socket_type2_count", EType::FMD_CHARGE_SOCKETS}, + {"socket_type2_output", EType::FMD_CHARGE_SOCKETS}, /// @todo Add description? }; diff --git a/libs/geometry/point_with_altitude.cpp b/libs/geometry/point_with_altitude.cpp index d76210c5f..8674d786f 100644 --- a/libs/geometry/point_with_altitude.cpp +++ b/libs/geometry/point_with_altitude.cpp @@ -1,6 +1,8 @@ #include "geometry/point_with_altitude.hpp" -#include "std/boost_container_hash.hpp" +#include "geometry/mercator.hpp" + +#include #include @@ -26,6 +28,11 @@ bool PointWithAltitude::operator<(PointWithAltitude const & r) const return m_altitude < r.m_altitude; } +ms::LatLon PointWithAltitude::ToLatLon() const +{ + return ms::LatLon(mercator::YToLat(m_point.y), mercator::XToLon(m_point.x)); +} + std::string DebugPrint(PointWithAltitude const & r) { std::ostringstream ss; diff --git a/libs/geometry/point_with_altitude.hpp b/libs/geometry/point_with_altitude.hpp index 91892eab6..7007e5fb6 100644 --- a/libs/geometry/point_with_altitude.hpp +++ b/libs/geometry/point_with_altitude.hpp @@ -1,7 +1,10 @@ #pragma once +#include "geometry/latlon.hpp" #include "geometry/point2d.hpp" +#include "base/math.hpp" + #include #include #include @@ -26,11 +29,19 @@ public: bool operator<(PointWithAltitude const & r) const; m2::PointD const & GetPoint() const { return m_point; } + ms::LatLon ToLatLon() const; Altitude GetAltitude() const { return m_altitude; } void SetPoint(m2::PointD const & point) { m_point = point; } void SetAltitude(Altitude altitude) { m_altitude = altitude; } + /// @param[in] f in range [0, 1] + PointWithAltitude Interpolate(PointWithAltitude const & to, double f) const + { + return PointWithAltitude(m_point + (to.m_point - m_point) * f, + math::iround(m_altitude + (to.m_altitude - m_altitude) * f)); + } + private: friend std::string DebugPrint(PointWithAltitude const & r); diff --git a/libs/indexer/CMakeLists.txt b/libs/indexer/CMakeLists.txt index feccdb2c9..ae872b59d 100644 --- a/libs/indexer/CMakeLists.txt +++ b/libs/indexer/CMakeLists.txt @@ -60,6 +60,8 @@ set(SRC feature_algo.cpp feature_algo.hpp feature_altitude.hpp + feature_charge_sockets.cpp + feature_charge_sockets.hpp feature_covering.cpp feature_covering.hpp feature_data.cpp diff --git a/libs/indexer/editable_map_object.cpp b/libs/indexer/editable_map_object.cpp index c1baa2e3a..c552eb6d7 100644 --- a/libs/indexer/editable_map_object.cpp +++ b/libs/indexer/editable_map_object.cpp @@ -2,6 +2,8 @@ #include "indexer/classificator.hpp" #include "indexer/edit_journal.hpp" +#include "indexer/feature_charge_sockets.hpp" +#include "indexer/feature_meta.hpp" #include "indexer/ftypes_matcher.hpp" #include "indexer/postcodes_matcher.hpp" #include "indexer/validate_and_format_contacts.hpp" @@ -158,6 +160,7 @@ void EditableMapObject::ForEachMetadataItem(function(feature::Metadata::FMD_COUNT); ++i) { auto const type = static_cast(i); + + // CHARGE_SOCKETS have multiple keys/values; handled separately further down + if (type == feature::Metadata::FMD_CHARGE_SOCKETS) + continue; std::string_view const & value = GetMetadata(type); std::string_view const & old_value = unedited_emo.GetMetadata(type); @@ -811,6 +826,15 @@ void EditableMapObject::LogDiffInJournal(EditableMapObject const & unedited_emo) if (cuisinesModified) m_journal.AddTagChange("cuisine", strings::JoinStrings(old_cuisines, ";"), strings::JoinStrings(new_cuisines, ";")); + + // charge sockets + auto chargeSocketsDiff = ChargeSocketsHelper(GetChargeSockets()).Diff(unedited_emo.GetChargeSockets()); + for (auto const & kvdiff : chargeSocketsDiff) + { + std::string key, old_value, new_value; + std::tie(key, old_value, new_value) = kvdiff; + m_journal.AddTagChange(key, old_value, new_value); + } } bool AreObjectsEqualIgnoringStreet(EditableMapObject const & lhs, EditableMapObject const & rhs) diff --git a/libs/indexer/editable_map_object.hpp b/libs/indexer/editable_map_object.hpp index 5717a7f17..90c8170a0 100644 --- a/libs/indexer/editable_map_object.hpp +++ b/libs/indexer/editable_map_object.hpp @@ -108,6 +108,7 @@ public: bool UpdateMetadataValue(std::string_view key, std::string value); void SetOpeningHours(std::string oh); + void SetChargeSockets(std::string sockets); void SetInternet(feature::Internet internet); /// @param[in] cuisine is a vector of osm cuisine ids. diff --git a/libs/indexer/feature_charge_sockets.cpp b/libs/indexer/feature_charge_sockets.cpp new file mode 100644 index 000000000..56a6e25c1 --- /dev/null +++ b/libs/indexer/feature_charge_sockets.cpp @@ -0,0 +1,445 @@ + +#include "indexer/feature_charge_sockets.hpp" + +#include "base/logging.hpp" +#include "base/string_utils.hpp" + +#include +#include // for formatting doubles +#include // for std::to_string alternative +#include +#include + +// helper to format doubles (avoids trailing zeros) +inline std::string to_string_trimmed(double value, int precision = 2) +{ + std::ostringstream oss; + oss << std::fixed << std::setprecision(precision) << value; + auto str = oss.str(); + + // Remove trailing zeros + auto pos = str.find('.'); + if (pos != std::string::npos) + { + // erase trailing zeros + while (!str.empty() && str.back() == '0') + str.pop_back(); + // if we end with a '.', remove it too + if (!str.empty() && str.back() == '.') + str.pop_back(); + } + return str; +} + +// we use a custom tokenizer, as strings::Tokenize discards empty +// tokens and we want to keep them: +// +// Example: +// "a||" → ["a", "", ""] +// "b|0|" → ["b", "0", ""] +// "c||34" → ["c", "", "34"] +// "d|43|54" → ["d", "43", "54"] +std::vector tokenize(std::string_view s, char delim = '|') +{ + std::vector tokens; + size_t start = 0; + while (true) + { + size_t pos = s.find(delim, start); + if (pos == std::string_view::npos) + { + tokens.emplace_back(s.substr(start)); + break; + } + tokens.emplace_back(s.substr(start, pos - start)); + start = pos + 1; + } + return tokens; +} + +ChargeSocketsHelper::ChargeSocketsHelper(std::string const & socketsList) : m_dirty(false) +{ + if (socketsList.empty()) + return; + + auto tokens = tokenize(socketsList, ';'); + + for (auto token : tokens) + { + if (token.empty()) + continue; + + auto fields = tokenize(token, '|'); + + if (fields.size() != 3) + continue; // invalid entry, skip + + ChargeSocketDescriptor desc; + + if (std::find(SUPPORTED_TYPES.begin(), SUPPORTED_TYPES.end(), fields[0]) != SUPPORTED_TYPES.end()) + desc.type = fields[0]; + else + desc.type = UNKNOWN; + + try + { + desc.count = std::stoi(std::string(fields[1])); + } + catch (...) + { + desc.count = 0; + } + + try + { + desc.power = std::stod(std::string(fields[2])); + } + catch (...) + { + desc.power = 0; + } + m_chargeSockets.push_back(desc); + } + m_dirty = true; +} + +void ChargeSocketsHelper::AddSocket(std::string const & type, unsigned int count, double power) +{ + if (power < 0) + { + LOG(LWARNING, ("Invalid socket power. Must be >= 0:", power)); + return; + } + + m_chargeSockets.push_back({type, count, power}); + m_dirty = true; +} + +void ChargeSocketsHelper::AggregateChargeSocketKey(std::string const & k, std::string const & v) +{ + auto keys = strings::Tokenize(k, ":"); + ASSERT(keys[0] == "socket", ()); // key must start with "socket:" + if (keys.size() < 2 || keys.size() > 3) + { + LOG(LWARNING, ("Invalid socket key:", k)); + return; + } + + std::string type(keys[1]); + + bool isOutput = false; + if (keys.size() == 3) + { + if (keys[2] == "output") + isOutput = true; + else + return; // ignore other suffixes + } + + // normalize type + static std::unordered_map const kTypeMap = { + {"tesla_supercharger", "nacs"}, + {"tesla_destination", "nacs"}, + {"tesla_standard", "nacs"}, + {"tesla", "nacs"}, + {"tesla_supercharger_ccs", "type2_combo"}, + {"ccs", "type2_combo"}, + {"type1_cable", "type1"}, + }; + + auto itMap = kTypeMap.find(type); + if (itMap != kTypeMap.end()) + type = itMap->second; + + if (std::find(SUPPORTED_TYPES.begin(), SUPPORTED_TYPES.end(), type) == SUPPORTED_TYPES.end()) + type = UNKNOWN; + + // Tokenize counts or powers + auto tokens = strings::Tokenize(v, ";"); + if (tokens.empty()) + return; + + if (!isOutput) + { + // Parse counts + std::vector counts; + for (auto & t : tokens) + { + strings::Trim(t); + if (t.empty()) + continue; + + if (t == "yes") + counts.push_back(0); + else + { + try + { + auto c = std::stoi(std::string(t)); + if (c > 0) + counts.push_back(c); + else + { + LOG(LWARNING, ("Invalid count. Ignoring:", t)); + continue; + } + } + catch (...) + { + LOG(LWARNING, ("Invalid count. Ignoring:", t)); + continue; + } + } + } + + // Update existing sockets or add new ones + for (size_t i = 0; i < counts.size(); ++i) + { + // Find the i-th socket of this type + size_t matched = 0; + auto it = std::find_if(m_chargeSockets.begin(), m_chargeSockets.end(), [&](ChargeSocketDescriptor const & d) + { + if (d.type != type) + return false; + if (matched == i) + return true; + ++matched; + return false; + }); + + if (it != m_chargeSockets.end()) + it->count = counts[i]; + else + m_chargeSockets.push_back({type, counts[i], 0}); + } + } + else + { + // Parse powers + std::vector powers; + for (auto & t : tokens) + { + strings::Trim(t); + if (t.empty()) + continue; + + std::string s = strings::MakeLowerCase(std::string(t)); + size_t pos = s.find("va"); + while (pos != std::string::npos) + { + s.replace(pos, 2, "w"); + pos = s.find("va", pos + 1); + } + + double value = 0; + enum PowerUnit + { + WATT, + KILOWATT, + MEGAWATT + } unit = KILOWATT; + + if (!s.empty() && s.back() == 'w') + { + unit = WATT; + s.pop_back(); + if (!s.empty() && s.back() == 'k') + { + unit = KILOWATT; + s.pop_back(); + } + else if (!s.empty() && s.back() == 'm') + { + unit = MEGAWATT; + s.pop_back(); + } + } + + try + { + value = std::stod(s); + if (value < 0) + { + LOG(LWARNING, ("Invalid power value. Ignoring:", t)); + continue; + } + switch (unit) + { + case WATT: value /= 1000.; break; + case MEGAWATT: value *= 1000.; break; + case KILOWATT: break; + } + } + catch (...) + { + LOG(LWARNING, ("Invalid power value. Ignoring:", t)); + continue; + } + + powers.push_back(value); + } + // Update existing sockets or add new ones + for (size_t i = 0; i < powers.size(); ++i) + { + size_t matched = 0; + auto it = std::find_if(m_chargeSockets.begin(), m_chargeSockets.end(), [&](ChargeSocketDescriptor const & d) + { + if (d.type != type) + return false; + if (matched == i) + return true; + ++matched; + return false; + }); + + if (it != m_chargeSockets.end()) + it->power = powers[i]; + else + m_chargeSockets.push_back({type, 0, powers[i]}); // default count=0 + } + } + + m_dirty = true; +} + +ChargeSocketDescriptors ChargeSocketsHelper::GetSockets() +{ + if (m_dirty) + Sort(); + + return m_chargeSockets; +} + +std::string ChargeSocketsHelper::ToString() +{ + if (m_dirty) + Sort(); + + std::ostringstream oss; + + for (size_t i = 0; i < m_chargeSockets.size(); ++i) + { + auto const & desc = m_chargeSockets[i]; + + oss << desc.type << "|"; + if (desc.count > 0) + oss << desc.count; + oss << "|"; + if (desc.power > 0) + oss << desc.power; + + if (i + 1 < m_chargeSockets.size()) + oss << ";"; + } + return oss.str(); +} + +OSMKeyValues ChargeSocketsHelper::GetOSMKeyValues() +{ + if (m_dirty) + Sort(); + + std::vector> result; + std::string lastType; + std::ostringstream countStream; + std::ostringstream powerStream; + bool firstCount = true; + bool firstPower = true; + + for (auto const & s : m_chargeSockets) + { + if (s.type.empty()) + continue; + + // If we switch type, flush previous streams + if (s.type != lastType && !lastType.empty()) + { + result.emplace_back("socket:" + lastType, countStream.str()); + if (powerStream.str().size() > 0) + result.emplace_back("socket:" + lastType + ":output", powerStream.str()); + + countStream.str(""); + countStream.clear(); + powerStream.str(""); + powerStream.clear(); + firstCount = true; + firstPower = true; + } + + lastType = s.type; + + // Append count + if (!firstCount) + countStream << ";"; + countStream << ((s.count > 0) ? std::to_string(s.count) : "yes"); + firstCount = false; + + // Append power if > 0 + if (s.power > 0) + { + if (!firstPower) + powerStream << ";"; + powerStream << to_string_trimmed(s.power); + firstPower = false; + } + } + + // Flush last type + if (!lastType.empty()) + { + result.emplace_back("socket:" + lastType, countStream.str()); + if (powerStream.str().size() > 0) + result.emplace_back("socket:" + lastType + ":output", powerStream.str()); + } + + return result; +} + +KeyValueDiffSet ChargeSocketsHelper::Diff(ChargeSocketDescriptors const & oldSockets) +{ + KeyValueDiffSet result; + + auto oldKeys = ChargeSocketsHelper(oldSockets).GetOSMKeyValues(); + auto newKeys = GetOSMKeyValues(); + + std::unordered_map oldMap, newMap; + + for (auto && [k, v] : oldKeys) + oldMap.emplace(k, v); + for (auto && [k, v] : newKeys) + newMap.emplace(k, v); + + // Handle keys that exist in old + for (auto && [k, oldVal] : oldMap) + if (auto it = newMap.find(k); it == newMap.end()) + result.insert({k, oldVal, ""}); // deleted + else if (it->second != oldVal) + result.insert({k, oldVal, it->second}); // updated + + // Handle keys that are only new + for (auto && [k, newVal] : newMap) + if (!oldMap.contains(k)) + result.insert({k, "", newVal}); // created + + return result; +} + +void ChargeSocketsHelper::Sort() +{ + size_t const unknownTypeOrder = SUPPORTED_TYPES.size(); + + std::sort(m_chargeSockets.begin(), m_chargeSockets.end(), + [&](ChargeSocketDescriptor const & a, ChargeSocketDescriptor const & b) + { + auto const itA = std::find(SUPPORTED_TYPES.begin(), SUPPORTED_TYPES.end(), a.type); + auto const orderA = (itA == SUPPORTED_TYPES.end()) ? unknownTypeOrder : std::distance(SUPPORTED_TYPES.begin(), itA); + auto const itB = std::find(SUPPORTED_TYPES.begin(), SUPPORTED_TYPES.end(), b.type); + auto const orderB = (itB == SUPPORTED_TYPES.end()) ? unknownTypeOrder : std::distance(SUPPORTED_TYPES.begin(), itB); + + if (orderA != orderB) + return orderA < orderB; + return a.power > b.power; // Sort by power in descending order for sockets of the same type + }); + + m_dirty = false; +} diff --git a/libs/indexer/feature_charge_sockets.hpp b/libs/indexer/feature_charge_sockets.hpp new file mode 100644 index 000000000..6a84c8d73 --- /dev/null +++ b/libs/indexer/feature_charge_sockets.hpp @@ -0,0 +1,121 @@ +#pragma once + +#include +#include +#include +#include +#include // for std::pair +#include + +// struct to store the representation of a charging station socket +struct ChargeSocketDescriptor +{ + std::string type; // https://wiki.openstreetmap.org/wiki/Key:socket:* + // e.g. "type1" + unsigned int count; // number of sockets; 0 means socket present, but unknown count + // (eg, OSM tag for count set to 'yes') + double power; // power output, in kW. 0 means unknown. +}; + +typedef std::vector ChargeSocketDescriptors; + +typedef std::vector> OSMKeyValues; + +typedef std::set> KeyValueDiffSet; + +class ChargeSocketsHelper +{ +public: + ChargeSocketsHelper() : m_dirty(false) {} + + ChargeSocketsHelper(ChargeSocketDescriptors const & sockets) : m_chargeSockets(sockets), m_dirty(true) {} + + /** Create a ChareSocketsHelper instance from an existing list of sockets + * stored as "||[];..." + * + * For instance: + * "type2_combo|2|150;chademo|1|50;type2|4|" + */ + ChargeSocketsHelper(std::string const & socketsList); + + void AddSocket(std::string const & type, unsigned int count, double power); + + /** Parse OSM attributes for socket types and add them to m_chargeSockets. + * + * Examples of (k,v) pairs: + * ("socket:type2_combo", "2") + * ("socket:type2_combo:output", "150 kW") + * ("socket:chademo", "1") + * ("socket:chademo:output", "50") // assumes kW + */ + void AggregateChargeSocketKey(std::string const & key, std::string const & value); + + /** Returns the current list of sockets, ordered from the most powerful to the least. + * + * The list is guaranteed to be sorted first by socket type (same ordered as + * SUPPORTED_TYPES), then by power (descending). + * + * Note that this method is not const as it may trigger a re-ordering of the + * internal list of sockets. + */ + ChargeSocketDescriptors GetSockets(); + + /** Serialize the list of sockets into a string with format "||[];..." + * + * For instance: + * "type2_combo|2|150;chademo|1|50;type2|4|" + * + * The list is guaranteed to be sorted first by socket type (same ordered as + * SUPPORTED_TYPES), then by power (descending). + * + * The same string can be use to re-create a the list of socket by creating a + * new instance of ChargeSocketsHelper with the + * ChargeSocketsHelper::ChargeSocketsHelper(std::string) ctor. + * + * Note that this method is not const as it may trigger a re-ordering of the + * internal list of sockets. + */ + std::string ToString(); + + /** Returns a list of OpenStreetMap (key, value) corresponding to the list of sockets. + * + * The list is guaranteed to be sorted first by socket type (same ordered as + * SUPPORTED_TYPES), then by power (descending). + * + * Note that this method is not const as it may trigger a re-ordering of the + * internal list of sockets. + */ + + OSMKeyValues GetOSMKeyValues(); + + static constexpr std::string_view UNKNOWN = "unknown"; + + /** List of supported sockets, ~ordered from high-power to low-power. + * This order can be used in the UIs. + */ + static constexpr std::array SUPPORTED_TYPES = { + "mcs", "type2_combo", "chademo", "nacs", "type1", "gb_dc", + "chaoji", "type3c", "type2_cable", "type2", "gb_ac", "type3a"}; + + /** Return a list of OSM attributes that have changed between the current + * list of sockets and the provided old list. + * + * Returns a set of (key, old_value, new_value) tuples. + * + * If old_value="", the attribute is new (ie has been created) + * If new_value="", the attribute has been deleted + * + * Note that this method is not const as it may trigger a re-ordering of the + * internal list of sockets. + */ + KeyValueDiffSet Diff(ChargeSocketDescriptors const & oldSockets); + +protected: + ChargeSocketDescriptors m_chargeSockets; + +private: + /** sort sockets: first by type, then by power (descending). + */ + void Sort(); + bool m_dirty; +}; diff --git a/libs/indexer/indexer_tests/CMakeLists.txt b/libs/indexer/indexer_tests/CMakeLists.txt index 42877484a..71afc5c25 100644 --- a/libs/indexer/indexer_tests/CMakeLists.txt +++ b/libs/indexer/indexer_tests/CMakeLists.txt @@ -16,6 +16,7 @@ set(SRC data_source_test.cpp drules_selector_parser_test.cpp editable_map_object_test.cpp + feature_charge_sockets_test.cpp feature_metadata_test.cpp feature_names_test.cpp feature_to_osm_tests.cpp diff --git a/libs/indexer/indexer_tests/feature_charge_sockets_test.cpp b/libs/indexer/indexer_tests/feature_charge_sockets_test.cpp new file mode 100644 index 000000000..fd87d2436 --- /dev/null +++ b/libs/indexer/indexer_tests/feature_charge_sockets_test.cpp @@ -0,0 +1,254 @@ +#include "indexer/feature_charge_sockets.hpp" + +#include "testing/testing.hpp" + +namespace feature_charge_sockets_test +{ + +ChargeSocketsHelper FromKVs(OSMKeyValues const & kvs) +{ + ChargeSocketsHelper helper; + for (auto const & kv : kvs) + helper.AggregateChargeSocketKey(kv.first, kv.second); + return helper; +} + +UNIT_TEST(ChargeSockets_Processing) +{ + /////////////////////////////////////////////////////////// + // Internal model consistency + + // valid socket lists + TEST_EQUAL(ChargeSocketsHelper("type2||").GetSockets().size(), 1, ()); + TEST_EQUAL(ChargeSocketsHelper("type2|1|50;type2|2|43").GetSockets().size(), 2, ()); + TEST_EQUAL(ChargeSocketsHelper("type2|1|50;type2|2|43;type1||").GetSockets().size(), 3, ()); + TEST_EQUAL(ChargeSocketsHelper("type2||;type2_cable||;type2_combo||;type1||;nacs||;chademo||").GetSockets().size(), 6, + ()); + TEST_EQUAL(ChargeSocketsHelper("unknown|2|150").GetSockets().size(), 1, ()); + TEST_EQUAL(ChargeSocketsHelper("||").GetSockets().size(), 1, ()); + + // invalid/partially valid socket lists + TEST_EQUAL(ChargeSocketsHelper("type2|").GetSockets().size(), 0, ()); + TEST_EQUAL(ChargeSocketsHelper("type2|;|;|||;|45||").GetSockets().size(), 0, ()); + TEST_EQUAL(ChargeSocketsHelper("type2|;type2_cable|1|50").GetSockets().size(), 1, ()); + + TEST(ChargeSocketsHelper("type2||").ToString() != "", ("ChargeSocketsHelper::ToString returned an empty string!")); + + TEST_EQUAL(ChargeSocketsHelper("||").ToString(), "unknown||", ()); + TEST_EQUAL(ChargeSocketsHelper("this_type_does_not_exist||").ToString(), "unknown||", ()); + TEST_EQUAL(ChargeSocketsHelper("type2||").ToString(), "type2||", ()); + TEST_EQUAL(ChargeSocketsHelper("type2|0|0").ToString(), "type2||", ()); + TEST_EQUAL(ChargeSocketsHelper("type2||50").ToString(), "type2||50", ()); + TEST_EQUAL(ChargeSocketsHelper("type2||7.4").ToString(), "type2||7.4", ()); + TEST_EQUAL(ChargeSocketsHelper("type2|0|50").ToString(), "type2||50", ()); + TEST_EQUAL(ChargeSocketsHelper("type2|1|50").ToString(), "type2|1|50", ()); + TEST_EQUAL(ChargeSocketsHelper("unknown||").ToString(), "unknown||", ()); + TEST_EQUAL(ChargeSocketsHelper("unknown||150").ToString(), "unknown||150", ()); + TEST_EQUAL(ChargeSocketsHelper("type2|;type2_cable|1|50").ToString(), "type2_cable|1|50", ()); + + // sorting + TEST_EQUAL(ChargeSocketsHelper("type2||;type2_cable|1|50").ToString(), "type2_cable|1|50;type2||", ()); + TEST_EQUAL(ChargeSocketsHelper("type2||;type2_cable||;||;type2_combo||").ToString(), + "type2_combo||;type2_cable||;type2||;unknown||", ()); + + // multiple sockets of same type, but different power + TEST_EQUAL(ChargeSocketsHelper("type2|1|50;type2|2|43").ToString(), "type2|1|50;type2|2|43", ()); + + // TEST_EQUAL(ChargeSocketsHelper("type2|1|43;type2|2|50").ToString(), "type2|1|50;type2|2|43", ()); + + /////////////////////////////////////////////////////////// + // OSM key parsing + + OSMKeyValues kvs; + + kvs = {{"socket:type2", "2"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|", ()); + + kvs = {{"socket:type2", "yes"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2||", ()); + + kvs = {{"socket:type2", "malformed"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "", ()); + + kvs = {{"socket:type2:output", "22"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2||22", ()); + + kvs = {{"socket:type2:malformed", "22"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "", ()); + + kvs = {{"socket:type2", "malformed"}, {"socket:type2:output", "22 kW"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2||22", ()); + + kvs = {{"socket:type2", "2"}, {"socket:type2:output", "22 kW"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|22", ()); + + kvs = {{"socket:type2", "2"}, {"socket:type2:output", "22kW"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|22", ()); + + kvs = {{"socket:type2", "2"}, {"socket:type2:output", "22KW"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|22", ()); + + kvs = {{"socket:type2", "2"}, {"socket:type2:output", "22"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|22", ()); + + kvs = {{"socket:chademo", "2"}, {"socket:chademo:output", "50"}, + {"socket:type2_combo", "10"}, {"socket:type2_combo:output", "200"}, + {"socket:type2_cable", "2"}, {"socket:type2_cable:output", "50"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo|10|200;chademo|2|50;type2_cable|2|50", ()); + + // unit conversion + kvs = {{"socket:type2:output", "7400W"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2||7.4", ()); + + kvs = {{"socket:type2_combo:output", "150 kw"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ()); + + kvs = {{"socket:type2_combo:output", "150 KW"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ()); + + kvs = {{"socket:type2_combo:output", " 150kw"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ()); + + kvs = {{"socket:type2_combo:output", "150kva"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ()); + + kvs = {{"socket:type2_combo:output", "0.150MW"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ()); + + kvs = {{"socket:type2_combo:output", ".150MW"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ()); + + // invalid + kvs = {{"socket:type2", "-1"}}; + TEST_EQUAL(FromKVs(kvs).GetSockets().size(), 0, ()); + + kvs = {{"socket:type2", "-2"}}; + TEST_EQUAL(FromKVs(kvs).GetSockets().size(), 0, ()); + + kvs = {{"socket:type2", "-2"}, {"socket:type2:output", "-50"}}; + TEST_EQUAL(FromKVs(kvs).GetSockets().size(), 0, ()); + + // count ignored (because invalid), but power valid + kvs = {{"socket:type2", "-2"}, {"socket:type2:output", "50"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2||50", ()); + + // normalization + kvs = {{"socket:tesla_supercharger", "2"}, {"socket:tesla_supercharger:output", "150"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "nacs|2|150", ()); + + kvs = {{"socket:ccs", "2"}, {"socket:ccs:output", "150"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo|2|150", ()); + + // multiple socket of same type + kvs = {{"socket:type2", "2;3"}, {"socket:type2:output", "50;43"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2|3|43", ()); + + kvs = {{"socket:type2:output", "50;43"}, {"socket:type2", "2;3"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2|3|43", ()); + + kvs = {{"socket:type2", "2;3"}, {"socket:type2:output", "43;50"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|3|50;type2|2|43", ()); + + kvs = {{"socket:type2", "2;3;5"}, {"socket:type2:output", "43;50;7.4"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|3|50;type2|2|43;type2|5|7.4", ()); + + kvs = {{"socket:type2", "2;3"}, {"socket:type2:output", "50 kW; 43 kw"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2|3|43", ()); + + // unbalanced multiple sockets + kvs = {{"socket:type2", "2"}, {"socket:type2:output", "50 kW; 43 kw"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2||43", ()); + + kvs = {{"socket:type2", "2;"}, {"socket:type2:output", "50 kW; 43 kw"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2||43", ()); + + kvs = {{"socket:type2", "2;3"}, {"socket:type2:output", "50 kW"}}; + TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2|3|", ()); + + /////////////////////////////////////////////////////////// + // OSM key generation + + kvs = {{"socket:type2", "2"}}; + TEST_EQUAL(ChargeSocketsHelper("type2|2|").GetOSMKeyValues(), kvs, ()); + TEST_EQUAL(ChargeSocketsHelper("type2|2|0").GetOSMKeyValues(), kvs, ()); + + kvs = {{"socket:type2", "yes"}}; + TEST_EQUAL(ChargeSocketsHelper("type2||").GetOSMKeyValues(), kvs, ()); + TEST_EQUAL(ChargeSocketsHelper("type2|0|").GetOSMKeyValues(), kvs, ()); + + kvs = {{"socket:type2", "yes"}, {"socket:type2:output", "150"}}; + TEST_EQUAL(ChargeSocketsHelper("type2||150").GetOSMKeyValues(), kvs, ()); + + // the order should always be the same, as the sockets are sorted + kvs = {{"socket:type2_combo", "10"}, {"socket:type2_combo:output", "200"}, {"socket:chademo", "2"}, + {"socket:chademo:output", "50"}, {"socket:type2_cable", "2"}, {"socket:type2_cable:output", "50"}}; + TEST_EQUAL(ChargeSocketsHelper("type2_combo|10|200;chademo|2|50;type2_cable|2|50").GetOSMKeyValues(), kvs, ()); + TEST_EQUAL(ChargeSocketsHelper("chademo|2|50;type2_cable|2|50;type2_combo|10|200").GetOSMKeyValues(), kvs, ()); + + // multiple socket of same type + // (should always be ordered from higher power to lower) + kvs = {{"socket:type2", "2;3"}, {"socket:type2:output", "50;43"}}; + TEST_EQUAL(ChargeSocketsHelper("type2|2|50;type2|3|43").GetOSMKeyValues(), kvs, ()); + + kvs = {{"socket:type2", "3;2"}, {"socket:type2:output", "50;43"}}; + TEST_EQUAL(ChargeSocketsHelper("type2|2|43;type2|3|50").GetOSMKeyValues(), kvs, ()); + + kvs = {{"socket:type2", "2;3;5"}, {"socket:type2:output", "50;43;7.4"}}; + TEST_EQUAL(ChargeSocketsHelper("type2|3|43;type2|5|7.4;type2|2|50").GetOSMKeyValues(), kvs, ()); + + kvs = {{"socket:type2_combo", "10;2"}, + {"socket:type2_combo:output", "250;100"}, + {"socket:type2", "2;3;5"}, + {"socket:type2:output", "50;43;7.4"}}; + TEST_EQUAL( + ChargeSocketsHelper("type2|3|43;type2|5|7.4;type2_combo|10|250;type2|2|50;type2_combo|2|100").GetOSMKeyValues(), + kvs, ()); + + /////////////////////////////////////////////////////////// + // OSM attribute diff + OSMKeyValues kvs_old, kvs_new; + KeyValueDiffSet diff; + + kvs_old = {{"socket:type2", "2"}}; + kvs_new = {{"socket:type2", "2"}}; + diff = {}; + TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ()); + + kvs_old = {{"socket:type2", "3"}}; + kvs_new = {{"socket:type2", "2"}}; + diff = {{"socket:type2", "3", "2"}}; + TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ()); + + kvs_old = {{"socket:type2", "2"}}; + kvs_new = {{"socket:type2", "3"}}; + diff = {{"socket:type2", "2", "3"}}; + TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ()); + + kvs_old = {}; + kvs_new = {{"socket:type2", "2"}}; + diff = {{"socket:type2", "", "2"}}; + TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ()); + + kvs_old = {{"socket:type2", "2"}}; + kvs_new = {}; + diff = {{"socket:type2", "2", ""}}; + TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ()); + + kvs_old = {{"socket:type2_combo", "10;2"}, + {"socket:type2_combo:output", "250;100"}, + {"socket:type1", "5"}, + {"socket:type2", "2;3;5"}, + {"socket:type2:output", "50;43;7.4"}}; + kvs_new = {{"socket:type2_combo", "10;2"}, + {"socket:type2_combo:output", "250;100"}, + {"socket:chademo", "2"}, + {"socket:type2", "2;3"}, + {"socket:type2:output", "50;43"}}; + diff = {{"socket:type1", "5", ""}, + {"socket:type2", "2;3;5", "2;3"}, + {"socket:type2:output", "50;43;7.4", "50;43"}, + {"socket:chademo", "", "2"}}; + TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ()); +} + +} // namespace feature_charge_sockets_test diff --git a/libs/indexer/map_object.cpp b/libs/indexer/map_object.cpp index 564d3ddc3..bf669a3c5 100644 --- a/libs/indexer/map_object.cpp +++ b/libs/indexer/map_object.cpp @@ -180,53 +180,8 @@ std::string_view MapObject::GetOpeningHours() const ChargeSocketDescriptors MapObject::GetChargeSockets() const { - ChargeSocketDescriptors sockets; - auto s = std::string(m_metadata.Get(MetadataID::FMD_CHARGE_SOCKETS)); - if (s.empty()) - return sockets; - - auto tokens = strings::Tokenize(s, ";"); - - for (auto token : tokens) - { - if (token.empty()) - continue; - - auto fields = strings::Tokenize(token, "|"); - - if (fields.size() < 3) - continue; // invalid entry, skip - - ChargeSocketDescriptor desc; - desc.type = fields[0]; - - try - { - desc.count = std::stoi(std::string(fields[1])); - } - catch (...) - { - desc.count = 0; - } - - if (fields.size() >= 3) - { - try - { - desc.power = std::stod(std::string(fields[2])); - } - catch (...) - { - desc.power = 0; - } - } - else - desc.power = 0; - - sockets.push_back(desc); - } - return sockets; + return ChargeSocketsHelper(s).GetSockets(); } feature::Internet MapObject::GetInternet() const diff --git a/libs/indexer/map_object.hpp b/libs/indexer/map_object.hpp index 1b612fe20..515c8d85e 100644 --- a/libs/indexer/map_object.hpp +++ b/libs/indexer/map_object.hpp @@ -1,5 +1,6 @@ #pragma once +#include "indexer/feature_charge_sockets.hpp" #include "indexer/feature_data.hpp" #include "indexer/feature_decl.hpp" #include "indexer/feature_meta.hpp" @@ -17,17 +18,6 @@ namespace osm { class EditableMapObject; -// struct to store the representation of a charging station socket -struct ChargeSocketDescriptor -{ - std::string type; // https://wiki.openstreetmap.org/wiki/Key:socket:* - // e.g. "type1" - unsigned int count; // number of sockets; 0 means socket present, but unknown count - // (eg, OSM tag for count set to 'yes') - double power; // power output, in kW. 0 means unknown. -}; -typedef std::vector ChargeSocketDescriptors; - class MapObject { public: diff --git a/libs/map/framework.cpp b/libs/map/framework.cpp index 230d35bf5..dc21f602c 100644 --- a/libs/map/framework.cpp +++ b/libs/map/framework.cpp @@ -114,14 +114,6 @@ std::string_view constexpr kTranslitMode = "TransliterationMode"; std::string_view constexpr kPreferredGraphicsAPI = "PreferredGraphicsAPI"; std::string_view constexpr kShowDebugInfo = "DebugInfo"; std::string_view constexpr kScreenViewport = "ScreenClipRect"; -std::string_view constexpr kPlacePageProductsPopupCloseTime = "PlacePageProductsPopupCloseTime"; -std::string_view constexpr kPlacePageProductsPopupCloseReason = "PlacePageProductsPopupCloseReason"; -std::string_view constexpr kPlacePageSelectedProduct = "PlacePageSelectedProduct"; - -std::string_view constexpr kProductsPopupCloseReasonCloseStr = "close"; -std::string_view constexpr kProductsPopupCloseReasonRemindLaterStr = "remind_later"; -std::string_view constexpr kProductsPopupCloseReasonAlreadyDonatedStr = "already_donated"; -std::string_view constexpr kProductsPopupCloseReasonSelectProductStr = "select_product"; auto constexpr kLargeFontsScaleFactor = 1.6; size_t constexpr kMaxTrafficCacheSizeBytes = 64 /* Mb */ * 1024 * 1024; @@ -3349,104 +3341,3 @@ void Framework::OnPowerSchemeChanged(power_management::Scheme const actualScheme if (actualScheme == power_management::Scheme::EconomyMaximum && GetTrafficManager().IsEnabled()) GetTrafficManager().SetEnabled(false); } - -bool Framework::ShouldShowProducts() const -{ - auto const connectionStatus = Platform::ConnectionStatus(); - if (connectionStatus == Platform::EConnectionType::CONNECTION_NONE) - return false; - - std::string donateUrl; - if (!settings::Get(settings::kDonateUrl, donateUrl)) // donation is disabled - return false; - - if (!m_usageStats.IsLoyalUser()) - return false; - - if (!HasPlacePageInfo()) // happens after the POI is deleted via the editor - return false; - - if (!storage::IsPointCoveredByDownloadedMaps(GetCurrentPlacePageInfo().GetMercator(), m_storage, *m_infoGetter)) - return false; - - uint64_t popupCloseTime; - std::string productCloseReason; - if (!settings::Get(kPlacePageProductsPopupCloseTime, popupCloseTime) || - !settings::Get(kPlacePageProductsPopupCloseReason, productCloseReason)) - return true; // The popup was never closed. - - auto const now = base::SecondsSinceEpoch(); - auto const timeout = GetTimeoutForReason(FromString(productCloseReason)); - bool const timeoutExpired = popupCloseTime + timeout < now; - if (timeoutExpired) - return true; - - return false; -} - -std::optional Framework::GetProductsConfiguration() const -{ - if (!ShouldShowProducts()) - return nullopt; - return products::GetProductsConfiguration(); -} - -void Framework::DidCloseProductsPopup(ProductsPopupCloseReason reason) const -{ - settings::Set(kPlacePageProductsPopupCloseTime, base::SecondsSinceEpoch()); - settings::Set(kPlacePageProductsPopupCloseReason, std::string(ToString(reason))); -} - -void Framework::DidSelectProduct(products::ProductsConfig::Product const & product) const -{ - settings::Set(kPlacePageSelectedProduct, product.GetTitle()); -} - -uint32_t Framework::GetTimeoutForReason(ProductsPopupCloseReason reason) const -{ -#ifdef DEBUG - uint32_t constexpr kPopupCloseTimeout = 10; - uint32_t constexpr kProductSelectTimeout = 20; - uint32_t constexpr kRemindMeLaterTimeout = 5; -#else - uint32_t constexpr kPopupCloseTimeout = 60 * 60 * 24 * 30; // 30 days - uint32_t constexpr kProductSelectTimeout = 60 * 60 * 24 * 180; // 180 days - uint32_t constexpr kRemindMeLaterTimeout = 60 * 60 * 24 * 3; // 3 days -#endif - switch (reason) - { - case ProductsPopupCloseReason::Close: return kPopupCloseTimeout; - case ProductsPopupCloseReason::RemindLater: return kRemindMeLaterTimeout; - case ProductsPopupCloseReason::AlreadyDonated: return kProductSelectTimeout; - case ProductsPopupCloseReason::SelectProduct: return kProductSelectTimeout; - } - ASSERT(false, ("Unknown reason")); - return kPopupCloseTimeout; -} - -std::string_view Framework::ToString(ProductsPopupCloseReason reason) const -{ - switch (reason) - { - case ProductsPopupCloseReason::Close: return kProductsPopupCloseReasonCloseStr; - case ProductsPopupCloseReason::RemindLater: return kProductsPopupCloseReasonRemindLaterStr; - case ProductsPopupCloseReason::AlreadyDonated: return kProductsPopupCloseReasonAlreadyDonatedStr; - case ProductsPopupCloseReason::SelectProduct: return kProductsPopupCloseReasonSelectProductStr; - } - ASSERT(false, ("Unknown reason")); - return kProductsPopupCloseReasonCloseStr; -} - -Framework::ProductsPopupCloseReason Framework::FromString(std::string const & str) const -{ - if (str == kProductsPopupCloseReasonCloseStr) - return ProductsPopupCloseReason::Close; - if (str == kProductsPopupCloseReasonRemindLaterStr) - return ProductsPopupCloseReason::RemindLater; - if (str == kProductsPopupCloseReasonAlreadyDonatedStr) - return ProductsPopupCloseReason::AlreadyDonated; - if (str == kProductsPopupCloseReasonSelectProductStr) - return ProductsPopupCloseReason::SelectProduct; - ASSERT(false, ("Incorrect reason string:", str)); - return ProductsPopupCloseReason::Close; -} diff --git a/libs/map/framework.hpp b/libs/map/framework.hpp index d7c8a7a49..d41f95095 100644 --- a/libs/map/framework.hpp +++ b/libs/map/framework.hpp @@ -48,7 +48,6 @@ #include "platform/distance.hpp" #include "platform/location.hpp" #include "platform/platform.hpp" -#include "platform/products.hpp" #include "routing/router.hpp" @@ -832,25 +831,4 @@ public: // PowerManager::Subscriber override. void OnPowerFacilityChanged(power_management::Facility const facility, bool enabled) override; void OnPowerSchemeChanged(power_management::Scheme const actualScheme) override; - -public: - bool ShouldShowProducts() const; - std::optional GetProductsConfiguration() const; - - enum class ProductsPopupCloseReason - { - Close, - SelectProduct, - AlreadyDonated, - RemindLater - }; - - ProductsPopupCloseReason FromString(std::string const & str) const; - - void DidCloseProductsPopup(ProductsPopupCloseReason reason) const; - void DidSelectProduct(products::ProductsConfig::Product const & product) const; - -private: - uint32_t GetTimeoutForReason(ProductsPopupCloseReason reason) const; - std::string_view ToString(ProductsPopupCloseReason reason) const; }; diff --git a/libs/map/place_page_info.cpp b/libs/map/place_page_info.cpp index fcf6ce687..2f1fd33e5 100644 --- a/libs/map/place_page_info.cpp +++ b/libs/map/place_page_info.cpp @@ -30,8 +30,7 @@ bool Info::IsBookmark() const bool Info::ShouldShowAddPlace() const { - auto const isPointOrBuilding = IsPointType() || IsBuilding(); - return !IsTrack() && !(IsFeature() && isPointOrBuilding); + return !IsTrack() && !(IsFeature() && IsPointType()); } void Info::SetFromFeatureType(FeatureType & ft) diff --git a/libs/map/place_page_info.hpp b/libs/map/place_page_info.hpp index 3ea5e3aa1..80d599512 100644 --- a/libs/map/place_page_info.hpp +++ b/libs/map/place_page_info.hpp @@ -105,7 +105,6 @@ public: /// Edit and add bool ShouldShowAddPlace() const; - bool ShouldShowAddBusiness() const { return IsBuilding(); } bool ShouldShowEditPlace() const; bool ShouldEnableAddPlace() const { return m_canEditOrAdd; } diff --git a/libs/platform/CMakeLists.txt b/libs/platform/CMakeLists.txt index f87b1a7c6..c26e864b1 100644 --- a/libs/platform/CMakeLists.txt +++ b/libs/platform/CMakeLists.txt @@ -53,8 +53,6 @@ set(SRC secure_storage.hpp servers_list.cpp servers_list.hpp - products.cpp - products.hpp settings.cpp settings.hpp socket.hpp diff --git a/libs/platform/platform_tests/CMakeLists.txt b/libs/platform/platform_tests/CMakeLists.txt index 2cea6978d..6748b2f71 100644 --- a/libs/platform/platform_tests/CMakeLists.txt +++ b/libs/platform/platform_tests/CMakeLists.txt @@ -15,7 +15,6 @@ set(SRC measurement_tests.cpp platform_test.cpp meta_config_tests.cpp - products_tests.cpp utm_mgrs_utils_tests.cpp ) diff --git a/libs/platform/platform_tests/meta_config_tests.cpp b/libs/platform/platform_tests/meta_config_tests.cpp index 29baa8515..3491e7986 100644 --- a/libs/platform/platform_tests/meta_config_tests.cpp +++ b/libs/platform/platform_tests/meta_config_tests.cpp @@ -1,6 +1,5 @@ #include "testing/testing.hpp" -#include "platform/products.hpp" #include "platform/servers_list.hpp" #include "cppjansson/cppjansson.hpp" @@ -17,7 +16,6 @@ UNIT_TEST(MetaConfig_JSONParser_OldFormat) TEST_EQUAL(result->m_serversList[1], "http://url2", ()); TEST_EQUAL(result->m_serversList[2], "http://url3", ()); TEST(result->m_settings.empty(), ()); - TEST(result->m_productsConfig.empty(), ()); } UNIT_TEST(MetaConfig_JSONParser_InvalidJSON) @@ -50,49 +48,6 @@ UNIT_TEST(MetaConfig_JSONParser_NewFormatWithoutProducts) TEST_EQUAL(result->m_serversList[1], "http://url2", ()); TEST_EQUAL(result->m_settings.size(), 1, ()); TEST_EQUAL(result->m_settings["DonateUrl"], "value1", ()); - TEST(result->m_productsConfig.empty(), ()); -} - -UNIT_TEST(MetaConfig_JSONParser_NewFormatWithProducts) -{ - std::string newFormatJson = R"({ - "servers": ["http://url1", "http://url2"], - "settings": { - "DonateUrl": "value1", - "key2": "value2" - }, - "productsConfig": { - "placePagePrompt": "prompt1", - "aboutScreenPrompt": "prompt2", - "products": [ - { - "title": "Product 1", - "link": "http://product1" - }, - { - "title": "Product 2", - "link": "http://product2" - } - ] - } - })"; - - auto result = ParseMetaConfig(newFormatJson); - TEST(result.has_value(), ()); - TEST_EQUAL(result->m_serversList.size(), 2, ()); - TEST_EQUAL(result->m_serversList[0], "http://url1", ()); - TEST_EQUAL(result->m_serversList[1], "http://url2", ()); - TEST_EQUAL(result->m_settings.size(), 1, ()); - TEST_EQUAL(result->m_settings["DonateUrl"], "value1", ()); - - TEST(!result->m_productsConfig.empty(), ()); - auto const productsConfigResult = products::ProductsConfig::Parse(result->m_productsConfig); - TEST(productsConfigResult.has_value(), ()); - auto const productsConfig = productsConfigResult.value(); - TEST_EQUAL(productsConfig.GetPlacePagePrompt(), "prompt1", ()); - TEST(productsConfig.HasProducts(), ()); - auto const products = productsConfig.GetProducts(); - TEST_EQUAL(products.size(), 2, ()); } UNIT_TEST(MetaConfig_JSONParser_MissingServersKey) diff --git a/libs/platform/platform_tests/products_tests.cpp b/libs/platform/platform_tests/products_tests.cpp deleted file mode 100644 index 38bb2ee26..000000000 --- a/libs/platform/platform_tests/products_tests.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include "testing/testing.hpp" - -#include "platform/products.hpp" - -#include "cppjansson/cppjansson.hpp" - -using namespace products; - -UNIT_TEST(ProductsConfig_ValidConfig) -{ - std::string jsonStr = R"({ - "placePagePrompt": "prompt1", - "products": [ - { - "title": "Product 1", - "link": "http://product1" - }, - { - "title": "Product 2", - "link": "http://product2" - } - ] - })"; - - auto const result = ProductsConfig::Parse(jsonStr); - TEST(result.has_value(), ()); - auto const productsConfig = result.value(); - TEST_EQUAL(productsConfig.GetPlacePagePrompt(), "prompt1", ()); - - auto const products = productsConfig.GetProducts(); - TEST_EQUAL(products.size(), 2, ()); - TEST_EQUAL(products[0].GetTitle(), "Product 1", ()); - TEST_EQUAL(products[0].GetLink(), "http://product1", ()); - TEST_EQUAL(products[1].GetTitle(), "Product 2", ()); - TEST_EQUAL(products[1].GetLink(), "http://product2", ()); -} - -UNIT_TEST(ProductsConfig_EmptyPrompts) -{ - std::string jsonStr = R"({ - "aboutScreenPrompt": "", - "products": [ - { - "title": "Product 1", - "link": "http://product1" - }, - { - "title": "Product 2", - "link": "http://product2" - } - ] - })"; - - auto const result = ProductsConfig::Parse(jsonStr); - TEST(result.has_value(), ()); - auto const productsConfig = result.value(); - TEST_EQUAL(productsConfig.GetPlacePagePrompt(), "", ()); - TEST_EQUAL(productsConfig.GetProducts().size(), 2, ()); -} - -UNIT_TEST(ProductsConfig_InvalidProduct) -{ - std::string jsonStr = R"({ - "placePagePrompt": "prompt1", - "products": [ - { - "title": "Product 1" - }, - { - "title": "Product 2", - "link": "http://product2" - } - ] - })"; - - auto const result = ProductsConfig::Parse(jsonStr); - TEST(result.has_value(), ()); - auto const productsConfig = result.value(); - TEST_EQUAL(productsConfig.GetPlacePagePrompt(), "prompt1", ()); - - auto const products = productsConfig.GetProducts(); - TEST_EQUAL(products.size(), 1, ()); - TEST_EQUAL(products[0].GetTitle(), "Product 2", ()); - TEST_EQUAL(products[0].GetLink(), "http://product2", ()); -} - -UNIT_TEST(ProductsConfig_EmptyProducts) -{ - std::string jsonStr = R"({ - "placePagePrompt": "prompt1", - "products": [] - })"; - - auto const result = ProductsConfig::Parse(jsonStr); - TEST(!result.has_value(), ()); -} - -UNIT_TEST(ProductsConfig_MissedProductsField) -{ - std::string jsonStr = R"({ - "placePagePrompt": "prompt1" - })"; - - auto const result = ProductsConfig::Parse(jsonStr); - TEST(!result.has_value(), ()); -} diff --git a/libs/platform/products.cpp b/libs/platform/products.cpp deleted file mode 100644 index e46f421dd..000000000 --- a/libs/platform/products.cpp +++ /dev/null @@ -1,119 +0,0 @@ -#include "platform/products.hpp" -#include "platform/platform.hpp" - -#include "base/assert.hpp" -#include "base/logging.hpp" -#include "base/string_utils.hpp" - -#include "defines.hpp" - -#include "coding/file_writer.hpp" - -#include "cppjansson/cppjansson.hpp" - -namespace products -{ - -char const kPlacePagePrompt[] = "placePagePrompt"; -char const kProducts[] = "products"; -char const kProductTitle[] = "title"; -char const kProductLink[] = "link"; - -std::string GetProductsFilePath() -{ - return GetPlatform().SettingsPathForFile(PRODUCTS_SETTINGS_FILE_NAME); -} - -ProductsSettings::ProductsSettings() -{ - std::lock_guard guard(m_mutex); - auto const path = GetProductsFilePath(); - if (Platform::IsFileExistsByFullPath(path)) - { - try - { - std::string outValue; - auto dataReader = GetPlatform().GetReader(path); - dataReader->ReadAsString(outValue); - m_productsConfig = ProductsConfig::Parse(outValue); - } - catch (std::exception const & ex) - { - LOG(LERROR, ("Error reading ProductsConfig file.", ex.what())); - } - } - LOG(LWARNING, ("ProductsConfig file not found.")); -} - -ProductsSettings & ProductsSettings::Instance() -{ - static ProductsSettings instance; - return instance; -} - -std::optional ProductsSettings::Get() -{ - std::lock_guard guard(m_mutex); - return m_productsConfig; -} - -void ProductsSettings::Update(std::string const & jsonStr) -{ - std::lock_guard guard(m_mutex); - if (jsonStr.empty()) - FileWriter::DeleteFileX(GetProductsFilePath()); - else - { - try - { - FileWriter file(GetProductsFilePath()); - file.Write(jsonStr.data(), jsonStr.size()); - m_productsConfig = ProductsConfig::Parse(jsonStr); - } - catch (std::exception const & ex) - { - LOG(LERROR, ("Error writing ProductsConfig file.", ex.what())); - } - } -} - -std::optional ProductsConfig::Parse(std::string const & jsonStr) -{ - base::Json const root(jsonStr.c_str()); - auto const json = root.get(); - auto const productsObj = json_object_get(json, kProducts); - if (!json_is_object(json) || !productsObj || !json_is_array(productsObj)) - { - LOG(LWARNING, ("Failed to parse ProductsConfig:", jsonStr)); - return std::nullopt; - } - - ProductsConfig config; - auto const placePagePrompt = json_object_get(json, kPlacePagePrompt); - if (placePagePrompt && json_is_string(placePagePrompt)) - config.m_placePagePrompt = json_string_value(placePagePrompt); - - for (size_t i = 0; i < json_array_size(productsObj); ++i) - { - json_t * product = json_array_get(productsObj, i); - if (!product || !json_is_object(product)) - { - LOG(LWARNING, ("Failed to parse Product:", jsonStr)); - continue; - } - json_t * title = json_object_get(product, kProductTitle); - json_t * link = json_object_get(product, kProductLink); - if (title && link && json_is_string(title) && json_is_string(link)) - config.m_products.push_back({json_string_value(title), json_string_value(link)}); - else - LOG(LWARNING, ("Failed to parse Product:", jsonStr)); - } - if (config.m_products.empty()) - { - LOG(LWARNING, ("Products list is empty")); - return std::nullopt; - } - return config; -} - -} // namespace products diff --git a/libs/platform/products.hpp b/libs/platform/products.hpp deleted file mode 100644 index f4a890895..000000000 --- a/libs/platform/products.hpp +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace products -{ - -struct ProductsConfig -{ - struct Product - { - private: - std::string m_title; - std::string m_link; - - public: - Product(std::string const & title, std::string const & link) : m_title(title), m_link(link) {} - - std::string const & GetTitle() const { return m_title; } - std::string const & GetLink() const { return m_link; } - }; - -private: - std::string m_placePagePrompt; - std::vector m_products; - -public: - std::string const GetPlacePagePrompt() const { return m_placePagePrompt; } - std::vector const & GetProducts() const { return m_products; } - bool HasProducts() const { return !m_products.empty(); } - - static std::optional Parse(std::string const & jsonStr); -}; - -class ProductsSettings -{ -private: - ProductsSettings(); - - std::optional m_productsConfig; - mutable std::mutex m_mutex; - -public: - static ProductsSettings & Instance(); - - void Update(std::string const & jsonStr); - std::optional Get(); -}; - -inline void Update(std::string const & jsonStr) -{ - ProductsSettings::Instance().Update(jsonStr); -} - -inline std::optional GetProductsConfiguration() -{ - return ProductsSettings::Instance().Get(); -} - -} // namespace products diff --git a/libs/platform/servers_list.cpp b/libs/platform/servers_list.cpp index 1a4622689..ab6dd7901 100644 --- a/libs/platform/servers_list.cpp +++ b/libs/platform/servers_list.cpp @@ -16,7 +16,6 @@ std::optional ParseMetaConfig(std::string const & jsonStr) { char const kSettings[] = "settings"; char const kServers[] = "servers"; - char const kProductsConfig[] = "productsConfig"; MetaConfig outMetaConfig; try @@ -48,12 +47,6 @@ std::optional ParseMetaConfig(std::string const & jsonStr) } servers = json_object_get(root.get(), kServers); - - auto const productsConfig = json_object_get(root.get(), kProductsConfig); - if (productsConfig) - outMetaConfig.m_productsConfig = json_dumps(productsConfig, JSON_ENCODE_ANY); - else - LOG(LINFO, ("No ProductsConfig in meta configuration")); } else { diff --git a/libs/platform/servers_list.hpp b/libs/platform/servers_list.hpp index 7887c02e7..c6f605c4d 100644 --- a/libs/platform/servers_list.hpp +++ b/libs/platform/servers_list.hpp @@ -14,7 +14,6 @@ struct MetaConfig ServersList m_serversList; using SettingsMap = std::map; SettingsMap m_settings; - std::string m_productsConfig; }; std::optional ParseMetaConfig(std::string const & jsonStr); diff --git a/libs/routing/mwm_hierarchy_handler.cpp b/libs/routing/mwm_hierarchy_handler.cpp index bd60b2fe9..a8aaaeac5 100644 --- a/libs/routing/mwm_hierarchy_handler.cpp +++ b/libs/routing/mwm_hierarchy_handler.cpp @@ -17,20 +17,20 @@ using CountrySetT = std::unordered_set; CountrySetT kEAEU = {"Armenia", "Belarus", "Kazakhstan", "Kyrgyzstan", "Russian Federation"}; // The Schengen Area list of countries. -CountrySetT kSchengenArea = {"Austria", "Belgium", "Czech Republic", "Denmark", "Estonia", "Finland", - "France", "Germany", "Greece", "Hungary", "Iceland", "Italy", - "Latvia", "Liechtenstein", "Lithuania", "Luxembourg", "Malta", "Netherlands", - "Norway", "Poland", "Portugal", "Slovakia", "Slovenia", "Spain", - "Sweden", "Switzerland", "Croatia"}; +CountrySetT kSchengenArea = {"Austria", "Belgium", "Bulgaria", "Croatia", "Czech Republic", "Denmark", + "Estonia", "Finland", "France", "Germany", "Greece", "Hungary", + "Iceland", "Italy", "Latvia", "Liechtenstein", "Lithuania", "Luxembourg", + "Malta", "Netherlands", "Norway", "Poland", "Portugal", "Romania", + "Slovakia", "Slovenia", "Spain", "Sweden", "Switzerland"}; -std::string_view kIreland = "Ireland"; -std::string_view kNorthernIrelandMwm = "UK_Northern Ireland"; +std::string_view constexpr kIreland = "Ireland"; +std::string_view constexpr kNorthernIrelandMwm = "UK_Northern Ireland"; // In fact, there is no _total_ border control on major roads between Israel and Palestine (UN boundary), except: // - Gaza, strict access/barrier restrictions should be mapped, no transit traffic. // - West bank wall (https://www.openstreetmap.org/relation/1410327), access/barrier restrictions should be mapped. CountrySetT kIsraelAndPalestine = {"Israel Region", "Palestine Region"}; -std::string_view kJerusalemMwm = "Jerusalem"; +std::string_view constexpr kJerusalemMwm = "Jerusalem"; bool IsInSet(CountrySetT const & theSet, std::string const & country) { diff --git a/libs/routing/routing_options.cpp b/libs/routing/routing_options.cpp index 69832371e..b2eaa3fbe 100644 --- a/libs/routing/routing_options.cpp +++ b/libs/routing/routing_options.cpp @@ -65,7 +65,9 @@ RoutingOptionsClassifier::RoutingOptionsClassifier() {{"highway", "track"}, RoutingOptions::Road::Dirty}, {{"highway", "road"}, RoutingOptions::Road::Dirty}, {{"psurface", "unpaved_bad"}, RoutingOptions::Road::Dirty}, - {{"psurface", "unpaved_good"}, RoutingOptions::Road::Dirty}}; + {{"psurface", "unpaved_good"}, RoutingOptions::Road::Dirty}, + {{"highway", "steps"}, RoutingOptions::Road::Steps}, + {{"highway", "ladder"}, RoutingOptions::Road::Steps}}; m_data.Reserve(std::size(types)); for (auto const & data : types) @@ -103,6 +105,9 @@ RoutingOptions::Road ChooseMainRoutingOptionRoad(RoutingOptions options, bool is if (options.Has(RoutingOptions::Road::Motorway)) return RoutingOptions::Road::Motorway; + if (options.Has(RoutingOptions::Road::Steps)) + return RoutingOptions::Road::Steps; + return RoutingOptions::Road::Usual; } @@ -126,6 +131,7 @@ string DebugPrint(RoutingOptions const & routingOptions) append(RoutingOptions::Road::Motorway); append(RoutingOptions::Road::Ferry); append(RoutingOptions::Road::Dirty); + append(RoutingOptions::Road::Steps); if (wasAppended) ss << " | "; @@ -143,6 +149,7 @@ string DebugPrint(RoutingOptions::Road type) case RoutingOptions::Road::Motorway: return "motorway"; case RoutingOptions::Road::Ferry: return "ferry"; case RoutingOptions::Road::Dirty: return "dirty"; + case RoutingOptions::Road::Steps: return "steps"; case RoutingOptions::Road::Usual: return "usual"; case RoutingOptions::Road::Max: return "max"; } diff --git a/libs/routing/routing_options.hpp b/libs/routing/routing_options.hpp index 06d6f30a7..b7e53b667 100644 --- a/libs/routing/routing_options.hpp +++ b/libs/routing/routing_options.hpp @@ -18,8 +18,9 @@ public: Motorway = 1u << 2, Ferry = 1u << 3, Dirty = 1u << 4, + Steps = 1u << 5, - Max = (1u << 4) + 1 + Max = (1u << 5) + 1 }; using RoadType = std::underlying_type_t; diff --git a/libs/routing/routing_settings.cpp b/libs/routing/routing_settings.cpp index 258949c1c..c2ffae340 100644 --- a/libs/routing/routing_settings.cpp +++ b/libs/routing/routing_settings.cpp @@ -78,7 +78,7 @@ RoutingSettings GetRoutingSettings(VehicleType vehicleType) return {true /* useDirectionForRouteBuilding */, true /* m_matchRoute */, true /* m_soundDirection */, - 50.0 /* m_matchingThresholdM */, + 30.0 /* m_matchingThresholdM */, true /* m_showTurnAfterNext */, measurement_utils::KmphToMps(3.0) /* m_minSpeedForRouteRebuildMpS */, 20.0 /* m_finishToleranceM */, diff --git a/libs/search/query_params.cpp b/libs/search/query_params.cpp index c273664f1..95dbb74aa 100644 --- a/libs/search/query_params.cpp +++ b/libs/search/query_params.cpp @@ -18,26 +18,26 @@ namespace unordered_map> const kSynonyms = { /// @todo Should process synonyms with errors like "blvrd" -> "blvd". /// @see HouseOnStreetSynonymsWithMisprints test. - {"1", {"pierwszy", "pierwsza", "un", "una", "pierwsze", "primo"}}, + {"1", {"pierwszy", "pierwsza", "un", "una", "pierwsze", "primo", "واحد", "حادى", "احد"}}, {"1st", {"first"}}, {"1°", {"primo"}}, - {"20", {"venti"}}, - {"25", {"venticinque"}}, - {"2", {"due", "drugi", "drugie", "druga"}}, + {"20", {"venti", "عشرين", "عشرون"}}, + {"25", {"venticinque", "خمسه و عشرون", "خمس و عشرين"}}, + {"2", {"due", "drugi", "drugie", "druga", "اثنان", "اثنين"}}, {"2nd", {"second"}}, - {"3", {"trzecia", "trzecie", "tre", "trzeci"}}, + {"3", {"trzecia", "trzecie", "tre", "trzeci", "ثلاث"}}, {"3rd", {"third"}}, - {"4", {"quattro"}}, + {"4", {"quattro", "اربع"}}, {"4th", {"fourth"}}, - {"5", {"cinque"}}, + {"5", {"cinque", "خمس"}}, {"5th", {"fifth"}}, - {"6", {"sei"}}, + {"6", {"sei", "ست"}}, {"6th", {"sixth"}}, - {"7", {"sette"}}, + {"7", {"sette", "سبع"}}, {"7th", {"seventh"}}, - {"8", {"otto"}}, + {"8", {"otto", "ثمان", "ثمانيه"}}, {"8th", {"eighth"}}, - {"9", {"nove"}}, + {"9", {"nove", "تسع"}}, {"9th", {"ninth"}}, {"10th", {"tenth"}}, {"11th", {"eleventh"}}, @@ -50,7 +50,7 @@ unordered_map> const kSynonyms = { {"18th", {"eighteenth"}}, {"19th", {"nineteenth"}}, {"20th", {"twentieth"}}, - {"a", {"am", "auto-estrada"}}, + {"a", {"am", "auto-estrada", "aikštė"}}, {"abe", {"abbaye"}}, {"accs", {"access"}}, {"aceq", {"acequia"}}, @@ -332,9 +332,10 @@ unordered_map> const kSynonyms = { {"crtjo", {"cortijo"}}, {"csac", {"cul-de-sac"}}, {"cs", {"cross"}}, + {"čs", {"československé", "československého", "československých"}}, {"csg", {"crossing"}}, {"csl", {"casal"}}, - {"čsl", {"československej"}}, + {"čsl", {"československej", "československé", "československého", "československých"}}, {"cso", {"corso"}}, {"csrio", {"caserío"}}, {"cstan", {"costanilla"}}, @@ -450,7 +451,7 @@ unordered_map> const kSynonyms = { {"espa", {"espace"}}, {"esp", {"esplanade", "esplanades"}}, {"espl", {"esplanade"}}, - {"esq", {"esquerdo"}}, + {"esq", {"esquerdo", "esquina"}}, {"estac", {"estacionament"}}, {"estcn", {"estación"}}, {"estda", {"estrada"}}, @@ -520,7 +521,7 @@ unordered_map> const kSynonyms = { {"gebr", {"gebroeders"}}, {"gen", {"generaal", "generała", "generála", "general"}}, {"geo", {"george"}}, - {"g", {"gata", "gasse", "großes", "großer", "gatan", "große", "gaten", "gate"}}, + {"g", {"gata", "gasse", "großes", "großer", "gatan", "große", "gaten", "gate", "gatvė"}}, {"gg", {"gang"}}, {"ghf", {"gasthof"}}, {"gh", {"gasthaus"}}, @@ -539,8 +540,7 @@ unordered_map> const kSynonyms = { {"gpt", {"groupement"}}, {"gra", {"grange"}}, {"grg", {"gymnasium und realgymnasium"}}, - {"gr", {"grande rue", "grandes rues", "gracht", "grand’rue", "gränd", "graben", "grovet", "gränden", "grove"}}, - {"gr", {"großes", "große", "großer"}}, + {"gr", {"grande rue", "grandes rues", "gracht", "grand’rue", "gränd", "graben", "grovet", "gränden", "grove", "großes", "große", "großer"}}, {"gri", {"grille"}}, {"grim", {"grimpette"}}, {"grnd", {"ground"}}, @@ -581,8 +581,7 @@ unordered_map> const kSynonyms = { {"hse", {"house"}}, {"hs", {"haus", "high school"}}, {"hst", {"haltestelle"}}, - {"ht", {"heights"}}, - {"ht", {"hinteres", "hinterer", "hinter…", "hintere"}}, + {"ht", {"heights", "hinteres", "hinterer", "hinter…", "hintere"}}, {"htl", {"höhere technische lehranstalt"}}, {"hts", {"heights"}}, {"htt", {"hütte"}}, @@ -602,7 +601,7 @@ unordered_map> const kSynonyms = { {"imp", {"impasse", "impasses"}}, {"ind", {"industrial"}}, {"inf", {"infante"}}, - {"ing", {"inžiniera", "inžinierky", "ingenieur"}}, + {"ing", {"inžiniera", "inžinierky", "ingenieur", "inženýra", "inženýrky"}}, {"inst", {"instituto"}}, {"intg", {"interchange"}}, {"int", {"interior", "internationaler", "intrarea", "internationales", "internationale"}}, @@ -611,8 +610,7 @@ unordered_map> const kSynonyms = { {"intr", {"intrarea"}}, {"ip", {"itinerário principal", "idrottsplats"}}, {"i", {"prima", "pierwszy", "pierwsza", "in", "island", "pierwsze", "primo", "im"}}, - {"ir", {"ingenieur"}}, - {"ir", {"insinyur", "ingenieur"}}, + {"ir", {"ingenieur", "insinyur"}}, {"is", {"island"}}, {"iv", {"quattro", "quarta", "quarto"}}, {"ix", {"nona", "nono"}}, @@ -633,8 +631,7 @@ unordered_map> const kSynonyms = { {"kag", {"kagawad"}}, {"ka", {"kereta api", "kläranlage"}}, {"kan", {"kanunnik"}}, - {"kap", {"kapelle"}}, - {"kap", {"kapitan"}}, + {"kap", {"kapelle", "kapitan"}}, {"kapt", {"kapitan"}}, {"kard", {"kardinaal", "kardynał"}}, {"kcn", {"khu công nghiệp"}}, @@ -718,13 +715,11 @@ unordered_map> const kSynonyms = { {"mevr", {"mevrouw"}}, {"mf", {"maison forestière"}}, {"mgr", {"monseigneur"}}, - {"mgr", {"monseigneur"}}, {"mh", {"mahalle"}}, {"mid", {"middle"}}, {"mil", {"military"}}, {"mi", {"mile"}}, {"min", {"minister", "ministro"}}, - {"mjr", {"majora"}}, {"mjr", {"majora", "major"}}, {"mkt", {"markt", "market"}}, {"mł", {"mała", "mały", "małe"}}, @@ -740,7 +735,6 @@ unordered_map> const kSynonyms = { {"mpal", {"municipal"}}, {"mq", {"marquês"}}, {"mrdor", {"mirador"}}, - {"mr", {"meester"}}, {"mr", {"meester", "meander"}}, {"ms", {"middle school"}}, {"mte", {"montée", "montées"}}, @@ -757,6 +751,7 @@ unordered_map> const kSynonyms = { {"mwy", {"motorway"}}, {"mz", {"manzana"}}, {"nábr", {"nábrežie"}}, + {"nábř", {"nábřeží"}}, {"nac", {"nacional"}}, {"nám", {"námestie", "náměstí"}}, {"n:a", {"norra"}}, @@ -872,7 +867,6 @@ unordered_map> const kSynonyms = { {"plk", {"plukovníka"}}, {"płk", {"pułkownika (pułkownik)"}}, {"pln", {"plaine", "plein"}}, - {"pln", {"plein"}}, {"pl", {"placu", "plaça", "platz", "plain", "placem", "planta", "plass", "place", "plaza", "plassen", "plains", "plats", "platsen", "plac"}}, @@ -897,8 +891,7 @@ unordered_map> const kSynonyms = { {"p", {"pfad", "polku", "phường", "pater", "paseo"}}, {"pplk", {"podplukovníka"}}, {"ppłk", {"ppułkownika", "podpułkownika", "podpułkownik"}}, - {"ppor", {"podporučíka"}}, - {"ppor", {"pporucznika", "podporucznika", "podporucznik"}}, + {"ppor", {"pporucznika", "podporucznika", "podporucznik", "podporučíka"}}, {"pq", {"parque"}}, {"pque", {"parque"}}, {"pral", {"principal"}}, @@ -908,7 +901,7 @@ unordered_map> const kSynonyms = { {"prk", {"purok"}}, {"prm", {"promenade"}}, {"profª", {"professora"}}, - {"prof", {"professora", "professor", "profesora/profesorky", "profesora (profesor)"}}, + {"prof", {"professora", "professor", "profesora", "profesorky", "profesora (profesor)"}}, {"proj", {"projectada", "projetada"}}, {"prolng", {"prolongamento"}}, {"prol", {"prolongación"}}, @@ -916,7 +909,7 @@ unordered_map> const kSynonyms = { {"provl", {"provincial"}}, {"prov", {"province"}}, {"p+r", {"parking relais", "parc relais"}}, - {"pr", {"praça", "prinses", "prins"}}, + {"pr", {"praça", "prinses", "prins", "prospektas"}}, {"prq", {"presqu’île"}}, {"prtco", {"pórtico"}}, {"prt", {"petite route"}}, @@ -951,8 +944,7 @@ unordered_map> const kSynonyms = { {"qd", {"quadra", "quadrant"}}, {"qdrt", {"quadrant"}}, {"ql", {"quốc lộ"}}, - {"q", {"quadra", "quận"}}, - {"q", {"quelle"}}, + {"q", {"quadra", "quận", "quelle"}}, {"qta", {"quinta"}}, {"qt", {"quảng trường"}}, {"quad", {"quad"}}, @@ -986,7 +978,7 @@ unordered_map> const kSynonyms = { {"rem", {"rempart"}}, {"rep", {"representative"}}, {"resid", {"residencial"}}, - {"res", {"reservation", "reserve", "reservoir", "résidence", "résidences"}}, + {"res", {"reservation", "reserve", "reservoir", "résidence", "résidences", "residencias", "residencia"}}, {"rest", {"rest"}}, {"rge", {"range"}}, {"rg", {"range"}}, @@ -1066,10 +1058,11 @@ unordered_map> const kSynonyms = { {"sh", {"state highway"}}, {"shun", {"shunt"}}, {"shwy", {"state highway"}}, - {"sídl", {"sídlisko"}}, + {"sídl", {"sídlisko", "sídliště"}}, {"sixth", {"6th"}}, {"sixteenth", {"16th"}}, {"sk", {"sokak", "sokağı"}}, + {"skv", {"skveras"}}, {"slj", {"sobre-loja"}}, {"slov", {"slovenskih"}}, {"slpe", {"slope"}}, @@ -1124,7 +1117,7 @@ unordered_map> const kSynonyms = { /// Remove "street" and "avenue" here, but should update GetNameScore. {"st", {"santo", "sant", "sint", "saint", "stara", "street", "stary", "stora", "sankt", "store", "stare", "stig", - "stigen", "sancta"}}, + "stigen", "sancta", "stotelė"}}, {"št", {"šent"}}, {"stwg", {"steenweg"}}, {"subdiv", {"subdivision"}}, @@ -1220,8 +1213,7 @@ unordered_map> const kSynonyms = { {"vcto", {"viaducto"}}, {"vda", {"viuda"}}, {"vdct", {"viaduct"}}, - {"vd", {"van de", "van den", "van der"}}, - {"vd", {"vorderer", "vorderes", "vordere"}}, + {"vd", {"van de", "van den", "van der", "vorderer", "vorderes", "vordere"}}, {"vecin", {"vecindario"}}, {"vel", {"veliki", "velike", "veliko", "velika", "velikem"}}, {"ven", {"venelles", "venelle"}}, @@ -1388,8 +1380,7 @@ unordered_map> const kSynonyms = { {"医", {"医療法人"}}, {"合", {"合同会社"}}, {"名", {"合名会社"}}, - {"大", {"国立大学法人", "公立大学法人"}}, - {"大", {"大学"}}, + {"大", {"国立大学法人", "公立大学法人","大学"}}, {"学", {"学校法人"}}, {"小", {"小学校"}}, {"有", {"有限会社"}}, @@ -1402,9 +1393,32 @@ unordered_map> const kSynonyms = { {"高", {"高等学校"}}, {"ش", {"شارع"}}, {"ط", {"طريق"}}, - {"م", {"ميدان"}}, + {"م", {"ميدان", "مجاوره", "محطه", "موقف"}}, {"د", {"دكتور"}}, - {"ج", {"جامعة"}} + {"ج", {"جامعه"}}, + {"ح", {"حى"}}, + {"ع", {"عماره"}}, + {"احد", {"1"}}, + {"واحد", {"1"}}, + {"حادى", {"1"}}, + {"اثنين", {"2"}}, + {"اثنان", {"2"}}, + {"ثلاث", {"3"}}, + {"اربع", {"4"}}, + {"خمس", {"5"}}, + {"ست", {"6"}}, + {"سبع", {"7"}}, + {"ثمان", {"8"}}, + {"ثمانيه", {"8"}}, + {"تسع", {"9"}}, + {"عشر", {"10"}}, + {"عشرين", {"20"}}, + {"عشرون", {"20"}}, + {"الحد", {"الاحد"}}, + {"الاحد", {"الحد"}}, + {"التلات", {"الثلاثاء"}}, + {"الثلاثاء", {"التلات"}}, + /* These synonyms are currently unreachable per https://codeberg.org/comaps/comaps/issues/1242 {"arm. gen", {"armádneho generála"}}, @@ -1449,7 +1463,6 @@ unordered_map> const kSynonyms = { {"n z", {"noordzijde"}}, {"n. z", {"noordzijde"}}, {"o.l.v", {"onze-lieve-vrouw"}}, - {"o.l.v", {"onze-lieve-vrouw"}}, {"o z", {"oostzijde"}}, {"o. z", {"oostzijde"}}, {"pg. ind", {"polígono industrial"}}, diff --git a/libs/storage/map_files_downloader.cpp b/libs/storage/map_files_downloader.cpp index 44e4292e0..391eb616b 100644 --- a/libs/storage/map_files_downloader.cpp +++ b/libs/storage/map_files_downloader.cpp @@ -6,7 +6,6 @@ #include "platform/http_client.hpp" #include "platform/locale.hpp" #include "platform/platform.hpp" -#include "platform/products.hpp" #include "platform/servers_list.hpp" #include "platform/settings.hpp" @@ -48,7 +47,6 @@ void MapFilesDownloader::RunMetaConfigAsync(std::function && callback) { m_serversList = metaConfig.m_serversList; settings::Update(metaConfig.m_settings); - products::Update(metaConfig.m_productsConfig); callback(); // Reset flag to invoke servers list downloading next time if current request has failed. diff --git a/xcode/indexer/indexer.xcodeproj/project.pbxproj b/xcode/indexer/indexer.xcodeproj/project.pbxproj index 56e4114f2..6acd3593f 100644 --- a/xcode/indexer/indexer.xcodeproj/project.pbxproj +++ b/xcode/indexer/indexer.xcodeproj/project.pbxproj @@ -7,6 +7,9 @@ objects = { /* Begin PBXBuildFile section */ + 27BCD5272E93E625002C50F0 /* feature_charge_sockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27BCD5262E93E625002C50F0 /* feature_charge_sockets.cpp */; }; + 27BCD5282E93E625002C50F0 /* feature_charge_sockets.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 27BCD5252E93E625002C50F0 /* feature_charge_sockets.hpp */; }; + 27BCD52A2E93E670002C50F0 /* feature_charge_sockets_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27BCD5292E93E670002C50F0 /* feature_charge_sockets_test.cpp */; }; 34583BC71C88552100F94664 /* cuisines.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34583BC11C88552100F94664 /* cuisines.cpp */; }; 34583BC81C88552100F94664 /* cuisines.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 34583BC21C88552100F94664 /* cuisines.hpp */; }; 34583BC91C88552100F94664 /* editable_map_object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34583BC31C88552100F94664 /* editable_map_object.cpp */; }; @@ -227,6 +230,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 27BCD5252E93E625002C50F0 /* feature_charge_sockets.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = feature_charge_sockets.hpp; sourceTree = ""; }; + 27BCD5262E93E625002C50F0 /* feature_charge_sockets.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = feature_charge_sockets.cpp; sourceTree = ""; }; + 27BCD5292E93E670002C50F0 /* feature_charge_sockets_test.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = feature_charge_sockets_test.cpp; sourceTree = ""; }; 34583BC11C88552100F94664 /* cuisines.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cuisines.cpp; sourceTree = ""; }; 34583BC21C88552100F94664 /* cuisines.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cuisines.hpp; sourceTree = ""; }; 34583BC31C88552100F94664 /* editable_map_object.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = editable_map_object.cpp; sourceTree = ""; }; @@ -541,6 +547,7 @@ 670C61011AB065B100C38A8C /* data_source_test.cpp */, 56C74C271C749E8100B71B9F /* drules_selector_parser_test.cpp */, 3D489BA71D3D1F8A0052AA38 /* editable_map_object_test.cpp */, + 27BCD5292E93E670002C50F0 /* feature_charge_sockets_test.cpp */, 56C74C281C749E8100B71B9F /* feature_metadata_test.cpp */, 3D452AF81EE6D9F5009EAB9B /* feature_names_test.cpp */, 391C0C8522BD255E003DC252 /* feature_to_osm_tests.cpp */, @@ -651,6 +658,8 @@ 675340BE1A3F540F00A0A8C3 /* feature_algo.cpp */, 675340BF1A3F540F00A0A8C3 /* feature_algo.hpp */, 34664CF01D49FEC1003D7096 /* feature_altitude.hpp */, + 27BCD5262E93E625002C50F0 /* feature_charge_sockets.cpp */, + 27BCD5252E93E625002C50F0 /* feature_charge_sockets.hpp */, 675340C01A3F540F00A0A8C3 /* feature_covering.cpp */, 675340C11A3F540F00A0A8C3 /* feature_covering.hpp */, 675340C21A3F540F00A0A8C3 /* feature_data.cpp */, @@ -754,6 +763,7 @@ buildActionMask = 2147483647; files = ( E906DE3C1CF44934004C4F5E /* postcodes_matcher.hpp in Headers */, + 27BCD5282E93E625002C50F0 /* feature_charge_sockets.hpp in Headers */, 6753414E1A3F540F00A0A8C3 /* types_mapping.hpp in Headers */, 67BC92F31D21476500A4A378 /* string_set.hpp in Headers */, 675341151A3F540F00A0A8C3 /* feature_covering.hpp in Headers */, @@ -971,6 +981,7 @@ 670C612C1AB0663400C38A8C /* testingmain.cpp in Sources */, 3D489BC61D3D220F0052AA38 /* editable_map_object_test.cpp in Sources */, 670BAA8D1D0B069A000302DA /* succinct_trie_test.cpp in Sources */, + 27BCD52A2E93E670002C50F0 /* feature_charge_sockets_test.cpp in Sources */, 670BAA951D0B06E1000302DA /* cell_coverer_test.cpp in Sources */, 670BAA8C1D0B0673000302DA /* trie_test.cpp in Sources */, ); @@ -1007,6 +1018,7 @@ 391C0C8322BD2551003DC252 /* feature_to_osm.cpp in Sources */, 675341401A3F540F00A0A8C3 /* scales.cpp in Sources */, 675341251A3F540F00A0A8C3 /* feature.cpp in Sources */, + 27BCD5272E93E625002C50F0 /* feature_charge_sockets.cpp in Sources */, 675341091A3F540F00A0A8C3 /* data_header.cpp in Sources */, F61F83061E4B187500B37B7A /* road_shields_parser.cpp in Sources */, 670EE56C1B60033A001E8064 /* features_vector.cpp in Sources */, diff --git a/xcode/platform/platform.xcodeproj/project.pbxproj b/xcode/platform/platform.xcodeproj/project.pbxproj index a2ef9f9e0..bac51beb6 100644 --- a/xcode/platform/platform.xcodeproj/project.pbxproj +++ b/xcode/platform/platform.xcodeproj/project.pbxproj @@ -111,10 +111,7 @@ D5B191CF2386C7E4009CD0D6 /* http_uploader_background.hpp in Headers */ = {isa = PBXBuildFile; fileRef = D5B191CE2386C7E4009CD0D6 /* http_uploader_background.hpp */; }; EB60B4DC204C130300E4953B /* network_policy_ios.mm in Sources */ = {isa = PBXBuildFile; fileRef = EB60B4DB204C130300E4953B /* network_policy_ios.mm */; }; EB60B4DE204C175700E4953B /* network_policy_ios.h in Headers */ = {isa = PBXBuildFile; fileRef = EB60B4DD204C175700E4953B /* network_policy_ios.h */; }; - ED49D7402CEE438E004AF27E /* products.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED49D73F2CEE438E004AF27E /* products.cpp */; }; - ED49D7412CEE438E004AF27E /* products.hpp in Headers */ = {isa = PBXBuildFile; fileRef = ED49D73E2CEE438E004AF27E /* products.hpp */; }; ED49D7442CEE43A4004AF27E /* meta_config_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED49D7422CEE43A4004AF27E /* meta_config_tests.cpp */; }; - ED49D7452CEE43A4004AF27E /* products_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED49D7432CEE43A4004AF27E /* products_tests.cpp */; }; ED965B252CD8F72E0049E39E /* duration.hpp in Headers */ = {isa = PBXBuildFile; fileRef = ED965B242CD8F72A0049E39E /* duration.hpp */; }; ED965B272CD8F7810049E39E /* duration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED965B262CD8F77D0049E39E /* duration.cpp */; }; ED965B472CDA52DB0049E39E /* duration_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED965B462CDA4EC00049E39E /* duration_tests.cpp */; }; @@ -257,10 +254,7 @@ D5B191CE2386C7E4009CD0D6 /* http_uploader_background.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = http_uploader_background.hpp; sourceTree = ""; }; EB60B4DB204C130300E4953B /* network_policy_ios.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = network_policy_ios.mm; sourceTree = ""; }; EB60B4DD204C175700E4953B /* network_policy_ios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = network_policy_ios.h; sourceTree = ""; }; - ED49D73E2CEE438E004AF27E /* products.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = products.hpp; sourceTree = ""; }; - ED49D73F2CEE438E004AF27E /* products.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = products.cpp; sourceTree = ""; }; ED49D7422CEE43A4004AF27E /* meta_config_tests.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = meta_config_tests.cpp; sourceTree = ""; }; - ED49D7432CEE43A4004AF27E /* products_tests.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = products_tests.cpp; sourceTree = ""; }; ED965B242CD8F72A0049E39E /* duration.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = duration.hpp; sourceTree = ""; }; ED965B262CD8F77D0049E39E /* duration.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = duration.cpp; sourceTree = ""; }; ED965B462CDA4EC00049E39E /* duration_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = duration_tests.cpp; sourceTree = ""; }; @@ -323,7 +317,6 @@ isa = PBXGroup; children = ( ED49D7422CEE43A4004AF27E /* meta_config_tests.cpp */, - ED49D7432CEE43A4004AF27E /* products_tests.cpp */, ED965B462CDA4EC00049E39E /* duration_tests.cpp */, 168EFCC12A30EB7400F71EE8 /* distance_tests.cpp */, 675341001C58C4C9002CF0D9 /* apk_test.cpp */, @@ -465,8 +458,6 @@ 6753439E1A3F5D5A00A0A8C3 /* platform_unix_impl.cpp */, 675343A41A3F5D5A00A0A8C3 /* preferred_languages.hpp */, 675343A31A3F5D5A00A0A8C3 /* preferred_languages.cpp */, - ED49D73E2CEE438E004AF27E /* products.hpp */, - ED49D73F2CEE438E004AF27E /* products.cpp */, 4564FA7C2094978C0043CCFB /* remote_file.hpp */, 4564FA7D2094978D0043CCFB /* remote_file.cpp */, 3D78157C1F3D8A0A0068B6AC /* safe_callback.hpp */, @@ -554,7 +545,6 @@ 675343CD1A3F5D5A00A0A8C3 /* platform.hpp in Headers */, 6741250F1B4C00CC00A3E828 /* local_country_file.hpp in Headers */, 3D15ACE2214A707900F725D5 /* localization.hpp in Headers */, - ED49D7412CEE438E004AF27E /* products.hpp in Headers */, D5B191CF2386C7E4009CD0D6 /* http_uploader_background.hpp in Headers */, 1669C8422A30DCD200530AD1 /* distance.hpp in Headers */, 3DE8B98F1DEC3115000E6083 /* network_policy.hpp in Headers */, @@ -710,7 +700,6 @@ ED965B272CD8F7810049E39E /* duration.cpp in Sources */, EB60B4DC204C130300E4953B /* network_policy_ios.mm in Sources */, 6741250E1B4C00CC00A3E828 /* local_country_file.cpp in Sources */, - ED49D7402CEE438E004AF27E /* products.cpp in Sources */, 670E8C761BB318AB00094197 /* platform_ios.mm in Sources */, 67A2526A1BB40E100063F8A8 /* platform_qt.cpp in Sources */, 56EB1EDE1C6B6E6C0022D831 /* mwm_traits.cpp in Sources */, @@ -748,7 +737,6 @@ files = ( 6783389E1C6DE59200FD6263 /* platform_test.cpp in Sources */, ED49D7442CEE43A4004AF27E /* meta_config_tests.cpp in Sources */, - ED49D7452CEE43A4004AF27E /* products_tests.cpp in Sources */, 678338961C6DE59200FD6263 /* apk_test.cpp in Sources */, 678338991C6DE59200FD6263 /* jansson_test.cpp in Sources */, ED965B482CDA575B0049E39E /* duration.cpp in Sources */,