Compare commits

..

16 Commits

Author SHA1 Message Date
map-per
21c9a58173 fix: don't return reference to object that goes out of scope
Signed-off-by: map-per <map-per@gmx.de>
2025-12-17 15:22:06 +01:00
map-per
8007c0df53 review fixes
Signed-off-by: map-per <map-per@gmx.de>
2025-12-17 15:05:09 +01:00
map-per
02ac1d8977 fix vending=public_transport_tickets in editor.config
Signed-off-by: map-per <map-per@gmx.de>
2025-12-17 15:05:08 +01:00
Yannik Bloscheck
3c2e77f59e [iOS] Added new editor files to their Xcode projects
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
2025-12-17 15:05:08 +01:00
map-per
c1760bbc37 [editor] Support complex POI types in the editor (#2855)
Signed-off-by: map-per <map-per@gmx.de>
2025-12-17 15:05:08 +01:00
map-per
3511dbb692 [android] Adjust margin in editor layout
Signed-off-by: map-per <map-per@gmx.de>
2025-12-16 21:35:31 +01:00
Codeberg Translate
e238a317f1 [strings] Update from Codeberg Translate
Co-authored-by: Codeberg Translate <translate@codeberg.org>
Co-authored-by: ERYpTION <eryption@noreply.codeberg.org>
Co-authored-by: Edgarsons <edgarsons@noreply.codeberg.org>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: JanezPavelZebovec <janezpavelzebovec@noreply.codeberg.org>
Co-authored-by: Juno Takano <jutty@noreply.codeberg.org>
Co-authored-by: Mickael81 <mickael81@noreply.codeberg.org>
Co-authored-by: N4ta <codeberg@n4ta.anonaddy.me>
Co-authored-by: Outbreak2096 <outbreak2096@noreply.codeberg.org>
Co-authored-by: Prefill add-on <noreply-addon-prefill@weblate.org>
Co-authored-by: Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
Co-authored-by: Stephan-P <stephan-p@noreply.codeberg.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: aoxa <aoxa@noreply.codeberg.org>
Co-authored-by: arnyminerz <arnyminerz@noreply.codeberg.org>
Co-authored-by: artnay <artnay@noreply.codeberg.org>
Co-authored-by: cirilla <cirilla@noreply.codeberg.org>
Co-authored-by: demode <demode@noreply.codeberg.org>
Co-authored-by: gimse <gimse@noreply.codeberg.org>
Co-authored-by: jeanbaptisteC <jeanbaptistec@noreply.codeberg.org>
Co-authored-by: ldmpub <ldmpub@noreply.codeberg.org>
Co-authored-by: loscati <loscati@noreply.codeberg.org>
Co-authored-by: ma12vlad <ma12vlad@noreply.codeberg.org>
Co-authored-by: mnalis <mnalis@noreply.codeberg.org>
Co-authored-by: ovl-005 <ovl-005@noreply.codeberg.org>
Co-authored-by: patepelo <patepelo@noreply.codeberg.org>
Co-authored-by: rimas <rimas@noreply.codeberg.org>
Translate-URL: https://translate.codeberg.org/projects/comaps/android-typestrings/
Translate-URL: https://translate.codeberg.org/projects/comaps/ios-typestrings/
Translation: CoMaps/Android - Map Feature Types
Translation: CoMaps/Android UI Strings
Translation: CoMaps/Countries and regions names
Translation: CoMaps/F-Droid app description
Translation: CoMaps/Google Play and Huawei AppGallery descriptions
Translation: CoMaps/Voice announcements for navigation (TTS)
Translation: CoMaps/iOS - Map Feature Types
Translation: CoMaps/iOS UI Strings
2025-12-16 18:10:27 +00:00
x7z4w
2e85899fcb [search] Add synonym
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-12-16 12:48:48 +01:00
pablogila
ce978d8ede [styles] Add amenity=hydrant
Signed-off-by: pablogila <pablo.gila.herranz@gmail.com>
Co-authored-by: pablogila <pablo.gila.herranz@gmail.com>
Co-committed-by: pablogila <pablo.gila.herranz@gmail.com>
2025-12-16 10:40:18 +01:00
thesupertechie
d56f9700f5 [tts] [routing] further revert out-of-scope changes
Signed-off-by: thesupertechie <thesupertechie1@gmail.com>
2025-12-16 07:27:59 +01:00
thesupertechie
cc042c3d1c [tts] [routing] revert out-of-scope changes
Signed-off-by: thesupertechie <thesupertechie1@gmail.com>
2025-12-16 07:27:59 +01:00
thesupertechie
4f739d98b0 [tts] Change notification to 400-700 m
Signed-off-by: thesupertechie <thesupertechie1@gmail.com>
2025-12-16 07:27:59 +01:00
Dobri Dabar
4691de7a66 [desktop] Display type names
Signed-off-by: Dobri Dabar <dobridabar@noreply.codeberg.org>
Co-authored-by: Dobri Dabar <dobridabar@noreply.codeberg.org>
Co-committed-by: Dobri Dabar <dobridabar@noreply.codeberg.org>
2025-12-15 19:36:29 +01:00
Jean-Baptiste
3c082b0629 [android] Rework shape of zoom buttons
Signed-off-by: Jean-Baptiste <jeanbaptiste.charron@outlook.fr>
2025-12-15 18:59:54 +01:00
Jean-Baptiste
a468bd3fab [docs] Update docs and funding config
Signed-off-by: Jean-Baptiste <jeanbaptiste.charron@outlook.fr>
2025-12-15 13:09:27 +01:00
x7z4w
fc87316184 [search] Fix apartment blocks search
Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
2025-12-14 20:52:17 +00:00
410 changed files with 4169 additions and 4937 deletions

View File

@@ -1,69 +1,55 @@
# All non-assigned.
* @organicmaps/mergers
# Visual design.
/android/app/src/main/res/drawable*/ @organicmaps/design
/android/app/src/main/res/font/ @organicmaps/design
/android/app/src/main/res/mipmap*/ @organicmaps/design
/data/*.ttf @organicmaps/design
/data/resources-svg/ @organicmaps/design
/data/search-icons/ @organicmaps/design
/iphone/Maps/Images.xcassets/ @organicmaps/design
/android/app/src/main/res/drawable*/ @comaps/design
/android/app/src/main/res/font/ @comaps/design
/android/app/src/main/res/mipmap*/ @comaps/design
/data/*.ttf @comaps/design
/data/resources-svg/ @comaps/design
/data/search-icons/ @comaps/design
/iphone/Maps/Images.xcassets/ @comaps/design
# Android.
/android/ @organicmaps/android
/android/app/src/main/java/app/organicmaps/car/ @organicmaps/android-auto
/docs/ANDROID_LOCATION_TEST.md @organicmaps/android
/docs/JAVA_STYLE.md @organicmaps/android
/android/ @comaps/android
/android/app/src/main/java/app/comaps/car/ @comaps/android-auto
/docs/ANDROID_LOCATION_TEST.md @comaps/android
/docs/JAVA_STYLE.md @comaps/android
# no owner for translation changes
/android/app/src/main/res/values*/strings.xml
# iOS.
/iphone/ @organicmaps/ios
/xcode/ @organicmaps/ios
/docs/OBJC_STYLE.md @organicmaps/ios
/iphone/ @comaps/ios
/xcode/ @comaps/ios
/docs/OBJC_STYLE.md @comaps/ios
# no owner for translation changes
/iphone/plist.txt
/iphone/Maps/LocalizedStrings/
# Qt
/qt/ @organicmaps/qt
# Rendering
/drape/ @organicmaps/rendering
/drape_frontend/ @organicmaps/rendering
# Map Data.
/tools/python/maps_generator/ @organicmaps/data
/generator/ @organicmaps/data
/topography_generator/ @organicmaps/data
/data/borders/ @organicmaps/data
/data/conf/isolines/ @organicmaps/data
/docs/SUBWAY_GENERATION.md @organicmaps/data
/docs/MAPS.md @organicmaps/data
/docs/EXPERIMENTAL_PUBLIC_TRANSPORT_SUPPORT.md @organicmaps/data
# no owner (changed often to add a new POI)
/generator/generator_tests/osm_type_test.cpp
# Map Styles.
/data/styles/ @organicmaps/styles
/data/types.txt @organicmaps/styles
/data/visibility.txt @organicmaps/styles
/data/mapcss-mapping.csv @organicmaps/styles
/data/replaced_tags.txt @organicmaps/styles
/data/classificator.txt @organicmaps/styles
/data/drules_* @organicmaps/styles
/data/styles/ @comaps/styles
/data/types.txt @comaps/styles
/data/visibility.txt @comaps/styles
/data/mapcss-mapping.csv @comaps/styles
/data/replaced_tags.txt @comaps/styles
/data/classificator.txt @comaps/styles
/data/drules_* @comaps/styles
/docs/STYLES.md
/tools/kothic/ @organicmaps/styles
/tools/kothic/ @comaps/styles
# DevOps.
/.forgejo/workflows @organicmaps/devops
/android/*gradle* @organicmaps/devops
/docs/RELEASE_MANAGEMENT.md @organicmaps/devops
/xcode/fastlane/ @organicmaps/devops
# Growth.
README.md @organicmaps/growth
/.forgejo/FUNDING.yml @organicmaps/growth
/android/app/src/fdroid/play/ @organicmaps/growth
/android/app/src/google/play/ @organicmaps/growth
/iphone/metadata/ @organicmaps/growth
/.forgejo/workflows @comaps/devops
/android/*gradle* @comaps/devops
/docs/RELEASE_MANAGEMENT.md @comaps/devops
/xcode/fastlane/ @comaps/devops
/tools/python/maps_generator/ @comaps/devops
/generator/ @comaps/devops
/topography_generator/ @comaps/devops
/data/borders/ @comaps/devops
/data/conf/isolines/ @comaps/devops
/docs/SUBWAY_GENERATION.md @comaps/devops
/docs/MAPS.md @comaps/devops
/docs/EXPERIMENTAL_PUBLIC_TRANSPORT_SUPPORT.md @comaps/devops
# Legal.
LEGAL @organicmaps/legal
LICENSE @organicmaps/legal
NOTICE @organicmaps/legal
CONTRIBUTORS @organicmaps/legal
/docs/CODE_OF_CONDUCT.md @organicmaps/legal
/docs/DCO.md @organicmaps/legal
/docs/GOVERNANCE.md @organicmaps/legal
LEGAL @comaps/admins
LICENSE @comaps/admins
NOTICE @comaps/admins
CONTRIBUTORS @comaps/admins
/docs/CODE_OF_CONDUCT.md @comaps/admins
/docs/DCO.md @comaps/admins
/docs/GOVERNANCE.md @comaps/admins

View File

@@ -1 +1,3 @@
open_collective: comaps
liberapay: comaps
custom: ["https://comaps.app/donate/"]

View File

@@ -2,5 +2,3 @@
480fa6c2fcf53be296504ac6ba8e6b3d70f92b42
a6ede2b1466f0c9d8a443600ef337ba6b5832e58
1377b81bf1cac72bb6da192da7fed6696d5d5281
0288b97b1367bb971eded1018f560598ea274e6c
bf30165b5f5de0907c3c64524a3bf8121624b0b7

3
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,3 @@
open_collective: comaps
liberapay: comaps
custom: ["https://comaps.app/donate/"]

2
.gitignore vendored
View File

@@ -155,6 +155,8 @@ android/huawei-appgallery.json
android/res/xml/network_security_config.xml
./server/
iphone/Maps/app.omaps/
# Generated file
libs/indexer/localized_types_map.cpp
*.li

View File

@@ -1,83 +0,0 @@
///////////////////////// ankerl::unordered_dense::{map, set} /////////////////////////
// A fast & densely stored hashmap and hashset based on robin-hood backward shift deletion.
// Version 4.8.1
// https://github.com/martinus/unordered_dense
//
// Licensed under the MIT License <http://opensource.org/licenses/MIT>.
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 Martin Leitner-Ankerl <martin.ankerl@gmail.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
#ifndef ANKERL_STL_H
#define ANKERL_STL_H
#include <array> // for array
#include <cstdint> // for uint64_t, uint32_t, std::uint8_t, UINT64_C
#include <cstring> // for size_t, memcpy, memset
#include <functional> // for equal_to, hash
#include <initializer_list> // for initializer_list
#include <iterator> // for pair, distance
#include <limits> // for numeric_limits
#include <memory> // for allocator, allocator_traits, shared_ptr
#include <optional> // for optional
#include <stdexcept> // for out_of_range
#include <string> // for basic_string
#include <string_view> // for basic_string_view, hash
#include <tuple> // for forward_as_tuple
#include <type_traits> // for enable_if_t, declval, conditional_t, ena...
#include <utility> // for forward, exchange, pair, as_const, piece...
#include <vector> // for vector
// <memory_resource> includes <mutex>, which fails to compile if
// targeting GCC >= 13 with the (rewritten) win32 thread model, and
// targeting Windows earlier than Vista (0x600). GCC predefines
// _REENTRANT when using the 'posix' model, and doesn't when using the
// 'win32' model.
#if defined __MINGW64__ && defined __GNUC__ && __GNUC__ >= 13 && !defined _REENTRANT
// _WIN32_WINNT is guaranteed to be defined here because of the
// <cstdint> inclusion above.
# ifndef _WIN32_WINNT
# error "_WIN32_WINNT not defined"
# endif
# if _WIN32_WINNT < 0x600
# define ANKERL_MEMORY_RESOURCE_IS_BAD() 1 // NOLINT(cppcoreguidelines-macro-usage)
# endif
#endif
#ifndef ANKERL_MEMORY_RESOURCE_IS_BAD
# define ANKERL_MEMORY_RESOURCE_IS_BAD() 0 // NOLINT(cppcoreguidelines-macro-usage)
#endif
#if defined(__has_include) && !defined(ANKERL_UNORDERED_DENSE_DISABLE_PMR)
# if __has_include(<memory_resource>) && !ANKERL_MEMORY_RESOURCE_IS_BAD()
# define ANKERL_UNORDERED_DENSE_PMR std::pmr // NOLINT(cppcoreguidelines-macro-usage)
# include <memory_resource> // for polymorphic_allocator
# elif __has_include(<experimental/memory_resource>)
# define ANKERL_UNORDERED_DENSE_PMR std::experimental::pmr // NOLINT(cppcoreguidelines-macro-usage)
# include <experimental/memory_resource> // for polymorphic_allocator
# endif
#endif
#if defined(_MSC_VER) && defined(_M_X64)
# include <intrin.h>
# pragma intrinsic(_umul128)
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1 @@
Paprasta ir patogi navigacija Turiningos kelionės Vystoma bendruomenės
Paprasta ir patogi navigacija Turiningesnės kelionės Vystoma bendruomenės

View File

@@ -1,20 +1,20 @@
Brezplačno in odprtokodno zemljevidno orodje, ki ga vodi skupnost, temelji na podatkih OpenStreetMap in je okrepljena s predanostjo transparentnosti, zasebnosti in nedobičkonosnosti. CoMaps je izpeljanka OrganicMaps, ta pa je izpeljanka Maps.ME.
Brezplačno in odprtokodno zemljevidno orodje, ki ga vodi skupnost, temelji na podatkih OpenStreetMap in je okrepljena s predanostjo transparentnosti, zasebnosti in nepridobitnosti. CoMaps je izpeljanka OrganicMaps, ta pa je izpeljanka Maps.ME.
Preverite si o razlogih za ta projekt in njegovi usmerjenosti na <b><i>codeberg.org/comaps</i></b>.
Preberite si o razlogih za ta projekt in njegovi usmerjenosti na <b><i>codeberg.org/comaps</i></b>.
Pridružite se skupnosti in pomagajte narediti najboljše zemljevidno orodje
• Uporabljajte orodje in širite glas o njem
• Dajajte povratne informacije in poročajte o napakah
• Posodabljajte podatke zemljevida v tem orodju ali na spletni strani OpenStreetMap
‣ <b>Osredotočeno na uporabo brez povezave</b>: Načrtujte in se usmerjajte na vašem potovanju v tujini vrez potrebe po mobilnih podatkih, iščite vmesne točke potocanja ko ste na daljšem pohodu ipd. Vse zmogljivosti orodja so zasnovane za delo brez povezave.
‣ <b>Osredotočeno na uporabo brez povezave</b>: Načrtujte in se usmerjajte na vašem potovanju v tujini vrez potrebe po mobilnih podatkih, iščite vmesne točke potovanja ko ste na daljšem pohodu ipd. Vse zmogljivosti orodja so zasnovane za delo brez povezave.
‣ <b>Spoštovanje zasebnosti</b>: orodje je zasnovano z mislijo na zasebnost ne prepoznava oseb, ne sledi in ne zbira osebnih podatkov. Brez oglasov.
‣ <b>Preprosto in dodelano</b>: nujne zmogljivosti, enostavne za uporabo, ki preprosto delujejo.
‣ <b>Prihrani vašo baterijo in prostor.</b>: ne izčrpava vaše baterije kakor druga usmerjevalna orodja. Strnjeni zemljevidi prihranijo dragocen prostor na vašem telefonu.
‣ <b>Brezplačno in ustvarjeno v skupnosti</b>: ljudje kot ste vi pomagajo ustvarjati to orodje, tako da dodajajo kraje na OpenStreetMap, preizkušajo in dajejo povratne informacije o zmogljivostih in prispevajo svoje razvijalske sposobnosti in sredstva.
‣ <b>Odprto in transparentno odločanje in finance, nedobičkonosno in popolnoma odprtokodno.</b>
‣ <b>Odprto in transparentno odločanje in finance, nepridobitno in popolnoma odprtokodno.</b>
<b>Glavne zmogljivosti</b>:
• Prenosljivi podrobni zemljevidi s kraji, ki na Googlovoh zemljevidih niso na voljo.
• Prenosljivi podrobni zemljevidi s kraji, ki na Googlovih zemljevidih niso na voljo.
• Prikaz za dejavnosti na prostem s poudarjenimi pohodniškimi potmi, tabornimi prostori, vodnimi viri, vrhovi, plastnicami itd.
• Pešpoti in kolesarke poti
• Kraji zanimanja, npr. restavracije, bencinske črpalke, hoteli, trgovine, znamenitosti in mnogo več

View File

@@ -1 +1 @@
Paprasta ir patogi navigacija Turiningos kelionės Vystoma bendruomenės
Paprasta ir patogi navigacija Turiningesnės kelionės Vystoma bendruomenės

View File

@@ -1 +1 @@
CoMaps - Usmerjajte zasebno
CoMaps - Usmerjajte se zasebno

View File

@@ -28,6 +28,7 @@ import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import com.google.android.material.textview.MaterialTextView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

View File

@@ -253,7 +253,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
mProgress.setMax(bytes);
// Start progress at 1% according to M3 guidelines
mProgress.setProgressCompat(bytes / 100, true);
mProgress.setProgressCompat(bytes/100, true);
}
else
finishFilesDownload(bytes);
@@ -372,7 +372,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
mTvMessage.setText(getString(R.string.downloading_country_can_proceed, item.name, fileSizeString));
mProgress.setMax((int) item.totalSize);
// Start progress at 1% according to M3 guidelines
mProgress.setProgressCompat((int) (item.totalSize / 100), true);
mProgress.setProgressCompat((int) (item.totalSize/100), true);
mCountryDownloadListenerSlot = MapManager.nativeSubscribe(mCountryDownloadListener);
MapManagerHelper.startDownload(mCurrentCountry);
@@ -424,17 +424,17 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
default -> throw new AssertionError("Unexpected result code = " + result);
};
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(titleId)
.setMessage(messageId)
.setCancelable(true)
.setOnCancelListener((dialog) -> setAction(PAUSE))
.setPositiveButton(R.string.try_again,
(dialog, which) -> {
setAction(TRY_AGAIN);
onTryAgainClicked();
})
.setOnDismissListener(dialog -> mAlertDialog = null)
.show();
mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
.setTitle(titleId)
.setMessage(messageId)
.setCancelable(true)
.setOnCancelListener((dialog) -> setAction(PAUSE))
.setPositiveButton(R.string.try_again,
(dialog, which) -> {
setAction(TRY_AGAIN);
onTryAgainClicked();
})
.setOnDismissListener(dialog -> mAlertDialog = null)
.show();
}
}

View File

@@ -38,9 +38,8 @@ public class OsmUploadWork extends Worker
{
final Constraints c = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
OneTimeWorkRequest.Builder builder = new OneTimeWorkRequest.Builder(OsmUploadWork.class).setConstraints(c);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
{
builder.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
builder.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST);
}
final OneTimeWorkRequest wr = builder.build();
WorkManager.getInstance(context).beginUniqueWork("UploadOsmChanges", ExistingWorkPolicy.KEEP, wr).enqueue();

View File

@@ -17,6 +17,7 @@ import androidx.annotation.NonNull;
import androidx.documentfile.provider.DocumentFile;
import app.organicmaps.R;
import app.organicmaps.sdk.util.log.Logger;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;

View File

@@ -10,6 +10,7 @@ import androidx.fragment.app.DialogFragment;
public class BaseMwmDialogFragment extends DialogFragment
{
protected int getStyle()
{
return STYLE_NORMAL;

View File

@@ -282,13 +282,11 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
{
if (isEmptySearchResults())
{
requirePlaceholder().setContent(R.string.search_not_found, R.string.search_not_found_query,
R.drawable.ic_search_fail);
requirePlaceholder().setContent(R.string.search_not_found, R.string.search_not_found_query, R.drawable.ic_search_fail);
}
else if (isEmpty())
{
requirePlaceholder().setContent(R.string.bookmarks_empty_list_title, R.string.bookmarks_empty_list_message,
R.drawable.ic_bookmarks);
requirePlaceholder().setContent(R.string.bookmarks_empty_list_title, R.string.bookmarks_empty_list_message, R.drawable.ic_bookmarks);
}
boolean isEmptyRecycler = isEmpty() || isEmptySearchResults();

View File

@@ -23,6 +23,7 @@ import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.widget.recycler.RecyclerClickListener;
import app.organicmaps.widget.recycler.RecyclerLongClickListener;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.imageview.ShapeableImageView;
@@ -457,12 +458,10 @@ public class Holders
String formattedDesc = desc.replace("\n", "<br>");
Spanned spannedDesc = Utils.fromHtml(formattedDesc);
if (!TextUtils.isEmpty(spannedDesc))
{
if (!TextUtils.isEmpty(spannedDesc)) {
mDescText.setText(spannedDesc);
}
else
{
else {
mDescText.setText(R.string.list_description_empty);
}
}

View File

@@ -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 Renderer 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

View File

@@ -31,7 +31,7 @@ public final class RoutingHelpers
default -> Distance.UNIT_METERS;
};
return Distance.create(distance.mDistance, displayUnit);
return Distance.create(distance.mDistance, displayUnit);
}
@NonNull
@@ -52,7 +52,7 @@ public final class RoutingHelpers
default -> LaneDirection.SHAPE_UNKNOWN;
};
return LaneDirection.create(shape, isRecommended);
return LaneDirection.create(shape, isRecommended);
}
@NonNull
@@ -77,7 +77,7 @@ public final class RoutingHelpers
case EXIT_HIGHWAY_TO_LEFT -> Maneuver.TYPE_OFF_RAMP_SLIGHT_LEFT;
case EXIT_HIGHWAY_TO_RIGHT -> Maneuver.TYPE_OFF_RAMP_SLIGHT_RIGHT;
};
final Maneuver.Builder builder = new Maneuver.Builder(maneuverType);
final Maneuver.Builder builder = new Maneuver.Builder(maneuverType);
if (maneuverType == Maneuver.TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW)
builder.setRoundaboutExitNumber(roundaboutExitNum > 0 ? roundaboutExitNum : 1);
builder.setIcon(new CarIcon.Builder(createManeuverIcon(context, carDirection, roundaboutExitNum)).build());
@@ -85,8 +85,7 @@ public final class RoutingHelpers
}
@NonNull
private static IconCompat createManeuverIcon(@NonNull final CarContext context, @NonNull CarDirection carDirection,
int roundaboutExitNum)
private static IconCompat createManeuverIcon(@NonNull final CarContext context, @NonNull CarDirection carDirection, int roundaboutExitNum)
{
if (!CarDirection.isRoundAbout(carDirection) || roundaboutExitNum == 0)
{

View File

@@ -39,7 +39,8 @@ public final class UiHelpers
}
@NonNull
public static ActionStrip createMapActionStrip(@NonNull CarContext context, @NonNull Renderer 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,13 +59,15 @@ public final class UiHelpers
}
@NonNull
public static MapController createMapController(@NonNull CarContext context, @NonNull Renderer 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 Renderer surfaceRenderer)
public static Action createSettingsAction(@NonNull BaseMapScreen mapScreen,
@NonNull Renderer surfaceRenderer)
{
return createSettingsAction(mapScreen, surfaceRenderer, null);
}
@@ -78,7 +81,8 @@ public final class UiHelpers
}
@NonNull
private static Action createSettingsAction(@NonNull BaseMapScreen mapScreen, @NonNull Renderer surfaceRenderer,
private static Action createSettingsAction(@NonNull BaseMapScreen mapScreen,
@NonNull Renderer surfaceRenderer,
@Nullable OnScreenResultListener onScreenResultListener)
{
final CarContext context = mapScreen.getCarContext();
@@ -119,7 +123,8 @@ public final class UiHelpers
return null;
final Row.Builder builder = new Row.Builder();
builder.setImage(new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_opening_hours)).build());
builder.setImage(
new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_opening_hours)).build());
if (isEmptyTT)
builder.setTitle(ohStr);

View File

@@ -125,8 +125,7 @@ public class EditTextDialogFragment extends BaseMwmDialogFragment
positiveButton.setOnClickListener(view -> {
final String result = mEtInput.getText().toString();
if (validateInput(requireActivity(), result))
{
if (validateInput(requireActivity(), result)) {
processInput(result);
editTextDialog.dismiss();
}

View File

@@ -4,6 +4,7 @@ import android.location.Location;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import app.organicmaps.MwmActivity;
@@ -48,8 +49,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
@Override
public void onStatusChanged(List<MapManager.StorageCallbackData> data)
{
if (mCurrentCountry == null)
{
if (mCurrentCountry == null) {
updateOfflineExplanationVisibility();
return;
}
@@ -109,13 +109,10 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
return enqueued || progress || applying;
}
private void updateOfflineExplanationVisibility()
{
if (mOfflineExplanation == null)
return;
private void updateOfflineExplanationVisibility() {
if (mOfflineExplanation == null) return;
// hide once threshold reached; safe to call repeatedly.
app.organicmaps.util.UiUtils.showIf(MapManager.nativeGetDownloadedCount() < (DEFAULT_MAP_BASELINE + HIDE_THRESHOLD),
mOfflineExplanation);
app.organicmaps.util.UiUtils.showIf(MapManager.nativeGetDownloadedCount() < (DEFAULT_MAP_BASELINE + HIDE_THRESHOLD), mOfflineExplanation);
}
private void updateProgressState(boolean shouldAutoDownload)

View File

@@ -15,6 +15,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.GridLayout;
import androidx.annotation.CallSuper;
import androidx.annotation.DrawableRes;
import androidx.annotation.IdRes;
@@ -397,7 +398,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
List<String> SOCKET_TYPES = Arrays.stream(getResources().getStringArray(R.array.charge_socket_types)).toList();
for (String socketType : SOCKET_TYPES)
{
ChargeSocketDescriptor socket = new ChargeSocketDescriptor(socketType, 0, 0);
ChargeSocketDescriptor socket = new ChargeSocketDescriptor(socketType,0,0);
MaterialButton btn = (MaterialButton) inflater.inflate(R.layout.button_socket_type, typeBtns, false);
@@ -405,16 +406,16 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
// load SVG icon converted into VectorDrawable in res/drawable
@SuppressLint("DiscouragedApi")
int resIconId = getResources().getIdentifier("ic_charge_socket_" + socket.visualType(), "drawable",
requireContext().getPackageName());
int resIconId =
getResources().getIdentifier("ic_charge_socket_" + socket.visualType(), "drawable", requireContext().getPackageName());
if (resIconId != 0)
{
btn.setIcon(getResources().getDrawable(resIconId));
}
@SuppressLint("DiscouragedApi")
int resTypeId = getResources().getIdentifier("charge_socket_" + socket.visualType(), "string",
requireContext().getPackageName());
int resTypeId =
getResources().getIdentifier("charge_socket_" + socket.visualType(), "string", requireContext().getPackageName());
if (resTypeId != 0)
{
btn.setText(getResources().getString(resTypeId));
@@ -462,16 +463,13 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
// Add a TextWatcher to validate on text change
countView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s)
{
public void afterTextChanged(Editable s) {
validatePositiveField(s.toString(), countInputLayout);
}
});
@@ -486,16 +484,13 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
// Add a TextWatcher to validate on text change
powerView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s)
{
public void afterTextChanged(Editable s) {
validatePositiveField(s.toString(), powerInputLayout);
}
});
@@ -503,82 +498,74 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
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;
}
}
.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());
}
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());
}
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());
}
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());
}
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);
ChargeSocketDescriptor socket =
new ChargeSocketDescriptor(socketType, countValue, powerValue);
updateChargeSockets(socketIndex, socket);
})
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())
{
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
{
try {
double value = Double.parseDouble(text);
if (value < 0)
{
if (value < 0) {
layout.setError(getString(R.string.error_value_must_be_positive));
return false;
} else {
layout.setError(null);
return true;
}
else
{
layout.setError(null);
return true;
}
}
catch (NumberFormatException e)
{
} catch (NumberFormatException e) {
layout.setError(getString(R.string.error_invalid_number));
return false;
}
@@ -598,8 +585,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
{
sockets[socketIndex] = socket;
}
else
{
else {
List<ChargeSocketDescriptor> list = new ArrayList<>(Arrays.asList(sockets));
list.add(socket);
sockets = list.toArray(new ChargeSocketDescriptor[0]);
@@ -617,8 +603,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
GridLayout socketsGrid = mChargeSockets.findViewById(R.id.socket_grid_editor);
socketsGrid.removeAllViews();
for (int i = 0; i < sockets.length; i++)
{
for (int i = 0; i < sockets.length; i++) {
final int currentIndex = i;
ChargeSocketDescriptor socket = sockets[i];
@@ -629,30 +614,27 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
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.visualType(), "drawable",
requireContext().getPackageName());
if (resIconId != 0)
{
requireContext().getPackageName());
if (resIconId != 0) {
icon.setImageResource(resIconId);
}
@SuppressLint("DiscouragedApi")
int resTypeId = getResources().getIdentifier("charge_socket_" + socket.visualType(), "string",
requireContext().getPackageName());
if (resTypeId != 0)
{
int resTypeId =
getResources().getIdentifier("charge_socket_" + socket.visualType(), "string", requireContext().getPackageName());
if (resTypeId != 0) {
type.setText(resTypeId);
}
if (socket.power() != 0)
{
if (socket.power() != 0) {
DecimalFormat df = new DecimalFormat("#.##");
power.setText(getString(R.string.kw_label, df.format(socket.power())));
}
else if (socket.ignorePower())
{
else if (socket.ignorePower()) {
power.setVisibility(INVISIBLE);
}
@@ -661,8 +643,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
count.setText(getString(R.string.count_label, socket.count()));
}
itemView.setOnClickListener(
v -> buildChargeSocketDialog(currentIndex, socket.type(), socket.count(), socket.power()).show());
itemView.setOnClickListener(v -> buildChargeSocketDialog(currentIndex, socket.type(), socket.count(), socket.power()).show());
socketsGrid.addView(itemView);
}
@@ -808,8 +789,9 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
View lineContactBlock =
initBlock(view, Metadata.MetadataType.FMD_CONTACT_LINE, R.id.block_line, R.drawable.ic_line_white,
R.string.editor_line_social_network, InputType.TYPE_TEXT_VARIATION_URI);
View blueskyContactBlock = initBlock(view, Metadata.MetadataType.FMD_CONTACT_BLUESKY, R.id.block_bluesky,
R.drawable.ic_bluesky, R.string.bluesky, InputType.TYPE_TEXT_VARIATION_URI);
View blueskyContactBlock =
initBlock(view, Metadata.MetadataType.FMD_CONTACT_BLUESKY, R.id.block_bluesky, R.drawable.ic_bluesky,
R.string.bluesky, InputType.TYPE_TEXT_VARIATION_URI);
View operatorBlock = initBlock(view, Metadata.MetadataType.FMD_OPERATOR, R.id.block_operator,
R.drawable.ic_operator, R.string.editor_operator, 0);
@@ -1041,15 +1023,14 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
private void placeDisused()
{
new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog)
.setTitle(R.string.editor_mark_business_vacant_title)
.setMessage(R.string.editor_mark_business_vacant_description)
.setPositiveButton(R.string.editor_submit,
(dlg, which) -> {
Editor.nativeMarkPlaceAsDisused();
mParent.processEditedFeatures();
})
.setNegativeButton(android.R.string.cancel, null)
.show();
.setTitle(R.string.editor_mark_business_vacant_title)
.setMessage(R.string.editor_mark_business_vacant_description)
.setPositiveButton(R.string.editor_submit, (dlg, which) -> {
Editor.nativeMarkPlaceAsDisused();
mParent.processEditedFeatures();
})
.setNegativeButton(android.R.string.cancel, null)
.show();
}
private void commitPlaceDoesntExists(@NonNull String text)

View File

@@ -13,6 +13,7 @@ import app.organicmaps.R;
import app.organicmaps.sdk.editor.data.FeatureCategory;
import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textview.MaterialTextView;
@@ -68,7 +69,8 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
}
case TYPE_FOOTER ->
{
return new FooterViewHolder(inflater.inflate(R.layout.item_feature_category_footer, parent, false), mFragment);
return new FooterViewHolder(inflater.inflate(R.layout.item_feature_category_footer, parent, false),
mFragment);
}
default -> throw new IllegalArgumentException("Unsupported viewType: " + viewType);
}
@@ -132,21 +134,26 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
mSendNoteButton = itemView.findViewById(R.id.send_note_button);
mSendNoteButton.setOnClickListener(v -> listener.onSendNoteClicked());
final ColorStateList bgButtonColor = new ColorStateList(
new int[][] {
new int[] {android.R.attr.state_enabled}, // enabled
new int[] {-android.R.attr.state_enabled} // disabled
},
new int[] {ContextCompat.getColor(mSendNoteButton.getContext(), R.color.base_accent),
ContextCompat.getColor(mSendNoteButton.getContext(), R.color.button_accent_disabled)});
new int[][]{
new int[]{android.R.attr.state_enabled}, // enabled
new int[]{-android.R.attr.state_enabled} // disabled
},
new int[]{
ContextCompat.getColor(
mSendNoteButton.getContext(), R.color.base_accent),
ContextCompat.getColor(mSendNoteButton.getContext(), R.color.button_accent_disabled)
});
final ColorStateList textButtonColor = new ColorStateList(
new int[][] {
new int[] {android.R.attr.state_enabled}, // enabled
new int[] {-android.R.attr.state_enabled} // disabled
},
new int[] {ContextCompat.getColor(mSendNoteButton.getContext(),
UiUtils.getStyledResourceId(mSendNoteButton.getContext(),
android.R.attr.textColorPrimaryInverse)),
ContextCompat.getColor(mSendNoteButton.getContext(), R.color.button_accent_text_disabled)});
new int[][]{
new int[]{android.R.attr.state_enabled}, // enabled
new int[]{-android.R.attr.state_enabled} // disabled
},
new int[]{
ContextCompat.getColor(
mSendNoteButton.getContext(),
UiUtils.getStyledResourceId(mSendNoteButton.getContext(), android.R.attr.textColorPrimaryInverse)),
ContextCompat.getColor(mSendNoteButton.getContext(), R.color.button_accent_text_disabled)
});
mSendNoteButton.setBackgroundTintList(bgButtonColor);
mSendNoteButton.setTextColor(textButtonColor);
mNoteEditText.addTextChangedListener(new StringUtils.SimpleTextWatcher() {

View File

@@ -2,16 +2,19 @@ package app.organicmaps.editor;
import android.content.res.Configuration;
import android.content.res.Resources;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.timepicker.MaterialTimePicker;
import com.google.android.material.timepicker.TimeFormat;
import app.organicmaps.R;
import app.organicmaps.sdk.editor.data.HoursMinutes;
import app.organicmaps.sdk.util.DateUtils;
import com.google.android.material.timepicker.MaterialTimePicker;
import com.google.android.material.timepicker.TimeFormat;
public class FromToTimePicker
{
@@ -29,11 +32,18 @@ public class FromToTimePicker
private boolean mIsFromTimePicked;
private int mInputMode;
public static void pickTime(@NonNull Fragment fragment, @NonNull FromToTimePicker.OnPickListener listener,
@NonNull HoursMinutes fromTime, @NonNull HoursMinutes toTime, int id,
public static void pickTime(@NonNull Fragment fragment,
@NonNull FromToTimePicker.OnPickListener listener,
@NonNull HoursMinutes fromTime,
@NonNull HoursMinutes toTime,
int id,
boolean startWithToTime)
{
FromToTimePicker timePicker = new FromToTimePicker(fragment, listener, fromTime, toTime, id);
FromToTimePicker timePicker = new FromToTimePicker(fragment,
listener,
fromTime,
toTime,
id);
if (startWithToTime)
timePicker.showToTimePicker();
@@ -41,8 +51,11 @@ public class FromToTimePicker
timePicker.showFromTimePicker();
}
private FromToTimePicker(@NonNull Fragment fragment, @NonNull FromToTimePicker.OnPickListener listener,
@NonNull HoursMinutes fromTime, @NonNull HoursMinutes toTime, int id)
private FromToTimePicker(@NonNull Fragment fragment,
@NonNull FromToTimePicker.OnPickListener listener,
@NonNull HoursMinutes fromTime,
@NonNull HoursMinutes toTime,
int id)
{
mActivity = fragment.requireActivity();
mFragmentManager = fragment.getChildFragmentManager();
@@ -87,12 +100,15 @@ public class FromToTimePicker
private MaterialTimePicker buildFromTimePicker()
{
MaterialTimePicker timePicker = buildTimePicker(mFromTime, mResources.getString(R.string.editor_time_from),
mResources.getString(R.string.next_button), null);
MaterialTimePicker timePicker = buildTimePicker(mFromTime,
mResources.getString(R.string.editor_time_from),
mResources.getString(R.string.next_button),
null);
timePicker.addOnNegativeButtonClickListener(view -> finishTimePicking(false));
timePicker.addOnPositiveButtonClickListener(view -> {
timePicker.addOnPositiveButtonClickListener(view ->
{
mIsFromTimePicked = true;
saveState(timePicker, true);
mFromTimePicker = null;
@@ -106,10 +122,13 @@ public class FromToTimePicker
private MaterialTimePicker buildToTimePicker()
{
MaterialTimePicker timePicker = buildTimePicker(mToTime, mResources.getString(R.string.editor_time_to), null,
MaterialTimePicker timePicker = buildTimePicker(mToTime,
mResources.getString(R.string.editor_time_to),
null,
mResources.getString(R.string.back));
timePicker.addOnNegativeButtonClickListener(view -> {
timePicker.addOnNegativeButtonClickListener(view ->
{
saveState(timePicker, false);
mToTimePicker = null;
if (mIsFromTimePicked)
@@ -118,7 +137,8 @@ public class FromToTimePicker
finishTimePicking(false);
});
timePicker.addOnPositiveButtonClickListener(view -> {
timePicker.addOnPositiveButtonClickListener(view ->
{
saveState(timePicker, false);
finishTimePicking(true);
});
@@ -129,18 +149,18 @@ public class FromToTimePicker
}
@NonNull
private MaterialTimePicker buildTimePicker(@NonNull HoursMinutes time, @NonNull String title,
private MaterialTimePicker buildTimePicker(@NonNull HoursMinutes time,
@NonNull String title,
@Nullable String positiveButtonTextOverride,
@Nullable String negativeButtonTextOverride)
{
MaterialTimePicker.Builder builder =
new MaterialTimePicker.Builder()
.setTitleText(title)
.setTimeFormat(mIs24HourFormat ? TimeFormat.CLOCK_24H : TimeFormat.CLOCK_12H)
.setInputMode(mInputMode)
.setTheme(R.style.MwmTheme_MaterialTimePicker)
.setHour((int) time.hours)
.setMinute((int) time.minutes);
MaterialTimePicker.Builder builder = new MaterialTimePicker.Builder()
.setTitleText(title)
.setTimeFormat(mIs24HourFormat ? TimeFormat.CLOCK_24H : TimeFormat.CLOCK_12H)
.setInputMode(mInputMode)
.setTheme(R.style.MwmTheme_MaterialTimePicker)
.setHour((int) time.hours)
.setMinute((int) time.minutes);
if (positiveButtonTextOverride != null)
builder.setPositiveButtonText(positiveButtonTextOverride);

View File

@@ -7,6 +7,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import androidx.annotation.IdRes;
import androidx.annotation.IntRange;
import androidx.annotation.Nullable;
@@ -121,14 +122,20 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
notifyItemChanged(getItemCount() - 1);
}
private void pickTime(int position, @IntRange(from = ID_OPENING_TIME, to = ID_CLOSED_SPAN) int id,
private void pickTime(int position,
@IntRange(from = ID_OPENING_TIME, to = ID_CLOSED_SPAN) int id,
boolean startWithToTime)
{
final Timetable data = mItems.get(position);
mPickingPosition = position;
FromToTimePicker.pickTime(mFragment, this, data.workingTimespan.start, data.workingTimespan.end, id,
startWithToTime);
FromToTimePicker.pickTime(mFragment,
this,
data.workingTimespan.start,
data.workingTimespan.end,
id,
startWithToTime);
}
@Override
@@ -377,21 +384,26 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
final String text = mFragment.getString(R.string.editor_time_add);
mAdd.setEnabled(enable);
final ColorStateList bgButtonColor = new ColorStateList(
new int[][] {
new int[] {android.R.attr.state_enabled}, // enabled
new int[] {-android.R.attr.state_enabled} // disabled
},
new int[] {ContextCompat.getColor(mAdd.getContext(), R.color.base_accent),
ContextCompat.getColor(mAdd.getContext(), R.color.button_accent_disabled)});
new int[][]{
new int[]{android.R.attr.state_enabled}, // enabled
new int[]{-android.R.attr.state_enabled} // disabled
},
new int[]{
ContextCompat.getColor(
mAdd.getContext(), R.color.base_accent),
ContextCompat.getColor(mAdd.getContext(), R.color.button_accent_disabled)
});
final ColorStateList textButtonColor = new ColorStateList(
new int[][] {
new int[] {android.R.attr.state_enabled}, // enabled
new int[] {-android.R.attr.state_enabled} // disabled
},
new int[] {
ContextCompat.getColor(mAdd.getContext(), UiUtils.getStyledResourceId(
mAdd.getContext(), android.R.attr.textColorPrimaryInverse)),
ContextCompat.getColor(mAdd.getContext(), R.color.button_accent_text_disabled)});
new int[][]{
new int[]{android.R.attr.state_enabled}, // enabled
new int[]{-android.R.attr.state_enabled} // disabled
},
new int[]{
ContextCompat.getColor(
mAdd.getContext(),
UiUtils.getStyledResourceId(mAdd.getContext(), android.R.attr.textColorPrimaryInverse)),
ContextCompat.getColor(mAdd.getContext(), R.color.button_accent_text_disabled)
});
mAdd.setBackgroundTintList(bgButtonColor);
mAdd.setTextColor(textButtonColor);
mAdd.setText(enable ? text + " (" + TimeFormatUtils.formatWeekdays(mComplementItem) + ")" : text);

View File

@@ -9,8 +9,8 @@ import androidx.annotation.Nullable;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmRecyclerFragment;
public class SimpleTimetableFragment
extends BaseMwmRecyclerFragment<SimpleTimetableAdapter> implements TimetableProvider
public class SimpleTimetableFragment extends BaseMwmRecyclerFragment<SimpleTimetableAdapter>
implements TimetableProvider
{
private SimpleTimetableAdapter mAdapter;
@Nullable

View File

@@ -35,30 +35,25 @@ public class LayerBottomSheetItem
@DrawableRes
int drawableResId = 0;
@StringRes
int buttonTextResource = switch (mode)
{
case OUTDOORS ->
{
drawableResId = R.drawable.ic_layers_outdoors;
yield R.string.button_layer_outdoor;
}
case SUBWAY ->
{
drawableResId = R.drawable.ic_layers_subway;
yield R.string.subway;
}
case ISOLINES ->
{
drawableResId = R.drawable.ic_layers_isoline;
yield R.string.button_layer_isolines;
}
case TRAFFIC ->
{
drawableResId = R.drawable.ic_layers_traffic;
yield R.string.button_layer_traffic;
}
int buttonTextResource = switch (mode) {
case OUTDOORS -> {
drawableResId = R.drawable.ic_layers_outdoors;
yield R.string.button_layer_outdoor;
}
case SUBWAY -> {
drawableResId = R.drawable.ic_layers_subway;
yield R.string.subway;
}
case ISOLINES -> {
drawableResId = R.drawable.ic_layers_isoline;
yield R.string.button_layer_isolines;
}
case TRAFFIC -> {
drawableResId = R.drawable.ic_layers_traffic;
yield R.string.button_layer_traffic;
}
};
return new LayerBottomSheetItem(drawableResId, buttonTextResource, mode, layerItemClickListener);
return new LayerBottomSheetItem(drawableResId, buttonTextResource, mode, layerItemClickListener);
}
@NonNull

View File

@@ -5,9 +5,11 @@ import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import app.organicmaps.adapter.OnItemClickListener;
import com.google.android.material.textview.MaterialTextView;
class LayerHolder extends RecyclerView.ViewHolder
{

View File

@@ -395,7 +395,7 @@ public class MapButtonsController extends Fragment
0;
// Allow offset tolerance for zoom buttons
};
showButton(getViewTopOffset(translation, button) >= toleranceOffset, entry.getKey());
showButton(getViewTopOffset(translation, button) >= toleranceOffset, entry.getKey());
}
}
}

View File

@@ -43,6 +43,7 @@ import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import app.organicmaps.widget.recycler.DotDividerItemDecoration;
import app.organicmaps.widget.recycler.MultilineLayoutManager;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
@@ -122,9 +123,9 @@ final class RoutingBottomMenuController implements View.OnClickListener
@NonNull View timeElevationLine, @NonNull View transitFrame,
@NonNull MaterialTextView error, @NonNull MaterialButton start,
@NonNull ShapeableImageView altitudeChart, @NonNull MaterialTextView time,
@NonNull MaterialTextView altitudeDifference,
@NonNull MaterialTextView timeVehicle, @Nullable MaterialTextView arrival,
@NonNull View actionFrame, @Nullable RoutingBottomMenuListener listener)
@NonNull MaterialTextView altitudeDifference, @NonNull MaterialTextView timeVehicle,
@Nullable MaterialTextView arrival, @NonNull View actionFrame,
@Nullable RoutingBottomMenuListener listener)
{
mContext = context;
mAltitudeChartFrame = altitudeChartFrame;

View File

@@ -12,6 +12,9 @@ import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.sdk.Framework;
@@ -26,7 +29,6 @@ import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
import app.organicmaps.widget.RoutingToolbarButton;
import app.organicmaps.widget.ToolbarController;
import app.organicmaps.widget.WheelProgressView;
import com.google.android.material.textview.MaterialTextView;
public class RoutingPlanController extends ToolbarController
{
@@ -262,7 +264,7 @@ public class RoutingPlanController extends ToolbarController
default -> throw new IllegalArgumentException("unknown router: " + router);
};
RoutingToolbarButton button = mRouterTypes.findViewById(mRouterTypes.getCheckedRadioButtonId());
RoutingToolbarButton button = mRouterTypes.findViewById(mRouterTypes.getCheckedRadioButtonId());
button.progress();
updateProgressLabels();

View File

@@ -14,10 +14,12 @@ import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import app.organicmaps.sdk.search.DisplayedCategories;
import app.organicmaps.sdk.util.Language;
import com.google.android.material.textview.MaterialTextView;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Locale;

View File

@@ -10,12 +10,14 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import app.organicmaps.sdk.search.SearchResult;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.ThemeUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.textview.MaterialTextView;
class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHolder>
{
@@ -150,8 +152,7 @@ class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHol
{
final Resources resources = mSearchFragment.getResources();
if (result.description.openNow != SearchResult.OPEN_NOW_YES
&& result.description.openNow != SearchResult.OPEN_NOW_NO)
if (result.description.openNow != SearchResult.OPEN_NOW_YES && result.description.openNow != SearchResult.OPEN_NOW_NO)
{
// Hide if unknown opening hours state
UiUtils.hide(mOpen);
@@ -168,18 +169,15 @@ class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHol
{
final String minsToChangeStr = resources.getQuantityString(
R.plurals.minutes_short, Math.max(minsToNextState, 1), Math.max(minsToNextState, 1));
final String nextChangeFormatted =
resources.getString(isOpen ? R.string.closes_in : R.string.opens_in, minsToChangeStr);
final String nextChangeFormatted = resources.getString(isOpen ? R.string.closes_in : R.string.opens_in, minsToChangeStr);
UiUtils.setTextAndShow(mOpen, nextChangeFormatted);
mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), R.color.base_yellow));
}
else
{
UiUtils.setTextAndShow(
mOpen, isOpen ? resources.getString(R.string.editor_time_open) : resources.getString(R.string.closed));
mOpen.setTextColor(
ContextCompat.getColor(mSearchFragment.getContext(), isOpen ? R.color.base_green : R.color.base_red));
UiUtils.setTextAndShow(mOpen, isOpen ? resources.getString(R.string.editor_time_open) : resources.getString(R.string.closed));
mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), isOpen ? R.color.base_green : R.color.base_red));
}
}

View File

@@ -273,8 +273,7 @@ public class SearchFragment extends BaseMwmFragment implements SearchListener, C
RecyclerView mResults = mResultsFrame.findViewById(R.id.recycler);
setRecyclerScrollListener(mResults);
mResultsPlaceholder = mResultsFrame.findViewById(R.id.placeholder);
mResultsPlaceholder.setContent(R.string.search_not_found, R.string.search_not_found_query,
R.drawable.ic_search_fail);
mResultsPlaceholder.setContent(R.string.search_not_found, R.string.search_not_found_query, R.drawable.ic_search_fail);
mSearchAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver()
{

View File

@@ -5,13 +5,15 @@ import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.search.SearchRecents;
import app.organicmaps.util.Graphics;
import app.organicmaps.widget.SearchToolbarController;
import com.google.android.material.textview.MaterialTextView;
class SearchHistoryAdapter extends RecyclerView.Adapter<SearchHistoryAdapter.ViewHolder>
{

View File

@@ -8,12 +8,14 @@ import android.view.ViewGroup;
import android.widget.CompoundButton;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.materialswitch.MaterialSwitch;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmToolbarFragment;
import app.organicmaps.sdk.routing.RoutingController;
import app.organicmaps.sdk.routing.RoutingOptions;
import app.organicmaps.sdk.settings.RoadType;
import com.google.android.material.materialswitch.MaterialSwitch;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;

View File

@@ -8,165 +8,165 @@ import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public abstract class BaseSignView extends View
{
private float mBorderWidthRatio = 0.1f;
protected void setBorderWidthRatio(float ratio)
{
mBorderWidthRatio = ratio;
}
private float mBorderInsetRatio = 0f;
protected void setBorderInsetRatio(float ratio)
{
mBorderInsetRatio = ratio;
}
// colors
protected int mBackgroundColor;
protected int mBorderColor;
protected int mAlertColor;
protected int mTextColor;
protected int mTextAlertColor;
// paints
protected final Paint mBackgroundPaint;
protected final Paint mBorderPaint;
protected final Paint mTextPaint;
// geometry
protected float mWidth;
protected float mHeight;
protected float mRadius;
protected float mBorderWidth;
protected float mBorderRadius;
public BaseSignView(Context ctx, @Nullable AttributeSet attrs)
{
super(ctx, attrs);
mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBorderPaint.setStyle(Paint.Style.STROKE);
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setTextAlign(Paint.Align.CENTER);
mTextPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
}
protected void setColors(int backgroundColor, int borderColor, int alertColor, int textColor, int textAlertColor)
{
mBackgroundColor = backgroundColor;
mBorderColor = borderColor;
mAlertColor = alertColor;
mTextColor = textColor;
mTextAlertColor = textAlertColor;
mBackgroundPaint.setColor(mBackgroundColor);
mBorderPaint.setColor(mBorderColor);
mTextPaint.setColor(mTextColor);
}
@Override
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight)
{
super.onSizeChanged(width, height, oldWidth, oldHeight);
final float paddingX = getPaddingLeft() + getPaddingRight();
final float paddingY = getPaddingTop() + getPaddingBottom();
mWidth = width - paddingX;
mHeight = height - paddingY;
mRadius = Math.min(mWidth, mHeight) / 2f;
mBorderWidth = mRadius * mBorderWidthRatio;
// subtract half the stroke PLUS the extra inset
final float gap = mRadius * mBorderInsetRatio;
mBorderRadius = mRadius - (mBorderWidth / 2f) - gap;
configureTextSize();
}
@Override
protected void onDraw(@NonNull Canvas canvas)
{
super.onDraw(canvas);
final String str = getValueString();
if (str == null)
return;
final float cx = mWidth / 2f;
final float cy = mHeight / 2f;
// background & border
boolean alert = isAlert();
mBackgroundPaint.setColor(alert ? mAlertColor : mBackgroundColor);
canvas.drawCircle(cx, cy, mRadius, mBackgroundPaint);
if (!alert)
{
mBorderPaint.setStrokeWidth(mBorderWidth);
mBorderPaint.setColor(mBorderColor);
canvas.drawCircle(cx, cy, mBorderRadius, mBorderPaint);
private float mBorderWidthRatio = 0.1f;
protected void setBorderWidthRatio(float ratio) {
mBorderWidthRatio = ratio;
}
// text
mTextPaint.setColor(alert ? mTextAlertColor : mTextColor);
drawValueString(canvas, cx, cy, str);
}
@Override
public boolean onTouchEvent(@NonNull MotionEvent e)
{
final float cx = mWidth / 2f, cy = mHeight / 2f;
final float dx = e.getX() - cx, dy = e.getY() - cy;
if ((dx * dx) + (dy * dy) <= (mRadius * mRadius))
{
performClick();
return true;
private float mBorderInsetRatio = 0f;
protected void setBorderInsetRatio(float ratio) {
mBorderInsetRatio = ratio;
}
return false;
}
@Override
public boolean performClick()
{
super.performClick();
return false;
}
// colors
protected int mBackgroundColor;
protected int mBorderColor;
protected int mAlertColor;
protected int mTextColor;
protected int mTextAlertColor;
private void drawValueString(Canvas c, float cx, float cy, String str)
{
Rect b = new Rect();
mTextPaint.getTextBounds(str, 0, str.length(), b);
final float y = cy - b.exactCenterY();
c.drawText(str, cx, y, mTextPaint);
}
// paints
protected final Paint mBackgroundPaint;
protected final Paint mBorderPaint;
protected final Paint mTextPaint;
void configureTextSize()
{
String text = getValueString();
if (text == null)
return;
final float textRadius = mBorderRadius - mBorderWidth;
final float maxTextSize = 2f * textRadius;
final float maxTextSize2 = maxTextSize * maxTextSize;
float lo = 0f, hi = maxTextSize, sz = maxTextSize;
Rect b = new Rect();
while (lo <= hi)
// geometry
protected float mWidth;
protected float mHeight;
protected float mRadius;
protected float mBorderWidth;
protected float mBorderRadius;
public BaseSignView(Context ctx, @Nullable AttributeSet attrs)
{
sz = (lo + hi) / 2f;
mTextPaint.setTextSize(sz);
mTextPaint.getTextBounds(text, 0, text.length(), b);
float area = b.width() * b.width() + b.height() * b.height();
if (area <= maxTextSize2)
lo = sz + 1f;
else
hi = sz - 1f;
super(ctx, attrs);
mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBorderPaint.setStyle(Paint.Style.STROKE);
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setTextAlign(Paint.Align.CENTER);
mTextPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
}
mTextPaint.setTextSize(Math.max(1f, sz));
}
/** child must return the string to draw, or null if nothing */
@Nullable
protected abstract String getValueString();
protected void setColors(int backgroundColor,
int borderColor,
int alertColor,
int textColor,
int textAlertColor)
{
mBackgroundColor = backgroundColor;
mBorderColor = borderColor;
mAlertColor = alertColor;
mTextColor = textColor;
mTextAlertColor = textAlertColor;
/** child decides if this is in “alert” state */
protected abstract boolean isAlert();
mBackgroundPaint.setColor(mBackgroundColor);
mBorderPaint.setColor(mBorderColor);
mTextPaint.setColor(mTextColor);
}
@Override
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
super.onSizeChanged(width, height, oldWidth, oldHeight);
final float paddingX = getPaddingLeft() + getPaddingRight();
final float paddingY = getPaddingTop() + getPaddingBottom();
mWidth = width - paddingX;
mHeight = height - paddingY;
mRadius = Math.min(mWidth, mHeight) / 2f;
mBorderWidth = mRadius * mBorderWidthRatio;
// subtract half the stroke PLUS the extra inset
final float gap = mRadius * mBorderInsetRatio;
mBorderRadius = mRadius - (mBorderWidth / 2f) - gap;
configureTextSize();
}
@Override
protected void onDraw(@NonNull Canvas canvas)
{
super.onDraw(canvas);
final String str = getValueString();
if (str == null) return;
final float cx = mWidth / 2f;
final float cy = mHeight / 2f;
// background & border
boolean alert = isAlert();
mBackgroundPaint.setColor(alert ? mAlertColor : mBackgroundColor);
canvas.drawCircle(cx, cy, mRadius, mBackgroundPaint);
if (!alert)
{
mBorderPaint.setStrokeWidth(mBorderWidth);
mBorderPaint.setColor(mBorderColor);
canvas.drawCircle(cx, cy, mBorderRadius, mBorderPaint);
}
// text
mTextPaint.setColor(alert ? mTextAlertColor : mTextColor);
drawValueString(canvas, cx, cy, str);
}
@Override
public boolean onTouchEvent(@NonNull MotionEvent e)
{
final float cx = mWidth / 2f, cy = mHeight / 2f;
final float dx = e.getX() - cx, dy = e.getY() - cy;
if ((dx * dx) + (dy * dy) <= (mRadius * mRadius))
{
performClick();
return true;
}
return false;
}
@Override
public boolean performClick()
{
super.performClick();
return false;
}
private void drawValueString(Canvas c, float cx, float cy, String str)
{
Rect b = new Rect();
mTextPaint.getTextBounds(str, 0, str.length(), b);
final float y = cy - b.exactCenterY();
c.drawText(str, cx, y, mTextPaint);
}
void configureTextSize()
{
String text = getValueString();
if (text == null) return;
final float textRadius = mBorderRadius - mBorderWidth;
final float maxTextSize = 2f * textRadius;
final float maxTextSize2 = maxTextSize * maxTextSize;
float lo = 0f, hi = maxTextSize, sz = maxTextSize;
Rect b = new Rect();
while (lo <= hi)
{
sz = (lo + hi) / 2f;
mTextPaint.setTextSize(sz);
mTextPaint.getTextBounds(text, 0, text.length(), b);
float area = b.width()*b.width() + b.height()*b.height();
if (area <= maxTextSize2)
lo = sz + 1f;
else
hi = sz - 1f;
}
mTextPaint.setTextSize(Math.max(1f, sz));
}
/** child must return the string to draw, or null if nothing */
@Nullable
protected abstract String getValueString();
/** child decides if this is in “alert” state */
protected abstract boolean isAlert();
}

View File

@@ -4,7 +4,9 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Pair;
import androidx.annotation.Nullable;
import app.organicmaps.R;
import app.organicmaps.sdk.util.StringUtils;
@@ -20,18 +22,18 @@ public class CurrentSpeedView extends BaseSignView
setBorderWidthRatio(0.1f);
setBorderInsetRatio(0.05f);
try (TypedArray a = ctx.getTheme().obtainStyledAttributes(
attrs, R.styleable.CurrentSpeedView /* reuse same attrs or define new */, 0, 0))
try (TypedArray a = ctx.getTheme()
.obtainStyledAttributes(attrs, R.styleable.CurrentSpeedView /* reuse same attrs or define new */ , 0, 0))
{
int bg = a.getColor(R.styleable.CurrentSpeedView_currentSpeedBackgroundColor, DefaultValues.BACKGROUND_COLOR);
int bd = a.getColor(R.styleable.CurrentSpeedView_currentSpeedBorderColor, DefaultValues.BORDER_COLOR);
int tc = a.getColor(R.styleable.CurrentSpeedView_currentSpeedTextColor, DefaultValues.TEXT_COLOR);
int bg = a.getColor(R.styleable.CurrentSpeedView_currentSpeedBackgroundColor, DefaultValues.BACKGROUND_COLOR);
int bd = a.getColor(R.styleable.CurrentSpeedView_currentSpeedBorderColor, DefaultValues.BORDER_COLOR);
int tc = a.getColor(R.styleable.CurrentSpeedView_currentSpeedTextColor, DefaultValues.TEXT_COLOR);
setColors(bg, bd, 0, tc, 0);
if (isInEditMode())
{
mSpeedMps = a.getInt(R.styleable.CurrentSpeedView_currentSpeedEditModeCurrentSpeed, 50);
mSpeedStr = Integer.toString((int) mSpeedMps);
mSpeedMps = a.getInt(R.styleable.CurrentSpeedView_currentSpeedEditModeCurrentSpeed, 50);
mSpeedStr = Integer.toString((int)mSpeedMps);
}
}
}
@@ -45,7 +47,7 @@ public class CurrentSpeedView extends BaseSignView
}
else
{
Pair<String, String> su = StringUtils.nativeFormatSpeedAndUnits(mps);
Pair<String,String> su = StringUtils.nativeFormatSpeedAndUnits(mps);
mSpeedStr = su.first;
}
requestLayout();
@@ -68,8 +70,8 @@ public class CurrentSpeedView extends BaseSignView
private interface DefaultValues
{
int BACKGROUND_COLOR = 0xFFFFFFFF;
int BORDER_COLOR = 0xFF000000;
int TEXT_COLOR = 0xFF000000;
int BACKGROUND_COLOR = 0xFFFFFFFF;
int BORDER_COLOR = 0xFF000000;
int TEXT_COLOR = 0xFF000000;
}
}

View File

@@ -12,11 +12,13 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import app.organicmaps.util.UiUtils;
public class PlaceholderView extends LinearLayout
{
@SuppressWarnings("NullableProblems")

View File

@@ -5,14 +5,16 @@ import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import androidx.annotation.Nullable;
import app.organicmaps.R;
public class SpeedLimitView extends BaseSignView
{
private int mSpeedLimit = -1;
private boolean mAlert = false;
private String mSpeedStr = "-1";
private int mSpeedLimit = -1;
private boolean mAlert = false;
private String mSpeedStr = "-1";
private final int unlimitedBorderColor;
private final int unlimitedStripeColor;
@@ -25,22 +27,15 @@ public class SpeedLimitView extends BaseSignView
try (TypedArray styleAttrs = ctx.getTheme().obtainStyledAttributes(attrs, R.styleable.SpeedLimitView, 0, 0))
{
final int bgColor =
styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitBackgroundColor, DefaultValues.BACKGROUND_COLOR);
final int borderColor =
styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitBorderColor, DefaultValues.BORDER_COLOR);
final int alertColor =
styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitAlertColor, DefaultValues.ALERT_COLOR);
final int textColor =
styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitTextColor, DefaultValues.TEXT_COLOR);
final int txtAlertColor =
styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitTextAlertColor, DefaultValues.TEXT_ALERT_COLOR);
final int bgColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitBackgroundColor, DefaultValues.BACKGROUND_COLOR);
final int borderColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitBorderColor, DefaultValues.BORDER_COLOR);
final int alertColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitAlertColor, DefaultValues.ALERT_COLOR);
final int textColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitTextColor, DefaultValues.TEXT_COLOR);
final int txtAlertColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitTextAlertColor, DefaultValues.TEXT_ALERT_COLOR);
setColors(bgColor, borderColor, alertColor, textColor, txtAlertColor);
unlimitedBorderColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitUnlimitedBorderColor,
DefaultValues.UNLIMITED_BORDER_COLOR);
unlimitedStripeColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitUnlimitedStripeColor,
DefaultValues.UNLIMITED_STRIPE_COLOR);
unlimitedBorderColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitUnlimitedBorderColor, DefaultValues.UNLIMITED_BORDER_COLOR);
unlimitedStripeColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitUnlimitedStripeColor, DefaultValues.UNLIMITED_STRIPE_COLOR);
if (isInEditMode())
{
@@ -56,7 +51,7 @@ public class SpeedLimitView extends BaseSignView
if (mSpeedLimit != limit)
{
mSpeedLimit = limit;
mSpeedStr = Integer.toString(limit);
mSpeedStr = Integer.toString(limit);
requestLayout();
}
mAlert = alert;
@@ -80,7 +75,7 @@ public class SpeedLimitView extends BaseSignView
@Override
protected void onDraw(Canvas canvas)
{
final float cx = mWidth / 2f, cy = mHeight / 2f;
final float cx = mWidth/2f, cy = mHeight/2f;
if (mSpeedLimit == 0) // 0 means unlimited speed (maxspeed=none)
{
@@ -110,7 +105,7 @@ public class SpeedLimitView extends BaseSignView
stripe.setStrokeWidth(mBorderWidth * 0.4f);
final float radius = mRadius * 0.8f; // Shorten to 80% of full radius
final float diag = (float) (1 / Math.sqrt(2)); // 45 degrees
final float diag = (float) (1/Math.sqrt(2)); // 45 degrees
final float dx = -diag, dy = +diag;
final float px = -dy, py = +dx; // Perpendicular
final float step = radius * 0.15f; // Spacing
@@ -127,13 +122,14 @@ public class SpeedLimitView extends BaseSignView
}
}
private interface DefaultValues
{
int BACKGROUND_COLOR = 0xFFFFFFFF;
int BORDER_COLOR = 0xFFFF0000;
int ALERT_COLOR = 0xFFFF0000;
int TEXT_COLOR = 0xFF000000;
int TEXT_ALERT_COLOR = 0xFFFFFFFF;
int BACKGROUND_COLOR = 0xFFFFFFFF;
int BORDER_COLOR = 0xFFFF0000;
int ALERT_COLOR = 0xFFFF0000;
int TEXT_COLOR = 0xFF000000;
int TEXT_ALERT_COLOR = 0xFFFFFFFF;
int UNLIMITED_BORDER_COLOR = 0xFF000000;
int UNLIMITED_STRIPE_COLOR = 0xFF000000;
}

View File

@@ -72,7 +72,7 @@ public class MyPositionButton
case LocationState.FOLLOW_AND_ROTATE -> R.drawable.ic_follow_and_rotate;
default -> throw new IllegalArgumentException("Invalid button mode: " + mode);
};
image = ResourcesCompat.getDrawable(resources, drawableRes, context.getTheme());
image = ResourcesCompat.getDrawable(resources, drawableRes, context.getTheme());
mIcons.put(mode, image);
}

View File

@@ -1,9 +1,9 @@
package app.organicmaps.widget.placepage;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.organicmaps.sdk.util.StringUtils;
import com.github.mikephil.charting.charts.BarLineChartBase;
import androidx.annotation.Nullable;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;

View File

@@ -105,8 +105,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
public EditBookmarkFragment() {}
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
{
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, R.style.MwmTheme_FullScreenDialog);
}
@@ -185,9 +184,10 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
{
super.onStart();
Dialog dialog = getDialog();
if (dialog != null)
{
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
if (dialog != null) {
dialog.getWindow().setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
}
// Focus name and show keyboard for "Unknown Place" bookmarks

View File

@@ -6,6 +6,9 @@ import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.widget.NestedScrollView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.ChartController;
import app.organicmaps.R;
import app.organicmaps.sdk.Framework;
@@ -14,7 +17,6 @@ import app.organicmaps.sdk.bookmarks.data.Track;
import app.organicmaps.sdk.bookmarks.data.TrackStatistics;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
import com.google.android.material.textview.MaterialTextView;
import java.util.Objects;
public class ElevationProfileViewRenderer implements PlacePageStateListener

View File

@@ -14,8 +14,7 @@ public class OpenStateTextFormatter
return String.format(Locale.ROOT, "%02d:%02d", hour, minute);
int h = hour % 12;
if (h == 0)
h = 12;
if (h == 0) h = 12;
String ampm = (hour < 12) ? "AM" : "PM";
return String.format(Locale.ROOT, "%d:%02d %s", h, minute, ampm);
}
@@ -30,13 +29,21 @@ public class OpenStateTextFormatter
return t.getDayOfWeek().getDisplayName(TextStyle.SHORT, locale);
}
static String buildAtLabel(boolean opens, boolean isToday, String dayShort, String time, String opensAtLocalized,
String closesAtLocalized, String opensDayAtLocalized, String closesDayAtLocalized)
static String buildAtLabel(
boolean opens,
boolean isToday,
String dayShort,
String time,
String opensAtLocalized,
String closesAtLocalized,
String opensDayAtLocalized,
String closesDayAtLocalized
)
{
if (isToday)
return opens ? String.format(Locale.ROOT, opensAtLocalized, time) // Opens at %s
: String.format(Locale.ROOT, closesAtLocalized, time); // Closes at %s
: String.format(Locale.ROOT, closesAtLocalized, time); // Closes at %s
return opens ? String.format(Locale.ROOT, opensDayAtLocalized, dayShort, time) // Opens %s at %s
: String.format(Locale.ROOT, closesDayAtLocalized, dayShort, time); // Closes %s at %s
: String.format(Locale.ROOT, closesDayAtLocalized, dayShort, time); // Closes %s at %s
}
}

View File

@@ -80,6 +80,6 @@ public class PlacePageButtonFactory
yield R.drawable.ic_more;
}
};
return new PlacePageButton(titleId, iconId, buttonType);
return new PlacePageButton(titleId, iconId, buttonType);
}
}

View File

@@ -31,6 +31,7 @@ import androidx.fragment.app.FragmentFactory;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import app.organicmaps.MwmActivity;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
@@ -704,10 +705,12 @@ public class PlacePageView extends Fragment
}
else
{
mTvEditPlace.setOnClickListener(
(v) -> { Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit); });
mTvAddPlace.setOnClickListener(
(v) -> { Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit); });
mTvEditPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
mTvAddPlace.setOnClickListener((v) -> {
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
});
String countryId = MapManager.nativeGetSelectedCountry();
@@ -750,7 +753,9 @@ public class PlacePageView extends Fragment
mTvAddPlace.setTextColor(editButtonColor);
mTvEditPlace.setStrokeColor(ColorStateList.valueOf(editButtonColor));
mTvAddPlace.setStrokeColor(ColorStateList.valueOf(editButtonColor));
UiUtils.showIf(UiUtils.isVisible(mEditPlace) || UiUtils.isVisible(mAddPlace), mEditTopSpace);
UiUtils.showIf(
UiUtils.isVisible(mEditPlace) || UiUtils.isVisible(mAddPlace),
mEditTopSpace);
}
updateLinksView();
updateOpeningHoursView();
@@ -851,9 +856,10 @@ public class PlacePageView extends Fragment
}
// Get colours
final ForegroundColorSpan colorGreen = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_green));
final ForegroundColorSpan colorGreen =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_green));
final ForegroundColorSpan colorYellow =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_yellow));
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_yellow));
final ForegroundColorSpan colorRed = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_red));
// Get next state info
@@ -879,12 +885,13 @@ public class PlacePageView extends Fragment
if (nextStateTime > 0 && nextStateTime < Long.MAX_VALUE / 2)
{
// NOTE: Timezone is currently device timezone. TODO: use feature-specific timezone.
nextChangeLocal = ZonedDateTime.ofInstant(Instant.ofEpochSecond(nextStateTime), ZoneId.systemDefault());
nextChangeLocal = ZonedDateTime.ofInstant(
Instant.ofEpochSecond(nextStateTime), ZoneId.systemDefault()
);
hasFiniteNextChange = true;
}
}
catch (Throwable ignored)
{}
catch (Throwable ignored) {}
}
if (!hasFiniteNextChange) // No valid next change
@@ -899,7 +906,7 @@ public class PlacePageView extends Fragment
}
String localizedTimeString = OpenStateTextFormatter.formatHoursMinutes(
nextChangeLocal.getHour(), nextChangeLocal.getMinute(), DateUtils.is24HourFormat(context));
nextChangeLocal.getHour(), nextChangeLocal.getMinute(), DateUtils.is24HourFormat(context));
final boolean shortHorizonClosing = isOpen && minsToNextState >= 0 && minsToNextState <= SHORT_HORIZON_CLOSE_MIN;
final boolean shortHorizonOpening = !isOpen && minsToNextState >= 0 && minsToNextState <= SHORT_HORIZON_OPEN_MIN;
@@ -907,12 +914,12 @@ public class PlacePageView extends Fragment
if (shortHorizonClosing || shortHorizonOpening) // POI Opens/Closes in 60 mins • at 18:00
{
final String minsToChangeStr = getResources().getQuantityString(
R.plurals.minutes_short, Math.max(minsToNextState, 1), Math.max(minsToNextState, 1));
R.plurals.minutes_short, Math.max(minsToNextState, 1), Math.max(minsToNextState, 1));
final String nextChangeFormatted = getString(isOpen ? R.string.closes_in : R.string.opens_in, minsToChangeStr);
openStateString.append(nextChangeFormatted, colorYellow, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
.append("") // Add spacer
.append(getString(R.string.at, localizedTimeString));
.append("") // Add spacer
.append(getString(R.string.at, localizedTimeString));
}
else
{
@@ -922,16 +929,18 @@ public class PlacePageView extends Fragment
final String closesDayAtStr = getString(R.string.closes_day_at); // "Closes %1$s at %2$s"
final boolean isToday =
OpenStateTextFormatter.isSameLocalDate(nextChangeLocal, ZonedDateTime.now(nextChangeLocal.getZone()));
OpenStateTextFormatter.isSameLocalDate(nextChangeLocal, ZonedDateTime.now(nextChangeLocal.getZone()));
// Full weekday name per design feedback.
final String dayName = nextChangeLocal.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.getDefault());
final String dayName =
nextChangeLocal.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.getDefault());
if (isOpen) // > 60 minutes OR negative (safety). Show “Open now • Closes at 18:00”
{
openStateString.append(getString(R.string.open_now), colorGreen, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
final String atLabel = OpenStateTextFormatter.buildAtLabel(
false, isToday, dayName, localizedTimeString, opensAtStr, closesAtStr, opensDayAtStr, closesDayAtStr);
final String atLabel =
OpenStateTextFormatter.buildAtLabel(false, isToday, dayName, localizedTimeString,
opensAtStr, closesAtStr, opensDayAtStr, closesDayAtStr);
if (!TextUtils.isEmpty(atLabel))
openStateString.append("").append(atLabel);
@@ -940,8 +949,9 @@ public class PlacePageView extends Fragment
{
openStateString.append(getString(R.string.closed_now), colorRed, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
final String atLabel = OpenStateTextFormatter.buildAtLabel(
true, isToday, dayName, localizedTimeString, opensAtStr, closesAtStr, opensDayAtStr, closesDayAtStr);
final String atLabel =
OpenStateTextFormatter.buildAtLabel(true, isToday, dayName, localizedTimeString,
opensAtStr, closesAtStr, opensDayAtStr, closesDayAtStr);
if (!TextUtils.isEmpty(atLabel))
openStateString.append("").append(atLabel);

View File

@@ -3,7 +3,9 @@ package app.organicmaps.widget.placepage;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import app.organicmaps.sdk.bookmarks.data.MapObject;
import java.util.List;
public class PlacePageViewModel extends ViewModel

View File

@@ -31,8 +31,7 @@ import app.organicmaps.widget.placepage.PlacePageViewModel;
import com.google.android.material.textview.MaterialTextView;
public class PlacePageBookmarkFragment extends Fragment implements View.OnClickListener, View.OnLongClickListener,
Observer<MapObject>,
EditBookmarkFragment.EditBookmarkListener
Observer<MapObject>, EditBookmarkFragment.EditBookmarkListener
{
private View mFrame;
private MaterialTextView mTvBookmarkNote;

View File

@@ -13,13 +13,15 @@ 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.widget.placepage.PlacePageViewModel;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textview.MaterialTextView;
import java.text.DecimalFormat;
public class PlacePageChargeSocketsFragment extends Fragment implements Observer<MapObject>
@@ -94,8 +96,8 @@ public class PlacePageChargeSocketsFragment extends Fragment implements Observer
}
@SuppressLint("DiscouragedApi")
int resTypeId = getResources().getIdentifier("charge_socket_" + socket.visualType(), "string",
requireContext().getPackageName());
int resTypeId =
getResources().getIdentifier("charge_socket_" + socket.visualType(), "string", requireContext().getPackageName());
if (resTypeId != 0)
{
type.setText(resTypeId);
@@ -106,8 +108,7 @@ public class PlacePageChargeSocketsFragment extends Fragment implements Observer
DecimalFormat df = new DecimalFormat("#.##");
power.setText(getString(R.string.kw_label, df.format(socket.power())));
}
else if (socket.ignorePower())
{
else if (socket.ignorePower()) {
power.setVisibility(INVISIBLE);
}

View File

@@ -191,9 +191,8 @@ public class PlacePageLinksFragment extends Fragment implements Observer<MapObje
case FMD_PANORAMAX -> null; // Don't add raw ID to list, as it's useless for users.
default -> mMapObject.getMetadata(type);
};
// Add user names for social media if available
if (!TextUtils.isEmpty(title) && !title.equals(url) && !title.contains("/"))
items.add(title);
// Add user names for social media if available
if (!TextUtils.isEmpty(title) && !title.equals(url) && !title.contains("/")) items.add(title);
if (items.size() == 1)
PlacePageUtils.copyToClipboard(requireContext(), mFrame, items.get(0));

View File

@@ -1,9 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960">
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M240,520q-17,0 -28.5,-11.5T200,480q0,-17 11.5,-28.5T240,440h480q17,0 28.5,11.5T760,480q0,17 -11.5,28.5T720,520L240,520Z"
android:pathData="M19,13H5v-2h14v2z"
android:fillColor="#ffffff"/>
</vector>

View File

@@ -1,9 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960">
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M440,520L240,520q-17,0 -28.5,-11.5T200,480q0,-17 11.5,-28.5T240,440h200v-200q0,-17 11.5,-28.5T480,200q17,0 28.5,11.5T520,240v200h200q17,0 28.5,11.5T760,480q0,17 -11.5,28.5T720,520L520,520v200q0,17 -11.5,28.5T480,760q-17,0 -28.5,-11.5T440,720v-200Z"
android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"
android:fillColor="@android:color/white"/>
</vector>

View File

@@ -402,11 +402,13 @@
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_half"
android:fontFamily="@string/robotoMedium"
android:text="@string/editor_other_info"
android:textAppearance="@style/MwmTextAppearance.Body3"/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/custom_input"
android:layout_marginBottom="@dimen/margin_quarter"
style="@style/MwmWidget.Editor.CustomTextInput"
android:gravity="center_vertical"
android:minHeight="74dp"
@@ -416,6 +418,7 @@
android:id="@+id/input"
style="@style/MwmWidget.Editor.FieldLayout.EditText"
android:inputType="textMultiLine"
android:gravity="top"
android:hint="@string/editor_note_hint"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>

View File

@@ -11,14 +11,14 @@
style="@style/MwmWidget.M3.FAB.MapButton.Zoom"
android:tint="?iconTint"
app:srcCompat="@drawable/ic_plus"
app:shapeAppearance="@style/Widget.MaterialComponents.FloatingActionButton"
android:layout_marginBottom="@dimen/margin_half"
app:shapeAppearanceOverlay="@style/ShapeAppearance.MapButton.Zoom.Minus"
android:layout_marginBottom="@dimen/margin_eighth"
android:contentDescription="@string/zoom_in"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/nav_zoom_out"
style="@style/MwmWidget.M3.FAB.MapButton.Zoom"
android:tint="?iconTint"
app:srcCompat="@drawable/ic_minus"
app:shapeAppearance="@style/Widget.MaterialComponents.FloatingActionButton"
app:shapeAppearanceOverlay="@style/ShapeAppearance.MapButton.Zoom.Plus"
android:contentDescription="@string/zoom_out"/>
</LinearLayout>

View File

@@ -912,4 +912,12 @@
<string name="charge_socket_type1">Tipus 1</string>
<string name="charge_socket_nacs">NACS</string>
<string name="charge_socket_chademo">CHAdeMO</string>
<string name="place_page_too_old_to_edit">L\'edició de dades d\'OpenStreetMap està deshabilitada perquè les dades del mapa són massa antigues.</string>
<string name="place_page_map_too_old_title">Dades del mapa desactualitzades</string>
<string name="place_page_map_too_old_description">Les teves dades de mapa son molt antigues, per favor actualitza el mapa.</string>
<string name="place_page_app_too_old_description">Les teues dades del mapa son molt antigues, per favor actualitza l\'app de CoMaps.</string>
<string name="place_page_update_too_old_map">Actualitzar regió del mapa</string>
<string name="prefs_speed_cameras_information">Les advertències de càmeres radar estan deshabilitades als països on estan prohibides per llei.</string>
<string name="navigation_start_tts_message">"Iniciant Navegació, idioma d\'instruccions de veu: "</string>
<string name="navigation_start_tts_disabled_message">Instruccions de veu desactivades: motor TTS no disponible</string>
</resources>

View File

@@ -907,4 +907,10 @@
<string name="charge_socket_schuko">Domovní EU</string>
<string name="prefs_speed_cameras_information">Upozornění na radary jsou vypnuty v zemích, kde je tato funkcionalita zakázána místními zákony.</string>
<string name="navigation_start_tts_message">"Spouštím navigaci, jazyk hlasových instrukcí: "</string>
<string name="place_page_map_too_old_title">Mapová data jsou zastaralá</string>
<string name="place_page_map_too_old_description">Vaše mapová data jsou velmi stará, doporučujeme je aktualizovat.</string>
<string name="place_page_app_too_old_description">Vaše aktuální mapová data jsou velmi stará, aktualizujte prosím aplikaci CoMaps.</string>
<string name="place_page_update_too_old_map">Aktualizovat oblast mapy</string>
<string name="place_page_too_old_to_edit">Úprava OpenStreetMap je zakázaná, protože mapová data jsou příliš stará.</string>
<string name="navigation_start_tts_disabled_message">Hlasové pokyny vypnuty: služba TTS není dostupná</string>
</resources>

View File

@@ -896,4 +896,10 @@
<string name="charge_socket_schuko">Europæisk</string>
<string name="prefs_speed_cameras_information">Advarsler om hastighedskameraer er deaktiveret i lande, hvor advarsler er forbudt i henhold til lokal lovgivning.</string>
<string name="navigation_start_tts_message">"Starter navigation, sprog for stemmeinstruktioner: "</string>
<string name="place_page_map_too_old_title">Kortdata forældet</string>
<string name="place_page_map_too_old_description">Dine nuværende kortdata er meget gamle. Opdater kortet.</string>
<string name="place_page_app_too_old_description">Dine nuværende kortdata er meget gamle. Opdater CoMaps-appen.</string>
<string name="place_page_update_too_old_map">Opdater kortregion</string>
<string name="place_page_too_old_to_edit">Redigering af OpenStreetMap er deaktiveret, fordi kortdataene er for gamle.</string>
<string name="navigation_start_tts_disabled_message">Stemmeinstruktioner deaktiveret: TTS-motor ikke tilgængelig</string>
</resources>

View File

@@ -68,7 +68,7 @@
<!-- "Add new bookmark list" dialog title -->
<string name="add_new_set">Agregar una lista nueva</string>
<!-- Add Bookmark list dialog - hint when the list name is empty -->
<string name="bookmark_set_name">Nombre del grupo de marcadores</string>
<string name="bookmark_set_name">Nombre de la lista de marcadores</string>
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
<string name="bookmarks">Marcadores</string>
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
@@ -246,7 +246,7 @@
<!-- Button in the main menu -->
<string name="donate">Donar</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Apoya el proyecto</string>
<string name="how_to_support_us">Apoya y mejora el proyecto CoMaps</string>
<!-- Button in the main Help dialog -->
<string name="copyright">Derechos de autor</string>
<!-- Text in menu + Button in the main Help dialog -->
@@ -914,4 +914,12 @@
<string name="editor_mark_business_vacant_description">Usa esto si el negocio ya no existe y el local ha quedado vacío para un nuevo inquilino.</string>
<string name="editor_submit">Enviar</string>
<string name="power_management">Gestión de energía</string>
<string name="place_page_map_too_old_title">Datos del mapa anticuados</string>
<string name="place_page_map_too_old_description">Tus datos del mapa están muy anticuados, por favor actualiza el mapa.</string>
<string name="place_page_app_too_old_description">Tus datos del mapa están muy anticuados, por favor actualiza la aplicación CoMaps.</string>
<string name="place_page_update_too_old_map">Actualizar mapa de la región</string>
<string name="place_page_too_old_to_edit">La edición de OpenStreetMap está deshabilitada porque los datos del mapa están muy anticuados.</string>
<string name="prefs_speed_cameras_information">Las advertencias de radares de velocidad están deshabilitadas en países donde las alertas están prohibidas por ley.</string>
<string name="navigation_start_tts_message">"Iniciando Navegación, idioma de las instrucciones por voz: "</string>
<string name="navigation_start_tts_disabled_message">Instrucciones por voz deshabilitadas: Motor de TTS no disponible</string>
</resources>

View File

@@ -905,4 +905,10 @@
<string name="charge_socket_schuko">EU-sisene</string>
<string name="prefs_speed_cameras_information">Kiiruskaamerate teavitused on nendes riikides lülitatud välja, kus seda keelab kohalik seadusandlus.</string>
<string name="navigation_start_tts_message">"Alustan tee juhatamist, hääljuhiste keel: "</string>
<string name="place_page_map_too_old_title">Kaardiandmed on aegunud</string>
<string name="place_page_map_too_old_description">Sinu kasutatavad kaardiandmed on väga vanad. Palun uuenda andmeid.</string>
<string name="place_page_app_too_old_description">Sinu kasutatavad kaardiandmed on väga vanad. Palun uuenda CoMapsi rakendust.</string>
<string name="place_page_update_too_old_map">Uuenda piirkonna kaardiandmeid</string>
<string name="place_page_too_old_to_edit">Kuna kaardiandmed on liiga vanad, siis OpenStreetMapi muutmise võimalus on lülitatud välja.</string>
<string name="navigation_start_tts_disabled_message">Hääljuhiste kasutamine on lülitatud välja: kõnesünteesimootorit pole saadaval</string>
</resources>

View File

@@ -25,44 +25,44 @@
<!-- Location services are disabled by user alert - message -->
<string name="location_is_disabled_long_text">هم‌اینک، شما همه‌ی سامانه‌های گیاگ‌یابی را برای این دستگاه یا این برنامه ناکارا کرده‌اید. خواهشمند است آن را در پیکربندی‌ها کارا کنید.</string>
<!-- A dialog title, that warns a user that Precise Location is disabled and suggests to turn it on -->
<string name="limited_accuracy">دقت محدود</string>
<string name="limited_accuracy">نزومان ویمندیگ</string>
<!-- A dialog text, that warns a user that Precise Location is disabled and suggests to turn it on -->
<string name="precise_location_is_disabled_long_text">برای اطمینان از دقیق ناوبری ، موقعیت مکانی دقیق را در تنظیمات فعال کنید</string>
<string name="precise_location_is_disabled_long_text">برای آسوده‌دل بودن از نزومانی ناوبری، گیاگ‌یابی نزومان را در پیکربندی کارا کنید</string>
<!-- View and button titles for accessibility -->
<string name="zoom_to_country">نمایش بر روی نقشه</string>
<!-- Message to display at the center of the screen when the country download has failed -->
<string name="country_status_download_failed">دانلود با شکست مواجه شد</string>
<string name="country_status_download_failed">بارگیری ناکام بود</string>
<!-- Button text for the button under the country_status_download_failed message -->
<string name="try_again">تلاش مجدد</string>
<string name="about_menu_title">CoMaps درباره‌ی</string>
<string name="try_again">تلاش دوباره</string>
<string name="about_menu_title">درباره CoMaps</string>
<!-- Text in About screen -->
<string name="about_proposition_1">آسان برای استفاده و جلا</string>
<string name="about_proposition_1">بکارگیری آسان اود پیراسته</string>
<!-- Text in About screen -->
<string name="about_proposition_2">• حریم خصوصی متمرکز و بدون تبلیغات</string>
<string name="about_proposition_2">• حریم خصوصی متمرکز اود بی‌آگهی</string>
<!-- Text in About screen -->
<string name="about_proposition_3">• آفلاین، سریع و جمع و جور</string>
<string name="about_proposition_3">• آفلاین، چابک و جمع و جور</string>
<!-- Text in About screen -->
<string name="about_developed_by_enthusiasts">منبع کاملا باز، نه برای سود، تصمیم گیری شفاف و امور مالی شفاف.</string>
<!-- The button that opens system location settings -->
<string name="location_settings">تنظیمات مکان</string>
<string name="location_settings">پیکربندی‌های گیاگ</string>
<string name="close">بستن</string>
<string name="unsupported_phone">متأسفانه دستگاه شما از آن پشتیبانی نمی‌کندبرنامه برای اجرا به OpenGL نیازمند است.</string>
<string name="download">دانلود</string>
<string name="download">بارگیری</string>
<!-- Used in DownloadResources startup screen -->
<string name="not_enough_free_space_on_sdcard">لطفا مقداری از فضای ذخیره‌سازی را آزاد نمایید</string>
<string name="download_resources">قبل از استفاده از اپلیکیشن, اجازه دهید تا ما نقشه جهانی را بر روی موبایل شما دانلود کنیم. \nمقدار %s از حافظه شما اشغال می شود.</string>
<string name="download_resources_continue">برو به نقشه</string>
<string name="downloading_country_can_proceed">درحال دانلود %1$s (%2$s). شما اکنون می توانید \nبه نقشه بروید.</string>
<string name="download_country_ask">دانلود %1$s؟ (%2$s)</string>
<string name="downloading_country_can_proceed">بارگیری می‌شود %1$s (%2$s). شما اکنون میتوانید\nبه نقشه بروید.</string>
<string name="download_country_ask">بارگیری %1$s؟ (%2$s)</string>
<string name="update_country_ask">بروزرسانی %1$s؟ (%2$s)</string>
<!-- REMOVE THIS STRING AFTER REFACTORING -->
<string name="pause">درنگ</string>
<!-- REMOVE THIS STRING AFTER REFACTORING -->
<string name="continue_button">ادامه</string>
<!-- Show popup notification on top of the map when country download has failed. -->
<string name="download_country_failed">%s دانلود با شکست مواجه شد</string>
<string name="download_country_failed">%s بارگیری ناکام بود</string>
<!-- "Add new bookmark list" dialog title -->
<string name="add_new_set">اضافه کردن مجموعه جدید</string>
<string name="add_new_set">افزودن پهرستی نو</string>
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
<string name="bookmarks">نشانه‌ها</string>
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
@@ -778,7 +778,7 @@
<string name="panoramax">تصویر Panoramax</string>
<string name="app_site_url">https://comaps.app</string>
<string name="saved">ذخیره شد</string>
<string name="about_headline">رایگان برای همه، ساخته شده با عشق</string>
<string name="about_headline">پروژه‌ای باز نیرو گرفته از انجمن</string>
<string name="pedestrian">پیاده</string>
<string name="bicycle">دوچرخه</string>
<string name="backup_interval_every_week">هفتگی</string>

View File

@@ -524,7 +524,7 @@
<string name="editor_share_to_all_dialog_title">Haluatko lähettää sen kaikille käyttäjille?</string>
<!-- Dialog before publishing the modifications to the public map. -->
<string name="editor_share_to_all_dialog_message_1">Varmista, ettet syöttänyt henkilökohtaisia tietojasi.</string>
<string name="editor_share_to_all_dialog_message_2">OpenStreetMap-muokkaimet tarkistavat muutokset ja ottavat sinuun yhteyttä, jos niillä on kysyttävää</string>
<string name="editor_share_to_all_dialog_message_2">OpenStreetMap-muokkaajat tarkistavat muutokset ja ottavat sinuun yhteyttä, jos heillä on kysyttävää.</string>
<string name="navigation_stop_button">Lopeta</string>
<!-- Shown as toast when starting the recent track recording -->
<string name="track_recording">Reitin kirjaaminen</string>
@@ -903,4 +903,12 @@
<string name="editor_submit">Lähetä</string>
<string name="list_description_empty">Muokkaa listaa lisätäksesi kuvauksen</string>
<string name="editor_business_vacant_button">Liike on tyhjillään</string>
<string name="place_page_map_too_old_title">Karttatiedot vanhentuneet</string>
<string name="place_page_map_too_old_description">Nykyinen karttadata on hyvin vanhaa, päivitä kartta.</string>
<string name="place_page_app_too_old_description">Nykyinen karttadata on hyvin vanhaa, päivitä CoMaps-sovellus.</string>
<string name="place_page_update_too_old_map">Päivitä kartta-alue</string>
<string name="place_page_too_old_to_edit">OpenStreetMap-muokkaus on poistettu käytöstä, koska karttadata on liian vanhaa.</string>
<string name="prefs_speed_cameras_information">Nopeuskameravaroitukset on poistettu käytöstä niissä maissa, missä varoitukset on kielletty lain nojalla.</string>
<string name="power_management">Virranhallinta</string>
<string name="navigation_start_tts_message">"Käynnistetään navigointi, ääniohjeistuksen kieli: "</string>
</resources>

View File

@@ -897,7 +897,7 @@
<string name="editor_place_doesnt_exist_description">Décrivez le lieu afin de signaler l\'erreur à la communauté OpenStreetMap</string>
<string name="offline_explanation_text">Une carte doit être téléchargée pour visualiser et vous déplacer dans une zone.\nTéléchargez les cartes des zones que vous souhaitez visiter.</string>
<string name="list_description_empty">Modifier la liste pour ajouter une description</string>
<string name="avoid_paved">Éviter les routes goudronnées</string>
<string name="avoid_paved">Éviter les routes pavées</string>
<string name="opens_at">Ouvre à %s</string>
<string name="closes_at">Ferme à %s</string>
<string name="opens_day_at">Ouverture le %1$s à %2$s</string>
@@ -913,4 +913,12 @@
<string name="editor_submit">Soumettre</string>
<string name="power_management">Gestion de l\'énergie</string>
<string name="charge_socket_schuko">Europe</string>
<string name="place_page_map_too_old_title">Carte obsolète</string>
<string name="place_page_map_too_old_description">Les données de la carte actuelle sont anciennes, pensez à les mettre à jour.</string>
<string name="place_page_update_too_old_map">Mettre à jour la carte</string>
<string name="place_page_too_old_to_edit">Les modifications OpenStreetMap sont désactivées car les données de la carte sont trop anciennes.</string>
<string name="place_page_app_too_old_description">Vos données cartographiques actuelles sont très anciennes, veuillez mettre à jour l\'application CoMaps.</string>
<string name="prefs_speed_cameras_information">Les avertissements relatifs aux radars de vitesse sont désactivés dans les pays où les alertes sont interdites par la législation locale.</string>
<string name="navigation_start_tts_message">"Navigation de démarrage, langue des instructions vocales : "</string>
<string name="navigation_start_tts_disabled_message">Instructions vocales désactivées : moteur de synthèse vocale non disponible</string>
</resources>

View File

@@ -261,4 +261,13 @@
<string name="dialog_routing_system_error">Sistemska greška</string>
<string name="dialog_routing_application_error">Nije moguće napraviti rutu zbog greške u aplikaciji</string>
<string name="dialog_routing_try_again">Pokušajte ponovno</string>
<string name="search_not_found_query">Preuzmite regiju u kojoj pretražujete ili pokušajte dodati naziv obližnjeg grada/sela.</string>
<string name="search_history_text">Pogledajte svoja nedavna pretraživanja</string>
<string name="read_in_wikipedia">Wikipedija</string>
<string name="p2p_your_location">Vaša lokacija</string>
<string name="p2p_only_from_current">Navigacija je dostupna samo od vaše trenutne lokacije</string>
<string name="p2p_reroute_from_current">Želite li isplanirati rutu od vaše trenutne lokacije?</string>
<string name="editor_time_add">Dodaj Raspored</string>
<string name="editor_time_delete">Izbriši Raspored</string>
<string name="editor_time_allday">Cijeli dan (24 sata)</string>
</resources>

View File

@@ -898,4 +898,12 @@
<string name="avoid_paved">Evita le strade asfaltate</string>
<string name="charge_socket_schuko">Domestico EU</string>
<string name="power_management">Risparmio energetico</string>
<string name="place_page_too_old_to_edit">La modifica di OpenStreetMap è disabilitata perché le mappe sono troppo vecchie.</string>
<string name="place_page_update_too_old_map">Aggiorna questa mappa</string>
<string name="place_page_app_too_old_description">Le mappe correnti sono molto vecchie, si suggerisce di aggiornare CoMaps.</string>
<string name="place_page_map_too_old_description">La mappa corrente è molto vecchia, si suggerisce di aggiornarla.</string>
<string name="place_page_map_too_old_title">Mappa obsoleta</string>
<string name="navigation_start_tts_disabled_message">Istruzioni vocali disabilitate: TTS non disponibile</string>
<string name="prefs_speed_cameras_information">Gli avvisi di Autovelox sono disabilitati dove proibito dalla legge locale.</string>
<string name="navigation_start_tts_message">"Inizio Navigazione, lingua per istruzioni vocali: "</string>
</resources>

View File

@@ -371,4 +371,6 @@
<string name="error_value_must_be_positive">Res an niver positiv</string>
<string name="error_invalid_number">Niver anewn</string>
<string name="offline_explanation_title">Mappys Dhywarlinen</string>
<string name="category_shopping">Gwerthjiow</string>
<string name="edit">Golegi</string>
</resources>

View File

@@ -845,4 +845,10 @@
<string name="closed_now">Šobrīd slēgts</string>
<string name="avoid_paved">Izvairīties no ceļiem ar cietu mākslīgo segumu</string>
<string name="editor_submit">Iesniegt</string>
<string name="place_page_map_too_old_title">Novecojuši kartes dati</string>
<string name="place_page_map_too_old_description">Pašreizējie kartes dati ir ļoti veci, lūgums atjaunināt karti.</string>
<string name="place_page_app_too_old_description">Pašreizējie kartes dati ir ļoti veci, lūgums atjaunināt CoMaps lietotni.</string>
<string name="place_page_update_too_old_map">Atjaunināt karšu apgabalu</string>
<string name="place_page_too_old_to_edit">OpenStreetMap labošana ir atspējota, jo kartes dati ir pārāk veci.</string>
<string name="navigation_start_tts_disabled_message">Balss norādes atspējotas: nav pieejams teksta pārveidošanas runā dzinējs</string>
</resources>

View File

@@ -899,4 +899,11 @@
<string name="navigation_start_tts_disabled_message">Taleveiledninger deaktivert: TTS-motor ikke tilgjengelig</string>
<string name="navigation_start_tts_message">"Starter navigering, taleveiledningsspråk: "</string>
<string name="prefs_speed_cameras_information">Fotoboksvarsler er deaktivert i land hvor varsler er forbudt i henhold til lokal lovgivning.</string>
<string name="place_page_map_too_old_title">Kartdata utdatert</string>
<string name="place_page_map_too_old_description">Gjeldende kartdata er gamle, oppdater kartet.</string>
<string name="place_page_app_too_old_description">Gjeldende kartdata er gamle, oppdater CoMaps-appen.</string>
<string name="place_page_update_too_old_map">Oppdater kartregion</string>
<string name="place_page_too_old_to_edit">OpenStreetMap-redigering er deaktivert fordi kartdataene er for gamle.</string>
<string name="osm_note_hint">Alternativt, så kan du legge til et notat i OpenStreetMap, slik at noen andre kan redigere eller legge til stedet.</string>
<string name="osm_note_toast">Notatet vil bli sendt til OpenStreetMap</string>
</resources>

View File

@@ -910,4 +910,9 @@
<string name="navigation_start_tts_message">"Navigatie starten, taal voor steminstructie: "</string>
<string name="prefs_speed_cameras_information">Waarschuwingen voor flitsers zijn uitgeschakeld in landen waar deze wettelijk zijn verboden.</string>
<string name="navigation_start_tts_disabled_message">Spraakinstructies uitgeschakeld: TTS-engine niet beschikbaar</string>
<string name="place_page_map_too_old_title">Kaartgegevens verouderd</string>
<string name="place_page_map_too_old_description">Uw huidige kaartgegevens zijn erg oud. Werk de kaart bij.</string>
<string name="place_page_app_too_old_description">Uw huidige kaartgegevens zijn erg oud. Update de CoMaps-app.</string>
<string name="place_page_update_too_old_map">Kaart regio bijwerken</string>
<string name="place_page_too_old_to_edit">Het bewerken van OpenStreetMap is uitgeschakeld omdat de kaartgegevens te oud zijn.</string>
</resources>

View File

@@ -885,4 +885,12 @@
<string name="editor_submit">Enviar</string>
<string name="power_management">Gerenciamento de energia</string>
<string name="charge_socket_schuko">Doméstica UE</string>
<string name="place_page_map_too_old_title">Dados do mapa desatualizados</string>
<string name="place_page_map_too_old_description">Os seus dados do mapa atuais são muito antigos, por favor atualize o mapa.</string>
<string name="place_page_app_too_old_description">Seus dados do mapa atuais são muito antigos, por favor atualize o aplicativo CoMaps.</string>
<string name="place_page_update_too_old_map">Atualizar região do mapa</string>
<string name="place_page_too_old_to_edit">A edição do OpenStreetMap está desativada porque os dados do mapa são antigos demais.</string>
<string name="prefs_speed_cameras_information">Alertas de radar fotográfico de velocidade estão desativados em países onde os alertas são proibidos pelas leis locais.</string>
<string name="navigation_start_tts_message">"Iniciando navegação, idioma da instrução por voz: "</string>
<string name="navigation_start_tts_disabled_message">Instrução por voz desativada: nenhum motor de texto para voz disponível</string>
</resources>

View File

@@ -901,4 +901,12 @@
<string name="list_description_empty">Edite a lista para adicionar uma descrição</string>
<string name="power_management">Gestão de Energia</string>
<string name="charge_socket_schuko">Doméstica UE</string>
<string name="place_page_map_too_old_title">Dados do mapa desatualizados</string>
<string name="place_page_map_too_old_description">O seu mapa atual tem dados demasiado antigos, por favor atualize-o.</string>
<string name="place_page_app_too_old_description">O seu mapa atual tem dados demasiado antigos, por favor atualize a aplicação do CoMaps.</string>
<string name="place_page_update_too_old_map">Atualizar região do mapa</string>
<string name="place_page_too_old_to_edit">Edição OpenStreetMap está desativada, pois os dados do mapa são demasiado antigos.</string>
<string name="prefs_speed_cameras_information">Avisos de câmaras de velocidade estão desativados em países onde alertas estão proibidos por lei.</string>
<string name="navigation_start_tts_message">"Iniciando Navegação, idioma das instruções por voz: "</string>
<string name="navigation_start_tts_disabled_message">Instruções por voz desativadas: nenhum motor de TTS disponível</string>
</resources>

View File

@@ -17,7 +17,7 @@
<!-- Choose measurement on first launch alert - choose imperial system button -->
<string name="miles">Мили</string>
<!-- Update maps later button text -->
<string name="later">Не сейчас</string>
<string name="later">Позже</string>
<!-- View and button titles for accessibility, please also edit it in iphone/plist.txt -->
<string name="search">Поиск</string>
<!-- Search box placeholder text; Used when searching on the map itself, not when searching for a map -->
@@ -27,7 +27,7 @@
<!-- A dialog title, that warns a user that Precise Location is disabled and suggests to turn it on -->
<string name="limited_accuracy">Точность местоположения ограничена</string>
<!-- A dialog text, that warns a user that Precise Location is disabled and suggests to turn it on -->
<string name="precise_location_is_disabled_long_text">Для обеспечения точной навигации включите определение точного местоположения в настройках</string>
<string name="precise_location_is_disabled_long_text">Включите в настройках определение точного местоположения</string>
<!-- View and button titles for accessibility -->
<string name="zoom_to_country">Показать на карте</string>
<!-- Message to display at the center of the screen when the country download has failed -->
@@ -297,7 +297,7 @@
<!-- location service disabled -->
<string name="enable_location_services">Пожалуйста, включите геолокацию</string>
<string name="save">Сохранить</string>
<string name="create">создать</string>
<string name="create">Создать</string>
<!-- red color -->
<string name="red">Красный</string>
<!-- yellow color -->
@@ -526,8 +526,8 @@
<!-- Displayed when saving some edits to the map to warn against publishing personal data -->
<string name="editor_share_to_all_dialog_title">Отправить всем пользователям?</string>
<!-- Dialog before publishing the modifications to the public map. -->
<string name="editor_share_to_all_dialog_message_1">Убедитесь, что вы не указали никаких личных данных</string>
<string name="editor_share_to_all_dialog_message_2">Редакторы OpenStreetMap проверят изменения и свяжутся с вами, если у них возникнут вопросы</string>
<string name="editor_share_to_all_dialog_message_1">Убедитесь, что вы не указали никаких личных данных.</string>
<string name="editor_share_to_all_dialog_message_2">Редакторы OpenStreetMap проверят изменения и свяжутся с вами, если у них возникнут вопросы.</string>
<string name="navigation_stop_button">оп</string>
<!-- Shown as toast when starting the recent track recording -->
<string name="track_recording">Запись трека</string>
@@ -918,4 +918,9 @@
<string name="list_description_empty">Отредактируйте список, чтобы добавить описание</string>
<string name="pref_tts_no_system_tts_short">Не найден движок синтезатора речи, проверьте настройки приложения</string>
<string name="unknown_power_output">неизвестно</string>
<string name="opens_day_at">Откроется %1$s на %2$s</string>
<string name="closes_day_at">Закроется %1$s на %2$s</string>
<string name="place_page_map_too_old_title">Данные карты устарели</string>
<string name="place_page_update_too_old_map">Обновить регион карты</string>
<string name="place_page_too_old_to_edit">Редактирование OpenStreetMap отключено, так как данные карты слишком старые.</string>
</resources>

View File

@@ -349,8 +349,8 @@
<string name="osm_note_hint">Ali pa pusti sporočilo skupnosti OpenStreetMap, da bo nekdo drug dodal ali popravil ta kraj.</string>
<string name="osm_note_toast">Sporočilo bo poslano na OpenStreetMap</string>
<string name="editor_share_to_all_dialog_title">Ali to želite poslati vsem uporabnikom?</string>
<string name="editor_share_to_all_dialog_message_1">Poskrbite, da niste vnesli nobenih zasebnih podatkov</string>
<string name="editor_share_to_all_dialog_message_2">Uredniki na OpenStreetMap bodo preverili spremembe in stopili v stik z vami, če kaj ne bo jasno</string>
<string name="editor_share_to_all_dialog_message_1">Poskrbite, da niste vnesli nobenih zasebnih ali osebnih podatkov</string>
<string name="editor_share_to_all_dialog_message_2">Uredniki na OpenStreetMap bodo preverili spremembe in stopili v stik z vami, če kaj ne bo jasno.</string>
<string name="navigation_stop_button">Ustavi</string>
<string name="track_recording">Snemam pot</string>
<string name="accept">Potrdi</string>
@@ -639,4 +639,22 @@
<item quantity="few">%d min</item>
<item quantity="other">%d min</item>
</plurals>
<string name="opens_day_at">Odpre se %1$s, ob %2$s</string>
<string name="closes_day_at">Zapre se %1$s, ob %2$s</string>
<string name="editor_business_vacant_button">Podjetje ni zakupljeno</string>
<string name="editor_mark_business_vacant_title">Označi, da je podjetje nezakupljeno</string>
<string name="editor_mark_business_vacant_description">To uporabite, če se je podjetje izselilo in so prostori prazni in pripravljeni za novega zakupnika.</string>
<string name="editor_submit">Potrdi</string>
<string name="place_page_map_too_old_title">Podatki zemljevida so zastareli</string>
<string name="place_page_map_too_old_description">Vaši trenutni podatki zemljevida so zelo stari; prosimo, posodobite zemljevid.</string>
<string name="place_page_app_too_old_description">Vaši trenutni podatki zemljevida so zelo stari; prosimo, posodobite orodje CoMaps.</string>
<string name="place_page_update_too_old_map">Posodobi področje zemljevida</string>
<string name="place_page_too_old_to_edit">Urejanje OpenStreetMap je onemogočeno, ker so podatki zemljevida prestari.</string>
<string name="prefs_speed_cameras_information">Opozorila o merilnikih hitrosti so onemogočena v državah, kjer so prepovedana s tamkajšnjimi zakoni.</string>
<string name="power_management">Energetsko upravljanje</string>
<string name="avoid_paved">Izogni se neasfaltiranim cestam</string>
<string name="navigation_start_tts_message">"Začenjanje potnega usmerjanja, jezik glasovnih napotkov: "</string>
<string name="navigation_start_tts_disabled_message">Glasovni napotki so onemogočeni: ustvarjalec glasu (TTS) ni na voljo</string>
<string name="charge_socket_schuko">standardna evropska vtičnica (Schuko)</string>
<string name="list_description_empty">Uredite seznam, da dodate opis</string>
</resources>

View File

@@ -912,4 +912,9 @@
<string name="navigation_start_tts_message">"启动导航,语音指令语言: "</string>
<string name="prefs_speed_cameras_information">在当地法律禁止发出警报的国家/地区,测速摄像头警告功能将被禁用。</string>
<string name="navigation_start_tts_disabled_message">语音指令已禁用TTS 引擎不可用</string>
<string name="place_page_map_too_old_title">地图数据已过时</string>
<string name="place_page_map_too_old_description">您当前的地图数据非常旧,请更新地图。</string>
<string name="place_page_app_too_old_description">您当前的地图数据非常旧,请更新 CoMaps 应用。</string>
<string name="place_page_update_too_old_map">更新地图区域</string>
<string name="place_page_too_old_to_edit">由于地图数据太旧OpenStreetMap 编辑被禁用。</string>
</resources>

View File

@@ -119,7 +119,7 @@
<dimen name="nav_menu_landscape_width">360dp</dimen>
<dimen name="nav_frame_padding">@dimen/margin_half</dimen>
<dimen name="zoom_buttons_margin">64dp</dimen>
<dimen name="zoom_buttons_margin">58dp</dimen>
<dimen name="map_buttons_bottom_margin">136dp</dimen>
<dimen name="map_buttons_bottom_max_width">300dp</dimen>

View File

@@ -425,4 +425,17 @@
<item name="android:maxWidth">@dimen/map_buttons_bottom_max_width</item>
<item name="android:padding">@dimen/nav_frame_padding</item>
</style>
<style name="ShapeAppearance.MapButton.Zoom.Plus" parent="">
<item name="cornerSizeTopLeft">10%</item>
<item name="cornerSizeTopRight">10%</item>
<item name="cornerSizeBottomRight">50%</item>
<item name="cornerSizeBottomLeft">50%</item>
</style>
<style name="ShapeAppearance.MapButton.Zoom.Minus" parent="">
<item name="cornerSizeBottomLeft">10%</item>
<item name="cornerSizeBottomRight">10%</item>
<item name="cornerSizeTopLeft">50%</item>
<item name="cornerSizeTopRight">50%</item>
</style>
</resources>

View File

@@ -4,10 +4,11 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Locale;
import org.junit.Test;
public class OpenStateTextFormatterTest
{
@@ -35,10 +36,10 @@ public class OpenStateTextFormatterTest
@Test
public void buildAtLabel_today_open_close()
{
String open = OpenStateTextFormatter.buildAtLabel(true, true, "Sat", "09:00", OPENS_AT, CLOSES_AT, OPENS_DAY_AT,
CLOSES_DAY_AT);
String close = OpenStateTextFormatter.buildAtLabel(false, true, "Sat", "18:00", OPENS_AT, CLOSES_AT, OPENS_DAY_AT,
CLOSES_DAY_AT);
String open = OpenStateTextFormatter.buildAtLabel(true, true, "Sat", "09:00",
OPENS_AT, CLOSES_AT, OPENS_DAY_AT, CLOSES_DAY_AT);
String close = OpenStateTextFormatter.buildAtLabel(false, true, "Sat", "18:00",
OPENS_AT, CLOSES_AT, OPENS_DAY_AT, CLOSES_DAY_AT);
assertEquals("Opens at 09:00", open);
assertEquals("Closes at 18:00", close);
}
@@ -46,10 +47,10 @@ public class OpenStateTextFormatterTest
@Test
public void buildAtLabel_other_day()
{
String open = OpenStateTextFormatter.buildAtLabel(true, false, "Sat", "09:00", OPENS_AT, CLOSES_AT, OPENS_DAY_AT,
CLOSES_DAY_AT);
String close = OpenStateTextFormatter.buildAtLabel(false, false, "Tue", "18:00", OPENS_AT, CLOSES_AT, OPENS_DAY_AT,
CLOSES_DAY_AT);
String open = OpenStateTextFormatter.buildAtLabel(true, false, "Sat", "09:00",
OPENS_AT, CLOSES_AT, OPENS_DAY_AT, CLOSES_DAY_AT);
String close = OpenStateTextFormatter.buildAtLabel(false, false, "Tue", "18:00",
OPENS_AT, CLOSES_AT, OPENS_DAY_AT, CLOSES_DAY_AT);
assertEquals("Opens Sat at 09:00", open);
assertEquals("Closes Tue at 18:00", close);
}

View File

@@ -0,0 +1 @@
../../../../../data/mapcss-mapping.csv
1 ../../../../../data/mapcss-mapping.csv

View File

@@ -18,6 +18,7 @@
#include <functional>
#include <memory>
#include <unordered_map>
#include <vector>
namespace
@@ -52,7 +53,7 @@ struct TBatchedData
jobject g_countryChangedListener = nullptr;
DECLARE_THREAD_CHECKER(g_batchingThreadChecker);
ankerl::unordered_dense::map<jobject, std::vector<TBatchedData>> g_batchedCallbackData;
std::unordered_map<jobject, std::vector<TBatchedData>> g_batchedCallbackData;
bool g_isBatched;
storage::Storage & GetStorage()

View File

@@ -320,7 +320,7 @@ JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_editor_OpeningHours_nativeCur
jclass ohStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/OhState");
jclass ruleStateClass = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/editor/OhState$State");
static ankerl::unordered_dense::map<RuleState, char const *> const ruleState = {
static std::unordered_map<RuleState, char const *> const ruleState = {
{RuleState::Open, "Open"}, {RuleState::Closed, "Closed"}, {RuleState::Unknown, "Unknown"}};
jfieldID stateField =

View File

@@ -35,8 +35,7 @@ SOFTWARE.
#include <iterator>
#include <string>
#include "3party/ankerl/unordered_dense.h"
#include <unordered_map>
DECLARE_EXCEPTION(JniException, RootException);
@@ -152,7 +151,7 @@ public:
}
private:
ankerl::unordered_dense::map<std::string, jfieldID> m_fieldIds;
std::unordered_map<std::string, jfieldID> m_fieldIds;
};
} // namespace

View File

@@ -4,30 +4,28 @@ 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)
{
/**
* Some charge sockets have the same visuals as other sockets, even though they are different and are tagged
* differently in OSM. This method returns the 'visual' type that should be used for the socket.
*
* @return the 'equivalent' visual style that should be used for this socket
*/
public String visualType()
{
if (type.equals("typee"))
{
return "schuko";
}
return type;
}
public record ChargeSocketDescriptor(String type, int count, double power) {
/**
* Some charge sockets have the same visuals as other sockets, even though they are different and are tagged
* differently in OSM. This method returns the 'visual' type that should be used for the socket.
*
* @return the 'equivalent' visual style that should be used for this socket
*/
public String visualType() {
if (type.equals("typee")) {
return "schuko";
}
return type;
}
/**
* For some sockets (eg, domestic sockets), the power is usually not provided, as it is 'implicit'
*
* @return true if this socket type does not require displaying the power
*/
public Boolean ignorePower() {
return type.equals("typee") || type.equals("schuko");
}
/**
* For some sockets (eg, domestic sockets), the power is usually not provided, as it is 'implicit'
*
* @return true if this socket type does not require displaying the power
*/
public Boolean ignorePower()
{
return type.equals("typee") || type.equals("schuko");
}
}

View File

@@ -3,6 +3,7 @@ package app.organicmaps.sdk.editor;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.organicmaps.sdk.editor.data.Timespan;
import app.organicmaps.sdk.editor.data.Timetable;

View File

@@ -2,14 +2,16 @@ package app.organicmaps.sdk.util;
import android.content.Context;
import android.content.res.Resources;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import app.organicmaps.sdk.R;
import java.text.DateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import app.organicmaps.sdk.R;
public final class DateUtils
{
private DateUtils() {}
@@ -42,7 +44,7 @@ public final class DateUtils
if (days == 1)
return resources.getString(R.string.yesterday).toLowerCase();
if (days < 7)
return resources.getString(R.string.days_ago, Integer.toString(days));
return resources.getString(R.string.days_ago, Integer.toString(days));
if (days < 30)
return resources.getString(days < 14 ? R.string.week_ago : R.string.weeks_ago, Integer.toString(days / 7));
if (days < 365)

View File

@@ -1497,4 +1497,5 @@
<string name="type.shop.beauty.nails">Nehtový salón</string>
<string name="type.xmas.tree">Vánoční strom</string>
<string name="type.man_made.mast.communication">Komunikační stožár</string>
<string name="type.amenity.hydrant">Hydrant na zavlažování</string>
</resources>

View File

@@ -160,7 +160,7 @@
<string name="type.amenity.public_bath">Baños públicos</string>
<string name="type.amenity.shower">Ducha</string>
<string name="type.amenity.stripclub">Club de estriptis</string>
<string name="type.amenity.taxi">Sitio de taxis</string>
<string name="type.amenity.taxi">Parada de taxis</string>
<string name="type.amenity.telephone">Teléfono</string>
<string name="type.amenity.theatre">Teatro</string>
<string name="type.amenity.toilets">WC</string>
@@ -351,6 +351,7 @@
<string name="type.emergency.assembly_point">Punto de reunión de emergencia</string>
<string name="type.emergency.defibrillator">Desfibrilador</string>
<string name="type.emergency.fire_hydrant">Boca de incendio</string>
<string name="type.amenity.hydrant">Boca de riego</string>
<string name="type.emergency.phone">Teléfono de emergencias</string>
<!-- A place where a lifeguard is on duty. -->
<string name="type.emergency.lifeguard">Socorrista</string>
@@ -454,7 +455,7 @@
<!-- These translations are used for all type.highway.*.bridge. -->
<string name="type.highway.residential.bridge">Puente</string>
<!-- These translations are used for all type.highway.*.tunnel. -->
<string name="type.highway.residential.tunnel">Túnel de calle residencial</string>
<string name="type.highway.residential.tunnel">Túnel</string>
<string name="type.highway.rest_area">Área de descanso</string>
<string name="type.highway.road">Carretera</string>
<!-- These translations are used for all type.highway.*.bridge. -->
@@ -467,7 +468,7 @@
<!-- These translations are used for all type.highway.*.bridge. -->
<string name="type.highway.secondary.bridge">Puente</string>
<!-- These translations are used for all type.highway.*.tunnel. -->
<string name="type.highway.secondary.tunnel">Túnel de carretera secundaria</string>
<string name="type.highway.secondary.tunnel">Túnel</string>
<string name="type.highway.secondary_link">Enlace de carretera secundaria</string>
<!-- These translations are used for all type.highway.*.bridge. -->
<string name="type.highway.secondary_link.bridge">Puente</string>

View File

@@ -337,6 +337,7 @@
<string name="type.emergency.assembly_point">Point de rassemblement durgence</string>
<string name="type.emergency.defibrillator">Défibrillateur</string>
<string name="type.emergency.fire_hydrant">Point deau incendie</string>
<string name="type.amenity.hydrant">Borne dpuisage</string>
<string name="type.emergency.phone">Téléphone durgence</string>
<!-- A place where a lifeguard is on duty. -->
<string name="type.emergency.lifeguard">Sauveteur</string>

View File

@@ -179,34 +179,686 @@
<string name="type.craft.shoemaker">Ewnans Eskis</string>
<string name="type.craft.winery">Gwinyer</string>
<string name="type.craft.tailor">Tregher</string>
<string name="type.cuisine.african">afrikan</string>
<string name="type.cuisine.american">amerikanek</string>
<string name="type.cuisine.arab">arabek</string>
<string name="type.cuisine.argentinian">arghantinek</string>
<string name="type.cuisine.asian">asiek</string>
<string name="type.cuisine.austrian">ostrian</string>
<string name="type.cuisine.african">Afrikan</string>
<string name="type.cuisine.american">Amerikanek</string>
<string name="type.cuisine.arab">Arabek</string>
<string name="type.cuisine.argentinian">Arghantinek</string>
<string name="type.cuisine.asian">Asiek</string>
<string name="type.cuisine.austrian">Ostrian</string>
<string name="type.cuisine.barbecue">Barbakoa</string>
<string name="type.cuisine.beef_bowl">Bolla Bewin</string>
<string name="type.cuisine.brazilian">brasiliek</string>
<string name="type.cuisine.brazilian">Brasiliek</string>
<string name="type.cuisine.breakfast">Hansel</string>
<string name="type.cuisine.bubble_tea">Te Hwethen</string>
<string name="type.cuisine.burger">Borger</string>
<string name="type.cuisine.cake">Tesen</string>
<string name="type.cuisine.chicken">Kig Yar</string>
<string name="type.cuisine.chinese">chinek</string>
<string name="type.cuisine.chinese">Chinek</string>
<string name="type.cuisine.coffee_shop">Koffi</string>
<string name="type.cuisine.croatian">kroatek</string>
<string name="type.cuisine.croatian">Kroatek</string>
<string name="type.cuisine.curry">Kurri</string>
<string name="type.cuisine.donut">Knowen Doos</string>
<string name="type.cuisine.ethiopian">ethiopek</string>
<string name="type.cuisine.ethiopian">Ethiopek</string>
<string name="type.cuisine.fine_dining">Dybri Brav</string>
<string name="type.cuisine.fish">Pysk</string>
<string name="type.cuisine.fish_and_chips">Asklotti</string>
<string name="type.cuisine.french">frynkek</string>
<string name="type.cuisine.georgian">jorjiek</string>
<string name="type.cuisine.german">almaynek</string>
<string name="type.cuisine.greek">grek</string>
<string name="type.cuisine.french">Frynkek</string>
<string name="type.cuisine.georgian">Jorjiek</string>
<string name="type.cuisine.german">Almaynek</string>
<string name="type.cuisine.greek">Grek</string>
<string name="type.cuisine.grill">Rastell</string>
<string name="type.cuisine.hungarian">hungarek</string>
<string name="type.cuisine.hungarian">Hungarek</string>
<string name="type.cuisine.ice_cream">Dehen Rew</string>
<string name="type.cuisine.indian">Eyndek</string>
<string name="type.cuisine.indonesian">Indonesek</string>
<string name="type.cuisine.international">Keswlasek</string>
<string name="type.cuisine.irish">Iwerdhonek</string>
<string name="type.cuisine.italian">Italek</string>
<string name="type.cuisine.italian_pizza">Italek, Pitsa</string>
<string name="type.cuisine.japanese">Japanek</string>
<string name="type.cuisine.korean">Koreek</string>
<string name="type.cuisine.lao">Laosek</string>
<string name="type.cuisine.lebanese">Lebanek</string>
<string name="type.cuisine.local">Leel</string>
<string name="type.cuisine.malaysian">Malaysiek</string>
<string name="type.cuisine.mediterranean">Kresvorek</string>
<string name="type.cuisine.mexican">Meksikan</string>
<string name="type.cuisine.moroccan">Morockek</string>
<string name="type.cuisine.noodles">Noudlys</string>
<string name="type.cuisine.oriental">Asiek Est</string>
<string name="type.cuisine.pancake">Krampothennow</string>
<string name="type.cuisine.pasta">Pasta</string>
<string name="type.cuisine.persian">Persi</string>
<string name="type.cuisine.peruvian">Peruvianek</string>
<string name="type.cuisine.pizza">Pitsa</string>
<string name="type.cuisine.polish">Polonek</string>
<string name="type.cuisine.portuguese">Portyngalek</string>
<string name="type.cuisine.regional">Ranndirek</string>
<string name="type.cuisine.russian">Russek</string>
<string name="type.cuisine.sandwich">Baramanyn</string>
<string name="type.cuisine.sausage">Selsigen</string>
<string name="type.cuisine.spanish">Spaynek</string>
<string name="type.cuisine.steak_house">Bosti Tregh Kig</string>
<string name="type.cuisine.sushi">Sushi</string>
<string name="type.cuisine.tea">Te</string>
<string name="type.cuisine.thai">Tai</string>
<string name="type.cuisine.turkish">Turkek</string>
<string name="type.cuisine.vegan">Vegan</string>
<string name="type.cuisine.vegetarian">Losowek</string>
<string name="type.cuisine.vietnamese">Vietnamek</string>
<string name="type.emergency">Goredhom</string>
<string name="type.emergency.access_point">Tyller Sawyans Goredhom</string>
<string name="type.emergency.assembly_point">Tyller Kuntelles Goredhom</string>
<string name="type.emergency.life_ring">Grugys-Sawya</string>
<string name="type.emergency.phone">Fon Goredhom</string>
<string name="type.emergency.lifeguard">Tyller Gwithyades-Sawya</string>
<string name="type.lateral.port">Porth</string>
<string name="type.lateral.starboard">Lew</string>
<string name="type.cardinal.east">Est</string>
<string name="type.cardinal.north">North</string>
<string name="type.cardinal.south">Soth</string>
<string name="type.cardinal.west">West</string>
<string name="type.emergency.mountain_rescue">Sawyansva Menydh</string>
<string name="type.entrance">Entrans</string>
<string name="type.entrance.main">Entrans Chif</string>
<string name="type.entrance.house">Entrans Chi</string>
<string name="type.entrance.garage">Entrans Karrji</string>
<string name="type.entrance.service">Entrans Gonis</string>
<string name="type.entrance.entry">Entrans (Unsel)</string>
<string name="type.entrance.exit">Fordh \'Mes (Unsel)</string>
<string name="type.entrance.emergency">Daras Goredhom</string>
<string name="type.fee.yes">£</string>
<string name="type.fee.no">Heb Kost</string>
<string name="type.healthcare.laboratory">Arbrovji Medhegel</string>
<string name="type.healthcare.physiotherapist">Yaghheans Fisio</string>
<string name="type.healthcare.alternative">Medhegneth Euvergryjyk</string>
<string name="type.healthcare.audiologist">Medhek Klew</string>
<string name="type.healthcare.blood_donation">Kres Argevrians Goos</string>
<string name="type.healthcare.optometrist">Medhek Golok</string>
<string name="type.healthcare.podiatrist">Medhek Troos</string>
<string name="type.healthcare.psychotherapist">Yaghheans Brysoniethel</string>
<string name="type.healthcare.sample_collection">Kres Kuntel Sampel</string>
<string name="type.healthcare.speech_therapist">Pathologydh Kows ha Tavas</string>
<string name="type.highway">Fordh Veur</string>
<string name="type.highway.bridleway">Marghlergh</string>
<string name="type.highway.bridleway.bridge">Pons</string>
<string name="type.highway.bridleway.permissive">Marghlergh</string>
<string name="type.highway.bridleway.tunnel">Kowfordh</string>
<string name="type.highway.busway">Fordh rag Kyttrinyow yn Unsel</string>
<string name="type.highway.busway.bridge">Pons</string>
<string name="type.highway.busway.tunnel">Kowfordh</string>
<string name="type.highway.bus_stop">Kyttrinva</string>
<string name="type.highway.construction">Fordh y\'n Drehevyans</string>
<string name="type.highway.cycleway">Hyns rag Diwrosow</string>
<string name="type.highway.cycleway.bridge">Pons</string>
<string name="type.highway.cycleway.permissive">Hyns rag Diwrosow</string>
<string name="type.highway.cycleway.tunnel">Kowfordh</string>
<string name="type.highway.elevator">Yskynnell</string>
<string name="type.highway.footway">Kerdhva</string>
<string name="type.highway.footway.sidewalk">Kons</string>
<string name="type.highway.footway.crossing">Treusva Gerdhoryon</string>
<string name="type.highway.footway.area">Arenebedh Gerdhoryon</string>
<string name="type.highway.footway.bridge">Pons Gerdhoryon</string>
<string name="type.highway.footway.tunnel">Kowfordh Gerdhoryon</string>
<string name="type.highway.ford">Res</string>
<string name="type.highway.living_street">Stret Pur Byghan</string>
<string name="type.highway.living_street.bridge">Pons</string>
<string name="type.highway.living_street.tunnel">Kowfordh</string>
<string name="type.highway.motorway">Gorfordh</string>
<string name="type.highway.motorway.bridge">Pons Gorfordh</string>
<string name="type.highway.motorway.tunnel">Kowfordh Gorfordh</string>
<string name="type.highway.motorway_junction">Fordh \'Mes</string>
<string name="type.highway.motorway_link">Rybfordh</string>
<string name="type.highway.motorway_link.bridge">Pons</string>
<string name="type.highway.motorway_link.tunnel">Kowfordh</string>
<string name="type.highway.path">Hyns</string>
<string name="type.highway.path.difficult">Ol Kales bo Andhiblans</string>
<string name="type.highway.path.expert">Ol Anweladow</string>
<string name="type.highway.path.bicycle">Hyns rag Kerdhoryon ha Diwrosow</string>
<string name="type.highway.footway.bicycle">Hyns rag Kerdhoryon ha Diwrosow</string>
<string name="type.highway.path.bridge">Pons</string>
<string name="type.highway.path.horse">Marghlergh</string>
<string name="type.highway.path.tunnel">Kowfordh</string>
<string name="type.highway.pedestrian">Stret Gerdhoryon yn Unsel</string>
<string name="type.highway.pedestrian.area">Arenebedh Gerdhoryon</string>
<string name="type.highway.pedestrian.bridge">Pons Gerdhoryon</string>
<string name="type.highway.pedestrian.square">Plen</string>
<string name="type.highway.pedestrian.tunnel">Kowfordh Gerdhoryon</string>
<string name="type.highway.primary">Fordh Kynsa</string>
<string name="type.highway.primary.bridge">Pons</string>
<string name="type.highway.primary.tunnel">Kowfordh</string>
<string name="type.highway.primary_link">Rybfordh Kynsa</string>
<string name="type.highway.primary_link.bridge">Pons</string>
<string name="type.highway.primary_link.tunnel">Kowfordh</string>
<string name="type.highway.residential">Stret Anedhel</string>
<string name="type.highway.residential.area">Stret Anedhel</string>
<string name="type.highway.residential.bridge">Pons</string>
<string name="type.highway.residential.tunnel">Kowfordh</string>
<string name="type.highway.rest_area">Powesva</string>
<string name="type.highway.road">Fordh</string>
<string name="type.highway.road.bridge">Pons</string>
<string name="type.man_made.bridge">Pons</string>
<string name="type.highway.road.tunnel">Kowfordh</string>
<string name="type.highway.secondary">Fordh Nessa</string>
<string name="type.highway.secondary.bridge">Pons</string>
<string name="type.highway.secondary.tunnel">Kowfordh</string>
<string name="type.highway.secondary_link">Rybfordh Nessa</string>
<string name="type.highway.secondary_link.bridge">Pons</string>
<string name="type.highway.secondary_link.tunnel">Kowfordh</string>
<string name="type.highway.service">Fordh Gonis</string>
<string name="type.highway.service.area">Fordh Gonis</string>
<string name="type.highway.service.bridge">Pons</string>
<string name="type.highway.service.driveway">Fordh dhe Chi</string>
<string name="type.highway.service.parking_aisle">Fordh Parkyans</string>
<string name="type.highway.service.tunnel">Kowfordh</string>
<string name="type.highway.services">Edhommva</string>
<string name="type.highway.speed_camera">Kamera Skavder</string>
<string name="type.highway.steps">Grisyow</string>
<string name="type.highway.ladder">Skeul</string>
<string name="type.highway.steps.bridge">Pons</string>
<string name="type.highway.steps.tunnel">Kowfordh</string>
<string name="type.highway.tertiary">Fordh Tryja</string>
<string name="type.highway.tertiary.bridge">Pons</string>
<string name="type.highway.tertiary.tunnel">Kowfordh</string>
<string name="type.highway.tertiary_link">Rybfordh Tryja</string>
<string name="type.highway.tertiary_link.bridge">Pons</string>
<string name="type.highway.tertiary_link.tunnel">Kowfordh</string>
<string name="type.highway.track">Ol</string>
<string name="type.highway.track.area">Ol</string>
<string name="type.highway.track.bridge">Pons</string>
<string name="type.highway.track.grade1">Ol</string>
<string name="type.highway.track.no.access">Ol</string>
<string name="type.highway.track.tunnel">Kowfordh</string>
<string name="type.highway.traffic_signals">Sinell Traffik</string>
<string name="type.highway.trunk">Fordh Chif</string>
<string name="type.highway.trunk.bridge">Pons</string>
<string name="type.highway.trunk.tunnel">Kowfordh</string>
<string name="type.highway.trunk_link">Rybfordh Chif</string>
<string name="type.highway.trunk_link.bridge">Pons</string>
<string name="type.highway.trunk_link.tunnel">Kowfordh</string>
<string name="type.highway.unclassified">Fordh Le</string>
<string name="type.highway.unclassified.area">Fordh Le</string>
<string name="type.highway.unclassified.bridge">Pons</string>
<string name="type.highway.unclassified.tunnel">Kowfordh</string>
<string name="type.area_highway.cycleway">Hyns rag Diwrosow</string>
<string name="type.area_highway.footway">Kerdhva</string>
<string name="type.area_highway.living_street">Stret pur Byghan</string>
<string name="type.area_highway.motorway">Gorfordh</string>
<string name="type.area_highway.path">Hyns</string>
<string name="type.area_highway.pedestrian">Stret Gerdhoryon yn Unsel</string>
<string name="type.area_highway.primary">Fordh Kynsa</string>
<string name="type.area_highway.residential">Stret Anedhel</string>
<string name="type.area_highway.secondary">Fordh Nessa</string>
<string name="type.area_highway.service">Fordh Gonis</string>
<string name="type.area_highway.tertiary">Fordh Tryja</string>
<string name="type.area_highway.steps">Grisyow</string>
<string name="type.area_highway.track">Ol</string>
<string name="type.area_highway.trunk">Fordh Chif</string>
<string name="type.area_highway.unclassified">Fordh Le</string>
<string name="type.historic">Taklen Istorek</string>
<string name="type.historic.aircraft">Ayren Istorek</string>
<string name="type.historic.anchor">Ankor Istorek</string>
<string name="type.historic.archaeological_site">Tyller Hendhyskoniethel</string>
<string name="type.historic.battlefield">Tyller Batel Istorek</string>
<string name="type.historic.boundary_stone">Men Or</string>
<string name="type.historic.cannon">Kanon</string>
<string name="type.historic.castle">Kastel</string>
<string name="type.historic.castle.castrum">Dinas Romanek</string>
<string name="type.historic.castle.defensive">Kastel Krev</string>
<string name="type.historic.castle.fortified_church">Eglos rag Skons</string>
<string name="type.historic.castle.fortress">Skons</string>
<string name="type.historic.castle.hillfort">Ker</string>
<string name="type.historic.castle.kremlin">Kastel Europek a\'n Est</string>
<string name="type.historic.castle.manor">Manerji</string>
<string name="type.historic.castle.palace">Palys</string>
<string name="type.historic.castle.shiro">Kastel Japanek</string>
<string name="type.historic.castle.stately">Kastel Maner</string>
<string name="type.historic.city_gate">Porth Cita</string>
<string name="type.historic.citywalls">Fos Cita</string>
<string name="type.historic.fort">Dinas</string>
<string name="type.historic.gallows">Krogbren</string>
<string name="type.historic.locomotive">Tren Istorek</string>
<string name="type.historic.memorial">Men Kov</string>
<string name="type.historic.memorial.cross">Krows Men Kov</string>
<string name="type.historic.memorial.plaque">Leghen Men Kov</string>
<string name="type.historic.memorial.sculpture">Gravyans</string>
<string name="type.historic.memorial.statue">Delow</string>
<string name="type.historic.memorial.stolperstein">Men Kov rag Fethesigow a an Naziow</string>
<string name="type.historic.stone">Men Istorek</string>
<string name="type.historic.memorial.war_memorial">Men Kov Bell</string>
<string name="type.historic.mine">Hwel Istorek</string>
<string name="type.historic.monument">Men Kov Bras</string>
<string name="type.historic.pillory">Karghar Prenn</string>
<string name="type.historic.ruins">Kryllasow Istorek</string>
<string name="type.historic.ship">Gorhel</string>
<string name="type.historic.tank">Tank Istorek</string>
<string name="type.historic.tomb">Bedh</string>
<string name="type.man_made.cross">Krows</string>
<string name="type.historic.wayside_cross">Krows amal an Fordh</string>
<string name="type.historic.wayside_shrine">Krerva amal an Fordh</string>
<string name="type.historic.wreck">Gwreck</string>
<string name="type.internet_access">Kesrosweyth</string>
<string name="type.internet_access.wlan">Kesrosweyth</string>
<string name="type.junction">Fordh Dhibarth</string>
<string name="type.junction.circular">Fordh A-Dro</string>
<string name="type.junction.roundabout">Fordh A-Dro</string>
<string name="type.landuse">Devnydh Tir</string>
<string name="type.landuse.allotments">Pastellow Tir</string>
<string name="type.landuse.basin">Bason</string>
<string name="type.landuse.brownfield">Tir Ragdevnydhys</string>
<string name="type.landuse.cemetery">Korflan</string>
<string name="type.landuse.cemetery.christian">Korflan Kristyon</string>
<string name="type.landuse.religious">Tir Kryjyk</string>
<string name="type.landuse.commercial">Tir Kenwerthel</string>
<string name="type.landuse.construction">Tir Drehevyans</string>
<string name="type.landuse.education">Komodyta Adhyskansel</string>
<string name="type.landuse.farmland">Tir Ammeth</string>
<string name="type.landuse.farmyard">Garth an Dre</string>
<string name="type.landuse.flowerbed">Bleujyowek</string>
<string name="type.landuse.forest">Koos</string>
<string name="type.landuse.forest.coniferous">Koos Bydhlas</string>
<string name="type.landuse.forest.deciduous">Koos Kolldhel</string>
<string name="type.landuse.forest.mixed">Koos Gemyskys</string>
<string name="type.landuse.garages">Karrjiow</string>
<string name="type.landuse.grass">Gwels</string>
<string name="type.landuse.greenfield">Tir Gwyrgh</string>
<string name="type.landuse.greenhouse_horticulture">Chi Gweder</string>
<string name="type.landuse.industrial">Hwelbark</string>
<string name="type.landuse.landfill">Tirlanow</string>
<string name="type.landuse.meadow">Pras</string>
<string name="type.landuse.military">Selva</string>
<string name="type.landuse.orchard">Avalennek</string>
<string name="type.landuse.quarry">Mengleudh</string>
<string name="type.landuse.railway">Yyns Horn</string>
<string name="type.landuse.recreation_ground">Park</string>
<string name="type.landuse.reservoir">Kreun</string>
<string name="type.landuse.residential">Tir Anedhel</string>
<string name="type.landuse.retail">Tir Daskwerthans</string>
<string name="type.landuse.salt_pond">Poll Holan</string>
<string name="type.landuse.village_green">Plen Glas Gwig</string>
<string name="type.landuse.vineyard">Gwinlan</string>
<string name="type.leisure">Tir rag Termyn Syger</string>
<string name="type.leisure.bandstand">Gwariva Poblek</string>
<string name="type.leisure.common">Tir Poblek</string>
<string name="type.leisure.dog_park">Park rag Keun</string>
<string name="type.leisure.fitness_centre">Hel Sport</string>
<string name="type.leisure.dance">Hel Donsya</string>
<string name="type.leisure.garden">Jardin</string>
<string name="type.leisure.garden.residential">Jardin Anedhel</string>
<string name="type.leisure.golf_course">Gwel Golf</string>
<string name="type.leisure.miniature_golf">Gwel Golf Munys</string>
<string name="type.leisure.indoor_play">Garth-Gwari Pervedhek</string>
<string name="type.leisure.marina">Porth</string>
<string name="type.leisure.nature_reserve">Gwithva Natur</string>
<string name="type.leisure.outdoor_seating">Esedhow yn-mes</string>
<string name="type.leisure.firepit">Oles</string>
<string name="type.leisure.park">Park</string>
<string name="type.leisure.park.no.access">Park Privedh</string>
<string name="type.leisure.park.permissive">Park</string>
<string name="type.leisure.park.private">Park Privedh</string>
<string name="type.leisure.picnic_table">Bordh Kroust</string>
<string name="type.leisure.pitch">Len Sportys</string>
<string name="type.leisure.playground">Garth-Gwari</string>
<string name="type.leisure.recreation_ground">Park</string>
<string name="type.leisure.sauna">Sawna</string>
<string name="type.leisure.sports_centre">Kres Sportya</string>
<string name="type.leisure.sports_centre.sport.multi">Kres Sportya Liesek</string>
<string name="type.leisure.sports_centre.sport.american_football">Kres Pel Droos Amerikanek</string>
<string name="type.leisure.sports_centre.sport.archery">Kres Gwaregieth</string>
<string name="type.leisure.sports_centre.sport.athletics">Kres Athletek</string>
<string name="type.leisure.sports_centre.sport.australian_football">Kres Pel Droos Ostralek</string>
<string name="type.leisure.sports_centre.sport.badminton">Kres Badminton</string>
<string name="type.leisure.sports_centre.sport.baseball">Kres Pel Vas</string>
<string name="type.leisure.sports_centre.sport.basketball">Kres Pel Ganstel</string>
<string name="type.leisure.sports_centre.sport.beachvolleyball">Kres Pel Volli war an Treth</string>
<string name="type.leisure.sports_centre.sport.bowls">Kres Gwari Pelyow</string>
<string name="type.leisure.sports_centre.sport.climbing">Kres Krambla</string>
<string name="type.leisure.sports_centre.sport.cricket">Kres Krycket</string>
<string name="type.leisure.sports_centre.sport.curling">Kres Hurlya</string>
<string name="type.leisure.sports_centre.sport.equestrian">Kres Marghek</string>
<string name="type.leisure.sports_centre.sport.field_hockey">Kres Hocki</string>
<string name="type.leisure.sports_centre.sport.futsal">Kres Futsal</string>
<string name="type.leisure.sports_centre.sport.golf">Kres Golf</string>
<string name="type.leisure.sports_centre.sport.gymnastics">Kres Gymnastek</string>
<string name="type.leisure.sports_centre.sport.handball">Kres Pel Dhorn</string>
<string name="type.leisure.sports_centre.sport.ice_hockey">Kres Hocki Rew</string>
<string name="type.leisure.sports_centre.sport.skateboard">Kres Rostell</string>
<string name="type.leisure.sports_centre.sport.skiing">Kres Skia</string>
<string name="type.leisure.sports_centre.sport.soccer">Kres Pel Droos</string>
<string name="type.leisure.sports_centre.sport.swimming">Kres Poll-Neuvya</string>
<string name="type.leisure.sports_centre.sport.table_tennis">Kres Tennis Moos</string>
<string name="type.leisure.sports_centre.sport.tennis">Kres Tennis</string>
<string name="type.leisure.sports_centre.sport.volleyball">Kres Pel Volli</string>
<string name="type.leisure.stadium">Sportva</string>
<string name="type.leisure.swimming_pool">Poll-Neuvya</string>
<string name="type.leisure.swimming_pool.private">Poll-Neuvya Privedh</string>
<string name="type.leisure.track">Ol Athletek</string>
<string name="type.leisure.track.area">Ol Athletek</string>
<string name="type.leisure.beach_resort">Tyller-Havi war an Treth</string>
<string name="type.man_made">Dornwrys</string>
<string name="type.man_made.cairn">Karnedh</string>
<string name="type.man_made.chimney">Chymbla</string>
<string name="type.man_made.survey_point">Bleyn Arhwithra</string>
<string name="type.man_made.flagpole">Gwelen Baner</string>
<string name="type.man_made.lighthouse">Golowji</string>
<string name="type.man_made.mast">Gwern</string>
<string name="type.man_made.pier">Kay</string>
<string name="type.man_made.pipeline">Gooth</string>
<string name="type.man_made.pipeline.overground">Gooth a-ugh dhe Leur</string>
<string name="type.man_made.surveillance">Kamera Aspians</string>
<string name="type.man_made.tower">Tour</string>
<string name="type.man_made.communications_tower">Tour Keskomunyans</string>
<string name="type.man_made.tower.communication">Tour Keskomunyans</string>
<string name="type.man_made.mast.communication">Tour Keskomunyans</string>
<string name="type.man_made.petroleum_well">Fenten Oyl bo Petrol</string>
<string name="type.man_made.crane">Garan</string>
<string name="type.man_made.wastewater_plant">Komodyta Karth Karthyon</string>
<string name="type.man_made.water_tap">Tapp</string>
<string name="type.man_made.water_tap.drinking_water_no">Tapp</string>
<string name="type.man_made.water_tower">Tour Dowrargh</string>
<string name="type.man_made.water_well">Fenten</string>
<string name="type.man_made.water_well.drinking_water_no">Fenten</string>
<string name="type.man_made.windmill">Melin Wyns</string>
<string name="type.man_made.works">Tir Gonis</string>
<string name="type.military">Selva</string>
<string name="type.natural">Natur</string>
<string name="type.natural.bare_rock">Karrek</string>
<string name="type.natural.shingle">Biliennow</string>
<string name="type.natural.scree">Radel</string>
<string name="type.natural.bay">Pleg Mor</string>
<string name="type.natural.beach">Treth</string>
<string name="type.natural.beach.sand">Treth Tewesek</string>
<string name="type.natural.beach.gravel">Treth Growan</string>
<string name="type.natural.cape">Pennrynn</string>
<string name="type.natural.cave_entrance">Entrans Fow</string>
<string name="type.natural.cliff">Als</string>
<string name="type.natural.earth_bank">Banken</string>
<string name="type.man_made.embankment">Bour</string>
<string name="type.natural.coastline">Kost</string>
<string name="type.natural.desert">Difeyth</string>
<string name="type.natural.sand">Tewes</string>
<string name="type.natural.geyser">Fenten Gnasek</string>
<string name="type.natural.glacier">Rewiva</string>
<string name="type.natural.grassland">Tonn</string>
<string name="type.natural.heath">Grug</string>
<string name="type.natural.hot_spring">Fenten Pooth</string>
<string name="type.natural.water.lake">Lynn</string>
<string name="type.natural.water.lock">Poll Yet Dhowr</string>
<string name="type.natural.water.pond">Poll</string>
<string name="type.natural.water.reservoir">Kreun</string>
<string name="type.natural.water.basin">Bason</string>
<string name="type.natural.water.river">Avon</string>
<string name="type.natural.land">Tir</string>
<string name="type.natural.meadow">Pras</string>
<string name="type.natural.orchard">Avalennek</string>
<string name="type.natural.peak">Topp</string>
<string name="type.natural.rock">Men</string>
<string name="type.natural.scrub">Krann</string>
<string name="type.natural.spring">Fenten</string>
<string name="type.natural.spring.drinking_water_no">Fenten</string>
<string name="type.natural.tree">Gwedhen</string>
<string name="type.natural.tree_row">Rew a Gwedhennow</string>
<string name="type.natural.vineyard">Gwinlan</string>
<string name="type.natural.volcano">Loskvenydh</string>
<string name="type.natural.water">Dowr</string>
<string name="type.natural.wetland.bog">Keunegen</string>
<string name="type.natural.wetland.marsh">Keunek</string>
<string name="type.natural.wetland.saltmarsh">Keunek Sall</string>
<string name="type.natural.wetland.fen">Gwern</string>
<string name="type.natural.wetland.reedbed">Keunegen</string>
<string name="type.natural.wetland.swamp">Gwern</string>
<string name="type.natural.wetland.mangrove">Koos Liva</string>
<string name="type.noexit">Fordh Dhal</string>
<string name="type.office">Buro</string>
<string name="type.office.company">Buro Kowethyans</string>
<string name="type.office.government">Buro Governans</string>
<string name="type.office.insurance">Buro Surheans</string>
<string name="type.office.lawyer">Laghyas</string>
<string name="type.office.ngo">Buro Aluseneth</string>
<string name="type.office.telecommunication">Kowethyans Pellgomunyans</string>
<string name="type.organic.only">Organek</string>
<string name="type.organic.yes">Organek</string>
<string name="type.place.city">Cita</string>
<string name="type.place.city.capital">Chifcita</string>
<string name="type.place.city.capital.10">Cita</string>
<string name="type.place.city.capital.11">Cita</string>
<string name="type.place.city.capital.2">Chifcita</string>
<string name="type.place.city.capital.3">Cita</string>
<string name="type.place.city.capital.4">Cita</string>
<string name="type.place.city.capital.5">Cita</string>
<string name="type.place.city.capital.6">Cita</string>
<string name="type.place.city.capital.7">Cita</string>
<string name="type.place.city.capital.8">Cita</string>
<string name="type.place.city.capital.9">Cita</string>
<string name="type.place.continent">Brastir</string>
<string name="type.place.country">Bro</string>
<string name="type.place.county">Konteth</string>
<string name="type.place.farm">Amethva</string>
<string name="type.place.hamlet">Gwigbian</string>
<string name="type.place.island">Enys</string>
<string name="type.place.islet">Enesik</string>
<string name="type.place.isolated_dwelling">Tre Enyshes</string>
<string name="type.place.locality">Tyller</string>
<string name="type.place.quarter">Kwarter</string>
<string name="type.place.neighbourhood">Kentreveth</string>
<string name="type.place.ocean">Keynvor</string>
<string name="type.place.region">Pow</string>
<string name="type.place.sea">Mor</string>
<string name="type.place.square">Plen</string>
<string name="type.place.state">Gwlas</string>
<string name="type.place.state.USA">Gwlas Amerikanek</string>
<string name="type.place.suburb">Mestrev</string>
<string name="type.place.town">Tre</string>
<string name="type.place.village">Gwig</string>
<string name="type.power">Tredan</string>
<string name="type.power.generator">Dinythell Dredan</string>
<string name="type.power.generator.solar">Dinythell an Howl</string>
<string name="type.power.generator.wind">Dinythell an Awel</string>
<string name="type.power.line">Linen Tredanek</string>
<string name="type.power.line.underground">Linen Tredanek yn-dann Dhor</string>
<string name="type.power.minor_line">Linen Tredanek Le</string>
<string name="type.power.plant">Dinythva Dredan</string>
<string name="type.power.plant.coal">Tredanva Glow</string>
<string name="type.power.plant.gas">Tredanva Gass</string>
<string name="type.power.plant.hydro">Tredanva Dowr</string>
<string name="type.power.plant.solar">Tredanva an Howl</string>
<string name="type.power.plant.wind">Tredanva an Awel</string>
<string name="type.power.tower">Tour Tredanek</string>
<string name="type.power.pole">Gwelen Tredanek</string>
<string name="type.man_made.utility_pole">Gwelen Les</string>
<string name="type.public_transport">Karyans Poblek</string>
<string name="type.public_transport.platform">Kay</string>
<string name="type.railway">Hyns Horn</string>
<string name="type.railway.abandoned">Hyns Horn Gesys</string>
<string name="type.railway.abandoned.bridge">Pons Hyns Horn Gesys</string>
<string name="type.railway.abandoned.tunnel">Kowfordh Hyns Horn Gesys</string>
<string name="type.railway.construction">Hyns Horn Drehevyans</string>
<string name="type.railway.crossing">Treusva Hyns Horn</string>
<string name="type.railway.disused">Hyns Horn Undevnydhys</string>
<string name="type.railway.halt">Savla Tren</string>
<string name="type.railway.level_crossing">Treusva Hyns Horn</string>
<string name="type.railway.light_rail">Hyns Horn Byghan</string>
<string name="type.railway.light_rail.bridge">Pons Hyns Horn Byghan</string>
<string name="type.railway.light_rail.tunnel">Kowfordh Hyns Horn Byghan</string>
<string name="type.railway.monorail">Tren Ungledhren</string>
<string name="type.railway.monorail.bridge">Pons Tren Ungledhren</string>
<string name="type.railway.monorail.tunnel">Kowfordh Tren Ungledhren</string>
<string name="type.railway.platform">Kay</string>
<string name="type.railway.rail">Hyns Horn</string>
<string name="type.railway.rail.highspeed">Hyns Horn Tooth</string>
<string name="type.railway.rail.tourism">Hyns Horn Tourystek</string>
<string name="type.railway.rail.main">Hyns Horn</string>
<string name="type.railway.rail.branch">Hyns Horn Skorr</string>
<string name="type.railway.rail.utility">Hyns Horn Gonis</string>
<string name="type.railway.rail.bridge">Pons Hyns Horn</string>
<string name="type.railway.rail.highspeed.bridge">Pons Hyns Horn Tooth</string>
<string name="type.railway.rail.tourism.bridge">Pons Hyns Horn Tourystek</string>
<string name="type.railway.rail.main.bridge">Pons Hyns Horn</string>
<string name="type.railway.rail.branch.bridge">Pons Hyns Horn Skorr</string>
<string name="type.railway.rail.tunnel">Kowfordh Hyns Horn</string>
<string name="type.railway.rail.highspeed.tunnel">Kowfordh Hyns Horn Tooth</string>
<string name="type.railway.rail.tourism.tunnel">Kowfordh Hyns Horn Tourystek</string>
<string name="type.railway.rail.main.tunnel">Kowfordh Hyns Horn</string>
<string name="type.railway.rail.branch.tunnel">Kowfordh Hyns Horn Skorr</string>
<string name="type.railway.station">Gorsav</string>
<string name="type.railway.station.light_rail">Gorsav</string>
<string name="type.railway.station.light_rail.berlin">Gorsav S-Bahn</string>
<string name="type.railway.station.light_rail.london">Gorsav DLR</string>
<string name="type.railway.station.light_rail.porto">Gorsav Metro Porto</string>
<string name="type.railway.station.monorail">Gorsav Tren Ungledhren</string>
<string name="type.railway.station.subway">Gorsav Metro</string>
<string name="type.railway.station.subway.adana">Gorsav Metro</string>
<string name="type.railway.station.subway.algiers">Gorsav Metro</string>
<string name="type.railway.station.subway.almaty">Gorsav Metro</string>
<string name="type.railway.station.subway.amsterdam">Gorsav Metro</string>
<string name="type.railway.station.subway.ankara">Gorsav Metro</string>
<string name="type.railway.station.subway.athens">Gorsav Metro</string>
<string name="type.railway.station.subway.baku">Gorsav Metro</string>
<string name="type.railway.station.subway.bangkok">Gorsav Metro</string>
<string name="type.railway.station.subway.barcelona">Gorsav Metro</string>
<string name="type.railway.station.subway.beijing">Gorsav Metro</string>
<string name="type.railway.station.subway.bengalore">Gorsav Metro</string>
<string name="type.railway.station.subway.berlin">Gorsav Metro</string>
<string name="type.railway.station.subway.bilbao">Gorsav Metro</string>
<string name="type.railway.station.subway.brasilia">Gorsav Metro</string>
<string name="type.railway.station.subway.brescia">Gorsav Metro</string>
<string name="type.railway.station.subway.brussels">Gorsav Metro</string>
<string name="type.railway.station.subway.bucharest">Gorsav Metro</string>
<string name="type.railway.station.subway.budapest">Gorsav Metro</string>
<string name="type.railway.station.subway.buenos_aires">Gorsav Metro</string>
<string name="type.railway.station.subway.bursa">Gorsav Metro</string>
<string name="type.railway.station.subway.cairo">Gorsav Metro</string>
<string name="type.railway.station.subway.caracas">Gorsav Metro</string>
<string name="type.railway.station.subway.catania">Gorsav Metro</string>
<string name="type.railway.station.subway.changchun">Gorsav Metro</string>
<string name="type.railway.station.subway.chengdu">Gorsav Metro</string>
<string name="type.railway.station.subway.chicago">Gorsav Metro</string>
<string name="type.railway.station.subway.chongqing">Gorsav Metro</string>
<string name="type.railway.station.subway.dalian">Gorsav Metro</string>
<string name="type.railway.station.subway.delhi">Gorsav Metro</string>
<string name="type.railway.station.subway.dnepro">Gorsav Metro</string>
<string name="type.railway.station.subway.dubai">Gorsav Metro</string>
<string name="type.railway.station.subway.ekb">Gorsav Metro</string>
<string name="type.railway.station.subway.fukuoka">Gorsav Metro</string>
<string name="type.railway.station.subway.glasgow">Gorsav Metro</string>
<string name="type.railway.station.subway.guangzhou">Gorsav Metro</string>
<string name="type.railway.station.subway.hamburg">Gorsav Metro</string>
<string name="type.railway.station.subway.helsinki">Gorsav Metro</string>
<string name="type.railway.station.subway.hiroshima">Gorsav Metro</string>
<string name="type.railway.station.subway.hongkong">Gorsav Metro</string>
<string name="type.railway.station.subway.isfahan">Gorsav Metro</string>
<string name="type.railway.station.subway.istanbul">Gorsav Metro</string>
<string name="type.railway.station.subway.izmir">Gorsav Metro</string>
<string name="type.railway.station.subway.kazan">Gorsav Metro</string>
<string name="type.railway.station.subway.kharkiv">Gorsav Metro</string>
<string name="type.railway.station.subway.kiev">Gorsav Metro</string>
<string name="type.railway.station.subway.kobe">Gorsav Metro</string>
<string name="type.railway.station.subway.kolkata">Gorsav Metro</string>
<string name="type.railway.station.subway.kunming">Gorsav Metro</string>
<string name="type.railway.station.subway.kyoto">Gorsav Metro</string>
<string name="type.railway.station.subway.la">Gorsav Metro</string>
<string name="type.railway.station.subway.lausanne">Gorsav Metro</string>
<string name="type.railway.station.subway.lille">Gorsav Metro</string>
<string name="type.railway.station.subway.lima">Gorsav Metro</string>
<string name="type.railway.station.subway.lisboa">Gorsav Metro</string>
<string name="type.railway.station.subway.london">Gorsav Tube</string>
<string name="type.railway.station.subway.lyon">Gorsav Metro</string>
<string name="type.railway.station.subway.madrid">Gorsav Metro</string>
<string name="type.railway.station.subway.malaga">Gorsav Metro</string>
<string name="type.railway.station.subway.manila">Gorsav Metro</string>
<string name="type.railway.station.subway.maracaibo">Gorsav Metro</string>
<string name="type.railway.station.subway.mashhad">Gorsav Metro</string>
<string name="type.railway.station.subway.mecca">Gorsav Metro</string>
<string name="type.railway.station.subway.medellin">Gorsav Metro</string>
<string name="type.railway.station.subway.mexico">Gorsav Metro</string>
<string name="type.railway.station.subway.milan">Gorsav Metro</string>
<string name="type.railway.station.subway.minsk">Gorsav Metro</string>
<string name="type.railway.station.subway.montreal">Gorsav Metro</string>
<string name="type.railway.station.subway.moscow">Gorsav Metro</string>
<string name="type.railway.station.subway.munchen">Gorsav Metro</string>
<string name="type.railway.station.subway.nagoya">Gorsav Metro</string>
<string name="type.railway.station.subway.newyork">Gorsav Metro</string>
<string name="type.railway.station.subway.nnov">Gorsav Metro</string>
<string name="type.railway.station.subway.novosibirsk">Gorsav Metro</string>
<string name="type.railway.station.subway.osaka">Gorsav Metro</string>
<string name="type.railway.station.subway.oslo">Gorsav Metro</string>
<string name="type.railway.station.subway.palma">Gorsav Metro</string>
<string name="type.railway.station.subway.panama">Gorsav Metro</string>
<string name="type.railway.station.subway.paris">Gorsav Metro</string>
<string name="type.railway.station.subway.philadelphia">Gorsav Metro</string>
<string name="type.railway.station.subway.pyongyang">Gorsav Metro</string>
<string name="type.railway.station.subway.qingdao">Gorsav Metro</string>
<string name="type.railway.station.subway.rennes">Gorsav Metro</string>
<string name="type.railway.station.subway.rio">Gorsav Metro</string>
<string name="type.railway.station.subway.roma">Gorsav Metro</string>
<string name="type.railway.station.subway.rotterdam">Gorsav Metro</string>
<string name="type.railway.station.subway.samara">Gorsav Metro</string>
<string name="type.railway.station.subway.santiago">Gorsav Metro</string>
<string name="type.railway.station.subway.santo_domingo">Gorsav Metro</string>
<string name="type.railway.station.subway.saopaulo">Gorsav Metro</string>
<string name="type.railway.station.subway.sapporo">Gorsav Metro</string>
<string name="type.railway.station.subway.sendai">Gorsav Metro</string>
<string name="type.railway.station.subway.sf">Gorsav Metro</string>
<string name="type.railway.station.subway.shanghai">Gorsav Metro</string>
<string name="type.railway.station.subway.shenzhen">Gorsav Metro</string>
<string name="type.railway.station.subway.shiraz">Gorsav Metro</string>
<string name="type.railway.station.subway.singapore">Gorsav Metro</string>
<string name="type.railway.station.subway.sofia">Gorsav Metro</string>
<string name="type.railway.station.subway.spb">Gorsav Metro</string>
<string name="type.railway.station.subway.stockholm">Gorsav Metro</string>
<string name="type.railway.station.subway.tabriz">Gorsav Metro</string>
<string name="type.railway.station.subway.taipei">Gorsav Metro</string>
<string name="type.railway.station.subway.taoyuan">Gorsav Metro</string>
<string name="type.railway.station.subway.tashkent">Gorsav Metro</string>
<string name="type.railway.station.subway.tbilisi">Gorsav Metro</string>
<string name="type.railway.station.subway.tehran">Gorsav Metro</string>
<string name="type.railway.station.subway.tianjin">Gorsav Metro</string>
<string name="type.railway.station.subway.tokyo">Gorsav Metro</string>
<string name="type.railway.station.subway.valencia">Gorsav Metro</string>
<string name="type.railway.station.subway.vienna">Gorsav Metro</string>
<string name="type.railway.station.subway.warszawa">Gorsav Metro</string>
<string name="type.railway.station.subway.washington">Gorsav Metro</string>
<string name="type.railway.station.subway.wuhan">Gorsav Metro</string>
<string name="type.railway.station.subway.yerevan">Gorsav Metro</string>
<string name="type.railway.station.subway.yokohama">Gorsav Metro</string>
<string name="type.railway.subway">Gorsav Metro</string>
<string name="type.railway.subway_entrance">Entrans Metro</string>
<string name="type.railway.subway_entrance.adana">Entrans Metro</string>
<string name="type.railway.subway_entrance.algiers">Entrans Metro</string>
<string name="type.railway.subway_entrance.almaty">Entrans Metro</string>
<string name="type.railway.subway_entrance.amsterdam">Entrans Metro</string>
<string name="type.railway.subway_entrance.ankara">Entrans Metro</string>
<string name="type.railway.subway_entrance.athens">Entrans Metro</string>
<string name="type.railway.subway_entrance.baku">Entrans Metro</string>
<string name="type.railway.subway_entrance.bangkok">Entrans Metro</string>
<string name="type.railway.subway_entrance.barcelona">Entrans Metro</string>
<string name="type.railway.subway_entrance.beijing">Entrans Metro</string>
<string name="type.railway.subway_entrance.bengalore">Entrans Metro</string>
<string name="type.railway.subway_entrance.berlin">Entrans Metro</string>
<string name="type.railway.subway_entrance.bilbao">Entrans Metro</string>
<string name="type.railway.subway_entrance.brasilia">Entrans Metro</string>
<string name="type.railway.subway_entrance.brescia">Entrans Metro</string>
<string name="type.railway.subway_entrance.brussels">Entrans Metro</string>
<string name="type.railway.subway_entrance.bucharest">Entrans Metro</string>
<string name="type.railway.subway_entrance.budapest">Entrans Metro</string>
<string name="type.railway.subway_entrance.buenos_aires">Entrans Metro</string>
<string name="type.railway.subway_entrance.bursa">Entrans Metro</string>
<string name="type.railway.subway_entrance.cairo">Entrans Metro</string>
<string name="type.railway.subway_entrance.caracas">Entrans Metro</string>
<string name="type.railway.subway_entrance.catania">Entrans Metro</string>
<string name="type.railway.subway_entrance.changchun">Entrans Metro</string>
<string name="type.railway.subway_entrance.chengdu">Entrans Metro</string>
<string name="type.railway.subway_entrance.chicago">Entrans Metro</string>
<string name="type.railway.subway_entrance.chongqing">Entrans Metro</string>
<string name="type.railway.subway_entrance.dalian">Entrans Metro</string>
<string name="type.railway.subway_entrance.delhi">Entrans Metro</string>
<string name="type.railway.subway_entrance.dnepro">Entrans Metro</string>
<string name="type.railway.subway_entrance.dubai">Entrans Metro</string>
<string name="type.railway.subway_entrance.ekb">Entrans Metro</string>
<string name="type.railway.subway_entrance.fukuoka">Entrans Metro</string>
<string name="type.railway.subway_entrance.glasgow">Entrans Metro</string>
<string name="type.railway.subway_entrance.guangzhou">Entrans Metro</string>
<string name="type.railway.subway_entrance.hamburg">Entrans Metro</string>
<string name="type.railway.subway_entrance.helsinki">Entrans Metro</string>
<string name="type.railway.subway_entrance.hiroshima">Entrans Metro</string>
</resources>

View File

@@ -352,4 +352,21 @@
<string name="type.cuisine.argentinian">Argentinska kuhinja</string>
<string name="type.cuisine.asian">Azijska kuhinja</string>
<string name="type.cuisine.austrian">Avstrijska kuhinja</string>
<string name="type.cuisine.chinese">Kitajska kuhinja</string>
<string name="type.cuisine.crepe">Krep</string>
<string name="type.cuisine.donut">Donat</string>
<string name="type.cuisine.fish">Ribe</string>
<string name="type.cuisine.fish_and_chips">Riba s krompirčkom</string>
<string name="type.cuisine.french">Francoska kuhinja</string>
<string name="type.cuisine.grill">Žar</string>
<string name="type.cuisine.hotdog">Hot dog</string>
<string name="type.craft.electronics_repair">Popravilo elektronike</string>
<string name="type.craft.gardener">Vrtnar</string>
<string name="type.craft.hvac">Ogrevanje, prezračevanje, klimatizacija</string>
<string name="type.craft.key_cutter">Ključavničar</string>
<string name="type.shop.camera">Trgovina s fotoaparati</string>
<string name="type.craft.plumber">Vodovodar</string>
<string name="type.cuisine.breakfast">Zajtrk</string>
<string name="type.cuisine.bubble_tea">Čaj s tapiokinimi kroglicami (\'Bubble Tea\')</string>
<string name="type.cuisine.chicken">Piščanec</string>
</resources>

View File

@@ -379,6 +379,7 @@
<string name="type.emergency.life_ring">Lifebuoy</string>
<string name="type.emergency.defibrillator">Defibrillator</string>
<string name="type.emergency.fire_hydrant">Fire Hydrant</string>
<string name="type.amenity.hydrant">Irrigation Hydrant</string>
<string name="type.emergency.phone">Emergency Phone</string>
<!-- A place where a lifeguard is on duty. -->
<string name="type.emergency.lifeguard">Lifeguard</string>

View File

@@ -116,6 +116,9 @@ fi
echo "Generating search categories / synonyms..."
./tools/unix/generate_categories.sh
echo "Generating Desktop UI strings..."
./tools/unix/generate_desktop_ui_strings.sh
if [ -z "$SKIP_GENERATE_SYMBOLS" ]; then
if Diff data/symbols_hash data/styles/*/*/symbols/* || [ ! -z "$SYMBOLS_NOT_GENERATED" ]; then
echo "Generating symbols..."

View File

@@ -186,7 +186,7 @@
"place-state": "Щат|провинция",
"place-region": "Район|Регион",
"place-island|place-islet": "Остров",
"place-suburb|place-quarter|place-neighbourhood|landuse-residential": "Район|микрорайон|окръг|квартал|Предградие",
"place-suburb|place-quarter|place-neighbourhood|landuse-residential": "Район|микрорайон|окръг|квартал|Предградие|Жилищен комплекс|ж.к.|ЖК",
"place-hamlet": "Село",
"place-village": "Село",
"place-locality": "местност|регион|Място",

View File

@@ -384,7 +384,7 @@
"shop-outpost": "4Pickup Point|4Parcel Pickup",
"amenity-vending_machine-fuel|@category_fuel": "Fuel Dispenser|Gas Pump",
"building-garage": "Garage",
"highway-rest_area|highway-services": "4Rest area|4Service area|station",
"highway-rest_area|highway-services": "4Rest area|4Service area|station|rest stop",
"man_made-chimney": "Chimney",
"man_made-crane": "Crane",
"man_made-tower|man_made-flare": "Tower",
@@ -435,7 +435,8 @@
"emergency-assembly_point": "5Emergency assembly point",
"emergency-life_ring": "5Lifebuoy|6Life Ring|life-ring|lifering|flotation device|floatation device",
"emergency-defibrillator": "4Defibrillator|AED",
"emergency-fire_hydrant": "4Fire Hydrant|Fire Plug",
"emergency-fire_hydrant": "4Fire Hydrant|Fire Plug|Hydrant",
"amenity-hydrant": "Irrigation Hydrant|Water Hydrant|Cleaning Hydrant|Hydrant",
"emergency-lifeguard": "Lifeguard|Lifesaver",
"emergency-mountain_rescue": "Mountain Rescue Station|Search and Rescue|rescue",
"leisure-fitness_station": "3Fitness Station|street workout|fitness|workout|4Exercise station|Exercise bench|outdoor gym|5Calisthenics park|trim trail",

View File

@@ -405,7 +405,8 @@
"amenity-shower": "3Ducha|duchas|4Regadera|regaderas",
"emergency-assembly_point": "Punto de reunión de emergencia|reunión de emergencia|emergencia",
"emergency-defibrillator": "4Desfibrilador|defibrilador|socorro|primeros auxilios|auxilio|electroshock|schock|reanimar|reanimación|paro cardíaco|infarto|emergencia",
"emergency-fire_hydrant": "Boca de incendio|Hidrante",
"emergency-fire_hydrant": "Boca de incendio|Boca de incendios|Hidrante|Hidrante de incendio|Hidrante de incendios|Hidrante contra incendios|Hidrante de fuego",
"amenity-hydrant": "Boca de riego|Hidrante de riego|Hidrante de agua|Hidrante técnico|Hidrante de limpieza|Hidrante",
"emergency-lifeguard": "Socorrista|Salvavidas",
"emergency-mountain_rescue": "Puesto de rescate de montaña|Búsqueda y rescate|Rescate|rescatista|rescatistas",
"leisure-fitness_station": "Aparatos de gimnasia|Aparatos de ejercicio|Estación de ejercicios|Gimnasio exterior|Calistenia|Ejercicio",

View File

@@ -399,7 +399,8 @@
"amenity-shower": "Douche",
"emergency-assembly_point": "Point de rassemblement d'urgence",
"emergency-defibrillator": "4Défibrillateur|DAE",
"emergency-fire_hydrant": "Bouche dincendie|borne d'incendie",
"emergency-fire_hydrant": "Bouche dincendie|bouche de incendie|borne dincendie|borne de incendie|Borne hydratante|Poteau dincendie|Hydrant|Hydrante",
"amenity-hydrant": "Bouche dpuisage|bouche de puisage|borne dpuisage|bourne de puisage|Hydrant|Hydrante",
"emergency-lifeguard": "Sauveteur durgence|Sauveteur",
"emergency-mountain_rescue": "Sauveteurs en montagne durgence",
"leisure-fitness_station": "Station de fitness|Parcours de santé",

View File

@@ -199,7 +199,7 @@
"place-state": "Штат|провинция",
"place-region": "Район",
"place-island|place-islet": "Остров",
"place-suburb|place-quarter|place-neighbourhood|landuse-residential": "Район|микрорайон|квартал|Жилая зона",
"place-suburb|place-quarter|place-neighbourhood|landuse-residential": "Район|микрорайон|квартал|Жилая зона|Жилой комплекс|ж.к.|ЖК",
"place-hamlet": "Посёлок|деревня",
"place-village": "Деревня|поселок",
"place-locality": "Местность|регион",

View File

@@ -196,7 +196,7 @@
"place-state": "Штат|провінція|регіон",
"place-region": "Район|область",
"place-island|place-islet": "Острів",
"place-suburb|place-quarter|place-neighbourhood|landuse-residential": "Район|мікрорайон|квартал|округа|Сусідство",
"place-suburb|place-quarter|place-neighbourhood|landuse-residential": "Район|мікрорайон|квартал|округа|Сусідство|Житловий комплекс|ж.к.|ЖК",
"place-hamlet": "Поселення|селище|село",
"place-village": "Село|хутір|поселення",
"place-locality": "Місцевість|регіон|Місце",

View File

@@ -148,11 +148,11 @@
<ul class="license-list">
<li><a href="https://agg.sourceforge.net/antigrain.com/index.html">Anti-Grain Geometry</a><br>&copy; 2002&ndash;2005 Maxim Shemanarev; <a href="#agg-license" class="license">License</a></li>
<li><a href="https://www.boost.org">Boost</a>; <a href="#boost-license" class="license">Boost License</a></li>
<li><a href="https://www.boost.org/">Boost</a>; <a href="#boost-license" class="license">Boost License</a></li>
<li><a href="https://www.daemonology.net/bsdiff">bsdiff</a>; <a href="#bsd3-license" class="license">BSD License</a></li>
<li><a href="https://www.daemonology.net/bsdiff/">bsdiff</a>; <a href="#bsd3-license" class="license">BSD License</a></li>
<li><a href="https://chromium.googlesource.com/chromium/src/courgette">Chromium's Courgette</a>;
<li><a href="https://chromium.googlesource.com/chromium/src/courgette/">Chromium's Courgette</a>;
<a href="#bsd3-license" class="license">BSD License</a></li>
<li><a href="https://github.com/dpogue/CMake-MetalShaderSupport">CMake Metal support files</a><br>
@@ -170,22 +170,22 @@
<li><a href="https://www.freetype.org">FreeType</a><br>
&copy; 2013 The FreeType Project; <a href="#freetype-license" class="license">FTL</a></li>
<li><a href="https://stephenberry.github.io/glaze">glaze</a><br>
<li><a href="https://stephenberry.github.io/glaze/">glaze</a><br>
&copy; 2019 - present, Stephen Berry; <a href="#mit-license" class="license">MIT License</a></li>
<li><a href="https://www.glfw.org">GLFW</a><br>
<li><a href="https://www.glfw.org/">GLFW</a><br>
&copy; 2002-2006 Marcus Geelnard;2006-2019 Camilla Löwy; <a href="#zlib-license" class="license">Zlib License</a></li>
<li><a href="https://www.g-truc.net/project-0016.html">GLM</a><br>
&copy; 2005&ndash;2014 G-Truc Creation; <a href="#mit-license" class="license">MIT License</a></li>
<li><a href="https://site.icu-project.org">ICU</a><br>
<li><a href="https://site.icu-project.org/">ICU</a><br>
&copy; 1995&ndash;2016 IBM Corporation and others; <a href="#icu-license" class="license">ICU License</a></li>
<li><a href="https://www.digip.org/jansson">Jansson</a><br>
<li><a href="https://www.digip.org/jansson/">Jansson</a><br>
&copy; 2009-2013 Petri Lehtinen; <a href="#mit-license" class="license">MIT License</a></li>
<li><a href="https://libkdtree.alioth.debian.org">libkdtree++</a><br>
<li><a href="https://libkdtree.alioth.debian.org/">libkdtree++</a><br>
&copy; 2004-2007 Martin F. Krafft, parts are &copy; 2004-2008 Paul Harris and &copy; 2007-2008 Sylvain Bougerel; <a href="#artistic-license" class="license">Artistic License</a></li>
<li><a href="https://github.com/mapsme/omim">MAPS.ME</a><br>
@@ -215,7 +215,7 @@
<li><a href="https://github.com/googlesamples/android-vulkan-tutorials">Vulkan Wrapper</a><br>
&copy; 2016 Google Inc.; <a href="#apache2-license" class="license">Apache License</a></li>
<li class="android"><a href="https://cocosw.com/BottomSheet">BottomSheet</a><br>
<li class="android"><a href="https://cocosw.com/BottomSheet/">BottomSheet</a><br>
&copy; 2011, 2015 Kai Liao; <a href="#apache2-license" class="license">Apache License</a></li>
<li><a href="https://github.com/google/open-location-code">Open Location Code</a><br>
@@ -226,9 +226,6 @@
<li><a href="https://github.com/skarupke/flat_hash_map">Skarupke Hash Tables</a><br>
&copy; Malte Skarupke 2017; <a href="#boost-license" class="license">Boost License</a></li>
<li><a href="https://github.com/martinus/unordered_dense"></a><br>
&copy; 2022 Martin Leitner-Ankerl; <a href="#mit-license" class="license">MIT License</a></li>
</ul>
<p lang="en">Beyond OpenStreetMap, we also use a few other open data sources to improve our map data:</p>

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