From b2a6dd2717b4cda2d008f06afd4f39594a9e8c5b Mon Sep 17 00:00:00 2001 From: Roman Tsisyk Date: Sat, 10 Aug 2024 11:32:47 +0100 Subject: [PATCH 01/38] [android] Fix the crosshair (PICK_POINT) API It appears that the new streamlined logic introduced in c90c6bb "Fix SecurityException when importing bookmarks" is not consistently reliable across all scenarios, as reported in #8350. Steps to reproduce: 1. Remove all versions of Organic Maps from the device except one. The #8350 issue doesn't reproduce without this step. 2. Run PickPoint example from organicmaps/api-android repository. 3. The API call will always return RESULT_CANCELED. Installing one more version of Organic Maps (Debug, Beta, Web, etc.) alongside the existing version fixes the API to return RESULT_OK. Debugging shows that FLAG_ACTIVITY_FORWARD_RESULT is not getting set in this scenario. Revert partially c90c6bb "Fix SecurityException ..." to restore ActivityResultLauncher chain and re-add EXTRA_PICK_POINT, but keep the idea of forwarding of the original intent. Fixes #8350 Signed-off-by: Roman Tsisyk --- .../DownloadResourcesLegacyActivity.java | 20 +++++++++++++++++++ .../java/app/organicmaps/SplashActivity.java | 17 ++++++++++++++++ .../main/java/app/organicmaps/api/Const.java | 3 +++ .../java/app/organicmaps/intent/Factory.java | 5 ++++- 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java b/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java index 65d76a153d..176872413f 100644 --- a/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java +++ b/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java @@ -12,6 +12,8 @@ import android.widget.Button; import android.widget.CheckBox; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.CallSuper; import androidx.annotation.Keep; import androidx.annotation.NonNull; @@ -22,6 +24,7 @@ import androidx.annotation.StyleRes; import app.organicmaps.base.BaseMwmFragmentActivity; import app.organicmaps.downloader.CountryItem; import app.organicmaps.downloader.MapManager; +import app.organicmaps.intent.Factory; import app.organicmaps.location.LocationHelper; import app.organicmaps.location.LocationListener; import app.organicmaps.util.Config; @@ -59,6 +62,9 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity @Nullable private Dialog mAlertDialog; + @NonNull + private ActivityResultLauncher mApiRequest; + private boolean mAreResourcesDownloaded; private static final int DOWNLOAD = 0; @@ -187,6 +193,10 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity UiUtils.setLightStatusBar(this, true); setContentView(R.layout.activity_download_resources); initViewsAndListeners(); + mApiRequest = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + setResult(result.getResultCode(), result.getData()); + finish(); + }); if (prepareFilesDownload(false)) { @@ -205,6 +215,8 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity protected void onSafeDestroy() { super.onSafeDestroy(); + mApiRequest.unregister(); + mApiRequest = null; Utils.keepScreenOn(Config.isKeepScreenOnEnabled(), getWindow()); if (mCountryDownloadListenerSlot != 0) { @@ -347,6 +359,14 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity // Disable animation because MwmActivity should appear exactly over this one intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_CLEAR_TOP); + // See {@link SplashActivity.processNavigation()} + if (Factory.isStartedForApiResult(intent)) + { + // Wait for the result from MwmActivity for API callers. + mApiRequest.launch(intent); + return; + } + startActivity(intent); finish(); } diff --git a/android/app/src/main/java/app/organicmaps/SplashActivity.java b/android/app/src/main/java/app/organicmaps/SplashActivity.java index 0a11ab35ff..4480aa4d34 100644 --- a/android/app/src/main/java/app/organicmaps/SplashActivity.java +++ b/android/app/src/main/java/app/organicmaps/SplashActivity.java @@ -18,6 +18,7 @@ import androidx.annotation.StringRes; import androidx.appcompat.app.AppCompatActivity; import app.organicmaps.display.DisplayManager; +import app.organicmaps.intent.Factory; import app.organicmaps.location.LocationHelper; import app.organicmaps.util.Config; import app.organicmaps.util.LocationUtils; @@ -39,6 +40,9 @@ public class SplashActivity extends AppCompatActivity private boolean mCanceled = false; + @SuppressWarnings("NotNullFieldNotInitialized") + @NonNull + private ActivityResultLauncher mApiRequest; @SuppressWarnings("NotNullFieldNotInitialized") @NonNull private ActivityResultLauncher mPermissionRequest; @@ -66,6 +70,10 @@ public class SplashActivity extends AppCompatActivity setContentView(R.layout.activity_splash); mPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), result -> Config.setLocationRequested()); + mApiRequest = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + setResult(result.getResultCode(), result.getData()); + finish(); + }); mShareLauncher = SharingUtils.RegisterLauncher(this); if (DisplayManager.from(this).isCarDisplayUsed()) @@ -107,6 +115,8 @@ public class SplashActivity extends AppCompatActivity super.onDestroy(); mPermissionRequest.unregister(); mPermissionRequest = null; + mApiRequest.unregister(); + mApiRequest = null; } private void showFatalErrorDialog(@StringRes int titleId, @StringRes int messageId, Exception error) @@ -172,6 +182,13 @@ public class SplashActivity extends AppCompatActivity // https://github.com/organicmaps/organicmaps/pull/7287 intent.setFlags(intent.getFlags() & (Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_GRANT_READ_URI_PERMISSION)); + if (Factory.isStartedForApiResult(intent)) + { + // Wait for the result from MwmActivity for API callers. + mApiRequest.launch(intent); + return; + } + Config.setFirstStartDialogSeen(this); startActivity(intent); finish(); diff --git a/android/app/src/main/java/app/organicmaps/api/Const.java b/android/app/src/main/java/app/organicmaps/api/Const.java index 1b8c4ef84d..54cef106ff 100644 --- a/android/app/src/main/java/app/organicmaps/api/Const.java +++ b/android/app/src/main/java/app/organicmaps/api/Const.java @@ -9,6 +9,9 @@ public class Const public static final String EXTRA_PREFIX = AUTHORITY + ".extra"; public static final String ACTION_PREFIX = AUTHORITY + ".action"; + // Request extras + public static final String EXTRA_PICK_POINT = EXTRA_PREFIX + ".PICK_POINT"; + // Response extras public static final String EXTRA_POINT_NAME = EXTRA_PREFIX + ".POINT_NAME"; public static final String EXTRA_POINT_LAT = EXTRA_PREFIX + ".POINT_LAT"; diff --git a/android/app/src/main/java/app/organicmaps/intent/Factory.java b/android/app/src/main/java/app/organicmaps/intent/Factory.java index 6f89d64ae9..d648b453e8 100644 --- a/android/app/src/main/java/app/organicmaps/intent/Factory.java +++ b/android/app/src/main/java/app/organicmaps/intent/Factory.java @@ -28,11 +28,14 @@ import java.io.File; import java.util.Collections; import java.util.List; +import static app.organicmaps.api.Const.EXTRA_PICK_POINT; + public class Factory { public static boolean isStartedForApiResult(@NonNull Intent intent) { - return (intent.getFlags() & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0; + return ((intent.getFlags() & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0) + || intent.getBooleanExtra(EXTRA_PICK_POINT, false); } public static class KmzKmlProcessor implements IntentProcessor -- 2.45.3 From d555e629b188bef2e007db1befea2e7e2f7da42e Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Fri, 9 Aug 2024 17:56:01 +0200 Subject: [PATCH 02/38] [gpx] Correctly export modified bookmark name Signed-off-by: Alexander Borsuk --- kml/serdes_gpx.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/kml/serdes_gpx.cpp b/kml/serdes_gpx.cpp index 3a7226c817..38968beb91 100644 --- a/kml/serdes_gpx.cpp +++ b/kml/serdes_gpx.cpp @@ -412,8 +412,13 @@ void SaveBookmarkData(Writer & writer, BookmarkData const & bookmarkData) { auto const [lat, lon] = mercator::ToLatLon(bookmarkData.m_point); writer << "\n"; - if (auto const name = GetDefaultLanguage(bookmarkData.m_name)) - writer << kIndent2 << "" << name.value() << "\n"; + // If user customized the default bookmark name, it's saved in m_customName. + auto name = GetDefaultLanguage(bookmarkData.m_customName); + if (!name) + name = GetDefaultLanguage(bookmarkData.m_name); // Original POI name stored when bookmark was created. + if (name) + writer << kIndent2 << "" << *name << "\n"; + if (auto const description = GetDefaultLanguage(bookmarkData.m_description)) { writer << kIndent2 << ""; -- 2.45.3 From 3482016bb0a8e5a15fc0c68b2515a3650f631220 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Sun, 11 Aug 2024 16:20:48 +0200 Subject: [PATCH 03/38] Properly recreate the recent track storage file if it is corrupted/empty Signed-off-by: Alexander Borsuk --- map/gps_track_storage.cpp | 47 +++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/map/gps_track_storage.cpp b/map/gps_track_storage.cpp index cb897cef38..a4c7e5c769 100644 --- a/map/gps_track_storage.cpp +++ b/map/gps_track_storage.cpp @@ -88,15 +88,15 @@ inline size_t GetItemCount(size_t fileSize) inline bool WriteVersion(fstream & f, uint32_t version) { - static_assert(kHeaderSize == sizeof(version), ""); + static_assert(kHeaderSize == sizeof(version)); version = SwapIfBigEndianMacroBased(version); f.write(reinterpret_cast(&version), kHeaderSize); - return f.good(); + return f.good() && f.flush().good(); } inline bool ReadVersion(fstream & f, uint32_t & version) { - static_assert(kHeaderSize == sizeof(version), ""); + static_assert(kHeaderSize == sizeof(version)); f.read(reinterpret_cast(&version), kHeaderSize); version = SwapIfBigEndianMacroBased(version); return f.good(); @@ -111,6 +111,20 @@ GpsTrackStorage::GpsTrackStorage(string const & filePath, size_t maxItemCount) { ASSERT_GREATER(m_maxItemCount, 0, ()); + auto const createNewFile = [this] + { + m_stream.open(m_filePath, ios::in | ios::out | ios::binary | ios::trunc); + + if (!m_stream) + MYTHROW(OpenException, ("Open file error.", m_filePath)); + + if (!WriteVersion(m_stream, kCurrentVersion)) + MYTHROW(OpenException, ("Write version error.", m_filePath)); + + m_itemCount = 0; + }; + + // Open existing file m_stream.open(m_filePath, ios::in | ios::out | ios::binary); @@ -118,7 +132,12 @@ GpsTrackStorage::GpsTrackStorage(string const & filePath, size_t maxItemCount) { uint32_t version = 0; if (!ReadVersion(m_stream, version)) - MYTHROW(OpenException, ("Read version error.", m_filePath)); + { + LOG(LWARNING, ("Recreating", m_filePath, "because can't read version from it.")); + m_stream.close(); + createNewFile(); + version = kCurrentVersion; + } if (version == kCurrentVersion) { @@ -136,6 +155,8 @@ GpsTrackStorage::GpsTrackStorage(string const & filePath, size_t maxItemCount) m_stream.seekp(offset, ios::beg); if (!m_stream.good()) MYTHROW(OpenException, ("Seek to the offset error:", offset, m_filePath)); + + LOG(LINFO, ("Restored", m_itemCount, "points from gps track storage")); } else { @@ -146,18 +167,7 @@ GpsTrackStorage::GpsTrackStorage(string const & filePath, size_t maxItemCount) } if (!m_stream) - { - // Create new file - m_stream.open(m_filePath, ios::in | ios::out | ios::binary | ios::trunc); - - if (!m_stream) - MYTHROW(OpenException, ("Open file error.", m_filePath)); - - if (!WriteVersion(m_stream, kCurrentVersion)) - MYTHROW(OpenException, ("Write version error.", m_filePath)); - - m_itemCount = 0; - } + createNewFile(); } void GpsTrackStorage::Append(vector const & items) @@ -307,13 +317,12 @@ void GpsTrackStorage::TruncFile() m_stream.open(m_filePath, ios::in | ios::out | ios::binary | ios::ate); if (!m_stream) - MYTHROW(WriteException, ("File:", m_filePath)); + MYTHROW(OpenException, ("File:", m_filePath)); m_itemCount = newItemCount; // Write position must be after last item position (end of file) - ASSERT_EQUAL(m_stream.tellp(), static_cast( - GetItemOffset(m_itemCount)), ()); + ASSERT_EQUAL(m_stream.tellp(), static_cast(GetItemOffset(m_itemCount)), ()); } size_t GpsTrackStorage::GetFirstItemIndex() const -- 2.45.3 From b771762dcd149365b14b6dfb90395529be94a031 Mon Sep 17 00:00:00 2001 From: Sergiy Kozyr Date: Mon, 12 Aug 2024 10:15:33 +0300 Subject: [PATCH 04/38] Add support for KMB files generated with latest MapsMe app Signed-off-by: Sergiy Kozyr --- kml/serdes_binary.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kml/serdes_binary.hpp b/kml/serdes_binary.hpp index a33101bcfd..eda2a105a4 100644 --- a/kml/serdes_binary.hpp +++ b/kml/serdes_binary.hpp @@ -251,7 +251,7 @@ private: NonOwningReaderSource source(reader); m_header.Deserialize(source); - if (m_header.m_version == Version::V8) + if (m_header.m_version == Version::V8 || m_header.m_version == Version::V9) { // Check if file has Opensource V8 or MapsMe V8. // Actual V8 format has 6 offset (uint64_t) in header. While V8MM has 5 offsets. -- 2.45.3 From eb7c7ccc794ee44c99ca7abf89313a39f20831d8 Mon Sep 17 00:00:00 2001 From: Arushi Garg <123496275+ArushiGarg09@users.noreply.github.com> Date: Mon, 12 Aug 2024 18:21:48 +0530 Subject: [PATCH 05/38] Update brands_strings added hindi translations.txt Signed-off-by: Arushi Garg <123496275+ArushiGarg09@users.noreply.github.com> --- data/strings/brands_strings.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/data/strings/brands_strings.txt b/data/strings/brands_strings.txt index 614cecf466..65ba0e4421 100644 --- a/data/strings/brands_strings.txt +++ b/data/strings/brands_strings.txt @@ -85,6 +85,7 @@ [brand.chilis] en = Chili's + [brand.chipotle] en = Chipotle @@ -147,6 +148,7 @@ en = Domino's Pizza ar = دومينوز بيتزا he = דומינוס פיצה + hi = डॉमिनोज पिज्जा ja = ドミノ・ピザ ko = 도미노피자 ru = Домино'с Пицца @@ -164,6 +166,7 @@ [brand.dunkin_donuts] en = Dunkin Donuts ar = دنكن دونتس + hi = डुंकिन डोनट्स ru = Данкин Донатс [brand.espresso_house] @@ -285,6 +288,7 @@ en = KFC ar = دجاج كنتاكي fr = PFC + hi = केएफसी ja = ケンタッキーフライドチキン th = เค เอฟ ซ zh-Hans = 肯德基 @@ -358,7 +362,7 @@ ar = ماكدونالدز bg = Макдоналдс he = מקדונלד'ס - hi = ट्रेडमार्क + hi = मैकडॉनल्ड ja = マクドナルド ka = მაკდონალდსი ko = 디몰 맥도날드 @@ -501,6 +505,7 @@ [brand.starbucks] en = Starbucks ar = ستاربكس + hi = स्टारबक्स ja = スターバックス ko = 스타벅스 ru = Старбакс @@ -548,6 +553,7 @@ [brand.taco_bell] en = Taco Bell + hi = टाको बेल [brand.telepizza] en = Telepizza @@ -569,6 +575,7 @@ [brand.tim_hortons] en = Tim Hortons + hi = टिम होर्टन [brand.tonden] en = Tonden -- 2.45.3 From 1026e796eff818cd24af7ec081c828f207093907 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk <170263+biodranik@users.noreply.github.com> Date: Tue, 13 Aug 2024 09:48:09 +0200 Subject: [PATCH 06/38] Avoid unnecessary Locale copying in ToStringPrecisionLocale (#8896) * Avoid unnecessary copy in ToStringPrecisionLocale And a bit faster code in two other places Signed-off-by: Alexander Borsuk * fix Signed-off-by: Alexander Borsuk * Minor formatting Signed-off-by: Alexander Borsuk * Better formatting for distance tests Signed-off-by: Alexander Borsuk * Workaround for failing distance tests Signed-off-by: Alexander Borsuk * Fixed failing tests and improved formatting Signed-off-by: Alexander Borsuk * Review fixes Signed-off-by: Alexander Borsuk --------- Signed-off-by: Alexander Borsuk --- map/routing_mark.cpp | 40 ++- platform/distance.cpp | 8 +- platform/localization.cpp | 27 +- platform/localization.hpp | 13 +- platform/measurement_utils.cpp | 91 +++-- platform/measurement_utils.hpp | 4 +- platform/platform_tests/distance_tests.cpp | 370 +++++++++++---------- 7 files changed, 278 insertions(+), 275 deletions(-) diff --git a/map/routing_mark.cpp b/map/routing_mark.cpp index 01b651645f..9c4b00d1b8 100644 --- a/map/routing_mark.cpp +++ b/map/routing_mark.cpp @@ -630,10 +630,11 @@ uint16_t RoadWarningMark::GetPriority() const { switch (m_type) { - case RoadWarningMarkType::Toll: return static_cast(Priority::RoadWarningFirstToll); - case RoadWarningMarkType::Ferry: return static_cast(Priority::RoadWarningFirstFerry); - case RoadWarningMarkType::Dirty: return static_cast(Priority::RoadWarningFirstDirty); - case RoadWarningMarkType::Count: CHECK(false, ()); break; + using enum RoadWarningMarkType; + case Toll: return static_cast(Priority::RoadWarningFirstToll); + case Ferry: return static_cast(Priority::RoadWarningFirstFerry); + case Dirty: return static_cast(Priority::RoadWarningFirstDirty); + case Count: CHECK(false, ()); break; } } return static_cast(Priority::RoadWarning); @@ -665,16 +666,17 @@ void RoadWarningMark::SetDistance(std::string const & distance) drape_ptr RoadWarningMark::GetSymbolNames() const { - std::string symbolName; + std::string_view symbolName; switch (m_type) { - case RoadWarningMarkType::Toll: symbolName = "paid_road"; break; - case RoadWarningMarkType::Ferry: symbolName = "ferry"; break; - case RoadWarningMarkType::Dirty: symbolName = "unpaved_road"; break; - case RoadWarningMarkType::Count: CHECK(false, ()); break; + using enum RoadWarningMarkType; + case Toll: symbolName = "paid_road"; break; + case Ferry: symbolName = "ferry"; break; + case Dirty: symbolName = "unpaved_road"; break; + case Count: CHECK(false, ()); break; } auto symbol = make_unique_dp(); - symbol->insert(std::make_pair(1 /* zoomLevel */, symbolName)); + symbol->emplace(1 /* zoomLevel */, symbolName); return symbol; } @@ -683,10 +685,11 @@ std::string RoadWarningMark::GetLocalizedRoadWarningType(RoadWarningMarkType typ { switch (type) { - case RoadWarningMarkType::Toll: return platform::GetLocalizedString("toll_road"); - case RoadWarningMarkType::Ferry: return platform::GetLocalizedString("ferry_crossing"); - case RoadWarningMarkType::Dirty: return platform::GetLocalizedString("unpaved_road"); - case RoadWarningMarkType::Count: CHECK(false, ("Invalid road warning mark type", type)); break; + using enum RoadWarningMarkType; + case Toll: return platform::GetLocalizedString("toll_road"); + case Ferry: return platform::GetLocalizedString("ferry_crossing"); + case Dirty: return platform::GetLocalizedString("unpaved_road"); + case Count: CHECK(false, ("Invalid road warning mark type", type)); break; } return {}; } @@ -695,10 +698,11 @@ std::string DebugPrint(RoadWarningMarkType type) { switch (type) { - case RoadWarningMarkType::Toll: return "Toll"; - case RoadWarningMarkType::Ferry: return "Ferry"; - case RoadWarningMarkType::Dirty: return "Dirty"; - case RoadWarningMarkType::Count: return "Count"; + using enum RoadWarningMarkType; + case Toll: return "Toll"; + case Ferry: return "Ferry"; + case Dirty: return "Dirty"; + case Count: return "Count"; } UNREACHABLE(); } diff --git a/platform/distance.cpp b/platform/distance.cpp index 43eed86639..59fcdb416b 100644 --- a/platform/distance.cpp +++ b/platform/distance.cpp @@ -202,10 +202,10 @@ std::string DebugPrint(Distance::Units units) { switch (units) { - case Distance::Units::Meters: return "Distance::Units::Meters"; - case Distance::Units::Kilometers: return "Distance::Units::Kilometers"; - case Distance::Units::Feet: return "Distance::Units::Feet"; - case Distance::Units::Miles: return "Distance::Units::Miles"; + case Distance::Units::Meters: return "m"; + case Distance::Units::Kilometers: return "km"; + case Distance::Units::Feet: return "ft"; + case Distance::Units::Miles: return "mi"; default: UNREACHABLE(); } } diff --git a/platform/localization.cpp b/platform/localization.cpp index 48338edd92..14f2e90cc1 100644 --- a/platform/localization.cpp +++ b/platform/localization.cpp @@ -1,6 +1,5 @@ #include "platform/localization.hpp" -#include "platform/measurement_utils.hpp" #include "platform/settings.hpp" #include @@ -11,18 +10,18 @@ namespace { enum class MeasurementType { - Distance = 0, + Distance, Speed, Altitude }; -const LocalizedUnits & GetLocalizedUnits(measurement_utils::Units units, MeasurementType measurementType) +LocalizedUnits const & GetLocalizedUnits(measurement_utils::Units units, MeasurementType measurementType) { - static LocalizedUnits UnitsLenghImperial = {GetLocalizedString("ft"), GetLocalizedString("mi")}; - static LocalizedUnits UnitsLenghMetric = {GetLocalizedString("m"), GetLocalizedString("km")}; + static LocalizedUnits const lengthImperial = {GetLocalizedString("ft"), GetLocalizedString("mi")}; + static LocalizedUnits const lengthMetric = {GetLocalizedString("m"), GetLocalizedString("km")}; - static LocalizedUnits UnitsSpeedImperial = {GetLocalizedString("ft"), GetLocalizedString("miles_per_hour")}; - static LocalizedUnits UnitsSpeedMetric = {GetLocalizedString("m"), GetLocalizedString("kilometers_per_hour")}; + static LocalizedUnits const speedImperial = {GetLocalizedString("ft"), GetLocalizedString("miles_per_hour")}; + static LocalizedUnits const speedMetric = {GetLocalizedString("m"), GetLocalizedString("kilometers_per_hour")}; switch (measurementType) { @@ -30,27 +29,27 @@ const LocalizedUnits & GetLocalizedUnits(measurement_utils::Units units, Measure case MeasurementType::Altitude: switch (units) { - case measurement_utils::Units::Imperial: return UnitsLenghImperial; - case measurement_utils::Units::Metric: return UnitsLenghMetric; + case measurement_utils::Units::Imperial: return lengthImperial; + case measurement_utils::Units::Metric: return lengthMetric; } break; case MeasurementType::Speed: switch (units) { - case measurement_utils::Units::Imperial: return UnitsSpeedImperial; - case measurement_utils::Units::Metric: return UnitsSpeedMetric; + case measurement_utils::Units::Imperial: return speedImperial; + case measurement_utils::Units::Metric: return speedMetric; } } UNREACHABLE(); } } // namespace -LocalizedUnits GetLocalizedDistanceUnits() +LocalizedUnits const & GetLocalizedDistanceUnits() { return GetLocalizedUnits(measurement_utils::GetMeasurementUnits(), MeasurementType::Distance); } -LocalizedUnits GetLocalizedAltitudeUnits() +LocalizedUnits const & GetLocalizedAltitudeUnits() { return GetLocalizedUnits(measurement_utils::GetMeasurementUnits(), MeasurementType::Altitude); } @@ -60,7 +59,7 @@ const std::string & GetLocalizedSpeedUnits(measurement_utils::Units units) return GetLocalizedUnits(units, MeasurementType::Speed).m_high; } -std::string GetLocalizedSpeedUnits() +std::string const & GetLocalizedSpeedUnits() { return GetLocalizedSpeedUnits(measurement_utils::GetMeasurementUnits()); } diff --git a/platform/localization.hpp b/platform/localization.hpp index 7e0ab39f0f..fd64fca430 100644 --- a/platform/localization.hpp +++ b/platform/localization.hpp @@ -2,10 +2,7 @@ #include -namespace measurement_utils -{ -enum class Units; -} +#include "platform/measurement_utils.hpp" namespace platform { @@ -21,9 +18,9 @@ extern std::string GetLocalizedString(std::string const & key); extern std::string GetCurrencySymbol(std::string const & currencyCode); extern std::string GetLocalizedMyPositionBookmarkName(); -extern LocalizedUnits GetLocalizedDistanceUnits(); -extern LocalizedUnits GetLocalizedAltitudeUnits(); +extern LocalizedUnits const & GetLocalizedDistanceUnits(); +extern LocalizedUnits const & GetLocalizedAltitudeUnits(); -extern const std::string & GetLocalizedSpeedUnits(measurement_utils::Units units); -extern std::string GetLocalizedSpeedUnits(); +extern std::string const & GetLocalizedSpeedUnits(measurement_utils::Units units); +extern std::string const & GetLocalizedSpeedUnits(); } // namespace platform diff --git a/platform/measurement_utils.cpp b/platform/measurement_utils.cpp index ddb2b0fc5e..579077f2dc 100644 --- a/platform/measurement_utils.cpp +++ b/platform/measurement_utils.cpp @@ -8,7 +8,6 @@ #include "base/bits.hpp" #include "base/macros.hpp" #include "base/math.hpp" -#include "base/stl_helpers.hpp" #include "base/string_utils.hpp" #include @@ -18,24 +17,20 @@ namespace measurement_utils { -using namespace platform; -using namespace settings; -using namespace std; -using namespace strings; - -string ToStringPrecision(double d, int pr) +std::string ToStringPrecision(double d, int pr) { // We assume that the app will be restarted if a user changes device's locale. - static Locale const loc = GetCurrentLocale(); + static auto const locale = platform::GetCurrentLocale(); - return ToStringPrecisionLocale(loc, d, pr); + return ToStringPrecisionLocale(locale, d, pr); } -string ToStringPrecisionLocale(Locale loc, double d, int pr) +std::string ToStringPrecisionLocale(platform::Locale const & loc, double d, int pr) { - stringstream ss; - ss << setprecision(pr) << fixed << d; - string out = ss.str(); + // TODO(AB): Check if snprintf is faster. + std::ostringstream ss; + ss << std::setprecision(pr) << std::fixed << d; + std::string out = ss.str(); // std::locale does not work on Android NDK, so decimal and grouping (thousands) separator // shall be customized manually here. @@ -58,7 +53,7 @@ string ToStringPrecisionLocale(Locale loc, double d, int pr) return out; } -std::string DebugPrint(Units units) +std::string_view DebugPrint(Units units) { switch (units) { @@ -70,7 +65,7 @@ std::string DebugPrint(Units units) Units GetMeasurementUnits() { - Units units = measurement_utils::Units::Metric; + Units units = Units::Metric; settings::TryGet(settings::kMeasurementUnits, units); return units; } @@ -85,32 +80,32 @@ double ToSpeedKmPH(double speed, Units units) UNREACHABLE(); } -string FormatLatLonAsDMSImpl(double value, char positive, char negative, int dac) +std::string FormatLatLonAsDMSImpl(double value, char positive, char negative, int dac) { using namespace base; - ostringstream sstream; - sstream << setfill('0'); + std::ostringstream sstream; + sstream << std::setfill('0'); // Degrees double i; - double d = modf(fabs(value), &i); - sstream << setw(2) << i << "°"; + double d = std::modf(std::fabs(value), &i); + sstream << std::setw(2) << i << "°"; // Minutes - d = modf(d * 60.0, &i); - sstream << setw(2) << i << "′"; + d = std::modf(d * 60.0, &i); + sstream << std::setw(2) << i << "′"; // Seconds d = d * 60.0; if (dac == 0) d = SignedRound(d); - d = modf(d, &i); - sstream << setw(2) << i; + d = std::modf(d, &i); + sstream << std::setw(2) << i; if (dac > 0) - sstream << to_string_dac(d, dac).substr(1); + sstream << strings::to_string_dac(d, dac).substr(1); sstream << "″"; @@ -128,55 +123,55 @@ string FormatLatLonAsDMSImpl(double value, char positive, char negative, int dac return sstream.str(); } -string FormatLatLonAsDMS(double lat, double lon, bool withComma, int dac) +std::string FormatLatLonAsDMS(double lat, double lon, bool withComma, int dac) { return (FormatLatLonAsDMSImpl(lat, 'N', 'S', dac) + (withComma ? ", " : " ") + FormatLatLonAsDMSImpl(lon, 'E', 'W', dac)); } -void FormatLatLonAsDMS(double lat, double lon, string & latText, string & lonText, int dac) +void FormatLatLonAsDMS(double lat, double lon, std::string & latText, std::string & lonText, int dac) { latText = FormatLatLonAsDMSImpl(lat, 'N', 'S', dac); lonText = FormatLatLonAsDMSImpl(lon, 'E', 'W', dac); } -void FormatMercatorAsDMS(m2::PointD const & mercator, string & lat, string & lon, int dac) +void FormatMercatorAsDMS(m2::PointD const & mercator, std::string & lat, std::string & lon, int dac) { lat = FormatLatLonAsDMSImpl(mercator::YToLat(mercator.y), 'N', 'S', dac); lon = FormatLatLonAsDMSImpl(mercator::XToLon(mercator.x), 'E', 'W', dac); } -string FormatMercatorAsDMS(m2::PointD const & mercator, int dac) +std::string FormatMercatorAsDMS(m2::PointD const & mercator, int dac) { return FormatLatLonAsDMS(mercator::YToLat(mercator.y), mercator::XToLon(mercator.x), dac); } // @TODO take into account decimal points or commas as separators in different locales -string FormatLatLon(double lat, double lon, int dac) +std::string FormatLatLon(double lat, double lon, int dac) { - return to_string_dac(lat, dac) + " " + to_string_dac(lon, dac); + return strings::to_string_dac(lat, dac) + " " + strings::to_string_dac(lon, dac); } -string FormatLatLon(double lat, double lon, bool withComma, int dac) +std::string FormatLatLon(double lat, double lon, bool withComma, int dac) { - return to_string_dac(lat, dac) + (withComma ? ", " : " ") + to_string_dac(lon, dac); + return strings::to_string_dac(lat, dac) + (withComma ? ", " : " ") + strings::to_string_dac(lon, dac); } -void FormatLatLon(double lat, double lon, string & latText, string & lonText, int dac) +void FormatLatLon(double lat, double lon, std::string & latText, std::string & lonText, int dac) { - latText = to_string_dac(lat, dac); - lonText = to_string_dac(lon, dac); + latText = strings::to_string_dac(lat, dac); + lonText = strings::to_string_dac(lon, dac); } -string FormatMercator(m2::PointD const & mercator, int dac) +std::string FormatMercator(m2::PointD const & mercator, int dac) { return FormatLatLon(mercator::YToLat(mercator.y), mercator::XToLon(mercator.x), dac); } -void FormatMercator(m2::PointD const & mercator, string & lat, string & lon, int dac) +void FormatMercator(m2::PointD const & mercator, std::string & lat, std::string & lon, int dac) { - lat = to_string_dac(mercator::YToLat(mercator.y), dac); - lon = to_string_dac(mercator::XToLon(mercator.x), dac); + lat = strings::to_string_dac(mercator::YToLat(mercator.y), dac); + lon = strings::to_string_dac(mercator::XToLon(mercator.x), dac); } double MpsToUnits(double metersPerSecond, Units units) @@ -189,13 +184,13 @@ double MpsToUnits(double metersPerSecond, Units units) UNREACHABLE(); } -string FormatSpeedNumeric(double metersPerSecond, Units units) +std::string FormatSpeedNumeric(double metersPerSecond, Units units) { double const unitsPerHour = MpsToUnits(metersPerSecond, units); return ToStringPrecision(unitsPerHour, unitsPerHour >= 10.0 ? 0 : 1); } -string FormatOsmLink(double lat, double lon, int zoom) +std::string FormatOsmLink(double lat, double lon, int zoom) { static constexpr char chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_~"; @@ -204,7 +199,7 @@ string FormatOsmLink(double lat, double lon, int zoom) uint32_t const x = round((lon + 180.0) * factor); uint32_t const y = round((lat + 90.0) * factor * 2.0); uint64_t const code = bits::BitwiseMerge(y, x); - string osmUrl = "https://osm.org/go/"; + std::string osmUrl = "https://osm.org/go/"; for (int i = 0; i < (zoom + 10) / 3; ++i) { @@ -219,7 +214,7 @@ string FormatOsmLink(double lat, double lon, int zoom) return osmUrl + "?m"; } -bool OSMDistanceToMeters(string const & osmRawValue, double & outMeters) +bool OSMDistanceToMeters(std::string const & osmRawValue, double & outMeters) { using strings::is_finite; @@ -247,9 +242,9 @@ bool OSMDistanceToMeters(string const & osmRawValue, double & outMeters) double const inches = strtod(s, &stop); if (s != stop && *stop == '"' && is_finite(inches)) outMeters += InchesToMeters(inches); + return true; } - break; // Inches. case '"': outMeters = InchesToMeters(outMeters); return true; @@ -288,9 +283,9 @@ bool OSMDistanceToMeters(string const & osmRawValue, double & outMeters) return true; } -string OSMDistanceToMetersString(string const & osmRawValue, - bool supportZeroAndNegativeValues, - int digitsAfterComma) +std::string OSMDistanceToMetersString(std::string const & osmRawValue, + bool supportZeroAndNegativeValues, + int digitsAfterComma) { double meters; if (OSMDistanceToMeters(osmRawValue, meters)) diff --git a/platform/measurement_utils.hpp b/platform/measurement_utils.hpp index 4d29d790d7..906d4960e5 100644 --- a/platform/measurement_utils.hpp +++ b/platform/measurement_utils.hpp @@ -13,7 +13,7 @@ enum class Units Imperial = 1 }; -std::string DebugPrint(Units units); +std::string_view DebugPrint(Units units); Units GetMeasurementUnits(); @@ -64,5 +64,5 @@ std::string OSMDistanceToMetersString(std::string const & osmRawValue, bool supportZeroAndNegativeValues = true, int digitsAfterComma = 2); std::string ToStringPrecision(double d, int pr); -std::string ToStringPrecisionLocale(platform::Locale loc, double d, int pr); +std::string ToStringPrecisionLocale(platform::Locale const & locale, double d, int pr); } // namespace measurement_utils diff --git a/platform/platform_tests/distance_tests.cpp b/platform/platform_tests/distance_tests.cpp index 9bcbddb721..ad642f6f16 100644 --- a/platform/platform_tests/distance_tests.cpp +++ b/platform/platform_tests/distance_tests.cpp @@ -4,11 +4,23 @@ #include "platform/measurement_utils.hpp" #include "platform/settings.hpp" +#include + namespace platform { -std::string MakeDistanceStr(std::string const & value, std::string const & unit) +std::string MakeDistanceStr(std::string value, Distance::Units unit) { - return value + kNarrowNonBreakingSpace + unit; + static Locale const loc = GetCurrentLocale(); + + constexpr char kHardCodedGroupingSeparator = ','; + if (auto found = value.find(kHardCodedGroupingSeparator); found != std::string::npos) + value.replace(found, 1, loc.m_groupingSeparator); + + constexpr char kHardCodedDecimalSeparator = '.'; + if (auto found = value.find(kHardCodedDecimalSeparator); found != std::string::npos) + value.replace(found, 1, loc.m_decimalSeparator); + + return value.append(kNarrowNonBreakingSpace).append(DebugPrint(unit)); } struct ScopedSettings @@ -43,70 +55,64 @@ UNIT_TEST(Distance_InititalDistance) UNIT_TEST(Distance_CreateFormatted) { + using enum Distance::Units; { ScopedSettings const guard(measurement_utils::Units::Metric); Distance const d = Distance::CreateFormatted(100); - TEST_EQUAL(d.GetUnits(), Distance::Units::Meters, ()); + TEST_EQUAL(d.GetUnits(), Meters, ()); TEST_ALMOST_EQUAL_ULPS(d.GetDistance(), 100.0, ()); TEST_EQUAL(d.GetDistanceString(), "100", ()); - TEST_EQUAL(d.ToString(), MakeDistanceStr("100", "m"), ()); + TEST_EQUAL(d.ToString(), MakeDistanceStr("100", Meters), ()); } { ScopedSettings const guard(measurement_utils::Units::Imperial); Distance const d = Distance::CreateFormatted(100); - TEST_EQUAL(d.GetUnits(), Distance::Units::Feet, ()); + TEST_EQUAL(d.GetUnits(), Feet, ()); TEST_ALMOST_EQUAL_ULPS(d.GetDistance(), 330.0, ()); TEST_EQUAL(d.GetDistanceString(), "330", ()); - TEST_EQUAL(d.ToString(), MakeDistanceStr("330", "ft"), ()); + TEST_EQUAL(d.ToString(), MakeDistanceStr("330", Feet), ()); } } UNIT_TEST(Distance_CreateAltitudeFormatted) { + using enum Distance::Units; { ScopedSettings const guard(measurement_utils::Units::Metric); - TEST_EQUAL(Distance::FormatAltitude(5), MakeDistanceStr("5", "m"), ()); - } - { - ScopedSettings const guard(measurement_utils::Units::Metric); - - TEST_EQUAL(Distance::FormatAltitude(-8849), MakeDistanceStr("-8849", "m"), ()); - } - { - ScopedSettings const guard(measurement_utils::Units::Metric); - - TEST_EQUAL(Distance::FormatAltitude(12345), MakeDistanceStr("12,345", "m"), ()); + TEST_EQUAL(Distance::FormatAltitude(5), MakeDistanceStr("5", Meters), ()); + TEST_EQUAL(Distance::FormatAltitude(-8849), MakeDistanceStr("-8849", Meters), ()); + TEST_EQUAL(Distance::FormatAltitude(12345), MakeDistanceStr("12,345", Meters), ()); } { ScopedSettings const guard(measurement_utils::Units::Imperial); - TEST_EQUAL(Distance::FormatAltitude(10000), MakeDistanceStr("32,808", "ft"), ()); + TEST_EQUAL(Distance::FormatAltitude(10000), MakeDistanceStr("32,808", Feet), ()); } } UNIT_TEST(Distance_IsLowUnits) { - TEST_EQUAL(Distance(0.0, Distance::Units::Meters).IsLowUnits(), true, ()); - TEST_EQUAL(Distance(0.0, Distance::Units::Feet).IsLowUnits(), true, ()); - TEST_EQUAL(Distance(0.0, Distance::Units::Kilometers).IsLowUnits(), false, ()); - TEST_EQUAL(Distance(0.0, Distance::Units::Miles).IsLowUnits(), false, ()); + using enum Distance::Units; + TEST_EQUAL(Distance(0.0, Meters).IsLowUnits(), true, ()); + TEST_EQUAL(Distance(0.0, Feet).IsLowUnits(), true, ()); + TEST_EQUAL(Distance(0.0, Kilometers).IsLowUnits(), false, ()); + TEST_EQUAL(Distance(0.0, Miles).IsLowUnits(), false, ()); } UNIT_TEST(Distance_IsHighUnits) { - TEST_EQUAL(Distance(0.0, Distance::Units::Meters).IsHighUnits(), false, ()); - TEST_EQUAL(Distance(0.0, Distance::Units::Feet).IsHighUnits(), false, ()); - TEST_EQUAL(Distance(0.0, Distance::Units::Kilometers).IsHighUnits(), true, ()); - TEST_EQUAL(Distance(0.0, Distance::Units::Miles).IsHighUnits(), true, ()); + using enum Distance::Units; + TEST_EQUAL(Distance(0.0, Meters).IsHighUnits(), false, ()); + TEST_EQUAL(Distance(0.0, Feet).IsHighUnits(), false, ()); + TEST_EQUAL(Distance(0.0, Kilometers).IsHighUnits(), true, ()); + TEST_EQUAL(Distance(0.0, Miles).IsHighUnits(), true, ()); } UNIT_TEST(Distance_To) { - using Units = Distance::Units; - struct TestData { double initialDistance; @@ -116,47 +122,48 @@ UNIT_TEST(Distance_To) Distance::Units newUnits; }; + using enum Distance::Units; // clang-format off TestData constexpr testData[] = { - {0.1, Units::Meters, Units::Feet, 0, Units::Feet}, - {0.3, Units::Meters, Units::Feet, 1, Units::Feet}, - {0.3048, Units::Meters, Units::Feet, 1, Units::Feet}, - {0.4573, Units::Meters, Units::Feet, 2, Units::Feet}, - {0.9, Units::Meters, Units::Feet, 3, Units::Feet}, - {3, Units::Meters, Units::Feet, 10, Units::Feet}, - {30.17, Units::Meters, Units::Feet, 99, Units::Feet}, - {30.33, Units::Meters, Units::Feet, 100, Units::Feet}, - {30.49, Units::Meters, Units::Feet, 100, Units::Feet}, - {33.5, Units::Meters, Units::Feet, 110, Units::Feet}, - {302, Units::Meters, Units::Feet, 990, Units::Feet}, - {304.7, Units::Meters, Units::Feet, 0.2, Units::Miles}, - {304.8, Units::Meters, Units::Feet, 0.2, Units::Miles}, - {402.3, Units::Meters, Units::Feet, 0.2, Units::Miles}, - {402.4, Units::Meters, Units::Feet, 0.3, Units::Miles}, - {482.8, Units::Meters, Units::Feet, 0.3, Units::Miles}, - {1609.3, Units::Meters, Units::Feet, 1.0, Units::Miles}, - {1610, Units::Meters, Units::Feet, 1.0, Units::Miles}, - {1770, Units::Meters, Units::Feet, 1.1, Units::Miles}, - {15933, Units::Meters, Units::Feet, 9.9, Units::Miles}, - {16093, Units::Meters, Units::Feet, 10, Units::Miles}, - {16093.5, Units::Meters, Units::Feet, 10, Units::Miles}, - {16898.464, Units::Meters, Units::Feet, 11, Units::Miles}, - {16898.113, Units::Meters, Units::Kilometers, 17, Units::Kilometers}, - {302, Units::Meters, Units::Miles, 990, Units::Feet}, - {994, Units::Meters, Units::Kilometers, 990, Units::Meters}, - {995, Units::Meters, Units::Kilometers, 1.0, Units::Kilometers}, - {0.1, Units::Kilometers, Units::Meters, 100, Units::Meters}, - {0.3, Units::Kilometers, Units::Kilometers, 300, Units::Meters}, - {12, Units::Kilometers, Units::Feet, 7.5, Units::Miles}, - {0.1, Units::Kilometers, Units::Feet, 330, Units::Feet}, - {110, Units::Feet, Units::Meters, 34, Units::Meters}, - {1100, Units::Feet, Units::Kilometers, 340, Units::Meters}, - {1100, Units::Feet, Units::Meters, 340, Units::Meters}, - {1100, Units::Feet, Units::Miles, 0.2, Units::Miles}, - {0.2, Units::Miles, Units::Meters, 320, Units::Meters}, - {11, Units::Miles, Units::Meters, 18, Units::Kilometers}, - {11, Units::Miles, Units::Kilometers, 18, Units::Kilometers}, - {0.1, Units::Miles, Units::Feet, 530, Units::Feet}, + {0.1, Meters, Feet, 0, Feet}, + {0.3, Meters, Feet, 1, Feet}, + {0.3048, Meters, Feet, 1, Feet}, + {0.4573, Meters, Feet, 2, Feet}, + {0.9, Meters, Feet, 3, Feet}, + {3, Meters, Feet, 10, Feet}, + {30.17, Meters, Feet, 99, Feet}, + {30.33, Meters, Feet, 100, Feet}, + {30.49, Meters, Feet, 100, Feet}, + {33.5, Meters, Feet, 110, Feet}, + {302, Meters, Feet, 990, Feet}, + {304.7, Meters, Feet, 0.2, Miles}, + {304.8, Meters, Feet, 0.2, Miles}, + {402.3, Meters, Feet, 0.2, Miles}, + {402.4, Meters, Feet, 0.3, Miles}, + {482.8, Meters, Feet, 0.3, Miles}, + {1609.3, Meters, Feet, 1.0, Miles}, + {1610, Meters, Feet, 1.0, Miles}, + {1770, Meters, Feet, 1.1, Miles}, + {15933, Meters, Feet, 9.9, Miles}, + {16093, Meters, Feet, 10, Miles}, + {16093.5, Meters, Feet, 10, Miles}, + {16898.464, Meters, Feet, 11, Miles}, + {16898.113, Meters, Kilometers, 17, Kilometers}, + {302, Meters, Miles, 990, Feet}, + {994, Meters, Kilometers, 990, Meters}, + {995, Meters, Kilometers, 1.0, Kilometers}, + {0.1, Kilometers, Meters, 100, Meters}, + {0.3, Kilometers, Kilometers, 300, Meters}, + {12, Kilometers, Feet, 7.5, Miles}, + {0.1, Kilometers, Feet, 330, Feet}, + {110, Feet, Meters, 34, Meters}, + {1100, Feet, Kilometers, 340, Meters}, + {1100, Feet, Meters, 340, Meters}, + {1100, Feet, Miles, 0.2, Miles}, + {0.2, Miles, Meters, 320, Meters}, + {11, Miles, Meters, 18, Kilometers}, + {11, Miles, Kilometers, 18, Kilometers}, + {0.1, Miles, Feet, 530, Feet}, }; // clang-format on @@ -171,186 +178,187 @@ UNIT_TEST(Distance_To) UNIT_TEST(Distance_ToPlatformUnitsFormatted) { + using enum Distance::Units; { ScopedSettings const guard(measurement_utils::Units::Metric); - Distance d{11, Distance::Units::Feet}; + Distance d{11, Feet}; Distance newDistance = d.ToPlatformUnitsFormatted(); - TEST_EQUAL(newDistance.GetUnits(), Distance::Units::Meters, (d.ToString())); + TEST_EQUAL(newDistance.GetUnits(), Meters, (d.ToString())); TEST_ALMOST_EQUAL_ULPS(newDistance.GetDistance(), 3.0, (d.ToString())); TEST_EQUAL(newDistance.GetDistanceString(), "3", (d.ToString())); - TEST_EQUAL(newDistance.ToString(), MakeDistanceStr("3", "m"), (d.ToString())); + TEST_EQUAL(newDistance.ToString(), MakeDistanceStr("3", Meters), (d.ToString())); - d = Distance{11, Distance::Units::Kilometers}; + d = Distance{11, Kilometers}; newDistance = d.ToPlatformUnitsFormatted(); - TEST_EQUAL(newDistance.GetUnits(), Distance::Units::Kilometers, (d.ToString())); + TEST_EQUAL(newDistance.GetUnits(), Kilometers, (d.ToString())); TEST_ALMOST_EQUAL_ULPS(newDistance.GetDistance(), 11.0, (d.ToString())); TEST_EQUAL(newDistance.GetDistanceString(), "11", (d.ToString())); - TEST_EQUAL(newDistance.ToString(), MakeDistanceStr("11", "km"), (d.ToString())); + TEST_EQUAL(newDistance.ToString(), MakeDistanceStr("11", Kilometers), (d.ToString())); } { ScopedSettings const guard(measurement_utils::Units::Imperial); - Distance d{11, Distance::Units::Feet}; + Distance d{11, Feet}; Distance newDistance = d.ToPlatformUnitsFormatted(); - TEST_EQUAL(newDistance.GetUnits(), Distance::Units::Feet, (d.ToString())); + TEST_EQUAL(newDistance.GetUnits(), Feet, (d.ToString())); TEST_ALMOST_EQUAL_ULPS(newDistance.GetDistance(), 11.0, (d.ToString())); TEST_EQUAL(newDistance.GetDistanceString(), "11", (d.ToString())); - TEST_EQUAL(newDistance.ToString(), MakeDistanceStr("11", "ft"), (d.ToString())); + TEST_EQUAL(newDistance.ToString(), MakeDistanceStr("11", Feet), (d.ToString())); - d = Distance{11, Distance::Units::Kilometers}; + d = Distance{11, Kilometers}; newDistance = d.ToPlatformUnitsFormatted(); - TEST_EQUAL(newDistance.GetUnits(), Distance::Units::Miles, (d.ToString())); + TEST_EQUAL(newDistance.GetUnits(), Miles, (d.ToString())); TEST_ALMOST_EQUAL_ULPS(newDistance.GetDistance(), 6.8, (d.ToString())); TEST_EQUAL(newDistance.GetDistanceString(), "6.8", (d.ToString())); - TEST_EQUAL(newDistance.ToString(), MakeDistanceStr("6.8", "mi"), (d.ToString())); + TEST_EQUAL(newDistance.ToString(), MakeDistanceStr("6.8", Miles), (d.ToString())); } } UNIT_TEST(Distance_GetUnits) { - TEST_EQUAL(Distance(1234).GetUnits(), Distance::Units::Meters, ()); - TEST_EQUAL(Distance(1234, Distance::Units::Kilometers).GetUnits(), Distance::Units::Kilometers, ()); - TEST_EQUAL(Distance(1234, Distance::Units::Feet).GetUnits(), Distance::Units::Feet, ()); - TEST_EQUAL(Distance(1234, Distance::Units::Miles).GetUnits(), Distance::Units::Miles, ()); + using enum Distance::Units; + TEST_EQUAL(Distance(1234).GetUnits(), Meters, ()); + TEST_EQUAL(Distance(1234, Kilometers).GetUnits(), Kilometers, ()); + TEST_EQUAL(Distance(1234, Feet).GetUnits(), Feet, ()); + TEST_EQUAL(Distance(1234, Miles).GetUnits(), Miles, ()); } UNIT_TEST(Distance_GetUnitsString) { + using enum Distance::Units; TEST_EQUAL(Distance(1234).GetUnitsString(), "m", ()); - TEST_EQUAL(Distance(1234, Distance::Units::Meters).GetUnitsString(), "m", ()); - TEST_EQUAL(Distance(1234, Distance::Units::Kilometers).GetUnitsString(), "km", ()); - TEST_EQUAL(Distance(1234, Distance::Units::Feet).GetUnitsString(), "ft", ()); - TEST_EQUAL(Distance(1234, Distance::Units::Miles).GetUnitsString(), "mi", ()); + TEST_EQUAL(Distance(1234, Meters).GetUnitsString(), "m", ()); + TEST_EQUAL(Distance(1234, Kilometers).GetUnitsString(), "km", ()); + TEST_EQUAL(Distance(1234, Feet).GetUnitsString(), "ft", ()); + TEST_EQUAL(Distance(1234, Miles).GetUnitsString(), "mi", ()); } UNIT_TEST(Distance_FormattedDistance) { - using Units = Distance::Units; - struct TestData { Distance distance; double formattedDistance; - Units formattedUnits; - std::string formattedDistanceString; - std::string formattedString; + Distance::Units formattedUnits; + std::string formattedDistanceStringInUsLocale; }; + using enum Distance::Units; // clang-format off TestData const testData[] = { // From Meters to Meters - {Distance(0, Units::Meters), 0, Units::Meters, "0", MakeDistanceStr("0", "m")}, - {Distance(0.3, Units::Meters), 0, Units::Meters, "0", MakeDistanceStr("0", "m")}, - {Distance(0.9, Units::Meters), 1, Units::Meters, "1", MakeDistanceStr("1", "m")}, - {Distance(1, Units::Meters), 1, Units::Meters, "1", MakeDistanceStr("1", "m")}, - {Distance(1.234, Units::Meters), 1, Units::Meters, "1", MakeDistanceStr("1", "m")}, - {Distance(9.99, Units::Meters), 10, Units::Meters, "10", MakeDistanceStr("10", "m")}, - {Distance(10.01, Units::Meters), 10, Units::Meters, "10", MakeDistanceStr("10", "m")}, - {Distance(10.4, Units::Meters), 10, Units::Meters, "10", MakeDistanceStr("10", "m")}, - {Distance(10.5, Units::Meters), 11, Units::Meters, "11", MakeDistanceStr("11", "m")}, - {Distance(10.51, Units::Meters), 11, Units::Meters, "11", MakeDistanceStr("11", "m")}, - {Distance(64.2, Units::Meters), 64, Units::Meters, "64", MakeDistanceStr("64", "m")}, - {Distance(99, Units::Meters), 99, Units::Meters, "99", MakeDistanceStr("99", "m")}, - {Distance(100, Units::Meters), 100, Units::Meters, "100", MakeDistanceStr("100", "m")}, - {Distance(101, Units::Meters), 100, Units::Meters, "100", MakeDistanceStr("100", "m")}, - {Distance(109, Units::Meters), 110, Units::Meters, "110", MakeDistanceStr("110", "m")}, - {Distance(991, Units::Meters), 990, Units::Meters, "990", MakeDistanceStr("990", "m")}, + {Distance(0, Meters), 0, Meters, "0"}, + {Distance(0.3, Meters), 0, Meters, "0"}, + {Distance(0.9, Meters), 1, Meters, "1"}, + {Distance(1, Meters), 1, Meters, "1"}, + {Distance(1.234, Meters), 1, Meters, "1"}, + {Distance(9.99, Meters), 10, Meters, "10"}, + {Distance(10.01, Meters), 10, Meters, "10"}, + {Distance(10.4, Meters), 10, Meters, "10"}, + {Distance(10.5, Meters), 11, Meters, "11"}, + {Distance(10.51, Meters), 11, Meters, "11"}, + {Distance(64.2, Meters), 64, Meters, "64"}, + {Distance(99, Meters), 99, Meters, "99"}, + {Distance(100, Meters), 100, Meters, "100"}, + {Distance(101, Meters), 100, Meters, "100"}, + {Distance(109, Meters), 110, Meters, "110"}, + {Distance(991, Meters), 990, Meters, "990"}, // From Kilometers to Kilometers - {Distance(0, Units::Kilometers), 0, Units::Meters, "0", MakeDistanceStr("0", "m")}, - {Distance(0.3, Units::Kilometers), 300, Units::Meters, "300", MakeDistanceStr("300", "m")}, - {Distance(1.234, Units::Kilometers), 1.2, Units::Kilometers, "1.2", MakeDistanceStr("1.2", "km")}, - {Distance(10, Units::Kilometers), 10, Units::Kilometers, "10", MakeDistanceStr("10", "km")}, - {Distance(11, Units::Kilometers), 11, Units::Kilometers, "11", MakeDistanceStr("11", "km")}, - {Distance(54, Units::Kilometers), 54, Units::Kilometers, "54", MakeDistanceStr("54", "km")}, - {Distance(99.99, Units::Kilometers), 100, Units::Kilometers, "100", MakeDistanceStr("100", "km")}, - {Distance(100.01, Units::Kilometers), 100, Units::Kilometers, "100", MakeDistanceStr("100", "km")}, - {Distance(115, Units::Kilometers), 115, Units::Kilometers, "115", MakeDistanceStr("115", "km")}, - {Distance(999, Units::Kilometers), 999, Units::Kilometers, "999", MakeDistanceStr("999", "km")}, - {Distance(1000, Units::Kilometers), 1000, Units::Kilometers, "1000", MakeDistanceStr("1000", "km")}, - {Distance(1049.99, Units::Kilometers), 1050, Units::Kilometers, "1050", MakeDistanceStr("1050", "km")}, - {Distance(1050, Units::Kilometers), 1050, Units::Kilometers, "1050", MakeDistanceStr("1050", "km")}, - {Distance(1050.01, Units::Kilometers), 1050, Units::Kilometers, "1050", MakeDistanceStr("1050", "km")}, - {Distance(1234, Units::Kilometers), 1234, Units::Kilometers, "1234", MakeDistanceStr("1234", "km")}, - {Distance(12345, Units::Kilometers), 12345, Units::Kilometers, "12,345", MakeDistanceStr("12,345", "km")}, + {Distance(0, Kilometers), 0, Meters, "0"}, + {Distance(0.3, Kilometers), 300, Meters, "300"}, + {Distance(1.234, Kilometers), 1.2, Kilometers, "1.2"}, + {Distance(10, Kilometers), 10, Kilometers, "10"}, + {Distance(11, Kilometers), 11, Kilometers, "11"}, + {Distance(54, Kilometers), 54, Kilometers, "54"}, + {Distance(99.99, Kilometers), 100, Kilometers, "100"}, + {Distance(100.01, Kilometers), 100, Kilometers, "100"}, + {Distance(115, Kilometers), 115, Kilometers, "115"}, + {Distance(999, Kilometers), 999, Kilometers, "999"}, + {Distance(1000, Kilometers), 1000, Kilometers, "1000"}, + {Distance(1049.99, Kilometers), 1050, Kilometers, "1050"}, + {Distance(1050, Kilometers), 1050, Kilometers, "1050"}, + {Distance(1050.01, Kilometers), 1050, Kilometers, "1050"}, + {Distance(1234, Kilometers), 1234, Kilometers, "1234"}, + {Distance(12345, Kilometers), 12345, Kilometers, "12,345"}, // From Feet to Feet - {Distance(0, Units::Feet), 0, Units::Feet, "0", MakeDistanceStr("0", "ft")}, - {Distance(1, Units::Feet), 1, Units::Feet, "1", MakeDistanceStr("1", "ft")}, - {Distance(9.99, Units::Feet), 10, Units::Feet, "10", MakeDistanceStr("10", "ft")}, - {Distance(10.01, Units::Feet), 10, Units::Feet, "10", MakeDistanceStr("10", "ft")}, - {Distance(95, Units::Feet), 95, Units::Feet, "95", MakeDistanceStr("95", "ft")}, - {Distance(125, Units::Feet), 130, Units::Feet, "130", MakeDistanceStr("130", "ft")}, - {Distance(991, Units::Feet), 990, Units::Feet, "990", MakeDistanceStr("990", "ft")}, + {Distance(0, Feet), 0, Feet, "0"}, + {Distance(1, Feet), 1, Feet, "1"}, + {Distance(9.99, Feet), 10, Feet, "10"}, + {Distance(10.01, Feet), 10, Feet, "10"}, + {Distance(95, Feet), 95, Feet, "95"}, + {Distance(125, Feet), 130, Feet, "130"}, + {Distance(991, Feet), 990, Feet, "990"}, // From Miles to Miles - {Distance(0, Units::Miles), 0, Units::Feet, "0", MakeDistanceStr("0", "ft")}, - {Distance(0.1, Units::Miles), 530, Units::Feet, "530", MakeDistanceStr("530", "ft")}, - {Distance(1, Units::Miles), 1.0, Units::Miles, "1.0", MakeDistanceStr("1.0", "mi")}, - {Distance(1.234, Units::Miles), 1.2, Units::Miles, "1.2", MakeDistanceStr("1.2", "mi")}, - {Distance(9.99, Units::Miles), 10, Units::Miles, "10", MakeDistanceStr("10", "mi")}, - {Distance(10.01, Units::Miles), 10, Units::Miles, "10", MakeDistanceStr("10", "mi")}, - {Distance(11, Units::Miles), 11, Units::Miles, "11", MakeDistanceStr("11", "mi")}, - {Distance(54, Units::Miles), 54, Units::Miles, "54", MakeDistanceStr("54", "mi")}, - {Distance(145, Units::Miles), 145, Units::Miles, "145", MakeDistanceStr("145", "mi")}, - {Distance(999, Units::Miles), 999, Units::Miles, "999", MakeDistanceStr("999", "mi")}, - {Distance(1149.99, Units::Miles), 1150, Units::Miles, "1150", MakeDistanceStr("1150", "mi")}, - {Distance(1150, Units::Miles), 1150, Units::Miles, "1150", MakeDistanceStr("1150", "mi")}, - {Distance(1150.01, Units::Miles), 1150, Units::Miles, "1150", MakeDistanceStr("1150", "mi")}, - {Distance(12345.0, Units::Miles), 12345, Units::Miles, "12,345", MakeDistanceStr("12,345", "mi")}, + {Distance(0, Miles), 0, Feet, "0"}, + {Distance(0.1, Miles), 530, Feet, "530"}, + {Distance(1, Miles), 1.0, Miles, "1.0"}, + {Distance(1.234, Miles), 1.2, Miles, "1.2"}, + {Distance(9.99, Miles), 10, Miles, "10"}, + {Distance(10.01, Miles), 10, Miles, "10"}, + {Distance(11, Miles), 11, Miles, "11"}, + {Distance(54, Miles), 54, Miles, "54"}, + {Distance(145, Miles), 145, Miles, "145"}, + {Distance(999, Miles), 999, Miles, "999"}, + {Distance(1149.99, Miles), 1150, Miles, "1150"}, + {Distance(1150, Miles), 1150, Miles, "1150"}, + {Distance(1150.01, Miles), 1150, Miles, "1150"}, + {Distance(12345.0, Miles), 12345, Miles, "12,345"}, // From Meters to Kilometers - {Distance(999, Units::Meters), 1.0, Units::Kilometers, "1.0", MakeDistanceStr("1.0", "km")}, - {Distance(1000, Units::Meters), 1.0, Units::Kilometers, "1.0", MakeDistanceStr("1.0", "km")}, - {Distance(1001, Units::Meters), 1.0, Units::Kilometers, "1.0", MakeDistanceStr("1.0", "km")}, - {Distance(1100, Units::Meters), 1.1, Units::Kilometers, "1.1", MakeDistanceStr("1.1", "km")}, - {Distance(1140, Units::Meters), 1.1, Units::Kilometers, "1.1", MakeDistanceStr("1.1", "km")}, - {Distance(1151, Units::Meters), 1.2, Units::Kilometers, "1.2", MakeDistanceStr("1.2", "km")}, - {Distance(1500, Units::Meters), 1.5, Units::Kilometers, "1.5", MakeDistanceStr("1.5", "km")}, - {Distance(1549.9, Units::Meters), 1.5, Units::Kilometers, "1.5", MakeDistanceStr("1.5", "km")}, - {Distance(1550, Units::Meters), 1.6, Units::Kilometers, "1.6", MakeDistanceStr("1.6", "km")}, - {Distance(1551, Units::Meters), 1.6, Units::Kilometers, "1.6", MakeDistanceStr("1.6", "km")}, - {Distance(9949, Units::Meters), 9.9, Units::Kilometers, "9.9", MakeDistanceStr("9.9", "km")}, - {Distance(9992, Units::Meters), 10, Units::Kilometers, "10", MakeDistanceStr("10", "km")}, - {Distance(10000, Units::Meters), 10, Units::Kilometers, "10", MakeDistanceStr("10", "km")}, - {Distance(10499.9, Units::Meters), 10, Units::Kilometers, "10", MakeDistanceStr("10", "km")}, - {Distance(10501, Units::Meters), 11, Units::Kilometers, "11", MakeDistanceStr("11", "km")}, - {Distance(101'001, Units::Meters), 101, Units::Kilometers, "101", MakeDistanceStr("101", "km")}, - {Distance(101'999, Units::Meters), 102, Units::Kilometers, "102", MakeDistanceStr("102", "km")}, - {Distance(287'386, Units::Meters), 287, Units::Kilometers, "287", MakeDistanceStr("287", "km")}, + {Distance(999, Meters), 1.0, Kilometers, "1.0"}, + {Distance(1000, Meters), 1.0, Kilometers, "1.0"}, + {Distance(1001, Meters), 1.0, Kilometers, "1.0"}, + {Distance(1100, Meters), 1.1, Kilometers, "1.1"}, + {Distance(1140, Meters), 1.1, Kilometers, "1.1"}, + {Distance(1151, Meters), 1.2, Kilometers, "1.2"}, + {Distance(1500, Meters), 1.5, Kilometers, "1.5"}, + {Distance(1549.9, Meters), 1.5, Kilometers, "1.5"}, + {Distance(1550, Meters), 1.6, Kilometers, "1.6"}, + {Distance(1551, Meters), 1.6, Kilometers, "1.6"}, + {Distance(9949, Meters), 9.9, Kilometers, "9.9"}, + {Distance(9992, Meters), 10, Kilometers, "10"}, + {Distance(10000, Meters), 10, Kilometers, "10"}, + {Distance(10499.9, Meters), 10, Kilometers, "10"}, + {Distance(10501, Meters), 11, Kilometers, "11"}, + {Distance(101'001, Meters), 101, Kilometers, "101"}, + {Distance(101'999, Meters), 102, Kilometers, "102"}, + {Distance(287'386, Meters), 287, Kilometers, "287"}, // From Feet to Miles - {Distance(999, Units::Feet), 0.2, Units::Miles, "0.2", MakeDistanceStr("0.2", "mi")}, - {Distance(1000, Units::Feet), 0.2, Units::Miles, "0.2", MakeDistanceStr("0.2", "mi")}, - {Distance(1150, Units::Feet), 0.2, Units::Miles, "0.2", MakeDistanceStr("0.2", "mi")}, - {Distance(5280, Units::Feet), 1.0, Units::Miles, "1.0", MakeDistanceStr("1.0", "mi")}, - {Distance(7920, Units::Feet), 1.5, Units::Miles, "1.5", MakeDistanceStr("1.5", "mi")}, - {Distance(10560, Units::Feet), 2.0, Units::Miles, "2.0", MakeDistanceStr("2.0", "mi")}, - {Distance(100'000, Units::Feet), 19, Units::Miles, "19", MakeDistanceStr("19", "mi")}, - {Distance(285'120, Units::Feet), 54, Units::Miles, "54", MakeDistanceStr("54", "mi")}, - {Distance(633'547, Units::Feet), 120, Units::Miles, "120", MakeDistanceStr("120", "mi")}, - {Distance(633'600, Units::Feet), 120, Units::Miles, "120", MakeDistanceStr("120", "mi")}, - {Distance(633'653, Units::Feet), 120, Units::Miles, "120", MakeDistanceStr("120", "mi")}, - {Distance(999'999, Units::Feet), 189, Units::Miles, "189", MakeDistanceStr("189", "mi")}, + {Distance(999, Feet), 0.2, Miles, "0.2"}, + {Distance(1000, Feet), 0.2, Miles, "0.2"}, + {Distance(1150, Feet), 0.2, Miles, "0.2"}, + {Distance(5280, Feet), 1.0, Miles, "1.0"}, + {Distance(7920, Feet), 1.5, Miles, "1.5"}, + {Distance(10560, Feet), 2.0, Miles, "2.0"}, + {Distance(100'000, Feet), 19, Miles, "19"}, + {Distance(285'120, Feet), 54, Miles, "54"}, + {Distance(633'547, Feet), 120, Miles, "120"}, + {Distance(633'600, Feet), 120, Miles, "120"}, + {Distance(633'653, Feet), 120, Miles, "120"}, + {Distance(999'999, Feet), 189, Miles, "189"}, }; // clang-format on - for (TestData const & data : testData) + for (auto const & [distance, formattedDistance, formattedUnits, formattedDistanceStringInUsLocale] : testData) { - Distance const formatted = data.distance.GetFormattedDistance(); + Distance const formatted = distance.GetFormattedDistance(); // Run two times to verify that nothing breaks after second format for (auto const & d : {formatted, formatted.GetFormattedDistance()}) { - TEST_ALMOST_EQUAL_ULPS(d.GetDistance(), data.formattedDistance, (data.distance)); - TEST_EQUAL(d.GetUnits(), data.formattedUnits, (data.distance)); - TEST_EQUAL(d.GetDistanceString(), data.formattedDistanceString, (data.distance)); - TEST_EQUAL(d.ToString(), data.formattedString, (data.distance)); + TEST_ALMOST_EQUAL_ULPS(d.GetDistance(), formattedDistance, (distance)); + TEST_EQUAL(d.GetUnits(), formattedUnits, (distance)); + auto const formattedString = MakeDistanceStr(formattedDistanceStringInUsLocale, formattedUnits); + TEST_EQUAL(d.ToString(), formattedString, (distance)); } } } -- 2.45.3 From e0e5830381c214c69f8a9e4feb8725ba5e0ef5de Mon Sep 17 00:00:00 2001 From: Sireesh Kodali Date: Fri, 5 Jul 2024 09:59:42 +0530 Subject: [PATCH 07/38] [indexer] Add Indian route shield parser The Indian route shield parser handles National Expressways (NE), Nataional Highways (NH), and State Highways (SH). Signed-off-by: Sireesh Kodali --- indexer/road_shields_parser.cpp | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/indexer/road_shields_parser.cpp b/indexer/road_shields_parser.cpp index ece14d368e..d79f4c949a 100644 --- a/indexer/road_shields_parser.cpp +++ b/indexer/road_shields_parser.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -61,6 +62,9 @@ std::unordered_map const kRoadNetworkShields = { // Estonia parser produces more specific shield types, incl. Generic_Orange. //{"ee:national", RoadShieldType::Generic_Red}, //{"ee:regional", RoadShieldType::Generic_White}, + {"in:ne", RoadShieldType::Generic_Blue}, + {"in:nh", RoadShieldType::Generic_Orange}, + {"in:sh", RoadShieldType::Generic_Green}, {"fr:a-road", RoadShieldType::Generic_Red}, {"jp:national", RoadShieldType::Generic_Blue}, {"jp:regional", RoadShieldType::Generic_Blue}, @@ -231,6 +235,35 @@ public: } }; +class IndiaRoadShieldParser : public RoadShieldParser +{ +public: + explicit IndiaRoadShieldParser(std::string const & baseRoadNumber) : RoadShieldParser(baseRoadNumber) {} + RoadShield ParseRoadShield(std::string_view rawText) const override + { + std::string shieldText(rawText); + + std::erase_if(shieldText, [](char c) { return c == '-' || ::isspace(c); }); + + if (shieldText.size() <= 2) + return RoadShield(RoadShieldType::Default, rawText); + + std::string_view roadType = std::string_view(shieldText).substr(0, 2); + std::string_view roadNumber = std::string_view(shieldText).substr(2); + + if (roadType == "NE") + return RoadShield(RoadShieldType::Generic_Blue, roadNumber); + + if (roadType == "NH") + return RoadShield(RoadShieldType::Generic_Orange, roadNumber); + + if (roadType == "SH") + return RoadShield(RoadShieldType::Generic_Green, roadNumber); + + return RoadShield(RoadShieldType::Default, rawText); + } +}; + class DefaultTypeRoadShieldParser : public RoadShieldParser { public: @@ -632,6 +665,8 @@ RoadShieldsSetT GetRoadShields(std::string const & mwmName, std::string const & return USRoadShieldParser(roadNumber).GetRoadShields(); if (mwmName == "UK") return UKRoadShieldParser(roadNumber).GetRoadShields(); + if (mwmName == "India") + return IndiaRoadShieldParser(roadNumber).GetRoadShields(); if (mwmName == "Russia") return RussiaRoadShieldParser(roadNumber).GetRoadShields(); if (mwmName == "France") -- 2.45.3 From efd5606ee2af26bbd144abfdab9437c05262abe1 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk <170263+biodranik@users.noreply.github.com> Date: Tue, 13 Aug 2024 21:02:59 +0200 Subject: [PATCH 08/38] Update kml/serdes_binary.hpp Signed-off-by: Alexander Borsuk <170263+biodranik@users.noreply.github.com> --- kml/serdes_binary.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kml/serdes_binary.hpp b/kml/serdes_binary.hpp index eda2a105a4..ec1aadc396 100644 --- a/kml/serdes_binary.hpp +++ b/kml/serdes_binary.hpp @@ -251,6 +251,8 @@ private: NonOwningReaderSource source(reader); m_header.Deserialize(source); + // The recent MapsMe update increased the version number, but it is not clear yet what changed/added in a newer version. + // Revise V9 in case of discovered crashes. if (m_header.m_version == Version::V8 || m_header.m_version == Version::V9) { // Check if file has Opensource V8 or MapsMe V8. -- 2.45.3 From 61251a01ef271d97eafb0420dd6410ee424bf33e Mon Sep 17 00:00:00 2001 From: zyphlar Date: Tue, 13 Aug 2024 12:07:35 -0700 Subject: [PATCH 09/38] Increase logging for direction calculation and TTS (#8911) * Increase logging for direction calculation and TTS * Update routing/turns_notification_manager.cpp Co-authored-by: Alexander Borsuk <170263+biodranik@users.noreply.github.com> Signed-off-by: zyphlar * Update routing/turns_notification_manager.cpp Co-authored-by: Alexander Borsuk <170263+biodranik@users.noreply.github.com> Signed-off-by: zyphlar --------- Signed-off-by: zyphlar Co-authored-by: Alexander Borsuk <170263+biodranik@users.noreply.github.com> --- routing/route.cpp | 3 +++ routing/routing_helpers.cpp | 2 +- routing/turns_notification_manager.cpp | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/routing/route.cpp b/routing/route.cpp index e18a2a86d1..3bfd7d096f 100644 --- a/routing/route.cpp +++ b/routing/route.cpp @@ -535,6 +535,9 @@ std::string Route::DebugPrintTurns() const // Always print first elemenst as Start. if (i == 0 || !turn.IsTurnNone()) { + res += DebugPrint(mercator::ToLatLon(m_routeSegments[i].GetJunction())); + res += "\n"; + res += DebugPrint(turn); res += "\n"; diff --git a/routing/routing_helpers.cpp b/routing/routing_helpers.cpp index 78dff21fe5..22244cd452 100644 --- a/routing/routing_helpers.cpp +++ b/routing/routing_helpers.cpp @@ -72,7 +72,7 @@ void ReconstructRoute(DirectionsEngine & engine, IndexRoadGraph const & graph, route.SetGeometry(routeGeometry.begin(), routeGeometry.end()); - LOG(LDEBUG, (route.DebugPrintTurns())); + LOG(LINFO, (route.DebugPrintTurns())); } Segment ConvertEdgeToSegment(NumMwmIds const & numMwmIds, Edge const & edge) diff --git a/routing/turns_notification_manager.cpp b/routing/turns_notification_manager.cpp index 8408493c53..7867f490c0 100644 --- a/routing/turns_notification_manager.cpp +++ b/routing/turns_notification_manager.cpp @@ -189,6 +189,8 @@ std::string NotificationManager::GenerateFirstTurnSound(TurnItem const & turn, d uint32_t const roundedDistToPronounceUnits = m_settings.RoundByPresetSoundedDistancesUnits(distToPronounceUnits); m_nextTurnNotificationProgress = PronouncedNotification::First; + + LOG(LINFO, ("TTS meters to pronounce", distanceToPronounceNotificationM, "meters to turn", distanceToTurnMeters, "meters to start pronounce", startPronounceDistMeters, "speed m/s", m_speedMetersPerSecond)); return GenerateTurnText(roundedDistToPronounceUnits, turn.m_exitNum, false /* useThenInsteadOfDistance */, turn, nextStreetInfo); } @@ -209,6 +211,8 @@ std::string NotificationManager::GenerateFirstTurnSound(TurnItem const & turn, d { m_nextTurnNotificationProgress = PronouncedNotification::Second; FastForwardFirstTurnNotification(); + + LOG(LINFO,("TTS meters to pronounce", distanceToPronounceNotificationM, "meters to turn", distanceToTurnMeters, "speed m/s", m_speedMetersPerSecond)); return GenerateTurnText(0 /* distMeters */, turn.m_exitNum, false /* useThenInsteadOfDistance */, turn, nextStreetInfo); } -- 2.45.3 From 9557eb8ed0cddef2fddc31c24c4775b0104ed28f Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Sat, 10 Aug 2024 21:49:27 +0400 Subject: [PATCH 10/38] [ios] add `self_service` and `outdoor_seating` tags to the pp Signed-off-by: Kiryl Kaveryn --- .../PlacePageData/Common/PlacePageInfoData.h | 2 ++ .../PlacePageData/Common/PlacePageInfoData.mm | 15 +++++++++++++-- .../Contents.json | 15 +++++++++++++++ .../ic_placepage_outdoor_seating.svg | 1 + .../Contents.json | 15 +++++++++++++++ .../ic_placepage_self_service.svg | 3 +++ .../Components/PlacePageInfoViewController.swift | 10 ++++++++++ 7 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 iphone/Maps/Images.xcassets/Place Page/ic_placepage_outdoor_seating.imageset/Contents.json create mode 100644 iphone/Maps/Images.xcassets/Place Page/ic_placepage_outdoor_seating.imageset/ic_placepage_outdoor_seating.svg create mode 100644 iphone/Maps/Images.xcassets/Place Page/ic_placepage_self_service.imageset/Contents.json create mode 100644 iphone/Maps/Images.xcassets/Place Page/ic_placepage_self_service.imageset/ic_placepage_self_service.svg diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h index 93ea1ae20f..b13a99a62c 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h @@ -32,6 +32,8 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, readonly, nullable) NSString *wheelchair; @property(nonatomic, readonly, nullable) NSString *driveThrough; @property(nonatomic, readonly, nullable) NSString *websiteMenu; +@property(nonatomic, readonly, nullable) NSString *selfService; +@property(nonatomic, readonly, nullable) NSString *outdoorSeating; @end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm index 0495fa5889..5fa65ac321 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm @@ -8,12 +8,18 @@ #include "indexer/validate_and_format_contacts.hpp" #include "indexer/kayak.hpp" +#include "indexer/feature_meta.hpp" #include "map/place_page_info.hpp" using namespace place_page; using namespace osm; +/// Get localized metadata value string when string format is "type.feature.value". +NSString * GetLocalizedMetadataValueString(MapObject::MetadataID metaID, std::string const & value) { + return ToNSString(platform::GetLocalizedTypeName(feature::ToString(metaID) + "." + value)); +} + @implementation PlacePageInfoData @end @@ -84,13 +90,18 @@ using namespace osm; _driveThrough = NSLocalizedString(@"drive_through", nil); break; case MetadataID::FMD_WEBSITE_MENU: _websiteMenu = ToNSString(value); break; + case MetadataID::FMD_SELF_SERVICE: _selfService = GetLocalizedMetadataValueString(metaID, value); break; + case MetadataID::FMD_OUTDOOR_SEATING: + if (value == "yes") + _outdoorSeating = NSLocalizedString(@"outdoor_seating", nil); + break; default: break; } }); - + _atm = rawData.HasAtm() ? NSLocalizedString(@"type.amenity.atm", nil) : nil; - + _address = rawData.GetAddress().empty() ? nil : @(rawData.GetAddress().c_str()); _coordFormats = @[@(rawData.GetFormattedCoordinate(place_page::CoordinatesFormat::LatLonDMS).c_str()), @(rawData.GetFormattedCoordinate(place_page::CoordinatesFormat::LatLonDecimal).c_str()), diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_placepage_outdoor_seating.imageset/Contents.json b/iphone/Maps/Images.xcassets/Place Page/ic_placepage_outdoor_seating.imageset/Contents.json new file mode 100644 index 0000000000..c5fbed49e8 --- /dev/null +++ b/iphone/Maps/Images.xcassets/Place Page/ic_placepage_outdoor_seating.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "ic_placepage_outdoor_seating.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_placepage_outdoor_seating.imageset/ic_placepage_outdoor_seating.svg b/iphone/Maps/Images.xcassets/Place Page/ic_placepage_outdoor_seating.imageset/ic_placepage_outdoor_seating.svg new file mode 100644 index 0000000000..18c2cdf0c9 --- /dev/null +++ b/iphone/Maps/Images.xcassets/Place Page/ic_placepage_outdoor_seating.imageset/ic_placepage_outdoor_seating.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_placepage_self_service.imageset/Contents.json b/iphone/Maps/Images.xcassets/Place Page/ic_placepage_self_service.imageset/Contents.json new file mode 100644 index 0000000000..40455e7590 --- /dev/null +++ b/iphone/Maps/Images.xcassets/Place Page/ic_placepage_self_service.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "ic_placepage_self_service.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_placepage_self_service.imageset/ic_placepage_self_service.svg b/iphone/Maps/Images.xcassets/Place Page/ic_placepage_self_service.imageset/ic_placepage_self_service.svg new file mode 100644 index 0000000000..83d12ceb93 --- /dev/null +++ b/iphone/Maps/Images.xcassets/Place Page/ic_placepage_self_service.imageset/ic_placepage_self_service.svg @@ -0,0 +1,3 @@ + + + diff --git a/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift b/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift index a0fdddd9aa..3481eb7c55 100644 --- a/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift +++ b/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift @@ -127,6 +127,8 @@ class PlacePageInfoViewController: UIViewController { private var openWithAppView: InfoItemViewController? private var capacityView: InfoItemViewController? private var wheelchairView: InfoItemViewController? + private var selfServiceView: InfoItemViewController? + private var outdoorSeatingView: InfoItemViewController? private var driveThroughView: InfoItemViewController? var placePageInfoData: PlacePageInfoData! @@ -251,6 +253,14 @@ class PlacePageInfoViewController: UIViewController { wheelchairView = createInfoItem(wheelchair, icon: UIImage(named: "ic_placepage_wheelchair")) } + if let selfService = placePageInfoData.selfService { + selfServiceView = createInfoItem(selfService, icon: UIImage(named: "ic_placepage_self_service")) + } + + if let outdoorSeating = placePageInfoData.outdoorSeating { + outdoorSeatingView = createInfoItem(outdoorSeating, icon: UIImage(named: "ic_placepage_outdoor_seating")) + } + if let driveThrough = placePageInfoData.driveThrough { driveThroughView = createInfoItem(driveThrough, icon: UIImage(named: "ic_placepage_drive_through")) } -- 2.45.3 From e5a8dc4b9009a6b7bcb2d7d31cffff5bf6db7cbe Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Sun, 11 Aug 2024 14:48:03 +0400 Subject: [PATCH 11/38] [strings] add self_service and outdoor_seating to ios Signed-off-by: Kiryl Kaveryn --- data/strings/strings.txt | 2 +- data/strings/types_strings.txt | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/data/strings/strings.txt b/data/strings/strings.txt index 2281209a7e..1ee733069e 100644 --- a/data/strings/strings.txt +++ b/data/strings/strings.txt @@ -31115,7 +31115,7 @@ [outdoor_seating] comment = To indicate if restaurant or other place has outdoor seating - tags = android + tags = android,ios en = Outdoor seating af = Buitelug sitplek ar = مقاعد خارجية diff --git a/data/strings/types_strings.txt b/data/strings/types_strings.txt index 4a7d008856..c0f20edbc5 100644 --- a/data/strings/types_strings.txt +++ b/data/strings/types_strings.txt @@ -32238,7 +32238,6 @@ zh-Hant = 收藏品 [type.self_service.yes] - tags = android en = Self-service available af = Selfbediening beskikbaar ar = الخدمة الذاتية متاحة @@ -32283,7 +32282,6 @@ zh-Hant = 提供自助服務 [type.self_service.only] - tags = android en = Self-service only af = Slegs selfbediening ar = الخدمة الذاتية فقط @@ -32328,7 +32326,6 @@ zh-Hant = 僅限自助服務 [type.self_service.partially] - tags = android en = Partial self-service af = Gedeeltelike selfbediening ar = خدمة ذاتية جزئية @@ -32373,7 +32370,6 @@ zh-Hant = 部分自助服務 [type.self_service.no] - tags = android en = No self-service af = Geen selfbediening nie ar = لا توجد خدمة ذاتية -- 2.45.3 From 532893c6955b46c64cbf53b0d4b542d8e93fff6d Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Sun, 11 Aug 2024 14:48:22 +0400 Subject: [PATCH 12/38] [strings] regenerate Signed-off-by: Kiryl Kaveryn --- .../LocalizedStrings/ar.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/az.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/be.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/bg.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/ca.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/cs.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/da.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/de.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/el.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/en-GB.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/en.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/es-MX.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/es.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/et.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/eu.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/fa.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/fi.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/fr.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/he.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/hi.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/hu.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/id.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/it.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/ja.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/ko.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/mr.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/nb.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/nl.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/pl.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/pt-BR.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/pt.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/ro.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/ru.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/sk.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/sv.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/sw.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/th.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/tr.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/uk.lproj/Localizable.strings | 11 +++++++++++ .../LocalizedStrings/vi.lproj/Localizable.strings | 11 +++++++++++ .../zh-Hans.lproj/Localizable.strings | 11 +++++++++++ .../zh-Hant.lproj/Localizable.strings | 11 +++++++++++ 42 files changed, 462 insertions(+) diff --git a/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings index 0cd30f98aa..942d872321 100644 --- a/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "فتح في تطبيق آخر"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "مقاعد خارجية"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "مزاد علني"; "type.shop.collector" = "مقتنيات"; + +"type.self_service.yes" = "الخدمة الذاتية متاحة"; + +"type.self_service.only" = "الخدمة الذاتية فقط"; + +"type.self_service.partially" = "خدمة ذاتية جزئية"; + +"type.self_service.no" = "لا توجد خدمة ذاتية"; diff --git a/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings index 3f1f41b0b7..e46aaf8479 100644 --- a/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Başqa Tətbiqdə Açın"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Çöldə oturma"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Hərrac"; "type.shop.collector" = "Kolleksiya əşyaları"; + +"type.self_service.yes" = "Özünə xidmət mövcuddur"; + +"type.self_service.only" = "Yalnız özünə xidmət"; + +"type.self_service.partially" = "Qismən özünəxidmət"; + +"type.self_service.no" = "Özünə xidmət yoxdur"; diff --git a/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings index 964425b69b..59b516d43f 100644 --- a/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Адкрыць у іншай прыладзе"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Месцы на адкрытым паветры"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Аўкцыён"; "type.shop.collector" = "Калекцыйныя прадметы"; + +"type.self_service.yes" = "Маецца самаабслугоўванне"; + +"type.self_service.only" = "Толькі самаабслугоўванне"; + +"type.self_service.partially" = "Частковае самаабслугоўванне"; + +"type.self_service.no" = "Няма самаабслугоўвання"; diff --git a/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings index 8888343da4..2f9a583b81 100644 --- a/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Отваряне в друго приложение"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Места за сядане на открито"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Търг"; "type.shop.collector" = "Колекционерски стоки"; + +"type.self_service.yes" = "Налично е самообслужване"; + +"type.self_service.only" = "Само на самообслужване"; + +"type.self_service.partially" = "Частично самообслужване"; + +"type.self_service.no" = "Няма самообслужване"; diff --git a/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings index 6c27e39fa5..2f1a471414 100644 --- a/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Obre en una altra aplicació"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Seients a l'aire lliure"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Subhasta"; "type.shop.collector" = "Col·leccionables"; + +"type.self_service.yes" = "Autoservei disponible"; + +"type.self_service.only" = "Només autoservei"; + +"type.self_service.partially" = "Autoservei parcial"; + +"type.self_service.no" = "Sense autoservei"; diff --git a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings index 79b76926ff..4768a45fc8 100644 --- a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Otevřít v jiné aplikaci"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Venkovní posezení"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Aukce"; "type.shop.collector" = "Sběratelské předměty"; + +"type.self_service.yes" = "K dispozici je samoobsluha"; + +"type.self_service.only" = "Pouze samoobsluha"; + +"type.self_service.partially" = "Částečná samoobsluha"; + +"type.self_service.no" = "Žádná samoobsluha"; diff --git a/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings index 3570cd6244..3398bc53bf 100644 --- a/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Åbn i en anden app"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Udendørs siddepladser"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Auktion"; "type.shop.collector" = "Samlerobjekter"; + +"type.self_service.yes" = "Selvbetjening tilgængelig"; + +"type.self_service.only" = "Kun selvbetjening"; + +"type.self_service.partially" = "Delvis selvbetjening"; + +"type.self_service.no" = "Ingen selvbetjening"; diff --git a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings index 45301c6a2f..7af4407ebc 100644 --- a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "In einer anderen App öffnen"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Sitzplätze im Freien"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Auktion"; "type.shop.collector" = "Sammlerstücke"; + +"type.self_service.yes" = "Selbstbedienung verfügbar"; + +"type.self_service.only" = "Nur Selbstbedienung"; + +"type.self_service.partially" = "Teilweise Selbstbedienung"; + +"type.self_service.no" = "Keine Selbstbedienung"; diff --git a/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings index c210608358..dbf59d375c 100644 --- a/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Άνοιγμα σε άλλη εφαρμογή"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Εξωτερικά καθίσματα"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Δημοπρασία"; "type.shop.collector" = "Συλλεκτικά αντικείμενα"; + +"type.self_service.yes" = "Διαθέσιμη αυτοεξυπηρέτηση"; + +"type.self_service.only" = "Μόνο αυτοεξυπηρέτηση"; + +"type.self_service.partially" = "Μερική αυτοεξυπηρέτηση"; + +"type.self_service.no" = "Δεν υπάρχει αυτοεξυπηρέτηση"; diff --git a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings index 0bbf1f28be..a4548d650c 100644 --- a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Open In Another App"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Outdoor seating"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Auction"; "type.shop.collector" = "Collectables"; + +"type.self_service.yes" = "Self-service available"; + +"type.self_service.only" = "Self-service only"; + +"type.self_service.partially" = "Partial self-service"; + +"type.self_service.no" = "No self-service"; diff --git a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings index f03a6b3146..c6849a4421 100644 --- a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Open In Another App"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Outdoor seating"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Auction"; "type.shop.collector" = "Collectables"; + +"type.self_service.yes" = "Self-service available"; + +"type.self_service.only" = "Self-service only"; + +"type.self_service.partially" = "Partial self-service"; + +"type.self_service.no" = "No self-service"; diff --git a/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings index 1234fcb3c8..80a815bdc3 100644 --- a/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Abrir en otra aplicación"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Asientos al aire libre"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Subasta"; "type.shop.collector" = "Coleccionables"; + +"type.self_service.yes" = "Autoservicio disponible"; + +"type.self_service.only" = "Sólo autoservicio"; + +"type.self_service.partially" = "Autoservicio parcial"; + +"type.self_service.no" = "Sin autoservicio"; diff --git a/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings index f0b6dd4c6b..f4ce8f27dc 100644 --- a/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Abrir en otra aplicación"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Asientos al aire libre"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Subasta"; "type.shop.collector" = "Coleccionables"; + +"type.self_service.yes" = "Autoservicio disponible"; + +"type.self_service.only" = "Sólo autoservicio"; + +"type.self_service.partially" = "Autoservicio parcial"; + +"type.self_service.no" = "Sin autoservicio"; diff --git a/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings index c8928b21c9..7d7f5832f9 100644 --- a/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Avatud teises rakenduses"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Istekohad õues"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Oksjon"; "type.shop.collector" = "Kollektsioneeritavad esemed"; + +"type.self_service.yes" = "Iseteenindus saadaval"; + +"type.self_service.only" = "Ainult iseteenindus"; + +"type.self_service.partially" = "Osaline iseteenindus"; + +"type.self_service.no" = "Iseteenindus puudub"; diff --git a/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings index f903a1cc81..0a3f8f577e 100644 --- a/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Ireki beste aplikazio batean"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Kanpoko eserlekuak"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Enkantea"; "type.shop.collector" = "Bildumagarriak"; + +"type.self_service.yes" = "Autozerbitzua eskuragarri"; + +"type.self_service.only" = "Autozerbitzua soilik"; + +"type.self_service.partially" = "Autozerbitzu partziala"; + +"type.self_service.no" = "Autozerbitzurik ez"; diff --git a/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings index d4bd7b8593..55efec2a00 100644 --- a/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "در یک برنامه دیگر باز کنید"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "نشستن در فضای باز"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "حراج"; "type.shop.collector" = "کلکسیونی ها"; + +"type.self_service.yes" = "سلف سرویس در دسترس است"; + +"type.self_service.only" = "فقط سلف سرویس"; + +"type.self_service.partially" = "سلف سرویس جزئی"; + +"type.self_service.no" = "بدون سلف سرویس"; diff --git a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings index 8a7b0cf6ec..6a695d8b85 100644 --- a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Avaa toisessa sovelluksessa"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Ulkona istuminen"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Huutokauppa"; "type.shop.collector" = "Keräilyesineet"; + +"type.self_service.yes" = "Itsepalvelu saatavilla"; + +"type.self_service.only" = "Vain itsepalvelu"; + +"type.self_service.partially" = "Osittainen itsepalvelu"; + +"type.self_service.no" = "Ei itsepalvelua"; diff --git a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings index cbc91c3616..b80eebd5ca 100644 --- a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Ouvrir dans une autre application"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Places en terrasse"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Vente aux enchères"; "type.shop.collector" = "Objets de collection"; + +"type.self_service.yes" = "Libre-service disponible"; + +"type.self_service.only" = "En libre-service uniquement"; + +"type.self_service.partially" = "En libre-service partiellement"; + +"type.self_service.no" = "Pas en libre-service"; diff --git a/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings index c65246b178..985d0bb52d 100644 --- a/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "פתח באפליקציה אחרת"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "ישיבה בחוץ"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "מכירה פומבית"; "type.shop.collector" = "פריטי אספנות"; + +"type.self_service.yes" = "שירות עצמי זמין"; + +"type.self_service.only" = "שירות עצמי בלבד"; + +"type.self_service.partially" = "שירות עצמי חלקי"; + +"type.self_service.no" = "אין שירות עצמי"; diff --git a/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings index 9c6bfd3b9f..d8586dff22 100644 --- a/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "किसी अन्य ऐप में खोलें"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "घर के बाहर बैठने"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Auction"; "type.shop.collector" = "Collectables"; + +"type.self_service.yes" = "स्व-सेवा उपलब्ध है"; + +"type.self_service.only" = "केवल स्व-सेवा"; + +"type.self_service.partially" = "आंशिक स्व-सेवा"; + +"type.self_service.no" = "कोई स्व-सेवा नहीं"; diff --git a/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings index dc95156184..d8d9685785 100644 --- a/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Megnyitás egy másik alkalmazásban"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Kültéri ülőhelyek"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Aukció"; "type.shop.collector" = "Gyűjthető tárgyak"; + +"type.self_service.yes" = "Önkiszolgálás elérhető"; + +"type.self_service.only" = "Csak önkiszolgálás"; + +"type.self_service.partially" = "Részleges önkiszolgálás"; + +"type.self_service.no" = "Nincs önkiszolgálás"; diff --git a/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings index 541cc25f08..230ac4129d 100644 --- a/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Buka di Aplikasi Lain"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Tempat duduk di luar ruangan"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Lelang"; "type.shop.collector" = "Barang koleksi"; + +"type.self_service.yes" = "Tersedia layanan mandiri"; + +"type.self_service.only" = "Hanya layanan mandiri"; + +"type.self_service.partially" = "Layanan mandiri sebagian"; + +"type.self_service.no" = "Tidak ada layanan mandiri"; diff --git a/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings index dde6d40b72..148efcce51 100644 --- a/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Apri in un'altra applicazione"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Posti a sedere all'aperto"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Asta"; "type.shop.collector" = "Oggetti da collezione"; + +"type.self_service.yes" = "Disponibile in self-service"; + +"type.self_service.only" = "Solo self-service"; + +"type.self_service.partially" = "Self-service parziale"; + +"type.self_service.no" = "Nessun self-service"; diff --git a/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings index cff9fe46cf..261e1a5e15 100644 --- a/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "別のアプリで開く"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "屋外席"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "オークション"; "type.shop.collector" = "コレクタブル"; + +"type.self_service.yes" = "セルフサービス可能"; + +"type.self_service.only" = "セルフサービスのみ"; + +"type.self_service.partially" = "一部セルフサービス"; + +"type.self_service.no" = "セルフサービスはない"; diff --git a/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings index e25837955c..66339e1fcc 100644 --- a/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "다른 앱에서 열기"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "야외 좌석"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "경매"; "type.shop.collector" = "수집품"; + +"type.self_service.yes" = "셀프 서비스 사용 가능"; + +"type.self_service.only" = "셀프 서비스 전용"; + +"type.self_service.partially" = "부분 셀프 서비스"; + +"type.self_service.no" = "셀프 서비스 없음"; diff --git a/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings index a1547d9d9f..f4c47d154b 100644 --- a/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "दुसऱ्या ॲपमध्ये उघडा"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "बाहेरची आसनव्यवस्था nb = Uteservering"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "लिलाव"; "type.shop.collector" = "संग्रहणीय वस्तू"; + +"type.self_service.yes" = "स्वयं-सेवा उपलब्ध"; + +"type.self_service.only" = "फक्त स्व-सेवा"; + +"type.self_service.partially" = "आंशिक स्व-सेवा"; + +"type.self_service.no" = "स्व-सेवा नाही"; diff --git a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings index f90a0adc83..b332671709 100644 --- a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Åpne i en annen app"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Outdoor seating"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Auksjon"; "type.shop.collector" = "Samleobjekter"; + +"type.self_service.yes" = "Selvbetjening tilgjengelig"; + +"type.self_service.only" = "Kun selvbetjening"; + +"type.self_service.partially" = "Delvis selvbetjening"; + +"type.self_service.no" = "Ingen selvbetjening"; diff --git a/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings index e09d642a25..fd7f3c0bb7 100644 --- a/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Openen in een andere app"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Zitplaatsen buiten"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Veiling"; "type.shop.collector" = "Verzamelobjecten"; + +"type.self_service.yes" = "Zelfbediening beschikbaar"; + +"type.self_service.only" = "Alleen zelfbediening"; + +"type.self_service.partially" = "Gedeeltelijke zelfbediening"; + +"type.self_service.no" = "Geen zelfbediening"; diff --git a/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings index 3fd1c1a4cb..1a89251c05 100644 --- a/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Otwórz w innej aplikacji"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Siedzenia na zewnątrz"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Dom aukcyjny"; "type.shop.collector" = "Przedmioty kolekcjonerskie"; + +"type.self_service.yes" = "Dostępna samoobsługa"; + +"type.self_service.only" = "Tylko samoobsługa"; + +"type.self_service.partially" = "Częściowa samoobsługa"; + +"type.self_service.no" = "Brak samoobsługi"; diff --git a/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings index 2e2a45d29f..0206d6baea 100644 --- a/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Abrir em outro aplicativo"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Assentos ao ar livre"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Leilão"; "type.shop.collector" = "Colecionáveis"; + +"type.self_service.yes" = "Autoatendimento disponível"; + +"type.self_service.only" = "Somente autoatendimento"; + +"type.self_service.partially" = "Autoatendimento parcial"; + +"type.self_service.no" = "Sem autoatendimento"; diff --git a/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings index 6f35ea5f2f..7e3b097fc9 100644 --- a/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Abrir noutra aplicação"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Assentos ao ar livre"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Leilão"; "type.shop.collector" = "Objectos de colecção"; + +"type.self_service.yes" = "Auto-atendimento disponível"; + +"type.self_service.only" = "Somente autosserviço"; + +"type.self_service.partially" = "Autosserviço parcial"; + +"type.self_service.no" = "Sem autosserviço"; diff --git a/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings index 02bfc653e3..ba0bf36183 100644 --- a/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Deschidere în altă aplicație"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Scaune în aer liber"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Licitație"; "type.shop.collector" = "Colecții"; + +"type.self_service.yes" = "Autoservire disponibilă"; + +"type.self_service.only" = "Numai autoservire"; + +"type.self_service.partially" = "Autoservire parțială"; + +"type.self_service.no" = "Fără autoservire"; diff --git a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings index f7be3a0c89..b679c30c7a 100644 --- a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Открыть в другом приложении"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Сидения на открытом воздухе"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Аукцион"; "type.shop.collector" = "Коллекции"; + +"type.self_service.yes" = "Самообслуживание доступно"; + +"type.self_service.only" = "Только самообслуживание"; + +"type.self_service.partially" = "Частичное самообслуживание"; + +"type.self_service.no" = "Никакого самообслуживания"; diff --git a/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings index a3f5d20f3c..0ca8c35687 100644 --- a/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Otvoriť v inej aplikácii"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Vonkajšie sedenie"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Aukcia"; "type.shop.collector" = "Zberateľské predmety"; + +"type.self_service.yes" = "K dispozícii je samoobsluha"; + +"type.self_service.only" = "Len samoobslužné služby"; + +"type.self_service.partially" = "Čiastočná samoobsluha"; + +"type.self_service.no" = "Žiadna samoobsluha"; diff --git a/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings index cc9c424c68..7eba6bfdbe 100644 --- a/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Öppna i en annan app"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Sittplatser utomhus"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Auktion"; "type.shop.collector" = "Samlingsföremål"; + +"type.self_service.yes" = "Självbetjäning tillgänglig"; + +"type.self_service.only" = "Endast självbetjäning"; + +"type.self_service.partially" = "Delvis självbetjäning"; + +"type.self_service.no" = "Ingen självbetjäning"; diff --git a/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings index 054e7f1290..94bfceba61 100644 --- a/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Fungua Katika Programu Nyingine"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Viti vya nje"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Mnada"; "type.shop.collector" = "Mikusanyiko"; + +"type.self_service.yes" = "Huduma ya kibinafsi inapatikana"; + +"type.self_service.only" = "Kujihudumia pekee"; + +"type.self_service.partially" = "Kujihudumia kwa sehemu"; + +"type.self_service.no" = "Hakuna huduma binafsi"; diff --git a/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings index 2411ebd6b8..ac37bd50e8 100644 --- a/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "เปิดในแอปอื่น"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "ที่นั่งกลางแจ้ง"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "ประมูล"; "type.shop.collector" = "ของสะสม"; + +"type.self_service.yes" = "มีบริการด้วยตนเอง"; + +"type.self_service.only" = "บริการตนเองเท่านั้น"; + +"type.self_service.partially" = "การบริการตนเองบางส่วน"; + +"type.self_service.no" = "ไม่มีบริการตนเอง"; diff --git a/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings index 6918f62257..93217df099 100644 --- a/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Başka Bir Uygulamada Aç"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Açık oturma alanı"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Müzayede"; "type.shop.collector" = "Koleksiyon eşyaları"; + +"type.self_service.yes" = "Self servis mevcut"; + +"type.self_service.only" = "Yalnızca self servis"; + +"type.self_service.partially" = "Kısmi self servis"; + +"type.self_service.no" = "Self servis yok"; diff --git a/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings index f6a991906d..d457ba15dc 100644 --- a/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Відкрити в іншій програмі"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Сидіння на відкритому повітрі"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Аукціон"; "type.shop.collector" = "Колекційні речі"; + +"type.self_service.yes" = "Доступне самообслуговування"; + +"type.self_service.only" = "Тільки самообслуговування"; + +"type.self_service.partially" = "Часткове самообслуговування"; + +"type.self_service.no" = "Самообслуговування відсутнє"; diff --git a/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings index 24615391bb..de5f4b76c3 100644 --- a/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "Mở trong ứng dụng khác"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "Chỗ ngồi ngoài trời"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "Bán đấu giá"; "type.shop.collector" = "Đồ sưu tầm"; + +"type.self_service.yes" = "Có sẵn dịch vụ tự phục vụ"; + +"type.self_service.only" = "Chỉ tự phục vụ"; + +"type.self_service.partially" = "Tự phục vụ một phần"; + +"type.self_service.no" = "Không tự phục vụ"; diff --git a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings index d096220d97..fab41fff02 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "在另一个应用程序中打开"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "室外座位"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "拍卖会"; "type.shop.collector" = "收藏品"; + +"type.self_service.yes" = "提供自助服务"; + +"type.self_service.only" = "仅限自助服务"; + +"type.self_service.partially" = "部分自助服务"; + +"type.self_service.no" = "无自助服务"; diff --git a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings index faceb05101..73c06b02f6 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings @@ -1368,6 +1368,9 @@ /* Title for the "Open In Another App" button on the PlacePage. */ "open_in_app" = "在另一個應用程式中打開"; +/* To indicate if restaurant or other place has outdoor seating */ +"outdoor_seating" = "戶外座位"; + /********** Types **********/ @@ -3980,3 +3983,11 @@ "type.shop.auction" = "拍賣"; "type.shop.collector" = "收藏品"; + +"type.self_service.yes" = "提供自助服務"; + +"type.self_service.only" = "僅限自助服務"; + +"type.self_service.partially" = "部分自助服務"; + +"type.self_service.no" = "沒有自助服務"; -- 2.45.3 From 1db5a0a1ca036a5b0cd9ddfd6795dfa8b315850a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20W=C3=BCthrich?= Date: Wed, 7 Aug 2024 12:33:06 -0600 Subject: [PATCH 13/38] Revert "[cherry] [MAPSME-5105] [ios] Fixed high cpu load in background." MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit b88a36a48c8a27539a1fbbb7bd40b3918dfda696. Signed-off-by: Fabian Wüthrich --- iphone/Maps/Core/Location/MWMLocationManager.mm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/iphone/Maps/Core/Location/MWMLocationManager.mm b/iphone/Maps/Core/Location/MWMLocationManager.mm index f09477dbf1..5e40208862 100644 --- a/iphone/Maps/Core/Location/MWMLocationManager.mm +++ b/iphone/Maps/Core/Location/MWMLocationManager.mm @@ -226,7 +226,6 @@ void setShowLocationAlert(BOOL needShow) { + (void)applicationDidBecomeActive { [self start]; - [[self manager] updateFrameworkInfo]; } + (void)applicationWillResignActive @@ -594,10 +593,8 @@ void setShowLocationAlert(BOOL needShow) { - (void)updateFrameworkInfo { auto app = UIApplication.sharedApplication; - if (app.applicationState != UIApplicationStateActive) - return; auto delegate = static_cast(app.delegate); - if (delegate.isDrapeEngineCreated) + if (delegate.isDrapeEngineCreated && app.applicationState == UIApplicationStateActive) { auto & f = GetFramework(); if (self.frameworkUpdateMode & MWMLocationFrameworkUpdateLocation) -- 2.45.3 From ced00b9df9665aa1cd78b523f2c71afdf626d9e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20W=C3=BCthrich?= Date: Wed, 7 Aug 2024 12:34:24 -0600 Subject: [PATCH 14/38] [ios] Allow location update when app is in background MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The app is configured to update the GPS location in the background but this information is not passed to the framework. With this commit the GPS location is passed to the framework even when the app is in background. This results in a higher battery usage if there is an active route but the battery usage will remain the same if no route is active because the GPS location is not updated. Close #6940 Signed-off-by: Fabian Wüthrich --- iphone/Maps/Core/Location/MWMLocationManager.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iphone/Maps/Core/Location/MWMLocationManager.mm b/iphone/Maps/Core/Location/MWMLocationManager.mm index 5e40208862..c7ea911c29 100644 --- a/iphone/Maps/Core/Location/MWMLocationManager.mm +++ b/iphone/Maps/Core/Location/MWMLocationManager.mm @@ -594,7 +594,7 @@ void setShowLocationAlert(BOOL needShow) { { auto app = UIApplication.sharedApplication; auto delegate = static_cast(app.delegate); - if (delegate.isDrapeEngineCreated && app.applicationState == UIApplicationStateActive) + if (delegate.isDrapeEngineCreated) { auto & f = GetFramework(); if (self.frameworkUpdateMode & MWMLocationFrameworkUpdateLocation) -- 2.45.3 From 11bd259731dd1ee1850d73e69ced89172b549dc8 Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Tue, 23 Jul 2024 13:15:48 +0400 Subject: [PATCH 15/38] [ios] prevent from selecting disabled menu cells Signed-off-by: Kiryl Kaveryn --- iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift | 7 +++++++ .../Maps/UI/BottomMenu/Menu/Cells/BottomMenuItemCell.swift | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift index 6eeb9b8495..0d2aae18d6 100644 --- a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift +++ b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift @@ -88,6 +88,13 @@ extension BottomMenuPresenter { //MARK: -- UITableDelegate extension BottomMenuPresenter { + func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { + if let cell = tableView.cellForRow(at: indexPath) as? BottomMenuItemCell { + return cell.isEnabled ? indexPath : nil + } + return indexPath + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard indexPath.section == Sections.items.rawValue else { return diff --git a/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuItemCell.swift b/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuItemCell.swift index b59332d089..f490b8615f 100644 --- a/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuItemCell.swift +++ b/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuItemCell.swift @@ -14,7 +14,7 @@ class BottomMenuItemCell: UITableViewCell { } } - private var isEnabled: Bool = true + private(set) var isEnabled: Bool = true private var isPromo: Bool = false func configure(imageName: String, title: String, badgeCount: UInt, enabled: Bool) { -- 2.45.3 From 9228c52ed635cfb6813fd7f8858f4b7aa3b3dd10 Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Tue, 23 Jul 2024 19:51:34 +0400 Subject: [PATCH 16/38] [core] [map] [ios] fix the `CanEditMap` logic to add places only to the downloaded and updated maps Signed-off-by: Kiryl Kaveryn --- .../CoreApi/Framework/MWMFrameworkHelper.h | 2 +- .../CoreApi/Framework/MWMFrameworkHelper.mm | 5 ++-- .../Common/PlacePageButtonsData.h | 4 ++- .../Common/PlacePageButtonsData.mm | 5 ++-- .../MWMMapViewControlsManager.mm | 4 +-- .../BottomMenu/Menu/BottomMenuPresenter.swift | 2 +- .../PlacePageButtonsViewController.swift | 20 ++----------- .../Layouts/PlacePageCommonLayout.swift | 1 - map/framework.cpp | 14 ++++----- map/framework.hpp | 4 +-- map/place_page_info.cpp | 7 ++--- map/place_page_info.hpp | 4 ++- platform/mwm_version.cpp | 10 ------- platform/mwm_version.hpp | 2 -- storage/storage.cpp | 30 +++++++++++++++++++ storage/storage.hpp | 3 ++ 16 files changed, 61 insertions(+), 56 deletions(-) diff --git a/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.h b/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.h index 68c101950c..1f0d5c170f 100644 --- a/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.h +++ b/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.h @@ -34,7 +34,7 @@ NS_SWIFT_NAME(FrameworkHelper) + (void)searchInDownloader:(NSString *)query inputLocale:(NSString *)locale completion:(SearchInDownloaderCompletions)completion; -+ (BOOL)canEditMap; ++ (BOOL)canEditMapAtViewportCenter; + (void)showOnMap:(MWMMarkGroupID)categoryId; + (void)showBookmark:(MWMMarkID)bookmarkId; + (void)showTrack:(MWMTrackID)trackId; diff --git a/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.mm b/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.mm index 5fb128f9f4..6581a9cdd5 100644 --- a/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.mm +++ b/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.mm @@ -162,8 +162,9 @@ GetFramework().GetSearchAPI().SearchInDownloader(std::move(params)); } -+ (BOOL)canEditMap { - return GetFramework().CanEditMap(); ++ (BOOL)canEditMapAtViewportCenter { + auto const &f = GetFramework(); + return f.CanEditMapForPosition(f.GetViewportCenter()); } + (void)showOnMap:(MWMMarkGroupID)categoryId { diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.h index 7671c0bc6f..14d3574fcf 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.h @@ -6,7 +6,9 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, readonly) BOOL showAddPlace; @property(nonatomic, readonly) BOOL showEditPlace; -@property(nonatomic, readonly) BOOL showAddBusiness; + +@property(nonatomic, readonly) BOOL enableAddPlace; +@property(nonatomic, readonly) BOOL enableEditPlace; @end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm index 96248894d1..9155eeab3a 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm @@ -11,8 +11,9 @@ if (self) { _showAddPlace = rawData.ShouldShowAddPlace(); _showEditPlace = rawData.ShouldShowEditPlace(); - _showAddBusiness = rawData.ShouldShowAddBusiness(); - if (_showAddPlace || _showEditPlace || _showAddBusiness) + _enableAddPlace = rawData.ShouldEnableAddPlace(); + _enableEditPlace = rawData.ShouldEnableEditPlace(); + if (_showAddPlace || _showEditPlace || _enableAddPlace || _enableEditPlace) return self; } return nil; diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm index cb5147d275..652404be7d 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm @@ -148,9 +148,7 @@ NSString *const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue"; applyPosition:hasPoint position:point doneBlock:^{ - auto &f = GetFramework(); - - if (IsPointCoveredByDownloadedMaps(f.GetViewportCenter(), f.GetStorage(), f.GetCountryInfoGetter())) + if ([MWMFrameworkHelper canEditMapAtViewportCenter]) [ownerController performSegueWithIdentifier:kMapToCategorySelectorSegue sender:nil]; else [ownerController.alertController presentIncorrectFeauturePositionAlert]; diff --git a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift index 0d2aae18d6..be87f1c2aa 100644 --- a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift +++ b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift @@ -59,7 +59,7 @@ extension BottomMenuPresenter { let cell = tableView.dequeueReusableCell(cell: BottomMenuItemCell.self)! switch CellType(rawValue: correctedRow(indexPath.row))! { case .addPlace: - let enabled = MWMNavigationDashboardManager.shared().state == .hidden && FrameworkHelper.canEditMap() + let enabled = MWMNavigationDashboardManager.shared().state == .hidden && FrameworkHelper.canEditMapAtViewportCenter() cell.configure(imageName: "ic_add_place", title: L("placepage_add_place_button"), badgeCount: 0, diff --git a/iphone/Maps/UI/PlacePage/Components/PlacePageButtonsViewController.swift b/iphone/Maps/UI/PlacePage/Components/PlacePageButtonsViewController.swift index 434f7f6fe1..94fe524a30 100644 --- a/iphone/Maps/UI/PlacePage/Components/PlacePageButtonsViewController.swift +++ b/iphone/Maps/UI/PlacePage/Components/PlacePageButtonsViewController.swift @@ -1,18 +1,13 @@ protocol PlacePageButtonsViewControllerDelegate: AnyObject { - func didPressHotels() func didPressAddPlace() func didPressEditPlace() - func didPressAddBusiness() } class PlacePageButtonsViewController: UIViewController { -// @IBOutlet var bookingButton: UIButton! @IBOutlet var addPlaceButton: UIButton! @IBOutlet var editPlaceButton: UIButton! -// @IBOutlet var addBusinessButton: UIButton! private var buttons: [UIButton?] { -// [bookingButton, addPlaceButton, editPlaceButton, addBusinessButton] [addPlaceButton, editPlaceButton] } @@ -30,18 +25,11 @@ class PlacePageButtonsViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() -// bookingButton.isHidden = !buttonsData.showHotelDescription addPlaceButton.isHidden = !buttonsData.showAddPlace editPlaceButton.isHidden = !buttonsData.showEditPlace -// addBusinessButton.isHidden = !buttonsData.showAddBusiness - buttons.forEach { - $0?.isEnabled = buttonsEnabled - } - } - - @IBAction func onBooking(_ sender: UIButton) { - delegate?.didPressHotels() + addPlaceButton.isEnabled = buttonsData.enableAddPlace + editPlaceButton.isEnabled = buttonsData.enableEditPlace } @IBAction func onAddPlace(_ sender: UIButton) { @@ -51,8 +39,4 @@ class PlacePageButtonsViewController: UIViewController { @IBAction func onEditPlace(_ sender: UIButton) { delegate?.didPressEditPlace() } - - @IBAction func onAddBusiness(_ sender: UIButton) { - delegate?.didPressAddBusiness() - } } diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageCommonLayout.swift b/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageCommonLayout.swift index 9f230375bd..f15f7f85d1 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageCommonLayout.swift +++ b/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageCommonLayout.swift @@ -70,7 +70,6 @@ class PlacePageCommonLayout: NSObject, IPlacePageLayout { lazy var buttonsViewController: PlacePageButtonsViewController = { let vc = storyboard.instantiateViewController(ofType: PlacePageButtonsViewController.self) vc.buttonsData = placePageData.buttonsData! - vc.buttonsEnabled = placePageData.mapNodeAttributes?.nodeStatus == .onDisk vc.delegate = interactor return vc } () diff --git a/map/framework.cpp b/map/framework.cpp index 2d6e1abf70..7725336e68 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -15,6 +15,7 @@ #include "search/engine.hpp" #include "search/locality_finder.hpp" +#include "storage/storage.hpp" #include "storage/country_info_getter.hpp" #include "storage/storage_helpers.hpp" @@ -653,7 +654,7 @@ void Framework::FillNotMatchedPlaceInfo(place_page::Info & info, m2::PointD cons info.SetCustomNameWithCoordinates(mercator, m_stringsBundle.GetString("core_placepage_unknown_place")); else info.SetCustomName(customTitle); - info.SetCanEditOrAdd(CanEditMap()); + info.SetCanEditOrAdd(CanEditMapForPosition(mercator)); info.SetMercator(mercator); } @@ -679,11 +680,9 @@ void Framework::FillInfoFromFeatureType(FeatureType & ft, place_page::Info & inf FillDescription(ft, info); auto const mwmInfo = ft.GetID().m_mwmId.GetInfo(); - bool const isMapVersionEditable = mwmInfo && mwmInfo->m_version.IsEditableMap(); - bool const canEditOrAdd = featureStatus != FeatureStatus::Obsolete && CanEditMap() && - isMapVersionEditable; + bool const isMapVersionEditable = CanEditMapForPosition(info.GetMercator()); + bool const canEditOrAdd = featureStatus != FeatureStatus::Obsolete && isMapVersionEditable; info.SetCanEditOrAdd(canEditOrAdd); - //info.SetPopularity(m_popularityLoader.Get(ft.GetID())); // Fill countryId for place page info auto const & types = info.GetTypes(); @@ -2855,9 +2854,10 @@ void SetHostingBuildingAddress(FeatureID const & hostingBuildingFid, DataSource } } // namespace -bool Framework::CanEditMap() const +bool Framework::CanEditMapForPosition(m2::PointD const & position) const { - return !GetStorage().IsDownloadInProgress(); + ASSERT(m_infoGetter, ("CountryInfoGetter shouldn't be nullprt.")); + return GetStorage().IsAllowedToEditVersion(m_infoGetter->GetRegionCountryId(position)); } bool Framework::CreateMapObject(m2::PointD const & mercator, uint32_t const featureType, diff --git a/map/framework.hpp b/map/framework.hpp index 88fe446de2..e345b7d721 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -721,10 +721,8 @@ protected: void RegisterCountryFilesOnRoute(std::shared_ptr ptr) const override; public: - /// @name Editor interface. - /// Initializes feature for Create Object UI. /// @returns false in case when coordinate is in the ocean or mwm is not downloaded. - bool CanEditMap() const; + bool CanEditMapForPosition(m2::PointD const & position) const; bool CreateMapObject(m2::PointD const & mercator, uint32_t const featureType, osm::EditableMapObject & emo) const; /// @returns false if feature is invalid or can't be edited. diff --git a/map/place_page_info.cpp b/map/place_page_info.cpp index 6df6943a4a..9242e62994 100644 --- a/map/place_page_info.cpp +++ b/map/place_page_info.cpp @@ -29,7 +29,7 @@ bool Info::IsBookmark() const bool Info::ShouldShowAddPlace() const { auto const isPointOrBuilding = IsPointType() || IsBuilding(); - return m_canEditOrAdd && !(IsFeature() && isPointOrBuilding); + return !(IsFeature() && isPointOrBuilding); } void Info::SetFromFeatureType(FeatureType & ft) @@ -290,9 +290,8 @@ void Info::SetBookmarkId(kml::MarkId bookmarkId) bool Info::ShouldShowEditPlace() const { - return m_canEditOrAdd && - // TODO(mgsergio): Does IsFeature() imply !IsMyPosition()? - !IsMyPosition() && IsFeature(); + // TODO(mgsergio): Does IsFeature() imply !IsMyPosition()? + return !IsMyPosition() && IsFeature(); } kml::LocalizableString Info::FormatNewBookmarkName() const diff --git a/map/place_page_info.hpp b/map/place_page_info.hpp index 1b5479e605..4ed026198d 100644 --- a/map/place_page_info.hpp +++ b/map/place_page_info.hpp @@ -113,9 +113,11 @@ public: /// Edit and add bool ShouldShowAddPlace() const; - bool ShouldShowAddBusiness() const { return m_canEditOrAdd && IsBuilding(); } bool ShouldShowEditPlace() const; + bool ShouldEnableAddPlace() const { return m_canEditOrAdd; }; + bool ShouldEnableEditPlace() const { return m_canEditOrAdd; }; + /// @returns true if Back API button should be displayed. bool HasApiUrl() const { return !m_apiUrl.empty(); } /// TODO: Support all possible Internet types in UI. @See MapObject::GetInternet(). diff --git a/platform/mwm_version.cpp b/platform/mwm_version.cpp index 27b22ab6ab..5431d6b508 100644 --- a/platform/mwm_version.cpp +++ b/platform/mwm_version.cpp @@ -16,11 +16,6 @@ namespace version { namespace { -// Editing maps older than approximately two months old is disabled, since the data -// is most likely already fixed on OSM. Not limited to the latest one or two versions, -// because a user can forget to update maps after a new app version has been installed -// automatically in the background. -uint64_t constexpr kMaxSecondsTillNoEdits = 3600 * 24 * 31 * 2; char const MWM_PROLOG[] = "MWM"; } @@ -48,11 +43,6 @@ uint32_t MwmVersion::GetVersion() const return base::GenerateYYMMDD(tm.tm_year, tm.tm_mon, tm.tm_mday); } -bool MwmVersion::IsEditableMap() const -{ - return m_secondsSinceEpoch + kMaxSecondsTillNoEdits > base::SecondsSinceEpoch(); -} - std::string DebugPrint(Format f) { return "v" + strings::to_string(static_cast(f) + 1); diff --git a/platform/mwm_version.hpp b/platform/mwm_version.hpp index e7f9301010..f58944f243 100644 --- a/platform/mwm_version.hpp +++ b/platform/mwm_version.hpp @@ -43,8 +43,6 @@ public: /// \return version as YYMMDD. uint32_t GetVersion() const; - bool IsEditableMap() const; - /// @name Used in tests only. /// @{ void SetFormat(Format format) { m_format = format; } diff --git a/storage/storage.cpp b/storage/storage.cpp index 208efc4661..6c8d12a895 100644 --- a/storage/storage.cpp +++ b/storage/storage.cpp @@ -23,6 +23,7 @@ #include "base/logging.hpp" #include "base/stl_helpers.hpp" #include "base/string_utils.hpp" +#include "base/timer.hpp" #include "defines.hpp" @@ -42,6 +43,16 @@ namespace { string const kDownloadQueueKey = "DownloadQueue"; + +// Editing maps older than approximately three months old is disabled, since the data +// is most likely already fixed on OSM. Not limited to the latest one or two versions, +// because a user can forget to update maps after a new app version has been installed +// automatically in the background. +uint64_t const kMaxSecondsTillLastVersionUpdate = 3600 * 24 * 31 * 3; +// Editing maps older than approximately six months old is disabled, because the device +// may have been offline for a long time. +uint64_t const kMaxSecondsTillNoEdits = 3600 * 24 * 31 * 6; + void DeleteCountryIndexes(LocalCountryFile const & localFile) { platform::CountryIndexes::DeleteFromDisk(localFile); @@ -1269,6 +1280,25 @@ bool Storage::HasLatestVersion(CountryId const & countryId) const return CountryStatusEx(countryId) == Status::OnDisk; } +bool Storage::IsAllowedToEditVersion(CountryId const & countryId) const +{ + auto const status = CountryStatusEx(countryId); + switch (status) + { + case Status::OnDisk: return true; + case Status::OnDiskOutOfDate: + { + auto const localFile = GetLatestLocalFile(countryId); + ASSERT(localFile, ("Local file shouldn't be nullptr.")); + auto const currentVersionTime = base::YYMMDDToSecondsSinceEpoch(static_cast(m_currentVersion)); + auto const localVersionTime = base::YYMMDDToSecondsSinceEpoch(static_cast(localFile->GetVersion())); + return currentVersionTime - localVersionTime < kMaxSecondsTillLastVersionUpdate && + base::SecondsSinceEpoch() - localVersionTime < kMaxSecondsTillNoEdits; + } + default: return false; + } +} + int64_t Storage::GetVersion(CountryId const & countryId) const { CHECK_THREAD_CHECKER(m_threadChecker, ()); diff --git a/storage/storage.hpp b/storage/storage.hpp index 992b016172..92100159bc 100644 --- a/storage/storage.hpp +++ b/storage/storage.hpp @@ -378,6 +378,9 @@ public: /// \brief Returns true if the last version of countryId has been downloaded. bool HasLatestVersion(CountryId const & countryId) const; + /// \brief Returns true if the version of countryId can be used to update maps. + bool IsAllowedToEditVersion(CountryId const & countryId) const; + /// Returns version of downloaded mwm or zero. int64_t GetVersion(CountryId const & countryId) const; -- 2.45.3 From e321914ecda9208a2c86a10ca5a8bcf090ce30e0 Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Wed, 24 Jul 2024 17:19:38 +0400 Subject: [PATCH 17/38] [android] fix enabling and visibility of the Edit and App buttons on the PP Signed-off-by: Kiryl Kaveryn --- .../src/main/cpp/app/organicmaps/editor/Editor.cpp | 14 ++++++++++++-- .../main/java/app/organicmaps/editor/Editor.java | 3 ++- .../widget/placepage/PlacePageView.java | 7 ++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/android/app/src/main/cpp/app/organicmaps/editor/Editor.cpp b/android/app/src/main/cpp/app/organicmaps/editor/Editor.cpp index 50cff911bf..b126499ecb 100644 --- a/android/app/src/main/cpp/app/organicmaps/editor/Editor.cpp +++ b/android/app/src/main/cpp/app/organicmaps/editor/Editor.cpp @@ -188,13 +188,23 @@ Java_app_organicmaps_editor_Editor_nativeShouldShowAddPlace(JNIEnv *, jclass) } JNIEXPORT jboolean JNICALL -Java_app_organicmaps_editor_Editor_nativeShouldShowAddBusiness(JNIEnv *, jclass) +Java_app_organicmaps_editor_Editor_nativeShouldEnableEditPlace(JNIEnv *, jclass) { ::Framework * frm = g_framework->NativeFramework(); if (!frm->HasPlacePageInfo()) return static_cast(false); - return g_framework->GetPlacePageInfo().ShouldShowAddBusiness(); + return g_framework->GetPlacePageInfo().ShouldEnableEditPlace(); +} + +JNIEXPORT jboolean JNICALL +Java_app_organicmaps_editor_Editor_nativeShouldEnableAddPlace(JNIEnv *, jclass) +{ + ::Framework * frm = g_framework->NativeFramework(); + if (!frm->HasPlacePageInfo()) + return static_cast(false); + + return g_framework->GetPlacePageInfo().ShouldEnableAddPlace(); } JNIEXPORT jintArray JNICALL diff --git a/android/app/src/main/java/app/organicmaps/editor/Editor.java b/android/app/src/main/java/app/organicmaps/editor/Editor.java index 827d98af5a..4e359bb1aa 100644 --- a/android/app/src/main/java/app/organicmaps/editor/Editor.java +++ b/android/app/src/main/java/app/organicmaps/editor/Editor.java @@ -55,7 +55,8 @@ public final class Editor public static native boolean nativeShouldShowEditPlace(); public static native boolean nativeShouldShowAddPlace(); - public static native boolean nativeShouldShowAddBusiness(); + public static native boolean nativeShouldEnableEditPlace(); + public static native boolean nativeShouldEnableAddPlace(); @NonNull public static native int[] nativeGetEditableProperties(); diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageView.java b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageView.java index c4a5dcec67..9ff6318d50 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageView.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageView.java @@ -450,8 +450,13 @@ public class PlacePageView extends Fragment implements View.OnClickListener, else { UiUtils.showIf(Editor.nativeShouldShowEditPlace(), mEditPlace); - UiUtils.showIf(Editor.nativeShouldShowAddBusiness(), mAddOrganisation); UiUtils.showIf(Editor.nativeShouldShowAddPlace(), mAddPlace); + mEditPlace.setEnabled(Editor.nativeShouldEnableEditPlace()); + mAddPlace.setEnabled(Editor.nativeShouldEnableAddPlace()); + TextView mTvEditPlace = mEditPlace.findViewById(R.id.tv__editor); + TextView mTvAddPlace = mAddPlace.findViewById(R.id.tv__editor); + mTvEditPlace.setTextColor(Editor.nativeShouldEnableEditPlace() ? getResources().getColor(R.color.base_accent) : getResources().getColor(R.color.button_accent_text_disabled)); + mTvAddPlace.setTextColor(Editor.nativeShouldEnableEditPlace() ? getResources().getColor(R.color.base_accent) : getResources().getColor(R.color.button_accent_text_disabled)); UiUtils.showIf(UiUtils.isVisible(mEditPlace) || UiUtils.isVisible(mAddOrganisation) || UiUtils.isVisible(mAddPlace), mEditTopSpace); -- 2.45.3 From 20b0954aaf54bc3189f18825b9ad2c618612ddd9 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Thu, 8 Aug 2024 22:17:31 +0200 Subject: [PATCH 18/38] Avoid temporary std::string for brands searching Signed-off-by: Alexander Borsuk --- indexer/brands_holder.hpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/indexer/brands_holder.hpp b/indexer/brands_holder.hpp index f41463536a..877f75822e 100644 --- a/indexer/brands_holder.hpp +++ b/indexer/brands_holder.hpp @@ -40,7 +40,7 @@ public: std::set const & GetKeys() const { return m_keys; } - template void ForEachNameByKey(std::string const & key, FnT && fn) const + template void ForEachNameByKey(std::string_view key, FnT && fn) const { auto const it = m_keyToName.find(key); if (it == m_keyToName.end()) @@ -57,7 +57,17 @@ private: void LoadFromStream(std::istream & s); void AddBrand(Brand & brand, std::string const & key); - std::unordered_map> m_keyToName; + struct StringViewHash + { + using hash_type = std::hash; + using is_transparent = void; + + // std::size_t operator()(const char* str) const { return hash_type{}(str); } + std::size_t operator()(std::string_view str) const { return hash_type{}(str); } + std::size_t operator()(std::string const & str) const { return hash_type{}(str); } + }; + + std::unordered_map, StringViewHash, std::equal_to<>> m_keyToName; std::set m_keys; }; @@ -67,9 +77,8 @@ BrandsHolder const & GetDefaultBrands(); template void ForEachLocalizedBrands(std::string_view brand, FnT && fn) { bool processed = false; - /// @todo Remove temporary string with the new cpp standard. /// Localized brands are not working as expected now because we store raw names from OSM, not brand IDs. - GetDefaultBrands().ForEachNameByKey(std::string(brand), [&fn, &processed](auto const & name) + GetDefaultBrands().ForEachNameByKey(brand, [&fn, &processed](auto const & name) { fn(name); processed = true; -- 2.45.3 From 365cd16877ae1a9784ff9bf054c8ca49708498ff Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Thu, 8 Aug 2024 22:17:41 +0200 Subject: [PATCH 19/38] Updated comment Signed-off-by: Alexander Borsuk --- coding/read_write_utils.hpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/coding/read_write_utils.hpp b/coding/read_write_utils.hpp index d628df6528..6a88053027 100644 --- a/coding/read_write_utils.hpp +++ b/coding/read_write_utils.hpp @@ -120,10 +120,9 @@ namespace rw void ReadVectorOfPOD(TSource & src, TCont & v) { typedef typename TCont::value_type ValueT; - /// This assert fails on std::pair and OsmID class. - /// @todo Review this logic in future with new compiler abilities. - /// https://trello.com/c/hzCc9bzN/1254-is-trivial-copy-read-write-utils-hpp - //static_assert(std::is_trivially_copyable::value, ""); + /// This assert fails on std::pair and OsmID class because std::pair is not trivially copyable: + /// std::pair has a non-trivial copy-assignment and move-assignment operator. + //static_assert(std::is_trivially_copyable_v); uint32_t const count = ReadVarUint(src); if (count > 0) @@ -137,10 +136,9 @@ namespace rw void WriteVectorOfPOD(TSink & sink, TCont const & v) { typedef typename TCont::value_type ValueT; - /// This assert fails on std::pair and OsmID class. - /// @todo Review this logic in future with new compiler abilities. - /// https://trello.com/c/hzCc9bzN/1254-is-trivial-copy-read-write-utils-hpp - //static_assert(std::is_trivially_copyable::value, ""); + /// This assert fails on std::pair and OsmID class because std::pair is not trivially copyable: + /// std::pair has a non-trivial copy-assignment and move-assignment operator. + //static_assert(std::is_trivially_copyable_v); uint32_t const count = static_cast(v.size()); WriteVarUint(sink, count); -- 2.45.3 From ed45ee0ee5a65a749f6a2bb7d9f43d1dfc0482d8 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk <170263+biodranik@users.noreply.github.com> Date: Tue, 13 Aug 2024 21:10:30 +0200 Subject: [PATCH 20/38] Update indexer/brands_holder.hpp Signed-off-by: Alexander Borsuk <170263+biodranik@users.noreply.github.com> --- indexer/brands_holder.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indexer/brands_holder.hpp b/indexer/brands_holder.hpp index 877f75822e..8969dca5a6 100644 --- a/indexer/brands_holder.hpp +++ b/indexer/brands_holder.hpp @@ -63,8 +63,8 @@ private: using is_transparent = void; // std::size_t operator()(const char* str) const { return hash_type{}(str); } - std::size_t operator()(std::string_view str) const { return hash_type{}(str); } - std::size_t operator()(std::string const & str) const { return hash_type{}(str); } + size_t operator()(std::string_view str) const { return hash_type{}(str); } + size_t operator()(std::string const & str) const { return hash_type{}(str); } }; std::unordered_map, StringViewHash, std::equal_to<>> m_keyToName; -- 2.45.3 From fcbf955aea610b3d48fc8f44b2e94510f7e07eee Mon Sep 17 00:00:00 2001 From: Sergiy Kozyr Date: Wed, 14 Aug 2024 10:03:06 +0300 Subject: [PATCH 21/38] Added KMB v9MM test case Signed-off-by: Sergiy Kozyr --- kml/kml_tests/serdes_tests.cpp | 46 +++++++++++++++++++++++-- kml/kml_tests/tests_data.hpp | 62 ++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) diff --git a/kml/kml_tests/serdes_tests.cpp b/kml/kml_tests/serdes_tests.cpp index ea1939d462..c9d465053b 100644 --- a/kml/kml_tests/serdes_tests.cpp +++ b/kml/kml_tests/serdes_tests.cpp @@ -849,8 +849,8 @@ UNIT_TEST(Kml_Deserialization_From_Bin_V8_And_V8MM) TEST(false, ("Exception raised", exc.what())); } - // Can't compare dataFromBinV8.m_categoryData and dataFromBinV8MM.m_categoryData directly - // because new format has less properties and different m_id. Compare some properties here: + // Can't compare dataFromBinV8.m_categoryData and dataFromBinV8MM.m_categoryData directly + // because new format has less properties and different m_id. Compare some properties here: TEST_EQUAL(dataFromBinV8.m_categoryData.m_name, dataFromBinV8MM.m_categoryData.m_name, ()); TEST_EQUAL(dataFromBinV8.m_categoryData.m_description, dataFromBinV8MM.m_categoryData.m_description, ()); TEST_EQUAL(dataFromBinV8.m_categoryData.m_annotation, dataFromBinV8MM.m_categoryData.m_annotation, ()); @@ -865,6 +865,48 @@ UNIT_TEST(Kml_Deserialization_From_Bin_V8_And_V8MM) TEST_EQUAL(dataFromBinV8.m_tracksData, dataFromBinV8MM.m_tracksData, ()); } +UNIT_TEST(Kml_Deserialization_From_KMB_V9MM) +{ + kml::FileData dataFromBinV8; + try + { + MemReader reader(kBinKmlV8.data(), kBinKmlV8.size()); + kml::binary::DeserializerKml des(dataFromBinV8); + des.Deserialize(reader); + } + catch (kml::binary::DeserializerKml::DeserializeException const & exc) + { + TEST(false, ("Exception raised", exc.what())); + } + + kml::FileData dataFromBinV9MM; + try + { + MemReader reader(kBinKmlV9MM.data(), kBinKmlV9MM.size()); + kml::binary::DeserializerKml des(dataFromBinV9MM); + des.Deserialize(reader); + } + catch (kml::binary::DeserializerKml::DeserializeException const & exc) + { + TEST(false, ("Exception raised", exc.what())); + } + + // Can't compare dataFromBinV8.m_categoryData and dataFromBinV9MM.m_categoryData directly + // because new format has less properties and different m_id. Compare some properties here: + TEST_EQUAL(dataFromBinV8.m_categoryData.m_name, dataFromBinV9MM.m_categoryData.m_name, ()); + TEST_EQUAL(dataFromBinV8.m_categoryData.m_description, dataFromBinV9MM.m_categoryData.m_description, ()); + TEST_EQUAL(dataFromBinV8.m_categoryData.m_annotation, dataFromBinV9MM.m_categoryData.m_annotation, ()); + TEST_EQUAL(dataFromBinV8.m_categoryData.m_accessRules, dataFromBinV9MM.m_categoryData.m_accessRules, ()); + TEST_EQUAL(dataFromBinV8.m_categoryData.m_visible, dataFromBinV9MM.m_categoryData.m_visible, ()); + TEST_EQUAL(dataFromBinV8.m_categoryData.m_rating, dataFromBinV9MM.m_categoryData.m_rating, ()); + TEST_EQUAL(dataFromBinV8.m_categoryData.m_reviewsNumber, dataFromBinV9MM.m_categoryData.m_reviewsNumber, ()); + TEST_EQUAL(dataFromBinV8.m_categoryData.m_tags, dataFromBinV9MM.m_categoryData.m_tags, ()); + TEST_EQUAL(dataFromBinV8.m_categoryData.m_properties, dataFromBinV9MM.m_categoryData.m_properties, ()); + + TEST_EQUAL(dataFromBinV8.m_bookmarksData, dataFromBinV9MM.m_bookmarksData, ()); + TEST_EQUAL(dataFromBinV8.m_tracksData, dataFromBinV9MM.m_tracksData, ()); +} + UNIT_TEST(Kml_Ver_2_3) { std::string_view constexpr data = R"( diff --git a/kml/kml_tests/tests_data.hpp b/kml/kml_tests/tests_data.hpp index 270d1c7372..f1f323611b 100644 --- a/kml/kml_tests/tests_data.hpp +++ b/kml/kml_tests/tests_data.hpp @@ -1644,3 +1644,65 @@ std::vector const kBinKmlV8MM = { 0x76, 0xb6, 0x17, 0x26, 0x46, 0x2f, 0x4c, 0xa2, 0x32, 0x03, 0x73, 0x28, 0x03, 0x8d, 0x3a, 0x5e, 0x98, 0x00, 0x01, 0x00, 0x29 }; + +// kBinKmlV8MM contains the same bookmarks and tracks as kBinKmlV7 +std::vector const kBinKmlV9MM = { + 0x09, 0x26, 0x41, 0x3a, 0x33, 0x39, 0x37, 0x33, 0x65, 0x66, 0x34, 0x64, 0x2d, 0x66, 0x35, 0x31, + 0x65, 0x2d, 0x34, 0x61, 0x37, 0x31, 0x2d, 0x38, 0x65, 0x64, 0x34, 0x2d, 0x64, 0x65, 0x61, 0x33, + 0x63, 0x31, 0x39, 0x30, 0x64, 0x61, 0x63, 0x35, 0x00, 0x1e, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xea, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8e, 0x85, 0xd7, 0xc7, 0x03, + 0x37, 0x02, 0x00, 0x00, 0xeb, 0x8c, 0x98, 0xfd, 0x94, 0x32, 0x01, 0x03, 0x01, 0x02, 0x08, 0x09, + 0x02, 0x00, 0x02, 0x08, 0x01, 0x02, 0x00, 0x04, 0x01, 0x03, 0x02, 0x00, 0x06, 0x08, 0x05, 0x01, + 0x00, 0x07, 0x01, 0x00, 0x08, 0x01, 0x00, 0x09, 0x03, 0x00, 0x0a, 0x01, 0x0b, 0x02, 0x0c, 0x02, + 0x00, 0x0d, 0x01, 0x0e, 0x04, 0x00, 0x0f, 0x01, 0x10, 0x02, 0x11, 0x03, 0x12, 0x01, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xce, 0x02, 0x00, 0x00, 0xcb, 0x02, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0xea, 0x30, 0xb5, 0x9f, 0xa8, 0xc1, 0x02, 0x8c, + 0xbe, 0xf0, 0xd0, 0x02, 0x01, 0x00, 0x00, 0x05, 0x02, 0x00, 0x14, 0x08, 0x13, 0x02, 0x00, 0x16, + 0x08, 0x15, 0x02, 0x00, 0x18, 0x01, 0x17, 0x01, 0x00, 0x19, 0x04, 0x00, 0x1a, 0x01, 0x1b, 0x02, + 0x1c, 0x03, 0x1d, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xbd, 0x94, + 0xdc, 0x1e, 0x00, 0xff, 0x00, 0x00, 0xff, 0xc8, 0xc2, 0xeb, 0x23, 0x00, 0xff, 0x00, 0xff, 0x00, + 0xa0, 0xf7, 0x36, 0x01, 0x03, 0xea, 0xbe, 0xd0, 0x82, 0x05, 0x98, 0xfc, 0xe0, 0xa1, 0x05, 0x85, + 0xe5, 0xfe, 0x01, 0xad, 0xc7, 0xd6, 0x01, 0xf1, 0x98, 0x0a, 0xe2, 0xc4, 0x80, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x1e, 0x08, 0x1f, 0x02, 0x00, 0x20, 0x08, 0x21, + 0x03, 0x00, 0x22, 0x01, 0x23, 0x02, 0x24, 0x04, 0x00, 0x25, 0x01, 0x26, 0x02, 0x27, 0x03, 0x28, + 0x4e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x0d, 0x0f, 0x0f, 0x21, 0x10, 0x19, + 0x07, 0x05, 0x09, 0x03, 0x09, 0x05, 0x05, 0x09, 0x06, 0x09, 0x06, 0x1b, 0x0d, 0x2c, 0x19, 0x11, + 0x20, 0x05, 0x0c, 0x06, 0x0c, 0x06, 0x0a, 0x19, 0x16, 0x2c, 0x05, 0x05, 0x05, 0x0c, 0x06, 0x0c, + 0x06, 0xce, 0x03, 0x51, 0x00, 0x01, 0x00, 0x01, 0x04, 0x01, 0x03, 0x05, 0x03, 0x05, 0x08, 0x23, + 0x07, 0x07, 0x04, 0x09, 0x06, 0x02, 0x0b, 0x05, 0x08, 0x0d, 0x07, 0x78, 0x0f, 0x06, 0x0d, 0x13, + 0x06, 0x05, 0x15, 0x08, 0x42, 0x17, 0x07, 0x0c, 0x19, 0x06, 0x06, 0x1b, 0x06, 0x12, 0x1d, 0x08, + 0x8d, 0x01, 0x1f, 0x07, 0x11, 0x25, 0x09, 0x39, 0x27, 0x07, 0x1a, 0x29, 0x07, 0x07, 0x2d, 0x08, + 0x7d, 0x2f, 0x07, 0x0f, 0x33, 0x06, 0x0a, 0x35, 0x09, 0x6d, 0x37, 0x08, 0x17, 0x39, 0x06, 0x09, + 0x3b, 0x06, 0x14, 0x3d, 0x08, 0xb9, 0x01, 0x3f, 0x07, 0x16, 0x45, 0x08, 0x28, 0x47, 0x07, 0x0b, + 0x4d, 0x08, 0x7b, 0x55, 0x08, 0x45, 0x57, 0x07, 0x0e, 0x5d, 0x09, 0xaa, 0x01, 0x5f, 0x09, 0x13, + 0x65, 0x08, 0x40, 0x67, 0x07, 0x1b, 0x69, 0x08, 0xc1, 0x01, 0x6d, 0x08, 0x7f, 0x6f, 0x07, 0x10, + 0x75, 0x09, 0x75, 0x77, 0x08, 0x1d, 0x7d, 0x08, 0xbb, 0x01, 0x7f, 0x07, 0x18, 0x85, 0x01, 0x09, + 0x25, 0x95, 0x01, 0x09, 0x44, 0x9d, 0x01, 0x09, 0x98, 0x01, 0xa5, 0x01, 0x08, 0x3f, 0xad, 0x01, + 0x08, 0x7e, 0xb5, 0x01, 0x09, 0x70, 0xb7, 0x01, 0x09, 0x19, 0xbd, 0x01, 0x09, 0xba, 0x01, 0xc5, + 0x01, 0x09, 0x2f, 0xcd, 0x01, 0x08, 0x7c, 0xd5, 0x01, 0x09, 0x68, 0xdd, 0x01, 0x09, 0xb2, 0x01, + 0xdf, 0x01, 0x08, 0xc0, 0x01, 0xe5, 0x01, 0x09, 0x41, 0xe9, 0x01, 0x08, 0xd1, 0x01, 0xed, 0x01, + 0x09, 0x8a, 0x01, 0xf5, 0x01, 0x08, 0x79, 0xf7, 0x01, 0x09, 0x21, 0xfd, 0x01, 0x09, 0xbe, 0x01, + 0xa5, 0x02, 0x09, 0x3b, 0xb5, 0x02, 0x09, 0x6e, 0xdd, 0x02, 0x09, 0xac, 0x01, 0xdf, 0x02, 0x09, + 0x15, 0xf5, 0x02, 0x09, 0x76, 0x85, 0x03, 0x09, 0x26, 0x95, 0x03, 0x09, 0x61, 0x9d, 0x03, 0x09, + 0x9b, 0x01, 0xb5, 0x03, 0x09, 0x74, 0xb7, 0x03, 0x09, 0x20, 0xbd, 0x03, 0x09, 0xbd, 0x01, 0xc5, + 0x03, 0x09, 0x30, 0xd5, 0x03, 0x09, 0x6c, 0xdd, 0x03, 0x09, 0xb5, 0x01, 0xe5, 0x03, 0x09, 0x43, + 0xed, 0x03, 0x09, 0x8f, 0x01, 0xf7, 0x03, 0x09, 0x22, 0xfd, 0x03, 0x09, 0xbf, 0x01, 0xc0, 0x04, + 0xb5, 0xa1, 0x7a, 0x44, 0x7d, 0xb5, 0xa1, 0x7d, 0x77, 0x11, 0xe8, 0x89, 0x46, 0xc9, 0x8a, 0xac, + 0x84, 0x6e, 0x35, 0xfa, 0x1d, 0x4b, 0x23, 0xc2, 0x43, 0xe4, 0x4a, 0x21, 0x19, 0xc4, 0xa1, 0x4c, + 0xa0, 0x9c, 0x0c, 0x61, 0xa0, 0xa2, 0x7c, 0xa5, 0xaa, 0xf9, 0x53, 0xab, 0xaa, 0xee, 0x35, 0x7a, + 0x6d, 0xff, 0x9b, 0xbe, 0xad, 0xd1, 0x2c, 0xea, 0x13, 0xa7, 0x3a, 0xad, 0xa0, 0x4c, 0xe5, 0xa6, + 0x65, 0xca, 0x34, 0xce, 0xbf, 0xb6, 0xdc, 0x8a, 0x06, 0x7f, 0x9e, 0x41, 0x7e, 0x69, 0x03, 0x49, + 0x2b, 0x28, 0xa0, 0x26, 0xe0, 0x95, 0xba, 0x55, 0xb0, 0x27, 0x4f, 0x0e, 0x17, 0x8a, 0xc2, 0xba, + 0xbe, 0x8c, 0xf1, 0xa4, 0x0a, 0x07, 0x68, 0xb2, 0xec, 0x4b, 0x16, 0x93, 0xa3, 0xb9, 0x65, 0x9b, + 0xe4, 0xd7, 0xc4, 0x01, 0x86, 0x07, 0xfc, 0xef, 0xb5, 0xcc, 0x4e, 0xb1, 0xc0, 0x7e, 0xbf, 0xf9, + 0x1c, 0xc4, 0xfb, 0x77, 0x25, 0x90, 0xfc, 0x58, 0x89, 0x2f, 0xe0, 0x06, 0x8c, 0x44, 0xc2, 0x9e, + 0xba, 0x0c, 0xc0, 0x74, 0x00, 0x18, 0x89, 0x43, 0x96, 0x45, 0x88, 0xf5, 0x75, 0x7e, 0xbc, 0x36, + 0xb0, 0x83, 0x79, 0xe2, 0x8e, 0x7c, 0x9c, 0x67, 0x90, 0x4a, 0x07, 0x00, 0x00, 0x00, 0xe9, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x59, 0x4e, 0x1f, 0x71, 0x5b, 0x3b, + 0xa2, 0x47, 0xa7, 0x62, 0xa0, 0x50, 0x28, 0x0a, 0x42, 0x47, 0x87, 0xfe, 0x5d, 0x41, 0xc8, 0xbf, + 0xe9, 0x4b, 0x23, 0xeb, 0x7c, 0x94, 0xdf, 0x45, 0xe0, 0x58, 0x9c, 0x01, 0x74, 0xb9, 0xbc, 0xc9, + 0xe8, 0xfd, 0x26, 0x13, 0x8b, 0x1c, 0xc8, 0xc3, 0x06, 0xa4, 0xac, 0xb4, 0x49, 0x06, 0x01, 0x00, + 0x29 +}; -- 2.45.3 From e0e59da62b63e9ff00c062f030d8a6afb78ef89b Mon Sep 17 00:00:00 2001 From: Sergiy Kozyr Date: Wed, 14 Aug 2024 11:17:34 +0300 Subject: [PATCH 22/38] Introduced V9MM version. It has the same format as V8MM but with extra flag in tracks data. Signed-off-by: Sergiy Kozyr --- kml/CMakeLists.txt | 1 + kml/header_binary.hpp | 9 ++- kml/kml_tests/serdes_tests.cpp | 5 +- kml/serdes_binary.hpp | 34 +++++++-- kml/types_v9mm.hpp | 129 +++++++++++++++++++++++++++++++++ 5 files changed, 169 insertions(+), 9 deletions(-) create mode 100644 kml/types_v9mm.hpp diff --git a/kml/CMakeLists.txt b/kml/CMakeLists.txt index d1f5112d36..4bfa286a58 100644 --- a/kml/CMakeLists.txt +++ b/kml/CMakeLists.txt @@ -22,6 +22,7 @@ set(SRC types_v8.hpp types_v8mm.hpp types_v9.hpp + types_v9mm.hpp visitors.hpp ) diff --git a/kml/header_binary.hpp b/kml/header_binary.hpp index 51a1e79ee7..77663f99f7 100644 --- a/kml/header_binary.hpp +++ b/kml/header_binary.hpp @@ -26,9 +26,12 @@ enum class Version : uint8_t // tags to kml V9 = 9, // 01 October 2020: add minZoom to bookmarks Latest = V9, - V8MM = 10 // 27 July 2023: MapsMe release version v15.0.71617. Technically it's version is 8 - // (first byte is 0x08), but it's not compatible with V8 from this repo. It has - // no compilations. + V8MM = 10, // 27 July 2023: MapsMe release version v15.0.71617. Technically it's version is 8 + // (first byte is 0x08), but it's not compatible with V8 from this repo. It has + // no compilations. + V9MM = 11 // In July 2024 MapsMe release version with new KMB format. Technically its version is 9 + // (first byte is 0x09), but it's not compatible with OrganicMaps V9 from this repo. It has + // extra flag in tracks data. }; struct Header diff --git a/kml/kml_tests/serdes_tests.cpp b/kml/kml_tests/serdes_tests.cpp index c9d465053b..e257a023d0 100644 --- a/kml/kml_tests/serdes_tests.cpp +++ b/kml/kml_tests/serdes_tests.cpp @@ -865,7 +865,7 @@ UNIT_TEST(Kml_Deserialization_From_Bin_V8_And_V8MM) TEST_EQUAL(dataFromBinV8.m_tracksData, dataFromBinV8MM.m_tracksData, ()); } -UNIT_TEST(Kml_Deserialization_From_KMB_V9MM) +UNIT_TEST(Kml_Deserialization_From_KMB_V8_And_V9MM) { kml::FileData dataFromBinV8; try @@ -903,7 +903,10 @@ UNIT_TEST(Kml_Deserialization_From_KMB_V9MM) TEST_EQUAL(dataFromBinV8.m_categoryData.m_tags, dataFromBinV9MM.m_categoryData.m_tags, ()); TEST_EQUAL(dataFromBinV8.m_categoryData.m_properties, dataFromBinV9MM.m_categoryData.m_properties, ()); + dataFromBinV8.m_bookmarksData[0].m_id = dataFromBinV9MM.m_bookmarksData[0].m_id; // V8 and V9MM bookmarks have different IDs. Fix ID value manually. TEST_EQUAL(dataFromBinV8.m_bookmarksData, dataFromBinV9MM.m_bookmarksData, ()); + + dataFromBinV8.m_tracksData[0].m_id = dataFromBinV9MM.m_tracksData[0].m_id; // V8 and V9MM tracks have different IDs. Fix ID value manually. TEST_EQUAL(dataFromBinV8.m_tracksData, dataFromBinV9MM.m_tracksData, ()); } diff --git a/kml/serdes_binary.hpp b/kml/serdes_binary.hpp index ec1aadc396..91c1ffd079 100644 --- a/kml/serdes_binary.hpp +++ b/kml/serdes_binary.hpp @@ -6,6 +6,7 @@ #include "kml/types_v7.hpp" #include "kml/types_v8.hpp" #include "kml/types_v8mm.hpp" +#include "kml/types_v9mm.hpp" #include "kml/types.hpp" #include "kml/visitors.hpp" @@ -195,6 +196,16 @@ public: m_data = dataV8MM.ConvertToLatestVersion(); break; } + case Version::V9MM: + { + FileDataV9MM dataV9MM; + dataV9MM.m_deviceId = m_data.m_deviceId; + dataV9MM.m_serverId = m_data.m_serverId; + DeserializeFileData(subReader, dataV9MM); + + m_data = dataV9MM.ConvertToLatestVersion(); + break; + } case Version::V7: { FileDataV7 dataV7; @@ -251,12 +262,10 @@ private: NonOwningReaderSource source(reader); m_header.Deserialize(source); - // The recent MapsMe update increased the version number, but it is not clear yet what changed/added in a newer version. - // Revise V9 in case of discovered crashes. - if (m_header.m_version == Version::V8 || m_header.m_version == Version::V9) + if (m_header.m_version == Version::V8) { - // Check if file has Opensource V8 or MapsMe V8. - // Actual V8 format has 6 offset (uint64_t) in header. While V8MM has 5 offsets. + // Check if file has Opensource V8 or MapsMe V8 format. + // Actual V8 format has 6 offsets (uint64_t) in header. While V8MM has 5 offsets. // It means that first section (usually categories) has offset 0x28 = 40 = 5 * 8. if (m_header.m_categoryOffset == 0x28 || m_header.m_bookmarksOffset == 0x28 || m_header.m_tracksOffset == 0x28 || m_header.m_stringsOffset == 0x28 || @@ -268,6 +277,21 @@ private: m_header.m_stringsOffset = m_header.m_compilationsOffset; } } + if (m_header.m_version == Version::V9) + { + // Check if file has Opensource V9 or MapsMe V9 format. + // Actual V9 format has 6 offsets (uint64_t) in header. While V9MM has 5 offsets. + // It means that first section (usually categories) has offset 0x28 = 40 = 5 * 8. + if (m_header.m_categoryOffset == 0x28 || m_header.m_bookmarksOffset == 0x28 || + m_header.m_tracksOffset == 0x28 || m_header.m_stringsOffset == 0x28 || + m_header.m_compilationsOffset == 0x28) + { + LOG(LWARNING, ("KMB file has version V9MM")); + m_header.m_version = Version::V9MM; + m_header.m_eosOffset = m_header.m_stringsOffset; + m_header.m_stringsOffset = m_header.m_compilationsOffset; + } + } m_initialized = true; } diff --git a/kml/types_v9mm.hpp b/kml/types_v9mm.hpp new file mode 100644 index 0000000000..d0687a4ac8 --- /dev/null +++ b/kml/types_v9mm.hpp @@ -0,0 +1,129 @@ +#pragma once + +#include "kml/types.hpp" +#include "kml/types_v8mm.hpp" + +namespace kml +{ +struct TrackDataV9MM +{ + DECLARE_VISITOR_AND_DEBUG_PRINT(TrackDataV9MM, visitor(m_id, "id"), + visitor(m_localId, "localId"), + visitor(m_name, "name"), + visitor(m_description, "description"), + visitor(m_layers, "layers"), + visitor(m_timestamp, "timestamp"), + visitor(m_flag1, "flag1"), // Extra field introduced in V9MM. + visitor(m_geometry, "geometry"), + visitor(m_visible, "visible"), + visitor(m_constant1, "constant1"), + visitor(m_constant2, "constant2"), + visitor(m_constant3, "constant3"), + visitor(m_nearestToponyms, "nearestToponyms"), + visitor(m_properties, "properties"), + VISITOR_COLLECTABLE) + + DECLARE_COLLECTABLE(LocalizableStringIndex, m_name, m_description, m_nearestToponyms, m_properties) + + bool operator==(TrackDataV9MM const & data) const + { + return m_id == data.m_id && m_localId == data.m_localId && m_name == data.m_name && + m_description == data.m_description && m_layers == data.m_layers && + IsEqual(m_timestamp, data.m_timestamp) && m_geometry == data.m_geometry && + m_visible == data.m_visible && m_nearestToponyms == data.m_nearestToponyms && + m_properties == data.m_properties; + } + + bool operator!=(TrackDataV9MM const & data) const { return !operator==(data); } + + TrackData ConvertToLatestVersion() const + { + TrackData data; + data.m_id = m_id; + data.m_localId = m_localId; + data.m_name = m_name; + data.m_description = m_description; + data.m_layers = m_layers; + data.m_timestamp = m_timestamp; + data.m_geometry = m_geometry; + data.m_visible = m_visible; + data.m_nearestToponyms = m_nearestToponyms; + data.m_properties = m_properties; + return data; + } + + // Unique id (it will not be serialized in text files). + TrackId m_id = kInvalidTrackId; + // Local track id. + LocalId m_localId = 0; + // Track's name. + LocalizableString m_name; + // Track's description. + LocalizableString m_description; + // Layers. + std::vector m_layers; + // Creation timestamp. + TimestampMillis m_timestamp{}; + MultiGeometry m_geometry; + // Visibility. + bool m_visible = true; + // These constants were introduced in KMB V8MM. Usually have value 0. Don't know its purpose. + uint8_t m_constant1 = 0; + uint8_t m_constant2 = 0; + uint8_t m_constant3 = 0; + // Nearest toponyms. + std::vector m_nearestToponyms; + // Key-value properties. + Properties m_properties; + // Extra field introduced in V9MM. + bool m_flag1 = true; +}; + + +// FileDataV8MM contains the same sections as FileDataV8MM but with changed m_tracksData format +struct FileDataV9MM +{ + DECLARE_VISITOR_AND_DEBUG_PRINT(FileDataV9MM, visitor(m_serverId, "serverId"), + visitor(m_categoryData, "category"), + visitor(m_bookmarksData, "bookmarks"), + visitor(m_tracksData, "tracks")) + + bool operator==(FileDataV9MM const & data) const + { + return m_serverId == data.m_serverId && m_categoryData == data.m_categoryData && + m_bookmarksData == data.m_bookmarksData && m_tracksData == data.m_tracksData; + } + + bool operator!=(FileDataV9MM const & data) const { return !operator==(data); } + + FileData ConvertToLatestVersion() + { + FileData data; + data.m_deviceId = m_deviceId; + data.m_serverId = m_serverId; + + data.m_categoryData = m_categoryData.ConvertToLatestVersion(); + + data.m_bookmarksData.reserve(m_bookmarksData.size()); + for (auto & d : m_bookmarksData) + data.m_bookmarksData.emplace_back(d.ConvertToLatestVersion()); + + data.m_tracksData.reserve(m_tracksData.size()); + for (auto & t : m_tracksData) + data.m_tracksData.emplace_back(t.ConvertToLatestVersion()); + + return data; + } + + // Device id (it will not be serialized in text files). + std::string m_deviceId; + // Server id. + std::string m_serverId; + // Category's data. + CategoryDataV8MM m_categoryData; + // Bookmarks collection. + std::vector m_bookmarksData; + // Tracks collection. + std::vector m_tracksData; +}; +} // namespace kml -- 2.45.3 From 16b69f9a5751094ed03d3aa546403829d2827f6a Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Wed, 14 Aug 2024 11:56:42 +0400 Subject: [PATCH 23/38] [ios] bring back `share my location` button partly revert 43c46beb0fd355b72335b9b7c52b5887f73b27af (for the menu) Signed-off-by: Kiryl Kaveryn --- .../UI/BottomMenu/Menu/BottomMenuInteractor.swift | 14 ++++++++++++++ .../UI/BottomMenu/Menu/BottomMenuPresenter.swift | 10 ++++++++++ 2 files changed, 24 insertions(+) diff --git a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuInteractor.swift b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuInteractor.swift index 706d66a71e..ac05c2e465 100644 --- a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuInteractor.swift +++ b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuInteractor.swift @@ -4,6 +4,7 @@ protocol BottomMenuInteractorProtocol: AnyObject { func downloadMaps() func donate() func openSettings() + func shareLocation(cell: BottomMenuItemCell) } @objc protocol BottomMenuDelegate { @@ -60,4 +61,17 @@ extension BottomMenuInteractor: BottomMenuInteractorProtocol { close() mapViewController?.performSegue(withIdentifier: "Map2Settings", sender: nil) } + + func shareLocation(cell: BottomMenuItemCell) { + let lastLocation = LocationManager.lastLocation() + guard let coordinates = lastLocation?.coordinate else { + let alert = UIAlertController(title: L("unknown_current_position"), message: nil, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: L("ok"), style: .default, handler: nil)) + viewController?.present(alert, animated: true, completion: nil) + return; + } + guard let viewController = viewController else { return } + let vc = ActivityViewController.share(forMyPosition: coordinates) + vc.present(inParentViewController: viewController, anchorView: cell.anchorView) + } } diff --git a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift index be87f1c2aa..81447c0281 100644 --- a/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift +++ b/iphone/Maps/UI/BottomMenu/Menu/BottomMenuPresenter.swift @@ -8,6 +8,7 @@ class BottomMenuPresenter: NSObject { case downloadMaps case donate case settings + case share } enum Sections: Int { case layers @@ -79,6 +80,11 @@ extension BottomMenuPresenter { title: L("settings"), badgeCount: 0, enabled: true) + case .share: + cell.configure(imageName: "ic_menu_share", + title: L("share_my_location"), + badgeCount: 0, + enabled: true) } return cell } @@ -109,6 +115,10 @@ extension BottomMenuPresenter { interactor.donate() case .settings: interactor.openSettings() + case .share: + if let cell = tableView.cellForRow(at: indexPath) as? BottomMenuItemCell { + interactor.shareLocation(cell: cell) + } } } } -- 2.45.3 From 9e39f32dc063c819ccae823c3e32fd5f4cb966f5 Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Wed, 14 Aug 2024 11:57:10 +0400 Subject: [PATCH 24/38] [strings] recover unknown_current_position and share_my_location in ios Signed-off-by: Kiryl Kaveryn --- data/strings/strings.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/strings/strings.txt b/data/strings/strings.txt index 1ee733069e..d04dba6c5e 100644 --- a/data/strings/strings.txt +++ b/data/strings/strings.txt @@ -4362,7 +4362,7 @@ [unknown_current_position] comment = Warning message when doing search around current position - tags = android + tags = android,ios en = Your location hasn't been determined yet af = U ligging is nog nie vasgestel nie ar = لم يتم تحديد موقعك بعد. @@ -5132,7 +5132,7 @@ zh-Hant = 長度 [share_my_location] - tags = android + tags = android,ios en = Share My Location af = Deel my ligging ar = مشاركة موقعي -- 2.45.3 From 026778acb70c137bee62543e4a72f3729ccee97c Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Wed, 14 Aug 2024 11:57:27 +0400 Subject: [PATCH 25/38] [strings] regenerate Signed-off-by: Kiryl Kaveryn --- iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings | 5 +++++ iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings | 5 +++++ .../Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings | 5 +++++ .../Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings | 5 +++++ 42 files changed, 210 insertions(+) diff --git a/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings index 942d872321..655032fde9 100644 --- a/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "تعديل"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "لم يتم تحديد موقعك بعد."; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "مرحباً، تفقد الدبوس الخاص بي على خريطة Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "الطول"; +"share_my_location" = "مشاركة موقعي"; + "prefs_group_route" = "الملاحة"; "pref_zoom_title" = "أزرار التكبير والتصغير"; diff --git a/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings index e46aaf8479..15577d539c 100644 --- a/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/az.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Redaktə et"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Məkanınız hələ müəyyən edilməyib"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Salam, Organic Maps xəritəsində mənim pin kodumu yoxlayın!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Uzunluq"; +"share_my_location" = "Məkanımı Paylaşın"; + "prefs_group_route" = "Naviqasiya"; "pref_zoom_title" = "Böyütmə düymələri"; diff --git a/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings index 59b516d43f..495b5a93be 100644 --- a/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/be.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Рэдагаваць"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Ваша месцазнаходжанне пакуль не вызначана"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Гэй, глядзі маю метку на Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Даўжыня"; +"share_my_location" = "Абагуліць маё месцазнаходжанне"; + "prefs_group_route" = "Навігацыя"; "pref_zoom_title" = "Кнопкі маштабавання"; diff --git a/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings index 2f9a583b81..8142416904 100644 --- a/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/bg.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Редакция"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Местоположението ви още не е определено"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Хей, виж какво съм отбелязал в Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Дължина"; +"share_my_location" = "Споделяне на местоположение"; + "prefs_group_route" = "Навигация"; "pref_zoom_title" = "Мащабни бутони"; diff --git a/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings index 2f1a471414..b481af6bea 100644 --- a/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ca.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Edita"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Encara no s'ha pogut determinar la vostra geolocalització"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Ep, mireu el meu marcador a l'Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Longitud"; +"share_my_location" = "Comparteix la meva ubicacio"; + "prefs_group_route" = "Navegació"; "pref_zoom_title" = "Botons de zoom"; diff --git a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings index 4768a45fc8..064fce7423 100644 --- a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Upravit"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Vaše poloha zatím nebyla určena"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Koukni na moji značku na mapě v Organic Maps"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Délka"; +"share_my_location" = "Sdílet mé umístění"; + "prefs_group_route" = "Navigace"; "pref_zoom_title" = "Tlačítka přiblížení/oddálení"; diff --git a/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings index 3398bc53bf..50153cebbc 100644 --- a/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Rediger"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Din lokation er ikke blevet bestemt endnu"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hey, tjek min knappenål på Organic Maps kortet ud!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Længde"; +"share_my_location" = "Del min lokation"; + "prefs_group_route" = "Navigation"; "pref_zoom_title" = "Zoom knapper"; diff --git a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings index 7af4407ebc..8d97aee359 100644 --- a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Bearbeiten"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Ihr Standort konnte noch nicht ermittelt werden"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hey, sieh dir meine Stecknadel auf der Organic Maps-Karte an!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Länge"; +"share_my_location" = "Meinen Standort teilen"; + "prefs_group_route" = "Navigation"; "pref_zoom_title" = "Zoom-Tasten"; diff --git a/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings index dbf59d375c..4bc8060d16 100644 --- a/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Επεξεργασία"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Η τοποθεσία σας δεν έχει προσδιοριστεί ακόμη"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Γεια, δες τις τοποθεσίες που έχω καρφιτσώσει στο Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Μήκος"; +"share_my_location" = "Κοινοποίηση της τοποθεσίας μου"; + "prefs_group_route" = "Πλοήγηση"; "pref_zoom_title" = "Πλήκτρα μεγέθυνσης"; diff --git a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings index a4548d650c..46a44f4fbd 100644 --- a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Edit"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Your location hasn't been determined yet"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hey, check out my pin in Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Length"; +"share_my_location" = "Share My Location"; + "prefs_group_route" = "Navigation"; "pref_zoom_title" = "Zoom buttons"; diff --git a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings index c6849a4421..ddcb40ee0d 100644 --- a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Edit"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Your location hasn't been determined yet"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hey, check out my pin in Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Length"; +"share_my_location" = "Share My Location"; + "prefs_group_route" = "Navigation"; "pref_zoom_title" = "Zoom buttons"; diff --git a/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings index 80a815bdc3..5af7c2c560 100644 --- a/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/es-MX.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Editar"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Su ubicación aún no ha sido determinada"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "¡Mira mi marcador en el mapa de Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Longitud"; +"share_my_location" = "Compartir mi ubicación"; + "prefs_group_route" = "Navegación"; "pref_zoom_title" = "Botones de zoom"; diff --git a/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings index f4ce8f27dc..e1e92f9515 100644 --- a/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Editar"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Su ubicación aún no ha sido determinada"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "¡Mira mi marcador en el mapa de Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Longitud"; +"share_my_location" = "Compartir mi ubicación"; + "prefs_group_route" = "Navegación"; "pref_zoom_title" = "Botones de zoom"; diff --git a/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings index 7d7f5832f9..d178fe3845 100644 --- a/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/et.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Muuda"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Sinu asukoht ei ole veel määratud"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hei, vaata minu asukoha märget Organic Maps kaardil!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Pikkus"; +"share_my_location" = "Jaga minu asukohta"; + "prefs_group_route" = "Navigeerimine"; "pref_zoom_title" = "Zoomi nupud"; diff --git a/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings index 0a3f8f577e..67275fc88e 100644 --- a/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/eu.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Editatu"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Zure kokapena ez da oraindik zehaztu"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Begiratu nire markagailua Organic Maps mapan!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Luzera"; +"share_my_location" = "Partekatu nire kokapena"; + "prefs_group_route" = "Nabigazioa"; "pref_zoom_title" = "Zoom botoiak"; diff --git a/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings index 55efec2a00..73c995f7cf 100644 --- a/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/fa.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "ویرایش"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "مکان شما هنوز مشخص نشده است"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hey, check out my pin in Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "طول"; +"share_my_location" = "به اشتراک گذاری موقعیت مکانی من"; + "prefs_group_route" = "مسیریابی"; "pref_zoom_title" = "دکمه‌های بزرگنمایی"; diff --git a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings index 6a695d8b85..7d1bdd1af6 100644 --- a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Muokkaa"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Sijaintiasi ei ole vielä määritetty"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hei, katso merkintäni Organic Maps-kartalla!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Pituus"; +"share_my_location" = "Jaa sijaintini"; + "prefs_group_route" = "Navigointi"; "pref_zoom_title" = "Zoomauspainikkeet"; diff --git a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings index b80eebd5ca..d2bf3fb1a1 100644 --- a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Modifier"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Votre position n'a pas encore été déterminée"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hé, regardez mon signet sur la carte Organic Maps !"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Longueur"; +"share_my_location" = "Partager ma position"; + "prefs_group_route" = "Navigation"; "pref_zoom_title" = "Boutons de zoom"; diff --git a/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings index 985d0bb52d..4800337008 100644 --- a/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "ערוך"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "מיקומך לא אותר עדיין"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "היי, בדוק את הסיכה שלי במפה של Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "אורך"; +"share_my_location" = "שיתוף מיקום שלי"; + "prefs_group_route" = "ניווט"; "pref_zoom_title" = "כפתורי זום"; diff --git a/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings index d8586dff22..1e6d6cc9ac 100644 --- a/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/hi.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "संपादन करना"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "आपका स्थान अभी तक निर्धारित नहीं किया गया है"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "अरे, ऑर्गेनिक मैप्स में मेरा पिन देखें!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "लंबाई"; +"share_my_location" = "मेरा स्थान साझा करें"; + "prefs_group_route" = "मार्गदर्शन"; "pref_zoom_title" = "ज़ूम बटन"; diff --git a/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings index d8d9685785..68031a4b5d 100644 --- a/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Szerkeszt"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Még nem határoztuk meg az aktuális helyzetét"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Nézze meg a Organic Maps jelzőmet"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Hossz"; +"share_my_location" = "Helyzetem megosztása"; + "prefs_group_route" = "Navigáció"; "pref_zoom_title" = "Nagyítás/kicsinyítés gombok"; diff --git a/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings index 230ac4129d..03ec9a9013 100644 --- a/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Edit"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Lokasi Anda belum ditentukan"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hei, lihat pinku di peta Organic Maps"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Panjang"; +"share_my_location" = "Bagikan Lokasi Saya"; + "prefs_group_route" = "Navigasi"; "pref_zoom_title" = "Tombol perbesaran"; diff --git a/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings index 148efcce51..8142309a37 100644 --- a/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Modifica"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "La tua posizione non è stata ancora stabilita"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Puoi vedere il mio luogo preferito sulla mappa Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Lunghezza"; +"share_my_location" = "Condividi la mia posizione"; + "prefs_group_route" = "Navigazione"; "pref_zoom_title" = "Pulsanti per lo zoom"; diff --git a/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings index 261e1a5e15..1fd40735e0 100644 --- a/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "編集"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "現在の座標が未確定です"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Organic Mapsでピン情報を確認"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "距離"; +"share_my_location" = "現在地を共有する"; + "prefs_group_route" = "ナビゲーション"; "pref_zoom_title" = "ズームボタン"; diff --git a/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings index 66339e1fcc..bd0498ed83 100644 --- a/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "편집"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "귀하의 위치를 아직 알아내지 못 했습니다"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Organic Maps 지도에서 내 핀 보기"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "길이"; +"share_my_location" = "내 위치 공유"; + "prefs_group_route" = "네비게이션"; "pref_zoom_title" = "확대/축소 버튼"; diff --git a/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings index f4c47d154b..dc3d748114 100644 --- a/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/mr.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "संपादन"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "तुमचे स्थान अद्याप निश्चित केलेले नाही"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Organic Maps द्वारे एक खूणपत्र पाठवत आहे!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "लांबी"; +"share_my_location" = "माझे स्थान सामायिक करा"; + "prefs_group_route" = "मार्गनिर्देशन"; "pref_zoom_title" = "झूम बटणे"; diff --git a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings index b332671709..673293a0bb 100644 --- a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Rediger"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Posisjonen din har ikke blitt fastslått enda"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hei, se merket mitt på Organic Maps-kartet"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Lengde"; +"share_my_location" = "Del posisjonen min"; + "prefs_group_route" = "Navigasjon"; "pref_zoom_title" = "Zoom-knapper"; diff --git a/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings index fd7f3c0bb7..f60e5c10c5 100644 --- a/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Wijzig"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Je locatie is nog niet vastgesteld"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hey, bekijk mijn pin op Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Lengte"; +"share_my_location" = "Deel mijn locatie"; + "prefs_group_route" = "Navigatie"; "pref_zoom_title" = "Zoomknoppen"; diff --git a/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings index 1a89251c05..d49e63a67d 100644 --- a/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Edytuj"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Nie określono jeszcze aktualnego położenia"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hej, spójrz na mój znacznik w Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Długość"; +"share_my_location" = "Udostępnij aktualne położenie"; + "prefs_group_route" = "Nawigacja"; "pref_zoom_title" = "Przyciski przybliżania"; diff --git a/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings index 0206d6baea..27bafbf76c 100644 --- a/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/pt-BR.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Editar"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "A sua localização ainda não foi determinada"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Veja o meu marcador no mapa do Organic Maps."; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Comprimento"; +"share_my_location" = "Compartilhar a minha localização"; + "prefs_group_route" = "Navegação"; "pref_zoom_title" = "Botões de zoom"; diff --git a/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings index 7e3b097fc9..0a3fb42206 100644 --- a/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Editar"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "A sua localização ainda não foi determinada"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Veja o meu marcador no mapa do Organic Maps."; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Comprimento"; +"share_my_location" = "Partilhar a minha localização"; + "prefs_group_route" = "Navegação"; "pref_zoom_title" = "Botões de ampliação"; diff --git a/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings index ba0bf36183..4d77fa93f3 100644 --- a/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Modifică"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Poziția ta nu a fost stabilită încă"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Poți vedea locul meu preferat pe harta Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Lungime"; +"share_my_location" = "Trimite poziția mea"; + "prefs_group_route" = "Navigare"; "pref_zoom_title" = "Butoane zoom"; diff --git a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings index b679c30c7a..aebe58802f 100644 --- a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Редактировать"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Ваше местоположение ещё не определено"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Смотри мою метку на карте Organic Maps"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Длина"; +"share_my_location" = "Поделиться местоположением"; + "prefs_group_route" = "Навигация"; "pref_zoom_title" = "Кнопки масштаба"; diff --git a/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings index 0ca8c35687..224f778c64 100644 --- a/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Upraviť"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Vaša poloha zatiaľ nebola určená"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Pozri na moju značku na mape Organic Maps"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Dĺžka"; +"share_my_location" = "Zdieľať moje umiestnenie"; + "prefs_group_route" = "Navigácia"; "pref_zoom_title" = "Tlačidlá priblíženia/oddialenia"; diff --git a/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings index 7eba6bfdbe..4ef7e49465 100644 --- a/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Redigera"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Din position har inte bestämts ännu"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hej, kolla på min pin på Organic Maps kartan"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Längd"; +"share_my_location" = "Dela Min Plats"; + "prefs_group_route" = "Navigering"; "pref_zoom_title" = "Zoom-knappar"; diff --git a/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings index 94bfceba61..e94199900a 100644 --- a/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/sw.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Edit"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Your location hasn't been determined yet"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hey, check out my pin in Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Length"; +"share_my_location" = "Share My Location"; + "prefs_group_route" = "Navigation"; "pref_zoom_title" = "Zoom buttons"; diff --git a/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings index ac37bd50e8..579924eedf 100644 --- a/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "แก้ไข"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "ตำแหน่งที่ตั้งของคุณยังไม่ได้รับการกำหนด"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "เฮ้ ตรวจสอบหมุดของฉันที่ แผนที่ Organic Maps!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "ระยะเวลา"; +"share_my_location" = "แชร์ตำแหน่งที่ตั้งของฉัน"; + "prefs_group_route" = "การนำทาง"; "pref_zoom_title" = "ปุ่มซูม"; diff --git a/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings index 93217df099..d6aa262e95 100644 --- a/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Düzenle"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Konumunuz henüz belirlenmedi"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Hey, Organic Maps haritasında raptiyemi incele!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Uzunluk"; +"share_my_location" = "Konumumu Paylaş"; + "prefs_group_route" = "Navigasyon"; "pref_zoom_title" = "Yakınlaştırma butonları"; diff --git a/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings index d457ba15dc..27aba5f885 100644 --- a/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Редагувати"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Ваше місце розташування не визначено"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Поглянь на мою мiтку на мапі Organic Maps"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Довжина"; +"share_my_location" = "Поділитися моїм місцезнаходженням"; + "prefs_group_route" = "Навігація"; "pref_zoom_title" = "Кнопки трансфокації"; diff --git a/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings index de5f4b76c3..413d9ea88f 100644 --- a/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "Sửa"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "Chưa xác định được vị trí của bạn"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "Này, hãy xem ghim của tôi tại Organic Maps map"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "Độ dài"; +"share_my_location" = "Chia sẻ Vị trí của tôi"; + "prefs_group_route" = "Điều hướng"; "pref_zoom_title" = "Nút Phóng to/Thu nhỏ"; diff --git a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings index fab41fff02..3f613f248a 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "编辑"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "您的位置尚未确定"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "嘿,在 Organic Maps 上查看我标注的图钉吧!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "长度"; +"share_my_location" = "共享我的位置"; + "prefs_group_route" = "导航"; "pref_zoom_title" = "缩放按钮"; diff --git a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings index 73c06b02f6..6b784a100c 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings @@ -185,6 +185,9 @@ /* resource for context menu */ "edit" = "編輯"; +/* Warning message when doing search around current position */ +"unknown_current_position" = "您的位置尚未定位完成"; + /* Subject for emailed bookmark */ "bookmark_share_email_subject" = "嘿,看看我在 Organic Maps 地圖上的圖釘!"; @@ -212,6 +215,8 @@ /* Length of track in cell that describes route */ "length" = "長度"; +"share_my_location" = "分享我的位置"; + "prefs_group_route" = "導航"; "pref_zoom_title" = "縮放按鈕"; -- 2.45.3 From b000ec07c03ac5228e3965f6125f78c274037657 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Tue, 13 Aug 2024 22:10:13 +0200 Subject: [PATCH 26/38] [drape] Use explicit font height in pixels for line metrics calculation The simplest approach works in the best way with different fonts, including Hebrew Noto Signed-off-by: Alexander Borsuk --- drape/glyph_manager.cpp | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/drape/glyph_manager.cpp b/drape/glyph_manager.cpp index 046d824b79..742da87428 100644 --- a/drape/glyph_manager.cpp +++ b/drape/glyph_manager.cpp @@ -255,28 +255,11 @@ public: auto const yOffset = (currPos.y_offset + static_cast(metrics.horiBearingY) - metrics.height) >> 6; int32_t const xAdvance = currPos.x_advance >> 6; // yAdvance is always zero for horizontal text layouts. - // This height gives 16 instead of expected 22-23. - // int32_t const height = metrics.height >> 6; - outMetrics.AddGlyphMetrics(static_cast(fontIndex), glyphId, xOffset, yOffset, xAdvance, - GetLineHeigthPixels(metrics.vertAdvance)); + outMetrics.AddGlyphMetrics(static_cast(fontIndex), glyphId, xOffset, yOffset, xAdvance, fontPixelSize); } } -private: - int32_t GetLineHeigthPixels(FT_Pos vertAdvance) const - { - // Freetype says that vertAdvance is unreliable if it contains a synthesized value in case of FT_HAS_VERTICAL - // returning false. Testing on supported fonts shows that non-zero vertAdvance can be trusted as a line height. - if (vertAdvance > 0 && vertAdvance < m_fontFace->bbox.yMax) [[likely]] - return vertAdvance >> 6; - - int32_t const bboxYMax = FT_MulFix(m_fontFace->bbox.yMax, m_fontFace->size->metrics.y_scale) >> 6; - int32_t const bboxYMmin = FT_MulFix(m_fontFace->bbox.yMin, m_fontFace->size->metrics.y_scale) >> 6; - - return bboxYMax - bboxYMmin; - } - private: ReaderPtr m_fontReader; FT_StreamRec_ m_stream; -- 2.45.3 From a86c911b4509d8f23d61d98aaf86d5240a698e0a Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Tue, 13 Aug 2024 22:13:37 +0200 Subject: [PATCH 27/38] [fonts] Use NotoSans instead of Serif for Hebrew Signed-off-by: Alexander Borsuk --- .../main/assets/00_NotoSansHebrew-Regular.ttf | 1 + data/00_NotoSansHebrew-Regular.ttf | Bin 0 -> 48036 bytes data/fonts_whitelist.txt | 4 +++- iphone/Maps/Maps.xcodeproj/project.pbxproj | 4 ++++ platform/platform.cpp | 1 + qt/CMakeLists.txt | 1 + 6 files changed, 10 insertions(+), 1 deletion(-) create mode 120000 android/app/src/main/assets/00_NotoSansHebrew-Regular.ttf create mode 100644 data/00_NotoSansHebrew-Regular.ttf diff --git a/android/app/src/main/assets/00_NotoSansHebrew-Regular.ttf b/android/app/src/main/assets/00_NotoSansHebrew-Regular.ttf new file mode 120000 index 0000000000..adccadfd0a --- /dev/null +++ b/android/app/src/main/assets/00_NotoSansHebrew-Regular.ttf @@ -0,0 +1 @@ +../../../../../data/00_NotoSansHebrew-Regular.ttf \ No newline at end of file diff --git a/data/00_NotoSansHebrew-Regular.ttf b/data/00_NotoSansHebrew-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b44a0db044c1625f118c7e20bd30ff662f0181bd GIT binary patch literal 48036 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 CT_R5a literal 0 HcmV?d00001 diff --git a/data/fonts_whitelist.txt b/data/fonts_whitelist.txt index e2f1b1bbcf..68a45694a8 100644 --- a/data/fonts_whitelist.txt +++ b/data/fonts_whitelist.txt @@ -19,4 +19,6 @@ Devanagari 00_NotoSerifDevanagari-Regular.ttf Malayalam /system/fonts/NotoSansMalayalam-Regular.ttf Malayalam 00_NotoSansMalayalam-Regular.ttf Bengali /system/fonts/NotoSansBengali-Regular.ttf -Bengali 00_NotoSansBengali-Regular.ttf \ No newline at end of file +Bengali 00_NotoSansBengali-Regular.ttf +Hebrew /system/fonts/NotoSansHebrew-Regular.ttf +Hebrew 00_NotoSansHebrew-Regular.ttf \ No newline at end of file diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 2a0165961d..188673e516 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -630,6 +630,7 @@ FA637ED329A500BE00D8921A /* drules_proto_outdoors_light.txt in Resources */ = {isa = PBXBuildFile; fileRef = FA637ECF29A500BE00D8921A /* drules_proto_outdoors_light.txt */; }; FA637ED429A500BE00D8921A /* drules_proto_outdoors_dark.txt in Resources */ = {isa = PBXBuildFile; fileRef = FA637ED029A500BE00D8921A /* drules_proto_outdoors_dark.txt */; }; FA637ED529A500BE00D8921A /* drules_proto_outdoors_dark.bin in Resources */ = {isa = PBXBuildFile; fileRef = FA637ED129A500BE00D8921A /* drules_proto_outdoors_dark.bin */; }; + FA80EB6B2C6BEB9300C5E8E5 /* 00_NotoSansHebrew-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FA80EB682C6BEB9300C5E8E5 /* 00_NotoSansHebrew-Regular.ttf */; }; FA853BA726BC3ACE0026D455 /* CoreApi.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA853BA626BC3ACE0026D455 /* CoreApi.framework */; }; FA853BA926BC3B8A0026D455 /* libbase.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FA853BA826BC3B8A0026D455 /* libbase.a */; }; FA853BAB26BC3B8A0026D455 /* libcoding.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FA853BAA26BC3B8A0026D455 /* libcoding.a */; }; @@ -1663,6 +1664,7 @@ FA637ED029A500BE00D8921A /* drules_proto_outdoors_dark.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = drules_proto_outdoors_dark.txt; path = ../../data/drules_proto_outdoors_dark.txt; sourceTree = ""; }; FA637ED129A500BE00D8921A /* drules_proto_outdoors_dark.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; name = drules_proto_outdoors_dark.bin; path = ../../data/drules_proto_outdoors_dark.bin; sourceTree = ""; }; FA64D9A813F975AD00350ECF /* types.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = types.txt; path = ../../data/types.txt; sourceTree = SOURCE_ROOT; }; + FA80EB682C6BEB9300C5E8E5 /* 00_NotoSansHebrew-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "00_NotoSansHebrew-Regular.ttf"; path = "../../data/00_NotoSansHebrew-Regular.ttf"; sourceTree = ""; }; FA853BA626BC3ACE0026D455 /* CoreApi.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CoreApi.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FA853BA826BC3B8A0026D455 /* libbase.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libbase.a; sourceTree = BUILT_PRODUCTS_DIR; }; FA853BAA26BC3B8A0026D455 /* libcoding.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libcoding.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -3787,6 +3789,7 @@ children = ( 6B679E88266BFD090074AE2A /* 00_NotoNaskhArabic-Regular.ttf */, FAC4E60F2C1FA9FC0043979C /* 00_NotoSansBengali-Regular.ttf */, + FA80EB682C6BEB9300C5E8E5 /* 00_NotoSansHebrew-Regular.ttf */, 6B15907026623AE500944BBA /* 00_NotoSansThai-Regular.ttf */, FA45118E2A5EC15100CD8F64 /* 00_NotoSerifDevanagari-Regular.ttf */, FAC4E6092C1FA4C40043979C /* 00_NotoSansMalayalam-Regular.ttf */, @@ -4073,6 +4076,7 @@ 340E1EF21E2F614400CE49BF /* Main.storyboard in Resources */, F6E2FE521E097BA00083EBEC /* MWMActionBarButton.xib in Resources */, EDBD68072B625724005DD151 /* LocationServicesDisabledAlert.xib in Resources */, + FA80EB6B2C6BEB9300C5E8E5 /* 00_NotoSansHebrew-Regular.ttf in Resources */, 993DF0CA23F6BD0600AC231A /* ElevationDetailsViewController.xib in Resources */, F623DA6F1C9C2E62006A3436 /* MWMAddPlaceNavigationBar.xib in Resources */, 6741A9991BF340DE002C974C /* MWMAlertViewController.xib in Resources */, diff --git a/platform/platform.cpp b/platform/platform.cpp index 1026368300..e4bc3667f8 100644 --- a/platform/platform.cpp +++ b/platform/platform.cpp @@ -196,6 +196,7 @@ void Platform::GetFontNames(FilesList & res) const char constexpr const * arrDef[] = { "00_NotoNaskhArabic-Regular.ttf", "00_NotoSansBengali-Regular.ttf", + "00_NotoSansHebrew-Regular.ttf", "00_NotoSansMalayalam-Regular.ttf", "00_NotoSansThai-Regular.ttf", "00_NotoSerifDevanagari-Regular.ttf", diff --git a/qt/CMakeLists.txt b/qt/CMakeLists.txt index e9265004b0..8513577266 100644 --- a/qt/CMakeLists.txt +++ b/qt/CMakeLists.txt @@ -139,6 +139,7 @@ copy_resources( 00_NotoNaskhArabic-Regular.ttf 00_NotoSansBengali-Regular.ttf + 00_NotoSansHebrew-Regular.ttf 00_NotoSansMalayalam-Regular.ttf 00_NotoSansThai-Regular.ttf 00_NotoSerifDevanagari-Regular.ttf -- 2.45.3 From 3802453b5ea36865089f68269de60739efde16ee Mon Sep 17 00:00:00 2001 From: Sergiy Kozyr Date: Wed, 14 Aug 2024 16:11:12 +0300 Subject: [PATCH 28/38] Inherit TrackDataV9MM from TrackDataV8MM Signed-off-by: Sergiy Kozyr --- kml/types_v9mm.hpp | 52 +--------------------------------------------- 1 file changed, 1 insertion(+), 51 deletions(-) diff --git a/kml/types_v9mm.hpp b/kml/types_v9mm.hpp index d0687a4ac8..8186c64839 100644 --- a/kml/types_v9mm.hpp +++ b/kml/types_v9mm.hpp @@ -5,7 +5,7 @@ namespace kml { -struct TrackDataV9MM +struct TrackDataV9MM : TrackDataV8MM { DECLARE_VISITOR_AND_DEBUG_PRINT(TrackDataV9MM, visitor(m_id, "id"), visitor(m_localId, "localId"), @@ -25,56 +25,6 @@ struct TrackDataV9MM DECLARE_COLLECTABLE(LocalizableStringIndex, m_name, m_description, m_nearestToponyms, m_properties) - bool operator==(TrackDataV9MM const & data) const - { - return m_id == data.m_id && m_localId == data.m_localId && m_name == data.m_name && - m_description == data.m_description && m_layers == data.m_layers && - IsEqual(m_timestamp, data.m_timestamp) && m_geometry == data.m_geometry && - m_visible == data.m_visible && m_nearestToponyms == data.m_nearestToponyms && - m_properties == data.m_properties; - } - - bool operator!=(TrackDataV9MM const & data) const { return !operator==(data); } - - TrackData ConvertToLatestVersion() const - { - TrackData data; - data.m_id = m_id; - data.m_localId = m_localId; - data.m_name = m_name; - data.m_description = m_description; - data.m_layers = m_layers; - data.m_timestamp = m_timestamp; - data.m_geometry = m_geometry; - data.m_visible = m_visible; - data.m_nearestToponyms = m_nearestToponyms; - data.m_properties = m_properties; - return data; - } - - // Unique id (it will not be serialized in text files). - TrackId m_id = kInvalidTrackId; - // Local track id. - LocalId m_localId = 0; - // Track's name. - LocalizableString m_name; - // Track's description. - LocalizableString m_description; - // Layers. - std::vector m_layers; - // Creation timestamp. - TimestampMillis m_timestamp{}; - MultiGeometry m_geometry; - // Visibility. - bool m_visible = true; - // These constants were introduced in KMB V8MM. Usually have value 0. Don't know its purpose. - uint8_t m_constant1 = 0; - uint8_t m_constant2 = 0; - uint8_t m_constant3 = 0; - // Nearest toponyms. - std::vector m_nearestToponyms; - // Key-value properties. - Properties m_properties; // Extra field introduced in V9MM. bool m_flag1 = true; }; -- 2.45.3 From 548425f133180f418796ea2a1385bce08bc39c06 Mon Sep 17 00:00:00 2001 From: Sergiy Kozyr Date: Wed, 14 Aug 2024 16:13:26 +0300 Subject: [PATCH 29/38] Apply suggestions from code review Co-authored-by: Alexander Borsuk <170263+biodranik@users.noreply.github.com> Signed-off-by: Sergiy Kozyr --- kml/header_binary.hpp | 4 ++-- kml/kml_tests/serdes_tests.cpp | 8 ++++---- kml/kml_tests/tests_data.hpp | 2 +- kml/types_v9mm.hpp | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/kml/header_binary.hpp b/kml/header_binary.hpp index 77663f99f7..afcf501639 100644 --- a/kml/header_binary.hpp +++ b/kml/header_binary.hpp @@ -26,10 +26,10 @@ enum class Version : uint8_t // tags to kml V9 = 9, // 01 October 2020: add minZoom to bookmarks Latest = V9, - V8MM = 10, // 27 July 2023: MapsMe release version v15.0.71617. Technically it's version is 8 + V8MM = 10, // 27 July 2023: MapsMe released version v15.0.71617. Technically its version is 8 // (first byte is 0x08), but it's not compatible with V8 from this repo. It has // no compilations. - V9MM = 11 // In July 2024 MapsMe release version with new KMB format. Technically its version is 9 + V9MM = 11 // In July 2024 MapsMe released version with a new KMB format. Technically its version is 9 // (first byte is 0x09), but it's not compatible with OrganicMaps V9 from this repo. It has // extra flag in tracks data. }; diff --git a/kml/kml_tests/serdes_tests.cpp b/kml/kml_tests/serdes_tests.cpp index e257a023d0..b33d4fddde 100644 --- a/kml/kml_tests/serdes_tests.cpp +++ b/kml/kml_tests/serdes_tests.cpp @@ -849,8 +849,8 @@ UNIT_TEST(Kml_Deserialization_From_Bin_V8_And_V8MM) TEST(false, ("Exception raised", exc.what())); } - // Can't compare dataFromBinV8.m_categoryData and dataFromBinV8MM.m_categoryData directly - // because new format has less properties and different m_id. Compare some properties here: +// Can't compare dataFromBinV8.m_categoryData and dataFromBinV8MM.m_categoryData directly +// because new format has less properties and different m_id. Compare some properties here: TEST_EQUAL(dataFromBinV8.m_categoryData.m_name, dataFromBinV8MM.m_categoryData.m_name, ()); TEST_EQUAL(dataFromBinV8.m_categoryData.m_description, dataFromBinV8MM.m_categoryData.m_description, ()); TEST_EQUAL(dataFromBinV8.m_categoryData.m_annotation, dataFromBinV8MM.m_categoryData.m_annotation, ()); @@ -876,7 +876,7 @@ UNIT_TEST(Kml_Deserialization_From_KMB_V8_And_V9MM) } catch (kml::binary::DeserializerKml::DeserializeException const & exc) { - TEST(false, ("Exception raised", exc.what())); + TEST(false, ("Failed to deserialize data from KMB V8 and V9MM", exc.what())); } kml::FileData dataFromBinV9MM; @@ -888,7 +888,7 @@ UNIT_TEST(Kml_Deserialization_From_KMB_V8_And_V9MM) } catch (kml::binary::DeserializerKml::DeserializeException const & exc) { - TEST(false, ("Exception raised", exc.what())); + TEST(false, ("Failed to deserialize data from KMB V9MM", exc.what())); } // Can't compare dataFromBinV8.m_categoryData and dataFromBinV9MM.m_categoryData directly diff --git a/kml/kml_tests/tests_data.hpp b/kml/kml_tests/tests_data.hpp index f1f323611b..809c95b3d5 100644 --- a/kml/kml_tests/tests_data.hpp +++ b/kml/kml_tests/tests_data.hpp @@ -1645,7 +1645,7 @@ std::vector const kBinKmlV8MM = { 0x98, 0x00, 0x01, 0x00, 0x29 }; -// kBinKmlV8MM contains the same bookmarks and tracks as kBinKmlV7 +// kBinKmlV9MM contains the same bookmarks and tracks as kBinKmlV8 std::vector const kBinKmlV9MM = { 0x09, 0x26, 0x41, 0x3a, 0x33, 0x39, 0x37, 0x33, 0x65, 0x66, 0x34, 0x64, 0x2d, 0x66, 0x35, 0x31, 0x65, 0x2d, 0x34, 0x61, 0x37, 0x31, 0x2d, 0x38, 0x65, 0x64, 0x34, 0x2d, 0x64, 0x65, 0x61, 0x33, diff --git a/kml/types_v9mm.hpp b/kml/types_v9mm.hpp index 8186c64839..69a3fd97d5 100644 --- a/kml/types_v9mm.hpp +++ b/kml/types_v9mm.hpp @@ -25,12 +25,12 @@ struct TrackDataV9MM : TrackDataV8MM DECLARE_COLLECTABLE(LocalizableStringIndex, m_name, m_description, m_nearestToponyms, m_properties) - // Extra field introduced in V9MM. + // Extra field introduced in V9MM for tracks. bool m_flag1 = true; }; -// FileDataV8MM contains the same sections as FileDataV8MM but with changed m_tracksData format +// Contains the same sections as FileDataV8MM but with changed m_tracksData format struct FileDataV9MM { DECLARE_VISITOR_AND_DEBUG_PRINT(FileDataV9MM, visitor(m_serverId, "serverId"), -- 2.45.3 From a076ac687a71ec1cb8e124733c4315ef5eff992b Mon Sep 17 00:00:00 2001 From: Sergiy Kozyr Date: Wed, 14 Aug 2024 16:17:44 +0300 Subject: [PATCH 30/38] Reduced log level to warning Signed-off-by: Sergiy Kozyr --- kml/serdes_binary.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kml/serdes_binary.hpp b/kml/serdes_binary.hpp index 91c1ffd079..63448b5f8d 100644 --- a/kml/serdes_binary.hpp +++ b/kml/serdes_binary.hpp @@ -271,7 +271,7 @@ private: m_header.m_tracksOffset == 0x28 || m_header.m_stringsOffset == 0x28 || m_header.m_compilationsOffset == 0x28) { - LOG(LWARNING, ("KMB file has version V8MM")); + LOG(LINFO, ("KMB file has version V8MM")); m_header.m_version = Version::V8MM; m_header.m_eosOffset = m_header.m_stringsOffset; m_header.m_stringsOffset = m_header.m_compilationsOffset; @@ -286,7 +286,7 @@ private: m_header.m_tracksOffset == 0x28 || m_header.m_stringsOffset == 0x28 || m_header.m_compilationsOffset == 0x28) { - LOG(LWARNING, ("KMB file has version V9MM")); + LOG(LINFO, ("KMB file has version V9MM")); m_header.m_version = Version::V9MM; m_header.m_eosOffset = m_header.m_stringsOffset; m_header.m_stringsOffset = m_header.m_compilationsOffset; -- 2.45.3 From 156cc9558ea327c825ab0412e74b40ecedfd399f Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Tue, 13 Aug 2024 22:32:29 +0200 Subject: [PATCH 31/38] Enabled logs for free disk space checks when downloading/updating countries There are several bug reports that iOS wrongly says that there is no free space available. As we can get iOS logs now, we can try to debug such cases. Signed-off-by: Alexander Borsuk --- platform/platform_unix_impl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/platform_unix_impl.cpp b/platform/platform_unix_impl.cpp index 231381e9be..c5ac6b5843 100644 --- a/platform/platform_unix_impl.cpp +++ b/platform/platform_unix_impl.cpp @@ -114,7 +114,7 @@ Platform::TStorageStatus Platform::GetWritableStorageStatus(uint64_t neededSize) struct statfs st; int const ret = statfs(m_writableDir.c_str(), &st); - LOG(LDEBUG, ("statfs return =", ret, + LOG(LINFO, ("statfs return =", ret, "; block size =", st.f_bsize, "; blocks available =", st.f_bavail)); @@ -125,7 +125,7 @@ Platform::TStorageStatus Platform::GetWritableStorageStatus(uint64_t neededSize) } auto const availableBytes = st.f_bsize * st.f_bavail; - LOG(LDEBUG, ("Free space check: requested =", neededSize, "; available =", availableBytes)); + LOG(LINFO, ("Free space check: requested =", neededSize, "; available =", availableBytes)); if (availableBytes < neededSize) return NOT_ENOUGH_SPACE; -- 2.45.3 From eb3fda97c64641615473ac9e5153a7a5edd47134 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Sun, 11 Aug 2024 16:38:33 +0200 Subject: [PATCH 32/38] [strings] Traditional and Simple Chinese updates from Felix Signed-off-by: Alexander Borsuk --- data/categories.txt | 20 +- data/strings/strings.txt | 902 +++++++++++++++++++-------------------- 2 files changed, 461 insertions(+), 461 deletions(-) diff --git a/data/categories.txt b/data/categories.txt index fdef1461ab..fce98cf8ba 100644 --- a/data/categories.txt +++ b/data/categories.txt @@ -188,7 +188,7 @@ tr:4Ulaşım uk:5Транспорт vi:Giao thông zh-Hans:交通 -zh-Hant:運輸 +zh-Hant:交通 el:Συγκοινωνία he:תחבורה sk:Doprava @@ -228,7 +228,7 @@ th:ก๊าซ tr:3Benzinlik|3Yakıt|3Akaryakıt|2Dizel|2Gaz uk:3бензин|3дызель|4паліва|газ vi:Khí đốt -zh-Hans:汽油 +zh-Hans:加油站 zh-Hant:加油站 el:Υγρά Καύσιμα he:גז @@ -353,8 +353,8 @@ th:โรงแรม tr:Otel|Oteller uk:4Готель|готелі vi:Khách sạn -zh-Hans:旅店|酒店|賓館 -zh-Hant:飯店|酒店|宾馆 +zh-Hans:酒店|旅店|賓館 +zh-Hant:旅馆|飯店|酒店|宾馆 el:4Ξενοδοχείο|Διαμονή|Ξενοδοχεία he:מלון|בתי sk:Hotel|Hotely @@ -559,7 +559,7 @@ tr:3Bankamatik uk:3Банкомат vi:ATM zh-Hans:自动取款机 -zh-Hant:1自動櫃員機 +zh-Hant:1自動提款機 el:ATM he:כספומט sk:3Bankomat @@ -604,8 +604,8 @@ th:สำหรับ RV tr:4Karavan Tesisleri uk:Для автобудинків|5Автодім|5Автобудинок|5Трейлер|5Караван|Будинок на колесах vi:Đối với RV -zh-Hans:房车用 -zh-Hant:房車用 +zh-Hans:房车设施 +zh-Hant:露營車設施 ca:Autocaravana amenity-atm|@category_atm @@ -725,7 +725,7 @@ tr:İkinci el uk:Секонд-хенд vi:Đồ cũ zh-Hans:二手货 -zh-Hant:二手 +zh-Hant:二手貨 amenity-bank|@category_bank en:money|U+1F3E6|U+1F4B0|U+1F4B2|U+1F4B3|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7 @@ -5781,7 +5781,7 @@ sv:apotekare th:เภสัชกร uk:3ліки zh-Hans:药店|药剂师 -zh-Hant:成藥 +zh-Hant:藥局 el:φαρμακείο|φαρμακοποιός|χορήγηση φαρμάκων fa:داروخانه @@ -5817,7 +5817,7 @@ th:3ไปรษณีย์ tr:3Posta uk:3Пошта vi:Bưu điện -zh-Hans:1邮政 +zh-Hans:1邮局 zh-Hant:1郵局 el:Ταχυδρομείο he:דואר diff --git a/data/strings/strings.txt b/data/strings/strings.txt index d04dba6c5e..a9d638f960 100644 --- a/data/strings/strings.txt +++ b/data/strings/strings.txt @@ -272,8 +272,8 @@ tr = İndirme başarısız oldu. Tekrar denemek için dokunun. uk = Помилка завантаження. Натисніть, щоб повторити спробу vi = Tải xuống thất bại, hãy chạm lại để thử một lần nữa - zh-Hans = 下载失败,重新轻触再试一次 - zh-Hant = 下載失敗,輕觸以再試一次 + zh-Hans = 下载失败,点击以再试一次 + zh-Hant = 下載失敗,點擊以再試一次 [downloading] comment = Settings/Downloader - info for country which started downloading @@ -318,8 +318,8 @@ tr = İndiriliyor… uk = Завантажується… vi = Đang tải xuống… - zh-Hans = 下载… - zh-Hant = 下載中… + zh-Hans = 正在下载… + zh-Hant = 正在下載… [kilometres] comment = Choose measurement on first launch alert - choose metric system button @@ -590,8 +590,8 @@ tr = Daha sonra uk = Не зараз vi = Để sau - zh-Hans = 稍后 - zh-Hant = 稍後 + zh-Hans = 以后再说 + zh-Hant = 以後再說 [search] comment = View and button titles for accessibility, please also edit it in iphone/plist.txt @@ -774,8 +774,8 @@ tr = Şu anda bu cihaz veya uygulama için tüm Konum Hizmetleri devre dışı bırakılmış. Lütfen bunu ayarlardan etkinleştirin. uk = Геолокація вимкнена в налаштуваннях пристрою. Будь ласка, увімкніть її для зручного використання програми. vi = Bạn hiện đang tắt tất cả Dịch vụ Định vị cho thiết bị hoặc ứng dụng này. Bạn vui lòng bật lại chúng trong Thiết lập. - zh-Hans = 您目前有此设备的所有位置服务或应用已禁用。请在设置中启用它们。 - zh-Hant = 您目前裝置所有的定位服務或相關應用程式是處於停用的狀態,請從系統設定中選擇啟用。 + zh-Hans = 您当前已禁用此设备或应用程序的所有位置服务,请在设置中启用。 + zh-Hant = 您當前已禁用此裝置或應用程式的所有位置服務,請在設定中啟用。 [zoom_to_country] comment = View and button titles for accessibility @@ -958,7 +958,7 @@ tr = Tekrar Dene uk = Спробуйте ще раз vi = Thử lại - zh-Hans = 重试 + zh-Hans = 再试一次 zh-Hant = 再試一次 [about_menu_title] @@ -1093,8 +1093,8 @@ tr = • Reklam yok, izleyici yok, veri toplama yok uk = • Без реклами, без трекінгу, без стеження vi = • Không có quảng cáo, không theo dõi, không thu thập dữ liệu - zh-Hans = •没有广告,不会跟踪您,更不会收集您的数据 - zh-Hant = •沒有廣告,不會跟踪您,更不會收集您的數據 + zh-Hans = • 没有广告,不会跟踪您,更不会收集您的数据 + zh-Hant = • 沒有廣告,不會跟踪您,更不會收集您的數據 [about_proposition_2] tags = android,ios @@ -1140,8 +1140,8 @@ tr = • Pilinizi tüketmez, çevrimdışı çalışır uk = • Не розряджає батарею, працює в автономному режимі vi = • Không hao pin, hoạt động offline - zh-Hans = • 无需耗费电池,可离线工作 - zh-Hant = • 無電池消耗,離線工作 + zh-Hans = • 无需耗费太多电量,可离线工作 + zh-Hant = • 無需耗費太多電量,可離線工作 [about_proposition_3] tags = android,ios @@ -1186,8 +1186,8 @@ tr = • Hızlı, minimalist, topluluk tarafından geliştirilmiş uk = • Швидкий, мінімалістичний, розроблений спільнотою vi = • Nhanh chóng, tối giản, được phát triển bởi cộng đồng - zh-Hans = • 快速、简约、由社区开发 - zh-Hant = • 快速、簡約、由社區開發 + zh-Hans = • 快速且简约,由社区开发 + zh-Hant = • 快速且簡約,由社區開發 [about_developed_by_enthusiasts] tags = android @@ -1230,8 +1230,8 @@ tr = Teknoloji tutkunları ve gönüllüler tarafından oluşturulan açık kaynaklı bir uygulama. uk = Програма з відкритим кодом, створена ентузіастами та волонтерами. vi = Ứng dụng nguồn mở được tạo bởi những người đam mê và tình nguyện viên. - zh-Hans = 由爱好者和志愿者创建的开源应用程序。 - zh-Hant = 由愛好者和志願者創建的開源應用程序。 + zh-Hans = 由爱好者和志愿者开发的开源应用程序。 + zh-Hant = 由愛好者和志願者開發的開源應用程式。 [location_settings] tags = android @@ -1366,8 +1366,8 @@ tr = Hızlı donanıma sahip bir OpenGL gerekli. Ne yazık ki cihazınız desteklenmiyor. uk = Для роботи програми необхідний апаратно прискорений OpenGL. На жаль, ваш пристрій не підтримується. vi = Cần có OpenGL được tăng tốc phần cứng. Thật không may, thiết bị của bạn không được hỗ trợ. - zh-Hans = 硬件加速的 OpenGL 是必需的。遗憾的是您的设备不支持此功能。 - zh-Hant = 需要 OpenGL 硬體加速功能的支援。但很不幸的,您的裝置並不支援此功能! + zh-Hans = 该应用程序需要硬件加速的 OpenGL。很遗憾,您的设备不受支持。 + zh-Hant = 該應用程式需要硬體加速的 OpenGL。很遺憾,您的裝置不受支持。 [download] tags = android,ios @@ -1456,7 +1456,7 @@ tr = Organic Maps’i kullanabilmek için lütfen USB kablosunun bağlantısını kesin veya hafıza kartı takın uk = Вимкніть USB кабель або вставте SD-карту vi = Bạn vui lòng tháo cáp USB hoặc lắp thẻ nhớ vào để sử dụng Organic Maps - zh-Hans = 请断开 USB 线或插入存储卡以使用 Organic Maps + zh-Hans = 请拔除 USB 线或插入 SD 卡以使用 Organic Maps zh-Hant = 請拔除 USB 線或插入 SD 卡以使用 Organic Maps [not_enough_free_space_on_sdcard] @@ -1502,8 +1502,8 @@ tr = Uygulamayı kullanabilmek için lütfen SD kart/USB depolama aygıtında biraz alan boşaltın uk = Недостатньо вільного місця на SD карті / в пам'яті пристрою для використання програми vi = Bạn vui lòng giải phóng dung lượng trên ổ lưu trữ thẻ SD/USB để có thể sử dụng ứng dụng - zh-Hans = 请在存储卡/ USB 储存设备上释放一些空间以 使用此应用 - zh-Hant = 如要繼續使用,請先釋放一些 SD 卡/ USB 儲存空間 + zh-Hans = 请先释放一些 SD 卡 / USB 存储空间以使用 Organic Maps。 + zh-Hant = 請先釋放一些 SD 卡 / USB 儲存空間以使用 Organic Maps。 [download_resources] tags = android @@ -1547,8 +1547,8 @@ tr = Başlamadan önce cihazınıza genel dünya haritasını indirelim.\n%@ alan gerekli. uk = Перш ніж розпочати дозвольте нам завантажити мапу світу на ваш пристрій.\nВона потребує %@ даних. vi = Trước khi bạn bắt đầu, hãy để chúng tôi tải bản đồ thế giới vào thiết bị của bạn.\nBản đồ này cần %@ dữ liệu. - zh-Hans = 在您开始前请让我们下载通用世界地图至您的设备中。\n它需要%@的 数据。 - zh-Hant = 在您開始之前,先讓我們下載世界地圖到您的裝置中以便瀏覽。\n這需要資料的 %@。 + zh-Hans = 在您开始使用此应用程序之前,请下载全球地图到您的设备。\n它将使用 %@ 的存储空间。 + zh-Hant = 在您開始使用此應用程式之前,請下載全球地圖到您的裝置。\n它將使用 %@ 的儲存空間。 [download_resources_continue] tags = android @@ -1593,7 +1593,7 @@ uk = Перейти на мапу vi = Đến Bản đồ zh-Hans = 前往地图 - zh-Hant = 跳到地圖 + zh-Hant = 前往地圖 [downloading_country_can_proceed] tags = android @@ -1637,8 +1637,8 @@ tr = %@ indiriliyor. Şimdi haritaya\ngidebilirsiniz. uk = Поки завантажується %@\nви можете користуватися програмою. vi = Đang tải xuống %@. Bây giờ bạn đã có thể\nvào bản đồ. - zh-Hans = 下载 %@。您现在可\n前往地图。 - zh-Hant = 正在下載 %@。您現在 可以繼續使用地圖了 + zh-Hans = 正在下载%@。您现在可以\n继续查看地图。 + zh-Hant = 正在下載%@。您現在可以\n繼續查看地圖。 [download_country_ask] tags = android @@ -1682,8 +1682,8 @@ tr = %@ indir? uk = Завантажити %@? vi = Tải xuống %@? - zh-Hans = 下载 %@? - zh-Hant = 下載 %@? + zh-Hans = 下载%@的地图吗? + zh-Hant = 下載%@的地圖嗎? [update_country_ask] tags = android @@ -1727,8 +1727,8 @@ tr = %@ güncelle? uk = Oновити %@? vi = Cập nhật %@? - zh-Hans = 更新 %@? - zh-Hant = 更新 %@? + zh-Hans = 更新%@的地图吗? + zh-Hant = 更新%@的地圖嗎? [pause] comment = REMOVE THIS STRING AFTER REFACTORING @@ -1865,8 +1865,8 @@ tr = %@ indirme işlemi başarısız oldu uk = Не вдалося завантажити %@ vi = %@ - zh-Hans = %@下载失败 - zh-Hant = %@ 下載失敗 + zh-Hans = %@的地图下载失败 + zh-Hant = %@的地圖下載失敗 [add_new_set] comment = "Add new bookmark list" dialog title @@ -1911,8 +1911,8 @@ tr = Yeni Liste Ekle uk = Додати список vi = Thêm Bộ Mới - zh-Hans = 添加新的集合 - zh-Hant = 新增收藏夾 + zh-Hans = 添加新的书签列表 + zh-Hant = 新增新的書籤列表 [bookmark_color] comment = Bookmark Color dialog title @@ -2003,8 +2003,8 @@ tr = Yer İmi Listesi Adı uk = Назва списка мiток vi = Đánh dấu Tên Bộ - zh-Hans = 书签集名称 - zh-Hant = 收藏夾名稱 + zh-Hans = 书签列表名称 + zh-Hant = 書籤列表名稱 [bookmark_sets] comment = "Bookmark Lists" dialog title @@ -2047,8 +2047,8 @@ tr = Yer İmi Listeleri uk = Списки мiток vi = Đánh dấu Bộ - zh-Hans = 书签集 - zh-Hant = 收藏夾 + zh-Hans = 书签列表 + zh-Hant = 書籤列表 [bookmarks] comment = Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. @@ -2183,7 +2183,7 @@ tr = Yerlerim uk = Мої Мітки vi = Các Địa chỉ của Tôi - zh-Hans = 我的位置 + zh-Hans = 我的地点 zh-Hant = 我的地點 [name] @@ -2460,8 +2460,8 @@ tr = Haritaların indirileceği yeri seçin uk = Виберіть місце, куди повинні бути завантажені мапи vi = Chọn vị trí nơi bản đồ sẽ được tải về - zh-Hans = 选取地图应该下载的位置 - zh-Hant = 請選擇下載地圖後要放的位置 + zh-Hans = 选择下载地图的文件夹。 + zh-Hant = 選擇下載地圖的資料夾。 [maps_storage_downloaded] comment = E.g. "Downloaded maps: 500Mb" in Maps Storage settings @@ -2505,8 +2505,8 @@ tr = Haritalar uk = Завантаженнi мапи vi = Bản đồ - zh-Hans = 地图 - zh-Hant = 地圖 + zh-Hans = 已下载的地图 + zh-Hant = 已下載的地圖 [maps_storage_internal] comment = Internal storage type in Maps Storage settings (not accessible by the user) @@ -2795,7 +2795,7 @@ uk = Це може зайняти кілька хвилин.\nБудь ласка, зачекайте… vi = Việc này có thể mất vài phút.\nVui lòng đợi… zh-Hans = 这可能需要几分钟的时间。\n请稍候… - zh-Hant = 這可能需要幾分鐘\n請稍候… + zh-Hant = 這可能需要幾分鐘的時間\n請稍候… [measurement_units] comment = Measurement units title in settings activity @@ -2984,7 +2984,7 @@ uk = Продукти vi = Cửa hàng tạp hóa zh-Hans = 食品 - zh-Hant = 食物 + zh-Hant = 食品 [category_transport] comment = Search category for public transport; any changes should be duplicated in categories.txt @category_transport! @@ -3030,7 +3030,7 @@ uk = Транспорт vi = Giao thông zh-Hans = 交通 - zh-Hant = 運輸 + zh-Hant = 交通 [category_fuel] comment = Search category for fuel stations; any changes should be duplicated in categories.txt @category_fuel! @@ -3075,7 +3075,7 @@ tr = Benzinlik uk = Заправка vi = Khí đốt - zh-Hans = 汽油 + zh-Hans = 加油站 zh-Hant = 加油站 [category_parking] @@ -3213,7 +3213,7 @@ uk = Секонд-хенд vi = Đồ cũ zh-Hans = 二手货 - zh-Hant = 二手 + zh-Hant = 二手貨 [category_hotel] comment = Search category for places to stay; any changes should be duplicated in categories.txt @category_hotel! @@ -3258,7 +3258,7 @@ tr = Otel uk = Готель vi = Khách sạn - zh-Hans = 旅店 + zh-Hans = 酒店 zh-Hant = 旅館 [category_tourism] @@ -3397,7 +3397,7 @@ uk = Банкомат vi = ATM zh-Hans = 自动取款机 - zh-Hant = 自動櫃員機 + zh-Hant = 自動提款機 [category_nightlife] comment = Search category for nightclubs/bars; any changes should be duplicated in categories.txt @category_nightlife! @@ -3721,7 +3721,7 @@ tr = Posta uk = Пошта vi = Bưu điện - zh-Hans = 邮政 + zh-Hans = 邮局 zh-Hant = 郵局 [category_police] @@ -3952,8 +3952,8 @@ tr = Karavan tesisleri uk = Для автобудинків vi = Đối với RV - zh-Hans = 房车用 - zh-Hant = 房車用 + zh-Hans = 房车设施 + zh-Hant = 露營車設施 [[Other translations]] @@ -4001,7 +4001,7 @@ uk = Примітка vi = Ghi chú zh-Hans = 注释 - zh-Hant = 描述說明 + zh-Hant = 註釋 [share_bookmarks_email_subject] comment = Email Subject when sharing bookmark list @@ -4044,8 +4044,8 @@ tr = Seninle paylaşılan Organic Maps yer imleri uk = З вами поділилися мiтками Organic Maps vi = Điểm đánh dấu Organic Maps được chia sẻ - zh-Hans = Organic Maps 书签已与您共享 - zh-Hant = 已分享 Organic Maps 書籤 + zh-Hans = 已与您分享 Organic Maps 书签 + zh-Hant = 已與您分享 Organic Maps 書籤 [share_bookmarks_email_body] tags = android,ios @@ -4124,7 +4124,7 @@ tr = Yer İmleri Yükleniyor uk = Завантаження мiток vi = Tải Điểm đánh dấu - zh-Hans = 加载书签 + zh-Hans = 正在载入书签… zh-Hant = 正在載入書籤… [load_kmz_successful] @@ -4170,8 +4170,8 @@ tr = Yer İmleri başarılı bir şekilde yüklendi! Bunları Haritada veya Yer İmleri Yöneticisi ekranında bulabilirsiniz. uk = Мiтки успішно завантаженi! Ви можете знайти їх на мапі або у ваших збережених мітках. vi = Đã tải điểm đánh dấu thành công! Bạn có thể tìm chúng trên bản đồ hoặc màn hình Trình quản lý Điểm đánh dấu. - zh-Hans = 书签加载成功!您可以在地图或书签管理窗口中找到它们。 - zh-Hant = 書籤上傳成功! 您可以在地圖上或是書籤管理畫面中找到書籤。 + zh-Hans = 书签载入成功!您可以在地图或书签管理页面中找到它们。 + zh-Hant = 書籤載入成功! 您可以在地圖或書籤管理畫面中找到它們。 [load_kmz_failed] comment = Kml file loading failed @@ -4216,8 +4216,8 @@ tr = Yer İmlerini yükleme işlemi başarısız oldu. Dosya bozuk veya hatalı olabilir. uk = Не вдалося завантажити мітки. Файл може бути пошкодженим або несправним. vi = Không tải lên được điểm đánh dấu. Tập tin có thể bị hỏng hoặc lỗi. - zh-Hans = 书签上传失败。该文件可能已损坏或有缺陷。 - zh-Hant = 書籤上傳失敗。 檔案可能有毀損或是不完全。 + zh-Hans = 书签载入失败,文件可能已损坏或不完整。 + zh-Hant = 書籤載入失敗,檔案可能已損壞或不完整。 [unknown_file_type] comment = Failed to recognize the format of a bookmarks or tracks file. @@ -4263,7 +4263,7 @@ tr = Dosya türü uygulama tarafından tanınmıyor:\n%1$@ uk = Тип файлу не розпізнається програмою:\n%1$@ vi = Loại tệp không được ứng dụng nhận dạng:\n%1$@ - zh-Hans = 应用程序无法识别文件类型:\n%1$@ + zh-Hans = 应用程序无法识别该文件类型:\n%1$@ zh-Hant = 應用程式無法識別該文件類型:\n%1$@ [failed_to_open_file] @@ -4311,8 +4311,8 @@ tr = Dosya açılamadı %1$@\n\n%2$@ uk = Не вдалося відкрити файл %1$@\n\n%2$@ vi = Không thể mở tập tin %1$@\n\n%2$@ - zh-Hans = 打开文件失败 %1$@\n\n%2$@ - zh-Hant = 無法開啟文件 %1$@\n\n%2$@ + zh-Hans = 无法打开文件 %1$@\n\n%2$@ + zh-Hant = 無法打開檔案 %1$@\n\n%2$@ [edit] comment = resource for context menu @@ -4404,7 +4404,7 @@ uk = Ваше місце розташування не визначено vi = Chưa xác định được vị trí của bạn zh-Hans = 您的位置尚未确定 - zh-Hant = 您的位置尚未定位完成 + zh-Hant = 您的位置尚未確定 [cant_change_this_setting] comment = Alert message that we can't run Map Storage settings due to some reasons. @@ -4449,7 +4449,7 @@ tr = Üzgünüz, Harita Depolama ayarları şu anda devre dışı. uk = Вибачте, налаштування папки з мапами зараз недоступні. vi = Rất tiếc, cài đặt Lưu trữ Bản đồ hiện đã bị tắt. - zh-Hans = 抱歉,地图存储设置目前被禁用 + zh-Hans = 很抱歉,地图存储设置目前已停用。 zh-Hant = 很抱歉,地圖儲存設定目前已停用。 [downloading_is_active] @@ -4496,7 +4496,7 @@ uk = Зараз відбувається завантаження країни. vi = Hiện đang tải xuống quốc gia. zh-Hans = 地图下载进行中。 - zh-Hant = 地圖下載中。 + zh-Hant = 地圖下載進行中。 [my_position_share_sms] comment = Share my position using SMS, %1$@ contains om:// and %2$@ https://omaps.app link WITHOUT NAME. @NOTE non-ascii symbols in the link will result in max 70 characters SMS instead of 140. @@ -4540,8 +4540,8 @@ tr = Hey, Organic Maps’te geçerli konumumu incele! %1$@ veya %2$@ Çevrimdışı haritalar sende yok mu? Buradan indir: https://omaps.app/get uk = Глянь де я зараз. Іди %1$@ або %2$@ vi = Này, hãy xem vị trí hiện tại của tôi tại Organic Maps! %1$@ hoặc %2$@ Bạn không có bản đồ ngoại tuyến? Tải xuống tại đây: https://omaps.app/get - zh-Hans = 嘿,在 Organic Maps 上查看我目前的位置吧!%1$@ 或%2$@ 未安装离线地图?在此下载: https://omaps.app/get - zh-Hant = 嘿,在 Organic Maps 查看我的目前位置吧! %1$@ 或%2$@ 沒安裝離線地圖?在此下載: https://omaps.app/get + zh-Hans = 嘿,在 Organic Maps 上查看我目前的位置吧!请打开 %1$@ 或 %2$@ 链接,还没安装离线地图?在此下载: https://omaps.app/get + zh-Hant = 嘿,在 Organic Maps 查看我的目前的位置吧!請打開 %1$@ 或 %2$@ 鏈接,還沒安裝離線地圖?在此下載: https://omaps.app/get [bookmark_share_email_subject] comment = Subject for emailed bookmark @@ -4585,8 +4585,8 @@ tr = Hey, Organic Maps haritasında raptiyemi incele! uk = Поглянь на мою мiтку на мапі Organic Maps vi = Này, hãy xem ghim của tôi tại Organic Maps map - zh-Hans = 嘿,在 Organic Maps 上查看我标注的图钉吧! - zh-Hant = 嘿,看看我在 Organic Maps 地圖上的圖釘! + zh-Hans = 嘿,看看我在 Organic Maps 上标记的图钉吧! + zh-Hant = 嘿,看看我在 Organic Maps 上標記的圖釘吧! [my_position_share_email_subject] comment = Subject for emailed position @@ -4630,8 +4630,8 @@ tr = Hey, Organic Maps’te geçerli konumumu incele! uk = Поглянь на моє поточне місцезнаходження на мапі Organic Maps vi = Này, hãy xem vị trí hiện tại của tôi tại Organic Maps map! - zh-Hans = 嗨,到 Organic Maps 查看我的当前位置! - zh-Hant = 嗨,到 Organic Maps 地圖查看我的目前位置! + zh-Hans = 嗨,到 Organic Maps 查看我当前的位置! + zh-Hant = 嗨,到 Organic Maps 查看我目前的位置! [my_position_share_email] comment = Share my position using EMail, %1$@ is om:// and %2$@ is https://omaps.app link WITHOUT NAME @@ -4767,7 +4767,7 @@ tr = E-posta uk = Ел. пошта vi = Email - zh-Hans = 邮件 + zh-Hans = 电子邮件 zh-Hant = 電子郵件 [copied_to_clipboard] @@ -4812,7 +4812,7 @@ tr = Panoya kopyalandı: %@ uk = Скопійовано в буфер обміну: %@ vi = Đã sao chép vào Bảng tạm: %@ - zh-Hans = 复制到剪贴板:%@ + zh-Hans = 已复制到剪贴板:%@ zh-Hant = 已複製到剪貼簿:%@ [info] @@ -4858,7 +4858,7 @@ uk = Інфо vi = Thông tin zh-Hans = 信息 - zh-Hant = 簡介 + zh-Hant = 資訊 [done] comment = Used for bookmark editing @@ -4947,7 +4947,7 @@ tr = Organic Maps sürümü: %@ uk = Версія Organic Maps: %@. vi = Phiên bản Organic Maps: %@ - zh-Hans = Organic Maps 版本: %@ + zh-Hans = Organic Maps 版本:%@ zh-Hant = Organic Maps 版本:%@ [data_version] @@ -5039,7 +5039,7 @@ uk = Продовжити? vi = Bạn có chắc muốn tiếp tục không? zh-Hans = 您确定要继续吗? - zh-Hant = 確定要繼續嗎? + zh-Hant = 您確定要繼續嗎? [tracks_title] comment = Title for tracks category in bookmarks manager @@ -5172,7 +5172,7 @@ tr = Konumumu Paylaş uk = Поділитися моїм місцезнаходженням vi = Chia sẻ Vị trí của tôi - zh-Hans = 共享我的位置 + zh-Hans = 分享我的位置 zh-Hant = 分享我的位置 [prefs_group_general] @@ -5827,8 +5827,8 @@ tr = 3D binalar güç tasarrufu modunda kapatılır uk = 3D будівлі вимкнені в режимі енергозбереження vi = Tòa nhà 3D bị tắt ở chế độ tiết kiệm năng lượng - zh-Hans = 3D 建筑在省电模式下关闭 - zh-Hant = 3D 建築在省電模式下關閉 + zh-Hans = 3D 建筑在省电模式下处于关闭状态 + zh-Hant = 3D 建築在省電模式下處於關閉狀態 [pref_tts_enable_title] comment = Settings «Route» category: «Tts enabled» title @@ -6048,8 +6048,8 @@ tr = Sesli yönlendirmeleri test edin (TTS, Text-To-Speech) uk = Тестування голосових підказок (TTS, Text-To-Speech) vi = Kiểm tra chỉ đường bằng giọng nói (TTS, chuyển văn bản thành giọng nói) - zh-Hans = 测试语音指令(TTS,Text-To-Speech) - zh-Hant = 測試語音指令(TTS、文本轉語音 + zh-Hans = 测试语音指令(TTS,文本转语音系统) + zh-Hant = 測試語音指令(TTS,文本轉語音系統) [pref_tts_playing_test_voice] comment = Settings «Route» category: Pop-up message when clicking «Test Voice Directions» @@ -6093,8 +6093,8 @@ tr = Sesi şimdi duymuyorsanız ses seviyesini veya sistem metin okuma ayarlarını kontrol edin. uk = Якщо ви не чуєте голос, перевірте гучність або налаштування системи перетворення тексту на мовлення. vi = Kiểm tra cài đặt âm lượng hoặc chuyển văn bản sang giọng nói của hệ thống nếu bây giờ bạn không nghe thấy giọng nói. - zh-Hans = 如果现在听不到语音,请检查音量或系统文本到语音设置。 - zh-Hant = 如果您現在聽不到聲音,請檢查音量或系統文本轉語音設置。 + zh-Hans = 如果您现在听不到声音,请检查音量或系统文本到语音系统的设置。 + zh-Hant = 如果您現在聽不到聲音,請檢查音量或系統文本轉語音系統的設定。 [pref_tts_unavailable] comment = Settings «Route» category: «Tts unavailable» subtitle @@ -6138,8 +6138,8 @@ tr = Mevcut Değil uk = Не доступнi vi = Không có sẵn - zh-Hans = 无法使用 - zh-Hant = 無法使用 + zh-Hans = 不可用 + zh-Hant = 不可用 [pref_tts_other_section_title] comment = Title for "Other" section in TTS settings. @@ -6228,7 +6228,7 @@ tr = En sonki rotayı kaydet uk = Недавній маршрут vi = Tìm kiếm gần đây - zh-Hans = 最近的路径 + zh-Hans = 最近的轨迹 zh-Hant = 最近的軌跡 [pref_map_auto_zoom] @@ -6360,8 +6360,8 @@ tr = 1 saat uk = 1 година vi = 1 giờ - zh-Hans = 1小时 - zh-Hant = 1小時 + zh-Hans = 1 小时 + zh-Hant = 1 小時 [duration_2_hours] tags = android,ios @@ -6404,8 +6404,8 @@ tr = 2 saat uk = 2 години vi = 2 giờ - zh-Hans = 2小时 - zh-Hant = 2小時 + zh-Hans = 2 小时 + zh-Hant = 2 小時 [duration_6_hours] tags = android,ios @@ -6448,8 +6448,8 @@ tr = 6 saat uk = 6 годин vi = 6 giờ - zh-Hans = 6小时 - zh-Hant = 6小時 + zh-Hans = 6 小时 + zh-Hant = 6 小時 [duration_12_hours] tags = android,ios @@ -6492,8 +6492,8 @@ tr = 12 saat uk = 12 годин vi = 12 giờ - zh-Hans = 12小时 - zh-Hant = 12小時 + zh-Hans = 12 小时 + zh-Hant = 12 小時 [duration_1_day] tags = android,ios @@ -6536,8 +6536,8 @@ tr = 1 gün uk = 1 день vi = 1 ngày - zh-Hans = 1天 - zh-Hant = 1天 + zh-Hans = 1 天 + zh-Hant = 1 天 [recent_track_help_text] tags = ios @@ -6581,8 +6581,8 @@ tr = Bu özellik, belirli bir süre içinde katedilen yolu kaydetmenizi ve harita üzerinde görüntülemenizi sağlar. Lütfen unutmayın: bu özelliğin etkinleştirilmesi pil tüketiminin artmasına neden olur. Kaydedilen rota, zaman aralığının sona ermesinin ardından otomatik olarak haritadan kaldırılacaktır. uk = Ця функція дозволяє прокласти подоланий маршрут протягом певного проміжку часу та переглянути його на мапі. Звертаємо вашу увагу, що вмикання цієї функції пришвидшить розрядження акумулятора. Щойно сплине заданий проміжок часу, прокладений маршрут буде видалено з мапи. vi = Chức năng này cho phép bạn ghi lại đường đi trong một khoảng thời gian nhất định và xem nó trên bản đồ. Xin lưu ý: việc kích hoạt chức năng này sẽ tăng mức sử dụng pin. Đường đi sẽ tự động bị xóa khỏi bản đồ sau khi kết thúc khoảng thời gian nói trên. - zh-Hans = 它允许您记录一定时间段内的旅行路径,并在地图上查看。请注意:激活此功能会导致电量消耗加快。过期后,轨迹将从地图中自动移除。 - zh-Hant = 它可讓您記錄特定期間所行經的路徑,並在地圖上看到該路徑。請注意:啟用此項功能會增加電池使用量。在時間間隔過期後,會從地圖中自動移除行進路線。 + zh-Hans = 记录并显示您在指定时间段内的旅行轨迹。请注意:这会显著增加电池消耗。 + zh-Hant = 記錄並顯示您在指定時間段內的旅行軌跡。請注意:這會顯著增加電池消耗。 [placepage_distance] tags = android,ios @@ -6891,7 +6891,7 @@ uk = Відгук vi = Phản hồi zh-Hans = 反馈 - zh-Hant = 意見反應 + zh-Hant = 反饋 [rate_the_app] comment = Text in menu @@ -7117,8 +7117,8 @@ tr = En iyi harita uygulamasını birlikte geliştirmemiz için bağış yapın! uk = Пожертвуйте, щоб разом створювати найкращі мапи! vi = Hãy quyên góp để cùng nhau xây dựng những bản đồ tốt nhất! - zh-Hans = 捐赠,共同打造最好的地图! - zh-Hant = 捐款共同打造最好的地圖! + zh-Hans = 捐助,以共同打造最好的地图! + zh-Hant = 捐助,以共同打造最好的地圖! [how_to_support_us] comment = Button in the main Help dialog @@ -7163,8 +7163,8 @@ tr = Bu projeyi destekle uk = Підтримайте проект vi = Hỗ trợ dự án - zh-Hans = 支持项目 - zh-Hant = 支持項目 + zh-Hans = 支持本项目 + zh-Hant = 支持本項目 [copyright] comment = Button in the main Help dialog @@ -7300,7 +7300,7 @@ tr = Haritadaki hataları bildirin veya düzeltin uk = Повідомляйте або виправляйте невірні картографічні дані vi = Báo cáo hoặc sửa dữ liệu bản đồ không chính xác - zh-Hans = 报告或修复错误的地图数据 + zh-Hans = 报告或修复不正确的地图数据 zh-Hant = 報告或修復不正確的地圖數據 [volunteer] @@ -7347,8 +7347,8 @@ tr = Gönüllümüz Olun uk = Стати волонтером vi = Tình nguyện - zh-Hans = 志愿服务 - zh-Hant = 志工服務 + zh-Hans = 志愿者 + zh-Hant = 志願者 [follow_us] comment = "Social media" section header in the About screen @@ -7439,8 +7439,8 @@ tr = E-posta istemcisi henüz kurulmamış. Lütfen e-posta istemcisini yapılandırın veya bize %@ adresinden ulaşmak için başka bir yöntem deneyin uk = Поштовий клієнт не налаштований. Налаштуйте його або скористайтеся іншими способами зв'язку. Наша адреса – %@. vi = Trình khách email này chưa được thiết lập. Bạn vui lòng cấu hình nó hoặc sử dụng một cách khác để liên hệ với chúng tôi tại %@ - zh-Hans = 电子邮件客户端尚未建立。请配置或使用任何其他方式与我们联系%@ - zh-Hant = 電子郵件客戶端尚未建立。請設定或使用任何其他方式與我們聯絡%@ + zh-Hans = 电子邮件客户端未设置。请配置电子邮件客户端或通过 %@ 联系我们。 + zh-Hant = 電子郵件客戶端未設定。請配置電子郵件客戶端或通過 %@ 聯絡我們。 [email_error_title] comment = Alert title @@ -7484,8 +7484,8 @@ tr = E-Posta gönderme hatası uk = Помилка при відправленні листа vi = Lỗi gửi thư - zh-Hans = 电子邮件发送错误 - zh-Hant = 電子郵件發送錯誤 + zh-Hans = 电子邮件发送失败 + zh-Hant = 電子郵件發送失敗 [pref_calibration_title] comment = Settings item title @@ -7573,8 +7573,8 @@ tr = Pusulayı kalibre etmek için telefonu sekiz şeklinde hareket ettirerek ok yönünü iyileştirin. uk = Покращіть напрямок стрілки, повернувши телефон вісімкою, щоб відкалібрувати компас. vi = Cải thiện hướng mũi tên bằng cách di chuyển điện thoại theo chuyển động hình số tám để hiệu chỉnh la bàn. - zh-Hans = 通过以八字形运动移动手机来改善箭头方向,以校准罗盘。 - zh-Hant = 通過以八字形移動手機來校準指南針來改善箭頭方向 + zh-Hans = 通过以 8 字形移动手机来改善箭头方向,以校准罗盘。 + zh-Hant = 通過以 8 字形移動手機來改善箭頭方向,以校準羅盤。 [compass_calibration_required] comment = Toast text when compass calibration may improve the correctness of the current position arrow @@ -7617,8 +7617,8 @@ tr = Pusulayı kalibre etmek ve haritadaki ok yönünü düzeltmek için telefonu sekiz şeklinde hareket ettirin. uk = Рухайте телефон вісімкою, щоб відкалібрувати компас і зафіксувати напрямок стрілки на карті. vi = Di chuyển điện thoại theo chuyển động hình số tám để hiệu chỉnh la bàn và cố định hướng mũi tên trên bản đồ. - zh-Hans = 以八字动作移动手机,校准罗盘,并在地图上固定箭头方向。 - zh-Hant = 以 8 字形移動手機以校準指南針並固定地圖上的箭頭方向 + zh-Hans = 通过以 8 字形移动手机以校准罗盘,并在地图上固定箭头方向。 + zh-Hant = 通過以 8 字形移動手機以校準羅盤,並在地圖上固定箭頭方向。 [long_tap_toast] comment = Toast text when user hides UI with a long tap anywhere on the map @@ -7662,8 +7662,8 @@ tr = Arayüzü görmek için haritaya tekrar uzun dokunun uk = Ще раз потримайте палець на карті, щоб побачити інтерфейс vi = Nhấn và giữ lại vào bản đồ để xem giao diện - zh-Hans = 再次长按地图查看界面 - zh-Hant = 再次長按地圖即可看到介面 + zh-Hans = 再次长按地图即可查看界面 + zh-Hant = 再次長按地圖即可查看介面 [downloader_update_all_button] comment = Update all button text @@ -7751,8 +7751,8 @@ tr = Tümünü İptal Et uk = Скасувати всі vi = Hủy tất cả - zh-Hans = 全部取消 - zh-Hant = 全部取消 + zh-Hans = 取消全部 + zh-Hant = 取消全部 [downloader_downloaded_subtitle] comment = Downloaded maps list header @@ -7884,7 +7884,7 @@ uk = В черзі vi = Đã xếp hàng chờ zh-Hans = 已加入到下载队列 - zh-Hant = 已加入下載隊列 + zh-Hant = 已加入到下載隊列 [downloader_near_me_subtitle] tags = android,ios @@ -8100,7 +8100,7 @@ tr = Bulundu uk = Знайдено vi = Đã tìm thấy - zh-Hans = 找到 + zh-Hans = 已找到 zh-Hant = 已找到 [downloader_status_outdated] @@ -8233,7 +8233,7 @@ uk = Щоб видалити мапу, будь ласка, зупините навiгацiю. vi = Để xóa bản đồ, vui lòng dừng điều hướng. zh-Hans = 要删除地图,请停止导航。 - zh-Hant = 如欲刪除地圖,請停止導航。 + zh-Hant = 要刪除地圖,請停止導航。 [routing_failed_cross_mwm_building] comment = PointsInDifferentMWM @@ -8276,8 +8276,8 @@ tr = Rotalar sadece tamamen tek bir harita dâhilinde oluşturulabilir. uk = Маршрут бути прокладений всередині мапи тільки одного регіону. vi = Tuyến đường chỉ có thể được tạo hoàn toàn được chứa trong một bản đồ. - zh-Hans = 路程只能完全处在同一地图里时才能被创建。 - zh-Hant = 路程只能完全處在同一地圖裡時才能被建立。 + zh-Hans = 路线只能完全处在同一地图里时才能被规划。 + zh-Hant = 路線只能完全處在同一地圖裡時才能被規劃。 [downloader_download_map] comment = Context menu item for downloader. @@ -8590,8 +8590,8 @@ tr = Rota üzerindeki tüm haritaları indir uk = Завантажити мапи з дороги vi = Tải xuống bản đồ theo tuyến đường - zh-Hans = 下载沿线地图 - zh-Hant = 下載沿線地圖 + zh-Hans = 下载路线上的所有地图 + zh-Hant = 下載路線上的所有地圖 [routing_requires_all_map] comment = Text for routing error dialog @@ -8635,8 +8635,8 @@ tr = Rota oluşturabilmemiz için bulunduğunuz yerden hedefinize kadar olan tüm haritaları indirmemiz ve güncellememiz gerekiyor. uk = Для створення маршруту необхідно щоб всі мапи, починаючи від вашого місцезнаходження і до пункту призначення, були завантажені та оновлені. vi = Tạo một tuyến đường đòi hỏi tất cả các bản đồ từ vị trí của bạn đến điểm đến phải được tải xuống và cập nhật. - zh-Hans = 创建路线需要下载并更新好所有从您的位置到目的地的地图。 - zh-Hant = 建立路線需要下載並更新好所有從您的位置到目的地的地圖。 + zh-Hans = 规划路线需要下载并更新好所有从您的位置到目的地的地图。 + zh-Hant = 規劃路線需要下載並更新好所有從您的位置到目的地的地圖。 [routing_not_enough_space] comment = Text for routing error dialog @@ -9169,8 +9169,8 @@ tr = Turuncu uk = Помаранчевий vi = Cam - zh-Hans = 橘红色 - zh-Hant = 橘色 + zh-Hans = 橙色 + zh-Hant = 橙色 [brown] comment = brown color @@ -9526,8 +9526,8 @@ tr = Koyu Turuncu uk = Темно-помаранчевий vi = Cam đậm - zh-Hans = 深橘色 - zh-Hant = 深橘色 + zh-Hans = 深橙色 + zh-Hant = 深橙色 [gray] comment = gray color @@ -9709,7 +9709,7 @@ uk = — Дорожня обстановка, правила дорожнього руху і знаки пріоритетніші, ніж поради програми; vi = — Điều kiện đường, luật giao thông và biển báo đường bộ luôn được ưu tiên hơn lời khuyên định hướng; zh-Hans = — 路况、交通法规和路标始终优先于导航建议; - zh-Hant = — 路況、交通規則及號誌優先於導航意見; + zh-Hant = — 路況、交通法規和路標始終優先於導航建議; [dialog_routing_disclaimer_precision] tags = android,ios @@ -9752,8 +9752,8 @@ tr = — Harita doğru olmayabilir, önerilen rota da hedefinize ulaşmak için en uygun yol olmayabilir; uk = — Мапа може бути неточною, а запропонований маршрут не завжди оптимальний; vi = — Bản đồ có thể không chính xác và tuyến đường được đề xuất có thể không luôn là cách tối ưu nhất để đi đến đích; - zh-Hans = — 地图可能不准确,建议的路线可能并非总是去往目的地的最佳路径; - zh-Hant = — 地圖可能不準確,建議的路線不盡然是最佳選擇; + zh-Hans = — 地图可能不准确,建议的路线可能并非总是去往目的地的最佳路线; + zh-Hant = — 地圖可能不準確,建議的路線可能並非總是前往目的地的最佳路線; [dialog_routing_disclaimer_recommendations] tags = android,ios @@ -9797,7 +9797,7 @@ uk = — Запропоновані маршрути — лише рекомендації; vi = — Các tuyến đường được đề nghị chỉ nên được coi là các khuyến nghị; zh-Hans = — 建议的路线仅作为推荐路线供您采纳; - zh-Hant = — 建議的路線僅供推薦參考; + zh-Hant = — 建議的路線僅作為推薦路線供您參考; [dialog_routing_disclaimer_borders] tags = android,ios @@ -9841,8 +9841,8 @@ tr = — Sınır bölgelerinde rotalar konusunda dikkatli olun: uygulamamız tarafından oluşturulan rotalar bazen izin verilmeyen yerlerdeki ülke sınırlarını geçebilir. uk = — Дотримуйтеся обережності з маршрутами у прикордонних зонах: маршрути, створені нашою програмою, іноді можуть перетинати кордони країн у несанкціонованих місцях; vi = — Chú ý khi thể dục theo những con đường gần đường biên giới: những con đường do ứng dụng của chúng tôi tạo ra đôi khi có khả năng vượt ra khỏi biên giới vào những địa điểm không được phép; - zh-Hans = — 小心对待国界区的路线:我们应用创造的路线有时会在未经授权的地方跨越国界; - zh-Hant = — 小心對待國界區的路線:我們應用程式建立的路線有時會在未經授權的地方跨越國界; + zh-Hans = — 小心对待国界区的路线:我们的应用程序生成的路线有时会在未经授权的地方跨越国界; + zh-Hant = — 小心對待國界區的路線:我們的應用程式建立的路線有時會在未經授權的地方跨越國界; [dialog_routing_disclaimer_beware] tags = android,ios @@ -9886,7 +9886,7 @@ uk = Будьте уважні на дорогах і бережіть себе! vi = Hãy cảnh giác và giữ an toàn trên đường! zh-Hans = 上路时请当心,祝您一路平安! - zh-Hant = 請保持警戒,一路平安! + zh-Hant = 上路時請當心,祝您一路平安! [dialog_routing_check_gps] tags = android,ios @@ -9929,7 +9929,7 @@ uk = Перевірте сигнал GPS vi = Kiểm tra tín hiệu GPS zh-Hans = 检查 GPS 信号 - zh-Hant = 查看 GPS 訊號 + zh-Hant = 檢查 GPS 訊號 [dialog_routing_error_location_not_found] tags = android,ios @@ -9972,8 +9972,8 @@ tr = Rota oluşturulamıyor. Mevcut GPS koordinatları tanımlanamadı. uk = Маршрут не побудовано. Поточну геопозицію не визначено. vi = Không thể tạo tuyến đường. Không xác định được tọa độ GPS hiện tại. - zh-Hans = 无法创建路线。当前 GPS 坐标无法识别。 - zh-Hant = 無法產生路線。 無法定位目前 GPS 座標。 + zh-Hans = 无法规划路线。无法识别当前 GPS 坐标。 + zh-Hant = 無法規劃路線。無法識別當前 GPS 座標。 [dialog_routing_location_turn_wifi] tags = android,ios @@ -10015,8 +10015,8 @@ tr = Lütfen GPS sinyalinizi kontrol edin. Wi-Fi'ı etkinleştirmek konum isabetini arttırır. uk = Будь ласка, перевірте сигнал GPS. Для покращання точності геопозиції увімкніть Wi-Fi. vi = Hãy kiểm tra tín hiệu GPS của bạn. Việc kích hoạt Wi-Fi sẽ cải thiện độ chính xác vị trí của bạn. - zh-Hans = 请检查您的 GPS 信号。启用无线网络将改善您的定位精度。 - zh-Hant = 請確認您的 GPS 訊號。啟用無線網路將提升地理位置定位準確度。 + zh-Hans = 请检查您的 GPS 信号。启用无线网络将改善定位精度。 + zh-Hant = 請檢查您的 GPS 訊號。啟用無線網路將改善定位精度。 [dialog_routing_location_turn_on] tags = android,ios @@ -10102,8 +10102,8 @@ tr = Mevcut GPS koordinatları belirlenemiyor. Rota hesaplamak için konum hizmetlerini etkinleştirin. uk = Поточну геопозицію не визначено. Для побудови маршруту увімкніть режим визначення геопозиції. vi = Không thể xác định vị trí tọa độ GPS hiện tại. Bật các dịch vụ định vị để tính toán tuyến đường. - zh-Hans = 无法定位当前 GPS 坐标。请启用定位服务以计算路线。 - zh-Hant = 無法定位目前 GPS 座標。請啟用定位服務以產生路線。 + zh-Hans = 无法定位当前 GPS 坐标。请启用定位服务以规划路线。 + zh-Hant = 無法定位目前 GPS 座標。請啟用定位服務以規劃路線。 [dialog_routing_download_files] tags = ios @@ -10188,8 +10188,8 @@ tr = Planlanan yoldaki tüm harita ve rota bilgilerini indirip güncelleyerek rotayı hesaplayın. uk = Для побудови маршруту завантажте і обновіть всі мапи і файли маршрутів на шляху руху. vi = Tải về và cập nhật tất cả các bản đồ và các thông tin tuyến đường dọc theo lộ trình dự kiến để tính toán tuyến đường. - zh-Hans = 下载和更新所有地图和预定路径沿途的路线信息,以计算路线。 - zh-Hant = 若要產生路線,請下載並更新所有地圖及沿路線的路線檔案。 + zh-Hans = 下载或更新沿预计路线的所有地图,以规划路线。 + zh-Hant = 下載或更新沿預期路線的所有地圖,以規劃路線。 [dialog_routing_unable_locate_route] tags = android,ios @@ -10233,7 +10233,7 @@ uk = Маршрут не знайдено vi = Không thể xác định tuyến đường zh-Hans = 无法定位路线 - zh-Hant = 路線未找到 + zh-Hant = 無法定位路線 [dialog_routing_cant_build_route] tags = android @@ -10276,8 +10276,8 @@ tr = Rota oluşturulamıyor. uk = Не вдалося побудувати маршрут. vi = Không thể tạo tuyến đường. - zh-Hans = 无法创建路线。 - zh-Hant = 無法產生路線。 + zh-Hans = 无法规划路线。 + zh-Hant = 無法規劃路線。 [dialog_routing_change_start_or_end] tags = android,ios @@ -10320,7 +10320,7 @@ uk = Будь ласка, змініть початкову або кінцеву точку маршруту. vi = Hãy điều chỉnh điểm bắt đầu hoặc điểm đến của bạn. zh-Hans = 请调整您的起点或目的地。 - zh-Hant = 請變更起點或最終目的地。 + zh-Hant = 請調整您的起點或目的地。 [dialog_routing_change_start] tags = android,ios @@ -10363,7 +10363,7 @@ uk = Змініть початкову точку маршруту vi = Điều chỉnh điểm bắt đầu zh-Hans = 调整出发点 - zh-Hant = 變更起點 + zh-Hant = 調整出發點 [dialog_routing_start_not_determined] tags = android,ios @@ -10406,8 +10406,8 @@ tr = Rota oluşturulamadı. Başlangıç noktası belirlenemiyor. uk = Маршрут не побудовано. Не визначено початкову точку маршруту. vi = Tuyến đường chưa được tạo. Không thể xác định vị trí điểm bắt đầu. - zh-Hans = 路线未创建。无法定位起点。 - zh-Hant = 此路線尚未產生。無法定位起點。 + zh-Hans = 路线未规划。无法定位起点。 + zh-Hant = 路線未規劃。無法定位起點。 [dialog_routing_select_closer_start] tags = android,ios @@ -10493,7 +10493,7 @@ uk = Змініть кінцеву точку маршруту vi = Điều chỉnh điểm đến zh-Hans = 调整目的地 - zh-Hant = 變更目的地 + zh-Hant = 調整目的地 [dialog_routing_end_not_determined] tags = android,ios @@ -10536,8 +10536,8 @@ tr = Rota oluşturulamadı. Hedef belirlenemiyor. uk = Маршрут не побудовано. Не визначено кінцеву точку маршруту. vi = Tuyến đường chưa được tạo. Không thể xác định vị trí điểm đến. - zh-Hans = 路线未创建。无法定位目的地。 - zh-Hant = 未產生路線。無法定位目的地。 + zh-Hans = 路线未规划。无法定位目的地。 + zh-Hant = 路線未規劃。無法定位目的地。 [dialog_routing_select_closer_end] tags = android,ios @@ -10580,7 +10580,7 @@ uk = Будь ласка, виберіть кінцеву точку маршруту ближче до дороги. vi = Hãy chọn điểm đến gần với một con đường hơn. zh-Hans = 请选择更靠近公路的目的地位置。 - zh-Hant = 請選擇更接近道路的目的地。 + zh-Hant = 請選擇更接近道路的目的地位置。 [dialog_routing_change_intermediate] tags = android,ios @@ -10622,8 +10622,8 @@ tr = Ara nokta bulunamadı. uk = Не вдалося знайти місцерозташування проміжної точки. vi = Không thể định vị điểm trung gian. - zh-Hans = 无法定位中间点。 - zh-Hant = 找不到中途休息站。 + zh-Hans = 无法定位途径点。 + zh-Hant = 無法定位途徑點。 [dialog_routing_intermediate_not_determined] tags = android,ios @@ -10666,8 +10666,8 @@ tr = Lütfen ara noktanızı ayarlayın. uk = Будь ласка, вкажіть місцерозташування проміжної точки вручну. vi = Vui lòng điều chỉnh điểm trung gian của bạn. - zh-Hans = 请调整您的中间点。 - zh-Hant = 請調整您的中途休息站。 + zh-Hans = 请调整您的途径点。 + zh-Hant = 請調整您的途徑點。 [dialog_routing_system_error] tags = android,ios @@ -10754,8 +10754,8 @@ tr = Uygulama hatası nedeniyle rota oluşturulamadı. uk = Не вдалося прокласти маршрут через помилки програми. vi = Không thể tạo tuyến đường do lỗi ứng dụng. - zh-Hans = 由于应用程序错误,无法创建路线。 - zh-Hant = 由於此錯誤,尚未建立路線。 + zh-Hans = 由于应用程序出错,因此无法规划路线。 + zh-Hant = 由於應用程式出錯,因此無法規劃路線。 [dialog_routing_try_again] tags = android,ios @@ -10797,7 +10797,7 @@ tr = Lütfen tekrar deneyin uk = Спробуйте знову vi = Vui lòng thử lại - zh-Hans = 请重试 + zh-Hans = 请再试一次 zh-Hant = 請再試一次 [not_now] @@ -10840,8 +10840,8 @@ tr = Şimdi Değil uk = Не зараз vi = Lúc khác - zh-Hans = 现在不用 - zh-Hant = 現在不要 + zh-Hans = 以后再说 + zh-Hant = 以後再說 [dialog_routing_download_and_build_cross_route] tags = android,ios @@ -10883,8 +10883,8 @@ tr = Haritayı indirerek birden fazla haritaya uzanan daha uygun bir rota oluşturmak ister misiniz? uk = Завантажити мапу і побудувати більш оптимальний маршрут з перетином межі мапи? vi = Bạn có muốn tải về bản đồ và tạo một tuyến đường tối ưu hơn kéo dài trên nhiều hơn một bản đồ? - zh-Hans = 您是否要下载地图并创建一条跨越多张地图的更佳路线? - zh-Hant = 您是否要下載地圖,產生跨越邊界的更好路線? + zh-Hans = 您是否要下载地图,以规划跨越边界的更佳路线? + zh-Hant = 您是否要下載地圖,以規劃跨越邊界的更佳路線? [dialog_routing_download_cross_route] tags = android,ios @@ -10926,8 +10926,8 @@ tr = Bu haritanın bir kısmından geçen daha uygun bir rota oluşturmak için haritayı indirin. uk = Для побудови більш оптимального маршруту з перетином межі потрібно завантажити мапу. vi = Tải về bản đồ để tạo tuyến đường tối ưu hơn mà đi qua cạnh của bản đồ này. - zh-Hans = 下载地图,创建一条跨越此地图边缘的更佳路线。 - zh-Hant = 若要產生跨越邊界的更理想路線,您需要下載地圖。 + zh-Hans = 下载地图,以规划一条跨越边界的更佳路线。 + zh-Hant = 下載地圖,以規劃一條跨越邊界的更佳路線。 [[Strings for downloading map from search]] @@ -10972,8 +10972,8 @@ tr = Aramak ve rota oluşturmaya başlamak için lütfen haritayı indirin. İndirdikten sonra artık internet bağlantısına ihtiyacınız olmayacak. uk = Щоб розпочати пошук та створення маршрутів, будь ласка, завантажте мапу і вам більше ніколи не знадобиться інтернет-з’єднання. vi = Để bắt đầu tìm kiếm và tạo đường đi, vui lòng tải về bản đồ, và bạn sẽ không cần đến kết nối Internet nữa. - zh-Hans = 要开始搜索和创建路线,请下载地图,那您就不再需要网络连接了。 - zh-Hant = 要開始搜索和建立路線,請下載地圖,那您就不再需要網絡連接了。 + zh-Hans = 要开始搜索和规划路线,请下载地图,然后您就不再需要网络连接了。 + zh-Hant = 要開始搜索和規劃路線,請下載地圖,然後您就不再需要網絡連接了。 [search_select_map] tags = android @@ -11194,8 +11194,8 @@ tr = Varış: %@ uk = Прибуття в %@ vi = Đến: %@ - zh-Hans = 抵達:%@ - zh-Hant = 抵達:%@ + zh-Hans = 已到达 %@ + zh-Hant = 已到達 %@ [dialog_routing_download_and_update_maps] comment = Text for routing::RouterResultCode::FileTooOld dialog. @@ -11237,8 +11237,8 @@ tr = Bir rota oluşturmak için lütfen rota üzerindeki tüm haritaları indirin ve güncelleyin. uk = Для створення маршруту, будь ласка, скачайте та обновіть всі карти за ним. vi = Để tạo đường đi, vui lòng tải về và cập nhật tất cả bản đồ dọc theo tuyến đường. - zh-Hans = 要创建路线,请下载并更新所有沿路线的地图。 - zh-Hant = 要建立路線,請下載並更新所有沿線的地圖。 + zh-Hans = 要规划路线,请下载并更新所有沿路线的地图。 + zh-Hant = 要規劃路線,請下載並更新所有沿路線的地圖。 [categories] tags = android,ios @@ -11326,7 +11326,7 @@ uk = Історія vi = Lịch sử zh-Hans = 历史 - zh-Hant = 記錄 + zh-Hant = 歷史 [search_not_found] tags = android,ios @@ -11369,8 +11369,8 @@ tr = Üzgünüz, hiç bir şey bulamadık. uk = На жаль, нічого не знайдено. vi = Xin lỗi, tôi không tìm thấy kết quả nào. - zh-Hans = 很抱歉,没有找到任何地点。 - zh-Hant = 很抱歉,沒有找到任何地點。 + zh-Hans = 很抱歉,没有搜到任何地点。 + zh-Hant = 很抱歉,沒有搜到任何地點。 [search_not_found_query] tags = android,ios @@ -11415,8 +11415,8 @@ tr = Arama yaptığınız bölgeyi indirin veya yakındaki bir kasaba/köy adını eklemeyi deneyin. uk = Завантажте регіон, де ви шукаєте, або спробуйте додати назву найближчого міста/села. vi = Tải xuống khu vực bạn đang tìm kiếm hoặc thử thêm tên thị trấn/làng gần đó. - zh-Hans = 下载要搜索的地区或尝试添加附近的城镇/村庄名称。 - zh-Hant = 下載您要搜尋的區域或嘗試新增附近的城鎮/村莊名稱。 + zh-Hans = 下载您要搜索的区域的地图,或尝试输入附近的城镇或村庄名称。 + zh-Hant = 下載您要搜尋的區域的地圖,或嘗試輸入附近的城鎮或村莊名稱。 [search_history_title] tags = android,ios @@ -11502,8 +11502,8 @@ tr = Son aramaları görüntüleyin. uk = Швидкий доступ до недавніх результатів пошуку. vi = Truy cập nhanh chóng đến câu hỏi tìm kiếm gần đây. - zh-Hans = 快速访问最近的搜索查询。 - zh-Hant = 檢視最近的搜尋。 + zh-Hans = 查看您最近的搜索记录。 + zh-Hant = 查看您最近的搜尋記錄。 [clear_search] tags = android,ios @@ -12108,7 +12108,7 @@ tr = Tüm Gün (24 saat) uk = Весь день (24 години) vi = Cả ngày (24 giờ) - zh-Hans = 全天(24小时) + zh-Hans = 全天(24 小时) zh-Hant = 全天 (24 小時) [editor_time_open] @@ -12151,8 +12151,8 @@ tr = Açık uk = Відчинено vi = Mở cửa - zh-Hans = 开始营业时间 - zh-Hant = 開始營業時間 + zh-Hans = 正在营业 + zh-Hant = 正在營業 [editor_time_close] tags = android,ios @@ -12194,8 +12194,8 @@ tr = Kapalı uk = Зачинено vi = Đóng cửa - zh-Hans = 结束营业时间 - zh-Hant = 結束營業時間 + zh-Hans = 已歇业 + zh-Hant = 已歇業 [editor_time_add_closed] tags = android,ios @@ -12237,7 +12237,7 @@ tr = Kapalı olduğu saatleri ekle uk = Додати перерву vi = Thêm giờ đóng cửa - zh-Hans = 添加非营业时间 + zh-Hans = 添加休息时间 zh-Hant = 新增休息時間 [editor_time_title] @@ -12577,8 +12577,8 @@ tr = Dünya haritasını değiştirdiniz. Bunu gizlemeyin! Arkadaşlarınıza anlatın ve birlikte düzenleyin. uk = Ви змінили карту світу. Не приховуйте це! Розкажіть своїм друзям і редагуйте разом. vi = Bạn đã thay đổi bản đồ thế giới. Đừng giấu điều đó! Hãy cho các bạn khác biết và cùng nhau chỉnh sửa. - zh-Hans = 您已经改变了世界地图。请不要隐藏这一点!告诉您的朋友们并一起编辑它。 - zh-Hant = 您已經改變了世界地圖。別藏私!告訴您的朋友們一起來編輯。 + zh-Hans = 您已经改变了世界地图。请别再藏着掖着了!告诉您的朋友们并一起来编辑地图。 + zh-Hant = 您已經改變了世界地圖。請別再藏私了!告訴您的朋友們並一起來編輯地圖。 [share_with_friends] tags = ios @@ -12706,7 +12706,7 @@ tr = Veya bunu https://www.openstreetmap.org/ adresinden kendiniz yapın uk = Або зробіть це самостійно на сайті https://www.openstreetmap.org/ vi = Hoặc bạn có thể tự sửa tại https://www.openstreetmap.org/ - zh-Hans = 或者在https://www.openstreetmap.org/上亲自修复此错误。 + zh-Hans = 或者在 https://www.openstreetmap.org/ 上亲自修复此错误。 zh-Hant = 或者在 https://www.openstreetmap.org/ 上親自修復此錯誤 [editor_report_problem_send_button] @@ -13010,8 +13010,8 @@ tr = Şu anda kapalı uk = Зараз закрито vi = Hiện đã đóng - zh-Hans = 现在关门 - zh-Hant = 現在關門 + zh-Hans = 现已关门 + zh-Hant = 現已關門 [daily] comment = Place Page opening hours text @@ -13098,8 +13098,8 @@ tr = 7/24 uk = Цілодобово vi = ngày và đêm - zh-Hans = 全天候 - zh-Hant = 全天候 + zh-Hans = 24/7 全天候营业 + zh-Hant = 24/7 全天候營業 [day_off_today] tags = android,ios @@ -13408,8 +13408,8 @@ sk = Zatvoria o %@ tr = %@ sonra kapanıyor uk = Зачиняється через %@ - zh-Hans = 将于 %@ 后停业 - zh-Hant = 將於 %@ 後停業 + zh-Hans = 将于 %@ 后歇业 + zh-Hant = 將於 %@ 後歇業 [closed] tags = android,ios @@ -13539,7 +13539,7 @@ tr = Çalışma saatlerini düzenle uk = Редагувати години роботи vi = Sửa giờ làm việc - zh-Hans = 编辑工作时间 + zh-Hans = 编辑营业时间 zh-Hant = 編輯營業時間 [no_osm_account] @@ -13583,7 +13583,7 @@ tr = OpenStreetMap hesabınız yok mu? uk = Не зареєстровані в OpenStreetMap? vi = Bạn chưa có tài khoản tại OpenStreetMap ư? - zh-Hans = 在OpenStreetMap上没有账户吗? + zh-Hans = 没有 OpenStreetMap 账户吗? zh-Hant = 沒有 OpenStreetMap 帳號嗎? [register_at_openstreetmap] @@ -13670,8 +13670,8 @@ tr = Şifre (en az 8 karakter) uk = Пароль (мінімум 8 символів) vi = Mật khẩu (tối thiểu 8 ký tự) - zh-Hans = 密码(最少8个字符) - zh-Hant = 密碼(最少8個字母) + zh-Hans = 密码(至少 8 个字符) + zh-Hant = 密碼(至少 8 個字符) [invalid_username_or_password] tags = ios @@ -13972,7 +13972,7 @@ tr = OSM Hesabı uk = Обліковий запис OSM vi = Tài khoản OSM - zh-Hans = OSM账户 + zh-Hans = OSM 账户 zh-Hant = OSM 帳號 [logout] @@ -14059,8 +14059,8 @@ tr = Son yükleme uk = Остання вiдправка vi = Tải lên mới nhất - zh-Hans = 上次上传 - zh-Hant = 上次上傳 + zh-Hans = 最后上传 + zh-Hant = 最後上傳 [thank_you] tags = ios @@ -14189,7 +14189,7 @@ tr = Yerin Adı uk = Назва vi = Tên địa điểm - zh-Hans = 地点名 + zh-Hans = 地点名称 zh-Hant = 地點名稱 [add_language] @@ -14707,7 +14707,7 @@ tr = E-posta veya kullanıcı adı uk = Ел. пошта або ім'я користувача vi = Email hoặc tên người dùng - zh-Hans = 邮箱或用户名 + zh-Hans = 电子邮件或用户名 zh-Hant = 電子郵件或使用者名稱 [phone] @@ -15008,8 +15008,8 @@ tr = Bir rota oluşturmak için tüm haritaları güncellemeli ve ardından rotayı tekrar planlamalısınız. uk = Для побудови маршруту необхідно оновити усі мапи та побудувати маршрут заново. vi = Để tạo một tuyến đường, bạn cần cập nhật tất cả các bản đồ và sau đó lập lại tuyến đường. - zh-Hans = 为了创建路线,您需要更新全部地图并重新规划路线。 - zh-Hant = 為了建立路線,您需要更新全部地圖並重新規劃路線。 + zh-Hans = 为了规划路线,您需要更新全部地图并重新规划路线。 + zh-Hant = 為了規劃路線,您需要更新全部地圖並重新規劃路線。 [downloader_search_field_hint] tags = android,ios @@ -15052,8 +15052,8 @@ tr = Harita bul uk = Знайти мапу vi = Tìm bản đồ - zh-Hans = 找到地图 - zh-Hant = 尋找地圖 + zh-Hans = 搜索地图 + zh-Hant = 搜尋地圖 [migration_download_error_dialog] tags = ios @@ -15096,8 +15096,8 @@ tr = İndirme hatası uk = Помилка завантаження vi = Lỗi tải xuống - zh-Hans = 下载错误 - zh-Hant = 下載錯誤 + zh-Hans = 下载失败 + zh-Hant = 下載失敗 [common_check_internet_connection_dialog] tags = android,ios @@ -15140,7 +15140,7 @@ uk = Будь ласка, перевірте свої налаштування і переконайтеся, що ваш пристрій підлючено до Інтернету. vi = Xin kiểm tra các thiết lập và đảm bảo thiết bị của bạn có kết nối Internet. zh-Hans = 请检查您的设置并确保您的设备已连接至网络。 - zh-Hant = 請檢查您的設定並確保您的設備已連接至網路。 + zh-Hant = 請檢查您的設定並確保您的裝置已連接至網路。 [downloader_no_space_title] tags = android,ios @@ -15182,8 +15182,8 @@ tr = Yeterli alan yok uk = Недостатньо місця vi = Không đủ dung lượng - zh-Hans = 无足够的空间 - zh-Hant = 無足夠的空間 + zh-Hans = 没有足够的空间 + zh-Hant = 沒有足夠的空間 [downloader_no_space_message] tags = android,ios @@ -15269,8 +15269,8 @@ tr = Giriş hatası uk = Виникла помилка при авторизації. vi = Lỗi đăng nhập. - zh-Hans = 登录错误。 - zh-Hant = 登入錯誤。 + zh-Hans = 无法登录。 + zh-Hant = 無法登入。 [editor_profile_changes] tags = android,ios @@ -15662,7 +15662,7 @@ uk = Місцевою мовою vi = Vì nó được viết bằng ngôn ngữ địa phương zh-Hans = 当地语言写道 - zh-Hant = 因為它是用當地語言寫的 + zh-Hant = 當地語言寫道 [editor_edit_place_category_title] tags = android,ios @@ -15791,7 +15791,7 @@ tr = Farklı bir sorun uk = Інші проблема vi = Một vấn đề khác - zh-Hans = 一个不同的问题 + zh-Hans = 不同的问题 zh-Hant = 不同的問題 [whatsnew_editor_message_1] @@ -15834,8 +15834,8 @@ tr = Doğrudan uygulamadan haritaya yeni yerler ekleyin ve mevcut yerleri düzenleyin. uk = Додати нові місця до мапи і редагувати існуючі місця прямо з програми. vi = Nhập các địa điểm mới vào bản đồ, và trực tiếp chỉnh sửa những địa điểm hiện có trên ứng dụng. - zh-Hans = 添加新地点到该地图,并直接通过此应用编辑已存在的地点。 - zh-Hant = 新增新地點到該地圖,並直接通過此應用程式編輯已存在的地點。 + zh-Hans = 添加新地点到地图,并直接通过此应用编辑已存在的地点。 + zh-Hant = 新增新地點到地圖,並直接通過此應用編輯已存在的地點。 [dialog_incorrect_feature_position] tags = ios @@ -15877,8 +15877,8 @@ tr = Konumu değiştir uk = Змініть розташування vi = Thay đổi địa điểm - zh-Hans = 改变位置 - zh-Hant = 改變位置 + zh-Hans = 更改位置 + zh-Hant = 更改位置 [message_invalid_feature_position] tags = android,ios @@ -15920,8 +15920,8 @@ tr = Buraya bir nesne konumlandırılamıyor uk = Об'єкт не може перебувати в цьому місцезнаходженні vi = Một đối tượng không thể đặt được ở đây - zh-Hans = 对象无法设置在这里 - zh-Hant = 物件無法設置在這裡 + zh-Hans = 地点不能放置在这里 + zh-Hant = 地點無法放置在這裡 [osm_presentation] comment = Text in About and OSM Login screens. First %@ is replaced by a local, human readable date. @@ -15967,8 +15967,8 @@ tr = %@ tarihine ait topluluk tarafından oluşturulmuş OpenStreetMap verilerini kullanıyorsunuz. OpenStreetMap.org adresinden haritayı nasıl düzenleyebileceğiniz hakkında bilgi edinebilirsiniz uk = Дані OpenStreetMap, створені спільнотою, станом на %@. Дізнайтеся більше про те, як редагувати та оновлювати мапу на OpenStreetMap.org vi = Dữ liệu OpenStreetMap do cộng đồng tạo ra kể từ %@. Tìm hiểu thêm về cách chỉnh sửa và cập nhật bản đồ tại OpenStreetMap.org - zh-Hans = 截至 %@ 的社区创建的 OpenStreetMap 数据。请访问 OpenStreetMap.org 以了解更多有关如何编辑和更新地图的信息。 - zh-Hant = 截至 %@ 的社群創建的 OpenStreetMap 資料。請訪問 OpenStreetMap.org 以了解更多有關如何編輯和更新地圖的更多信息。 + zh-Hans = 截至 %@ 的社区创建的 OpenStreetMap 数据。请访问 OpenStreetMap.org 以了解有关如何编辑和更新地图的信息。 + zh-Hant = 截至 %@ 的社群創建的 OpenStreetMap 資料。請訪問 OpenStreetMap.org 以了解有關如何編輯和更新地圖的更多信息。 [login_to_make_edits_visible] tags = android,ios @@ -16056,8 +16056,8 @@ tr = İndirmek için daha fazla alana ihtiyacınız var. Lütfen gereksiz verileri silin. uk = Для завантаження потрібно більше вільного місця. Будь ласка, видаліть непотрібні дані. vi = Để tải xuống, bạn cần thêm dung lượng. Xin xóa mọi dữ liệu không cần thiết. - zh-Hans = 为了下载,您需要更多的空间。请删除不必要的数据。 - zh-Hant = 為了下載,您需要更多的空間。請刪除不必要的資料。 + zh-Hans = 为了下载,您需要更多的存储空间。请删除不必要的文件。 + zh-Hant = 為了下載,您需要更多的儲存空間。請刪除不必要的檔案。 [editor_sharing_title] tags = ios @@ -16099,7 +16099,7 @@ tr = Organic Maps haritalarını geliştirdim uk = Я покращив мапи Organic Maps vi = Tôi đã cải thiện các bản đồ Organic Maps - zh-Hans = 我改进了Organic Maps地图 + zh-Hans = 我改进了 Organic Maps 地图 zh-Hant = 我改進了 Organic Maps 地圖 [downloader_of] @@ -16144,8 +16144,8 @@ tr = %1$d/%2$d uk = %1$d з %2$d vi = %1$d trên %2$d - zh-Hans = %1$d个/共%2$d个 - zh-Hant = %1$d個/共%2$d個 + zh-Hans = %1$d / %2$d + zh-Hant = %1$d / %2$d [download_over_mobile_header] tags = android,ios @@ -16273,7 +16273,7 @@ tr = Geçerli bir bina numarası girin uk = Введіть правильний номер будинку vi = Nhập số nhà chính xác - zh-Hans = 输入正确的房屋号 + zh-Hans = 输入正确的门牌号码 zh-Hant = 輸入正確的門牌號碼 [editor_storey_number] @@ -16316,8 +16316,8 @@ tr = Kat sayısı (en fazla %d) uk = Кількість поверхів (максимум %d) vi = Số tầng (tối đa %d) - zh-Hans = 楼号 (最大 %d) - zh-Hant = 樓層數(最大 %d) + zh-Hans = 楼层数量 (最多 %d 层) + zh-Hant = 樓層數量(最多 %d 層) [error_enter_correct_storey_number] comment = Error message in Editor when a user tries to set the number of floors for a building higher than %d floors @@ -16361,7 +16361,7 @@ uk = Редагуйте будівлі висотою максимум %d поверхів vi = Sửa tòa nhà có tối đa %d tầng zh-Hans = 最多可编辑 %d 层的建筑 - zh-Hant = 編輯最多 %d 層的建築 + zh-Hant = 最多可編輯 %d 層的建築 [editor_zip_code] tags = android,ios @@ -16493,8 +16493,8 @@ tr = Bilinmeyen Yer uk = Невідоме місце vi = Địa Điểm Chưa Biết - zh-Hans = 未知位置 - zh-Hant = 未知的位置 + zh-Hans = 未知地点 + zh-Hant = 未知地點 [editor_other_info] tags = android,ios @@ -16715,8 +16715,8 @@ tr = İşletmeci uk = Власник vi = Đơn vị điều hành - zh-Hans = 运营者 - zh-Hant = 營運者 + zh-Hans = 经营者 + zh-Hant = 經營者 [editor_category_unsuitable_title] tags = android @@ -16805,8 +16805,8 @@ tr = Organik Haritalar yalnızca basit nokta kategorileri eklemeye izin verir, yani kasaba, yol, göl, bina ana hatları vb. yoktur. Lütfen bu tür kategorileri doğrudan OpenStreetMap.org'a ekleyin. Adım adım ayrıntılı talimatlar için rehberimize göz atın. uk = Organic Maps дозволяють додавати до мапи лише прості типи об'єктів, тобто без міст, доріг, озер та контурів будівель. Будь ласка, додайте такі категорії на сайті OpenStreetMap.org. Ми також рекомендуємо ознайомитися із детальними інструкціями та іншими додатками для редагування карти. vi = Bản đồ không phải trả tiền chỉ cho phép thêm các danh mục điểm đơn giản, nghĩa là không có thị trấn, đường, hồ, đường viền tòa nhà, v.v. Vui lòng thêm các danh mục đó trực tiếp vào OpenStreetMap.org. Hãy xem hướng dẫn của chúng tôi để biết hướng dẫn chi tiết từng bước. - zh-Hans = Organic Maps 只允许添加简单的点类别,即无法添加城镇、道路、湖泊、建筑轮廓等类别。请直接向OpenStreetMap.org添加此类类别。请查看我们的指南,了解详细的步骤说明。 - zh-Hant = Organic Maps 只允許添加簡單的點類別,即無法添加城鎮、道路、湖泊、建築輪廓等類別。 請直接向OpenStreetMap.org新增此類類別。 請查看我們的指南,以了解詳細的步驟說明。 + zh-Hans = Organic Maps 只允许添加简单的点类别,即无法添加城镇、道路、湖泊、建筑轮廓等类别。请直接向 OpenStreetMap.org 添加此类类别。请查看我们的指南,了解详细的步骤说明。 + zh-Hant = Organic Maps 只允許添加簡單的點類別,即無法添加城鎮、道路、湖泊、建築輪廓等類別。請直接向 OpenStreetMap.org 新增此類類別。請查看我們的指南,以了解詳細的步驟說明。 [downloader_no_downloaded_maps_title] tags = android,ios @@ -16891,7 +16891,7 @@ tr = Çevrimdışı olarak adres bulmak ve gezinmek için haritaları indirin. uk = Завантажте необхідні мапи, щоб знаходити місця та користуватися навігацією без iнтернету. vi = Tải về bản đồ để tìm địa điểm và định hướng ngoại tuyến. - zh-Hans = 下载地图来查找位置和离线浏览 + zh-Hans = 下载地图来查找位置和离线浏览。 zh-Hant = 下載地圖來尋找位置和離線瀏覽。 [current_location_unknown_error_title] @@ -16933,7 +16933,7 @@ tr = Geçerli konum bilinmiyor. uk = Місцезнаходження не знайдено. vi = Chưa biết địa điểm hiện tại. - zh-Hans = 当前位置未知 + zh-Hans = 当前位置未知。 zh-Hant = 目前位置未知。 [current_location_unknown_error_message] @@ -17020,8 +17020,8 @@ tr = Konum hizmetleri devre dışı bırakıldı uk = Ідентифікацію місцезнаходження відключено vi = Chức năng nhận biết địa điểm bị tắt - zh-Hans = 地点定位被禁用 - zh-Hant = 地點定位被禁用 + zh-Hans = 定位服务已被禁用 + zh-Hant = 定位服務已被禁用 [location_services_disabled_message] tags = ios @@ -17063,8 +17063,8 @@ tr = Cihaz ayarlarında coğrafi konuma erişim izni verin uk = Увімкніть доступ до геолокації в налаштуваннях цього пристрою vi = Bật truy cập định vị địa lý trong thiết lập thiết bị - zh-Hans = 启用设备设置中的地理位置定位 - zh-Hant = 啟用設備設置中的地理位置定位 + zh-Hans = 启用设备设置中的定位服务 + zh-Hant = 啟用裝置設定中的定位服務 [location_services_disabled_1] tags = ios @@ -17149,7 +17149,7 @@ uk = 2. Клацніть «Місцезнаходження» vi = 2. Chạm mục Địa điểm zh-Hans = 2. 点击位置 - zh-Hant = 2. 點一下位置 + zh-Hant = 2. 點擊位置 [location_services_disabled_3] comment = iOS Dialog for the case when the location permission is not granted; you might find the exact wording for your language here: https://support.apple.com/en-us/102647 (replace 'en-us' in URL with your language/region) @@ -17191,8 +17191,8 @@ tr = 3. "Uygulamayı Kullanırken"i Seçin uk = 3. Оберіть "Під час роботи програми" vi = 3. Chọn Khi Đang Dùng Ứng dụng - zh-Hans = 3. 使用应用时选择 - zh-Hant = 3. 使用應用時選擇 + zh-Hans = 3. 点击“使用 App 期间” + zh-Hant = 3. 點擊“使用 App 期間” [location_services_disabled_on_device_2] tags = ios @@ -17236,8 +17236,8 @@ tr = 2. Gizlilik'i seçin uk = 2. Виберіть Конфіденційність vi = 2. Chọn Quyền riêng tư - zh-Hans = 2. 选择隐私 - zh-Hant = 2. 選擇隱私 + zh-Hans = 2. 点击“隐私和安全性” + zh-Hant = 2. 點擊“隱私權” [location_services_disabled_on_device_3] tags = ios @@ -17281,8 +17281,8 @@ tr = 3. Konum Servisleri'ni seçin uk = 3. Виберіть Служби визначення місцезнаходження vi = 3. Chọn Dịch vụ định vị - zh-Hans = 3.选择位置服务 - zh-Hant = 3. 選擇定位服務 + zh-Hans = 3. 选择“定位服务” + zh-Hant = 3. 選擇“定位服務” [location_services_disabled_on_device_4] tags = ios @@ -17326,8 +17326,8 @@ tr = 4. Konum Servislerini Açın uk = 4. Увімкніть Служби визначення місцезнаходження vi = 4. Bật Dịch vụ định vị - zh-Hans = 4.打开定位服务 - zh-Hant = 4.開啟定位服務 + zh-Hans = 4. 打开“定位服务” + zh-Hant = 4. 開啟“定位服務” [location_services_disabled_on_device_additional_message] tags = ios @@ -17802,8 +17802,8 @@ tr = Rezervasyon uk = Забронювати vi = Đặt trước - zh-Hans = 预約 - zh-Hant = 預約 + zh-Hans = 预定 + zh-Hant = 預定 [more_on_kayak] comment = A referral link on the place page for some hotels @@ -17893,7 +17893,7 @@ uk = Реферальний бонус, отриманий за кожне бронювання за цим посиланням, йде на розробку Organic Maps. vi = Phần thưởng giới thiệu nhận được cho mỗi lần đặt phòng thông qua liên kết này sẽ hướng tới việc phát triển bản đồ không phải trả tiền. zh-Hans = 每次通过此链接预订所获得的推荐奖金将用于 Organic Maps 的开发。 - zh-Hant = 透過此連結進行的每次預訂收到的推薦獎金將用於開發 Organic Maps。 + zh-Hant = 每次通過此鏈接預定所獲得的推薦獎金將用於 Organic Maps 的開發。 [dialog_kayak_button] comment = A confirmation button text in the explanation dialog that opens hotel details page on Kayak website. @@ -17936,7 +17936,7 @@ tr = Kayak hakkında detaylar uk = Докладніше на Kayak vi = Chi tiết trên Kayak - zh-Hans = Kayak 上的详细信息 + zh-Hans = 客涯 (Kayak) 上的详细信息 zh-Hant = Kayak 上的詳細資訊 [placepage_call_button] @@ -18237,7 +18237,7 @@ uk = Коментар… vi = Nhận xét… zh-Hans = 备注… - zh-Hant = 註解… + zh-Hant = 備註… [editor_reset_edits_message] tags = android,ios @@ -18365,8 +18365,8 @@ tr = Eklenen yer kaldırılsın mı? uk = Видалити об'єкт, що ви додали? vi = Xóa một địa điểm đã thêm? - zh-Hans = 删除已添加的位置? - zh-Hant = 移除已新增的位置? + zh-Hans = 删除已添加的地点? + zh-Hant = 移除已新增的地點? [editor_remove_place_button] tags = android,ios @@ -18616,8 +18616,8 @@ tr = Geçerli bir web adresi girin uk = Введіть вірну адресу веб-сайту vi = Nhập địa chỉ trang web hợp lệ - zh-Hans = 输入有效网址 - zh-Hant = 輸入有效網址 + zh-Hans = 请输入有效的网址 + zh-Hant = 請輸入有效的網址 [error_enter_correct_email] tags = android,ios @@ -18659,8 +18659,8 @@ tr = Geçerli bir e-posta girin uk = Введіть вірну адресу електронної пошти vi = Nhập email hợp lệ - zh-Hans = 输入有效电子邮箱 - zh-Hant = 輸入有效電子郵件 + zh-Hans = 请输入有效的电子邮件 + zh-Hant = 請輸入有效的電子郵件 [error_enter_correct_facebook_page] tags = android @@ -18941,8 +18941,8 @@ tr = Bunu tüm kullanıcılara göndermek ister misiniz? uk = Надіслати усім користувачам? vi = Bạn có muốn gửi cho toàn bộ người dùng? - zh-Hans = 您想要发给所有用户吗? - zh-Hant = 您想要發給所有用戶嗎? + zh-Hans = 您想要发送给所有用户吗? + zh-Hant = 您想要發送給所有使用者嗎? [editor_share_to_all_dialog_message_1] comment = Dialog before publishing the modifications to the public map. @@ -19108,8 +19108,8 @@ tr = En son seyahat edilen rotanızı kaydetmeyi devre dışı bırakmak istiyor musunuz? uk = Вимкнути запис нещодавно пройденого шляху? vi = Tắt ghi lại tuyến đường đã đi gần đây của bạn? - zh-Hans = 禁止记录您最近去过的路径? - zh-Hant = 禁止記錄您最近去過的路徑? + zh-Hans = 禁止记录您最近去过的路线吗? + zh-Hant = 禁止記錄您最近去過的路線嗎? [off_recent_track_background_button] tags = ios @@ -19195,7 +19195,7 @@ uk = Подивись, vi = Xem zh-Hans = 来看看 - zh-Hant = 看一看 + zh-Hant = 來看看 [recent_track_background_dialog_message] tags = ios @@ -19238,8 +19238,8 @@ tr = Organic Maps, en son seyahat ettiğiniz rotayı kaydetmek için arka planda coğrafi konumunuzu kullanır. uk = Organic Maps використовує вашу геопозицію у фоновому режимі для запису нещодавно пройденого шляху. vi = Organic Maps sử dụng định vị của bạn trong ứng dụng chạy nền để ghi lại tuyến đường đã đi gần đây của bạn. - zh-Hans = Organic Maps使用背景中的地理位置记录您最近去过的路径。 - zh-Hant = Organic Maps使用背景中的地理位置記錄您最近去過的路徑。 + zh-Hans = Organic Maps 在后台使用您的位置记录您最近去过的路线。 + zh-Hant = Organic Maps 在後臺使用您的位置記錄您最近去過的路線。 [general_settings] tags = ios @@ -19418,7 +19418,7 @@ uk = Список vi = Danh sách zh-Hans = 列表 - zh-Hant = 清單 + zh-Hant = 列表 [mobile_data_dialog] tags = android,ios @@ -19460,8 +19460,8 @@ tr = Ayrıntılı bilgileri görüntülemek için mobil internet kullanılsın mı? uk = Використовувати мобільні дані для перегляду докладної інформації? vi = Sử dụng mạng Internet di động để hiển thị thông tin chi tiết? - zh-Hans = 使用移动网络显示详细信息? - zh-Hant = 使用手機網路顯示詳細資訊? + zh-Hans = 使用移动网络显示更多详细信息吗? + zh-Hant = 使用手機網路顯示更多詳細資訊嗎? [mobile_data_option_always] tags = android,ios @@ -19680,7 +19680,7 @@ uk = Використання мобільних даних необхідно для сповіщень про оновлення карти та для відображення докладної інформації про місця та мітки. vi = Internet di động là cần thiết để hiển thị thông tin chi tiết về các nơi, ví dụ như ảnh chụp, giá cả và đánh giá. zh-Hans = 要显示地点的详细信息(例如照片、价格和评价),需要使用移动网络。 - zh-Hant = 需有手機網路才能顯示相片、價格與評論等詳細資訊和地點。 + zh-Hant = 要顯示地點的詳細資訊(例如照片、價格和評價),需要使用手機網絡。 [mobile_data_option_never] tags = android,ios @@ -19810,8 +19810,8 @@ tr = Trafik verilerini görüntülemek için haritaların güncellenmesi gerekiyor. uk = Для відображення інформації про трафік необхідно оновити мапи. vi = Để hiển thị dữ liệu giao thông, cần cập nhật bản đồ. - zh-Hans = 要显示交通数据,必须更新地图。 - zh-Hant = 若要顯示交通資料,必須更新地圖。 + zh-Hans = 诺要显示交通数据,必须更新地图。 + zh-Hant = 諾要顯示交通資料,必須更新地圖。 [big_font] tags = android,ios @@ -19941,8 +19941,8 @@ tr = Trafik verilerini görüntülemek için uygulamanın güncellenmesi gerekiyor. uk = Для відображення даних про трафік оновіть додаток. vi = Để hiển thị dữ liệu giao thông, ứng dụng cần phải được cập nhật. - zh-Hans = 要显示交通数据,必须更新应用。 - zh-Hant = 若要顯示交通資訊,必須更新 app。 + zh-Hans = 诺要显示交通数据,必须更新应用。 + zh-Hant = 諾要顯示交通資訊,必須更新應用。 [traffic_data_unavailable] comment = "traffic" as in "road congestion" @@ -19986,7 +19986,7 @@ uk = Дані про трафік недоступні vi = Dữ liệu giao thông không khả dụng zh-Hans = 交通数据不可用 - zh-Hant = 無法使用交通資訊 + zh-Hant = 交通資訊不可用 [enable_logging] tags = android,ios @@ -20029,8 +20029,8 @@ tr = Günlüğü etkinleştir uk = Включити логіювання vi = Bật nhật ký - zh-Hans = 启用记录 - zh-Hant = 啟用記錄 + zh-Hans = 启用日志记录 + zh-Hant = 啟用日誌記錄 [log_file_size] tags = ios @@ -20074,7 +20074,7 @@ tr = Günlük dosyası boyutu: %@ uk = Розмір файлу журналу: %@. vi = Kích thước tệp nhật ký: %@ - zh-Hans = 日志文件大小: %@ + zh-Hans = 日志文件大小:%@ zh-Hant = 日誌檔案大小:%@ [feedback_general] @@ -20119,7 +20119,7 @@ tr = Genel Geri Bildirim uk = Загальний відгук vi = Phản hồi chung - zh-Hans = 一般反馈 + zh-Hans = 常规反馈 zh-Hant = 一般反應 [prefs_languages_information] @@ -20163,8 +20163,8 @@ tr = Sesli yönlendirme için TTS sistemini kullanıyoruz. Çoğu Android cihaz, Google TTS'yi kullanıyor. Uygulamayı, Google Play'den indirebilir veya güncelleyebilirsiniz (https://play.google.com/store/apps/details?id=com.google.android.tts) uk = Для озвучування голосових інструкцій ми використовуємо систему TTS. Більшість Android-пристроїв підтримують систему Google TTS. Для завантаження або оновлення перейдіть до магазину Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts) vi = Chúng tôi sử dụng TTS hệ thống để hướng dẫn bằng giọng nói. Rất nhiều thiết bị Android sử dụng Google TTS, bạn có thể tải về hoặc cập nhật nó từ Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts) - zh-Hans = 我们为语音指令使用“文字转语音”系统。许多 Android 设备使用 Google 文字转语音,您可以从 Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts) 下载或更新这一功能 - zh-Hant = 我們使用系統 TTS 提供語音指示。許多 Android 裝置使用 Google TTS,您可從 Google Play 下載或更新 (https://play.google.com/store/apps/details?id=com.google.android.tts) + zh-Hans = 我们的语音导航使用“文本转语音”系统。许多 Android 设备使用 Google 的文本转语音系统,您可以从 Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts) 下载或更新这一功能 + zh-Hant = 我們的語音導航使用“文本轉語音”系統。許多 Android 裝置使用 Google 的文本轉語音系統,您可以從 Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts) 下載或更新這一功能。 [prefs_languages_information_off] tags = android @@ -20206,8 +20206,8 @@ tr = Bazı diller için uygulama mağazasından (Google Play, Galaxy Store, App Gallery, FDroid) farklı bir konuşma sentezleyicisi veya ek bir dil paketi yüklemeniz gerekebilir. Cihaz ayarları → Dil ve Giriş → Konuşma → Metin Okuma seçeneğini açın. Buradan konuşma sentezi ayarlarını yönetebilir (örneğin, çevrimdışı kullanım için bir dil paketini karşıdan yükleyebilir) ve başka bir metin okuma motorunu seçebilirsiniz. uk = Для деяких мов вам знадобиться встановити інший додаток для синтезу мовлення або додатковий мовний пакет з магазину додатків (Google Play, Galaxy Store, App Gallery, FDroid).\nВідкрийте налаштування пристрою → Мови та введення → Мовлення → Синтез мовлення.\nТут ви можете здійснювати управління налаштуваннями синтезу мовлення (наприклад, завантажити мовний пакет для використання офлайн) або вибрати інший програмний рушій для синтезу мовлення. vi = Đối với một số ngôn ngữ, bạn sẽ cần cài đặt một trình tổng hợp lời nói khác hoặc một gói ngôn ngữ bổ sung từ cửa hàng ứng dụng (Google Play, Galaxy Store, App Gallery, FDroid).\nMở cài đặt của thiết bị → Ngôn ngữ và nhập liệu → Lời nói → Đầu ra văn bản sang lời nói.\nTại đây bạn có thể quản lý các cài đặt tổng hợp lời nói (ví dụ, tải về các gói ngôn ngữ để sử dụng ngoại tuyến) và chọn một công cụ chuyển đổi văn bản sang lời nói khác. - zh-Hans = 对于某些语言,您需要从应用商店(Google Play Market、Galaxy Store)中安装其他语音合成器或语言包。\n打开您的设备的设置 → 语言和输入法 → 语音 → 文字转语音 (TTS) 输出。\n您可以在这里管理语音合成的设置(例如,下载语言包供离线使用)和选择其他文字转语音引擎。 - zh-Hant = 對於某些語言,您將需要從 App 商店 (Google Play 商店, Galaxy Store) 安裝其他語音合成器或額外的語言套件。\n開啟您裝置的設定 → 語言與輸入 → 語音 → 文字轉換語音輸出。\n在這裡,您可以管理語音合成器的設定(例如,下載語言套件以供離線使用),並選取其他文字轉換語音引擎。 + zh-Hans = 对于某些语言,您需要从应用商店(例如 Google Play 商店、Galaxy Store)中安装其他语音合成器或语言包。\n打开您的设备的设置 → 语言和输入法 → 语音 → 文字转语音 (TTS) 输出。\n您可以在这里管理语音合成的设置(例如,下载语言包供离线使用)和选择其他文字转语音引擎。 + zh-Hant = 對於某些語言,您需要從應用商店(例如 Google Play Store、Galaxy Store)中安裝其他語音合成器或語言包。\n打開您的裝置的設定 → 語言和輸入法 → 語音 → 文字轉語音 (TTS) 輸出。\n您可以在這裡管理語音合成的設定(例如,下載語言包供離線使用)和選擇其他文字轉語音引擎。 [prefs_languages_information_off_link] tags = android @@ -20252,7 +20252,7 @@ uk = Додаткову інформацію див. у цьому керівництві. vi = Để biết thêm thông tin, vui lòng kiểm tra bài hướng dẫn này. zh-Hans = 如需了解更多信息,请查阅此指南。 - zh-Hant = 如需更多資訊,請參閱本指南。 + zh-Hant = 如需瞭解更多資訊,請參閱此指南。 [transliteration_title] tags = android,ios @@ -20298,8 +20298,8 @@ tr = Latin harf çevirisi uk = Транслітерація латинськими літерами vi = Chuyển ngữ sang chữ Latinh - zh-Hans = 直译成拉丁文 - zh-Hant = 音譯為拉丁文 + zh-Hans = 拉丁字母音译 + zh-Hant = 拉丁字母音譯 [learn_more] tags = android @@ -20342,7 +20342,7 @@ tr = Daha fazla bilgi edinin uk = Докладніше vi = Tìm hiểu thêm - zh-Hans = 了解更多 + zh-Hans = 了解更多信息 zh-Hant = 瞭解更多資訊 [core_exit] @@ -20433,8 +20433,8 @@ tr = Bir rota başlangıç noktası eklemek için aramayı kullanın veya haritaya dokunun uk = Скористайтеся пошуком або торкніться мапи, щоб додати початкову точку маршруту vi = Sử dụng tìm kiếm hoặc nhấn vào bản đồ để thêm điểm bắt đầu tuyến đường - zh-Hans = 请使用搜索或点击地图以添加路线起点 - zh-Hant = 請使用搜尋或點擊地圖以新增路線起點 + zh-Hans = 请搜索地点或点击地图以添加路线起点 + zh-Hant = 請搜尋地點或點擊地圖以新增路線起點 [routing_add_finish_point] tags = android,ios @@ -20479,8 +20479,8 @@ tr = Bir hedef noktası eklemek için aramayı kullanın veya haritaya dokunun uk = Скористайтеся пошуком або торкніться мапи, щоб додати пункт призначення vi = Sử dụng tìm kiếm hoặc nhấn vào bản đồ để thêm điểm đến - zh-Hans = 请使用搜索或点击地图以添加目的地 - zh-Hant = 請使用搜尋或點擊地圖以新增目的地 + zh-Hans = 请搜索地点或点击地图以添加目的地 + zh-Hant = 請搜尋地點或點擊地圖以新增目的地 [planning_route_manage_route] tags = ios @@ -20790,8 +20790,8 @@ tr = Tüm harita düzenlemelerinizi otomatik olarak yüklemek için lütfen OpenStreetMap'e giriş yapın. Daha fazla bilgi burada. uk = Будь ласка увійдіть в акаунт OpenStreetMap.org, щоб автоматично публікувати зміни до мапи. Подробиці за посиланням. vi = Vui lòng đăng nhập vào OpenStreetMap để tự động tải lên tất cả các chỉnh sửa bản đồ của bạn. Tìm hiểu thêm tại đây. - zh-Hans = 请登录OpenStreetMap,自动上传您编辑的所有地图。了解更多信息请点击这里。 - zh-Hant = 請登入 OpenStreetMap 自動上傳您所有的地圖編輯內容。了解更多此處。 + zh-Hans = 请登录 OpenStreetMap 以自动上传您的所有地图编辑。诺要了解更多信息请点击这里。 + zh-Hant = 請登入 OpenStreetMap 以自動上傳您的所有地圖編輯。諾要了解更多資訊請點擊這裡。 [alert_reauth_message_ios] comment = For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part @@ -20837,8 +20837,8 @@ tr = Tüm harita düzenlemelerinizi otomatik olarak yüklemek için lütfen OpenStreetMap'e giriş yapın. Daha fazla bilgi uk = Будь ласка увійдіть в акаунт OpenStreetMap.org, щоб автоматично публікувати зміни до мапи. Подробиці за vi = Vui lòng đăng nhập vào OpenStreetMap để tự động tải lên tất cả các chỉnh sửa bản đồ của bạn. Tìm hiểu thêm - zh-Hans = 请登录OpenStreetMap,自动上传您编辑的所有地图。了解更多信息 - zh-Hant = 請登入 OpenStreetMap 自動上傳您所有的地圖編輯內容。了解更多 + zh-Hans = 请登录 OpenStreetMap 以自动上传您的所有地图编辑。了解更多 + zh-Hant = 請登入 OpenStreetMap 以自動上傳您的所有地圖編輯。了解更多 [alert_reauth_link_text_ios] comment = For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part @@ -20884,8 +20884,8 @@ tr = burada uk = посиланням vi = tại đây - zh-Hans = 请点击这里 - zh-Hant = 此處 + zh-Hans = 这里 + zh-Hant = 這裡 [dialog_error_storage_title] tags = android @@ -20930,7 +20930,7 @@ uk = Не вдалося отримати доступ до сховища vi = Vấn đề truy cập ổ lưu trữ zh-Hans = 存储空间访问问题 - zh-Hant = 儲存空間存取問題 + zh-Hant = 儲存空間訪問問題 [dialog_error_storage_message] tags = android @@ -20974,8 +20974,8 @@ tr = Harici bellek kullanılamıyor, muhtemelen SD Kart çıkarılmış, hasarlı veya dosya sistemi salt okunur. Lütfen kontrol edin veya support@organicmaps.app adresinden bizimle iletişime geçin uk = Зовнішнє сховище не доступно. Ймовірно, SD-картку пам'яті було вилучено, пошкоджено, або система файлів доступна тільки для читання. Будь ласка, перевірте та зв'яжіться з нами, написавши на адресу електронну пошту support@organicmaps.app vi = Ổ lưu trữ bên ngoài không khả dụng, có thể Thẻ SD đã bị tháo, bị hỏng hoặc hệ thống tập tin được thiết lập chỉ đọc. Hãy kiểm tra và liên hệ với chúng tôi qua support@organicmaps.app - zh-Hans = 外部存储空间不可用,可能是存储卡已移除、损坏,或者文件系统为只读。请检查,然后通过以下方式联系我们:support@organicmaps.app - zh-Hant = 外部儲存空間不可用,很可能是因為 SD 卡已移除、毀損,或檔案系統處於唯讀狀態。請進行檢查,然後以 support@organicmaps.app 方式聯繫我們 + zh-Hans = 外部存储空间不可用,很可能是因为 SD 卡已移除、损毁,或者文件系统为只读状态。请进行检查,然后通过 support@organicmaps.app 联系我们。 + zh-Hant = 外部儲存空間不可用,很可能是因為 SD 卡已移除、毀損,或檔案系統處於唯讀狀態。請進行檢查,然後通過 support@organicmaps.app 聯絡我們。 [setting_emulate_bad_storage] tags = android @@ -21156,7 +21156,7 @@ uk = Списки vi = Danh sách zh-Hans = 列表 - zh-Hant = 清單 + zh-Hant = 列表 [bookmark_lists_hide_all] comment = Do not display all bookmark lists on the map @@ -21358,7 +21358,7 @@ uk = Створити новий список vi = Tạo danh sách mới zh-Hans = 创建新的列表 - zh-Hant = 創建新列表 + zh-Hant = 創建新的列表 [bookmarks_import] tags = android,ios @@ -21493,7 +21493,7 @@ uk = %@ (%@ з %@) vi = %@ (%@ / %@) zh-Hans = %@ (%@ / %@) - zh-Hant = %@ (%@,共%@) + zh-Hant = %@ (%@ / %@) [downloader_process] tags = ios @@ -21539,7 +21539,7 @@ uk = Завантаження %@… vi = Tải về %@… zh-Hans = 正在下載 %@… - zh-Hant = 下載 %@ 中…… + zh-Hant = 正在下載 %@… [downloader_applying] tags = ios @@ -21584,8 +21584,8 @@ tr = %@ uygulanıyor… uk = Застосування %@… vi = Áp dụng %@… - zh-Hans = 正在套用 %@… - zh-Hant = 應用 %@ 中…… + zh-Hans = 正在应用 %@… + zh-Hant = 正在應用 %@… [bookmarks_error_message_share_general] tags = android,ios @@ -21630,8 +21630,8 @@ tr = Bir uygulama hatasından dolayı paylaşılamıyor uk = Неможливо поділитися через помилку програми vi = Không thể chia sẻ do lỗi ứng dụng - zh-Hans = 由于应用程序出错而无法分享 - zh-Hant = 由於 app 出錯而無法分享 + zh-Hans = 由于应用程序出错,导致无法分享 + zh-Hant = 由於應用程式出錯,導致無法分享 [bookmarks_error_title_share_empty] tags = android,ios @@ -21676,8 +21676,8 @@ tr = Paylaşma hatası uk = Помилка обміну vi = Lỗi chia sẻ - zh-Hans = 分享错误 - zh-Hant = 分享錯誤 + zh-Hans = 无法分享 + zh-Hant = 無法分享 [bookmarks_error_message_share_empty] tags = android,ios @@ -21722,7 +21722,7 @@ uk = Неможливо поділитися пустим списком vi = Không thể chia sẻ một danh sách trống zh-Hans = 无法分享空列表 - zh-Hant = 無法分享空的列表 + zh-Hant = 無法分享空列表 [bookmarks_error_title_empty_list_name] tags = android @@ -21905,8 +21905,8 @@ tr = Bu isim zaten alınmış uk = Це ім'я вже зайнято vi = Tên này đã được sử dụng - zh-Hans = 这个名字已经被使用了 - zh-Hant = 這個名字已經被使用了 + zh-Hans = 这个名称已经被使用了 + zh-Hant = 這個名稱已經被使用了 [bookmarks_error_message_list_name_already_taken] tags = android @@ -21995,8 +21995,8 @@ tr = Bu isim çok uzun uk = Це ім'я задовге vi = Tên này quá dài - zh-Hans = 这个名字太长了 - zh-Hant = 這個名字太長了 + zh-Hans = 这个名称太长了 + zh-Hant = 這個名稱太長了 [please_wait] tags = android @@ -22253,8 +22253,8 @@ uk:one = %d файл був знайдений. Ви побачите його після перетворення. uk:other = %d файлів було знайдено. Ви побачите їх після конвертації. vi:other = %d tập tin đã được tìm thấy. Bạn sẽ thấy chúng sau khi chuyển đổi. - zh-Hans = 找到%d个文件。 转换后你会看到它。 - zh-Hant = 找到%d個文件。 轉換後你會看到它。 + zh-Hans = 找到 %d 个文件,转换后您才能看到它们。 + zh-Hant = 找到 %d 個文件,轉換後您才能看到它們。 [button_convert] tags = ios @@ -22299,8 +22299,8 @@ tr = Dönüştür uk = Конвертувати vi = Chuyển đổi - zh-Hans = 兑换 - zh-Hant = 兌換 + zh-Hans = 转换 + zh-Hant = 轉換 [bookmarks_convert_error_title] tags = ios @@ -22502,8 +22502,8 @@ tr = %d rota uk = %d треків vi = %d các chặn đường - zh-Hans = %d 跟踪 - zh-Hant = %d 軌跡 + zh-Hans = %d 个轨迹 + zh-Hant = %d 個軌跡 [privacy] comment = Settings privacy group in settings screen @@ -22868,7 +22868,7 @@ uk = Список порожній vi = Danh sách trống zh-Hans = 该列表为空 - zh-Hant = 列表為空 + zh-Hant = 該列表為空 [bookmarks_empty_list_message] tags = android @@ -22912,8 +22912,8 @@ tr = Yer imi eklemek için önce haritadaki bir yere sonrasında ise yıldız simgesine dokunun uk = Щоб додати нову мітку, натисніть на значок зірочки в картці об’єкта vi = Để thêm dấu trang, hãy nhấn vào một địa điểm trên bản đồ và sau đó nhấn vào biểu tượng dấu sao - zh-Hans = 要添加新标签,请单击对象卡中的星形图标 - zh-Hant = 要增加新標籤,請點一下對象卡片中的星型圖標 + zh-Hans = 要添加新书签,请点击对象卡片中的星形图标 + zh-Hant = 要增加新書籤,請點擊對象卡片中的星型圖標 [category_desc_more] tags = android @@ -23080,8 +23080,8 @@ tr = KMZ Olarak Dışa Aktar uk = Експорт KMZ vi = Xuất KMZ - zh-Hans = 导出 KMZ - zh-Hant = 出口KMZ + zh-Hans = 导出为 KMZ + zh-Hant = 導出為 KMZ [export_file_gpx] tags = android,ios @@ -23124,8 +23124,8 @@ tr = GPX Olarak Dışa Aktar uk = Експорт GPX vi = Xuất GPX - zh-Hans = 导出 GPX - zh-Hant = 導出GPX + zh-Hans = 导出为 GPX + zh-Hant = 導出為 GPX [delete_list] tags = android,ios @@ -23213,8 +23213,8 @@ tr = Haritadan gizle uk = Приховати з карти vi = Ẩn từ bản đồ - zh-Hans = 从卡中隐藏 - zh-Hant = 從卡中隱藏 + zh-Hans = 从地图上隐藏 + zh-Hant = 從地圖上隱藏 [public_access] tags = android @@ -23258,8 +23258,8 @@ tr = Genel erişim uk = Публічний доступ vi = Truy cập công khai - zh-Hans = 公共访问 - zh-Hant = 開放空間 + zh-Hans = 允许公众访问 + zh-Hant = 允許公眾訪問 [limited_access] tags = android @@ -23303,8 +23303,8 @@ tr = Sınırlı erişim uk = Приватний доступ vi = Truy cập hạn chế - zh-Hans = 私人访问 - zh-Hant = 私人空間 + zh-Hans = 不允许访问的私人空间 + zh-Hant = 不允許訪問的私人空間 [bookmark_list_description_hint] tags = android,ios @@ -23348,8 +23348,8 @@ tr = Bir açıklama yazın (metin veya html) uk = Додайте опис (текст чи html) vi = Đánh vào một mô tả (văn bản hoặc html) - zh-Hans = 请添加说明(文字或html) - zh-Hant = 增加說明(文字或html) + zh-Hans = 添加说明(文字或 html) + zh-Hant = 增加說明(文字或 html) [not_shared] tags = android @@ -23850,7 +23850,7 @@ tr = Otomatik mod seçildiğinde, uygulama geçerli pil seviyesine bağlı olarak şarj harcayan özellikleri devre dışı bırakmaya başlar uk = Якщо увімкнено режим енергозбереження, додаток буде відключати енерговитратні функції в залежності від поточного заряду телефону vi = Nếu chế độ tiết kiệm năng lượng được bật, ứng dụng sẽ tắt các chức năng tiêu thụ năng lượng tùy thuộc vào mức pin hiện tại của điện thoại - zh-Hans = 如果开启省电模式,应用程序将根据手机的当前电量关耗电功能 + zh-Hans = 如果开启省电模式,应用程序将根据手机的当前电量关闭耗电功能 zh-Hant = 如果開啟省電模式,應用程序將根據手機的當前電量關閉耗電功能 [power_managment_setting_never] @@ -23942,8 +23942,8 @@ tr = Otomatik uk = Автоматично vi = Tự động - zh-Hans = 自动 - zh-Hant = 自動 + zh-Hans = 当电量低时 + zh-Hant = 當電量低時 [power_managment_setting_manual_max] tags = android,ios @@ -24034,8 +24034,8 @@ tr = Bu seçenek tanılama amacıyla günlüğe kaydetmeyi açar. Ekibimizin uygulamayla ilgili sorunları gidermesine yardımcı olabilir. Sorununuzla ilgili ayrıntılı günlükleri kaydetmek ve bize göndermek için bu seçeneği geçici olarak etkinleştirin. uk = Дана опція вмикається для логування дій з метою діагностики. Це допомагає команді виявити проблеми з додатком. Тимчасово включайте цю настройку тільки для відправки детальної інформації про знайдену вами проблему в додатку через кнопку "Сповістити про помилку". vi = Tùy chọn này được kích hoạt để ghi nhật ký đăng nhập cho mục đích chẩn đoán. Điều này sẽ giúp nhóm chúng tôi làm rõ các vấn đề liên quan đến ứng dụng. Hãy bật tùy chọn này chỉ khi nào có yêu cầu hỗ trợ từ Organic Maps. - zh-Hans = 临时启用此选项,以便使用“报告错误”功能在帮助对话框中记录并手动发送有关您的问题的详细诊断日志给我们。日志可能包含位置信息。 - zh-Hant = 暫時啟用此選項,以便使用「回報問題」功能在幫助對話框中記錄並手動發送詳細的診斷日誌給我們。日誌可能包含位置資訊。 + zh-Hans = 临时启用此选项,以便使用“报告错误”功能在帮助对话框中记录并手动发送详细诊断日志给我们。日志可能包含位置信息。 + zh-Hant = 暫時啟用此選項,以便使用“報告問題”功能在幫助對話框中記錄並手動發送詳細的診斷日誌給我們。日誌可能包含位置資訊。 [access_rules_author_only] tags = android @@ -24215,8 +24215,8 @@ tr = Asfaltsız yollardan kaçın uk = Уникати ґрунтових доріг vi = Tránh đường đất - zh-Hans = 避开未铺设道路 - zh-Hant = 避開未鋪設道路 + zh-Hans = 避开未铺砌道路 + zh-Hant = 避開未鋪砌道路 [avoid_ferry] comment = Recommended length for CarPlay and Android Auto is around 25-27 characters @@ -24397,8 +24397,8 @@ tr = Maalesef, muhtemelen belirlediğiniz seçeneklerden dolayı bir rota bulamadık. Lütfen seçenekleri değiştirin ve tekrar deneyin uk = На жаль, ми не змогли побудувати маршрут з вибраними опціями. Змініть налаштування та спробуйте ще раз vi = Rất tiếc, chúng không thể tạo tuyến đường với những tùy chọn đã chọn. Hãy thay đổi thiết lập và thử lại - zh-Hans = 很遗憾,我们无法使用所选选项规划路线。请更改设置,然后重试 - zh-Hant = 很遺憾,我們無法使用所選選項規劃路線。請更改設定,然後重試 + zh-Hans = 很遗憾,我们无法使用所选的绕行设置规划路线。请更改设置,然后重试 + zh-Hant = 很遺憾,我們無法使用所選的繞行設定規劃路線。請更改設定,然後重試 [define_to_avoid_btn] tags = android,ios @@ -24443,8 +24443,8 @@ tr = Kaçınılması gereken yolları tanımlayın uk = Налаштувати шляхи об’їзду vi = Thiết lập đường đi vòng - zh-Hans = 设置绕行路径 - zh-Hant = 設定繞行路徑 + zh-Hans = 选择要避开的道路 + zh-Hant = 選擇要避開的道路 [change_driving_options_btn] tags = android,ios @@ -24576,8 +24576,8 @@ tr = Asfaltsız yol uk = Ґрунтова дорога vi = Đường đất - zh-Hans = 土路 - zh-Hant = 土路 + zh-Hans = 未铺砌道路 + zh-Hant = 未鋪砌道路 [ferry_crossing] tags = android,ios @@ -24664,8 +24664,8 @@ tr = Hadi gidelim uk = Поїхали vi = Đi nào - zh-Hans = 前往 - zh-Hant = 前往 + zh-Hans = 出发 + zh-Hant = 出發 [pick_destination] tags = ios @@ -24708,8 +24708,8 @@ tr = Hedef uk = Ціль vi = Mục đích - zh-Hans = 目标 - zh-Hant = 目標 + zh-Hans = 目的地 + zh-Hant = 目的地 [follow_my_position] tags = ios @@ -24753,8 +24753,8 @@ tr = Tekrar ortala uk = Відцентрувати vi = Định tâm - zh-Hans = 定好中心 - zh-Hant = 重新設定中心點 + zh-Hans = 重新居中 + zh-Hant = 重新居中 [search_results] tags = ios @@ -24841,8 +24841,8 @@ tr = Sonra uk = Далі vi = Sau đó - zh-Hans = 接下来 - zh-Hant = 接下來 + zh-Hans = 然后 + zh-Hant = 然後 [redirect_route_alert] tags = ios @@ -24886,8 +24886,8 @@ tr = Yeniden bir rota oluşturmak ister misiniz? uk = Бажаєте перебудувати маршрут? vi = Bạn có muốn tạo lại tuyến không? - zh-Hans = 想重建路线? - zh-Hant = 想重建路線? + zh-Hans = 您想重新规划路线吗? + zh-Hant = 您想重新規劃路線嗎? [yes] comment = A generic "Yes" button in dialogs @@ -25087,8 +25087,8 @@ tr = Vardınız! uk = Ви прибули! vi = Bạn đã tới nơi! - zh-Hans = 您已到达! - zh-Hant = 您已經到達了! + zh-Hans = 您已到达目的地! + zh-Hant = 您已到達目的地! [keyboard_availability_alert] tags = ios @@ -25131,7 +25131,7 @@ tr = Klavye sürüş sırasında kullanılamaz uk = Клавіатура недоступна під час руху vi = Bàn phím không khả dụng trong thời gian di chuyển - zh-Hans = 移动时键盘不可用 + zh-Hans = 开车时键盘不可用 zh-Hant = 開車時鍵盤不可用 [dialog_routing_change_start_carplay] @@ -25176,8 +25176,8 @@ tr = Mevcut konumunuzdan rota oluşturulamıyor uk = Неможливо побудувати маршрут від поточного місця розташування vi = Không thể tạo tuyến đường từ địa điểm hiển tại - zh-Hans = 无法从当前位置构建路线 - zh-Hant = 無法從當前位置構建路線 + zh-Hans = 无法从当前位置规划路线 + zh-Hant = 無法從當前位置規劃路線 [dialog_routing_change_end_carplay] tags = ios @@ -25221,8 +25221,8 @@ tr = Hedefinize rota oluşturulamıyor. Lütfen başka bir nokta seçin uk = Неможливо побудувати маршрут до кінцевої точки. Оберіть іншу vi = Không thể tạo tuyến đường tới điểm kết cuối. Hãy chọn điểm khác - zh-Hans = 无法建立到终点的路线。请选择其他(路线) - zh-Hant = 無法建立到終點的路線。請選擇其他(路線) + zh-Hans = 无法规划到终点的路线。请选择其它目的地 + zh-Hant = 無法規劃到終點的路線。請選擇其它目的地 [dialog_routing_check_gps_carplay] tags = ios @@ -25266,8 +25266,8 @@ tr = GPS sinyali yok. Lütfen açık bir alana geçin uk = Немає сигналу GPS. Перейдіть на відкриту місцевість vi = Không có tín hiệu GPS. Hãy đến vị trí có không gian mở - zh-Hans = 无GPS信号。请沿着空旷区域行驶 - zh-Hant = 無GPS信號。請沿著空曠區域行駛 + zh-Hans = 没有 GPS 信号。请沿着空旷区域行驶 + zh-Hant = 沒有 GPS 信號。請沿著空曠區域行駛 [dialog_routing_unable_locate_route_carplay] tags = ios @@ -25311,8 +25311,8 @@ tr = Rota oluşturulamıyor. Lütfen başka bir rota noktası belirtin uk = Неможливо побудувати маршрут. Оберіть інші точки маршруту vi = Không thể tạo tuyến đường. Hãy chọn những điểm khác cho tuyến đường - zh-Hans = 无法建立路线。请选择其他路线点 - zh-Hant = 無法建立路線。請選擇其他路線點 + zh-Hans = 无法规划路线。请选择其他路线点 + zh-Hant = 無法規劃路線。請選擇其他路線點 [dialog_routing_download_files_carplay] tags = ios @@ -25356,8 +25356,8 @@ tr = Rota oluşturmak için cihazınızdaki eksik haritaları indirin uk = Щоб побудувати маршрут, завантажте відсутні карти на своєму пристрої vi = Để tạo tuyến đường, hãy tải xuống các bản đồ còn thiếu về thiết bị - zh-Hans = 为了创建线路,请在您的设备中下载所缺少的地图 - zh-Hant = 爲了創建線路,請在您的設備中下載所缺少的地圖 + zh-Hans = 为了规划路线,请在您的设备中下载所缺少的地图 + zh-Hant = 為了規劃路線,請在您的裝置中下載所缺少的地圖 [dialog_routing_system_error_carplay] tags = ios @@ -25401,8 +25401,8 @@ tr = Hata oluştu. Lütfen uygulamayı yeniden başlatın uk = Виникла помилка. Перезапустіть додаток vi = Đã xảy ra lỗi. Khởi động lại ứng dụng - zh-Hans = 发生了错误。请重新启动程序 - zh-Hant = 發生錯誤,請重新啟動 app + zh-Hans = 发生了错误,请重新启动应用程序 + zh-Hant = 發生了錯誤,請重新啟動應用程式 [dialog_routing_rebuild_from_current_location_carplay] tags = ios @@ -25491,8 +25491,8 @@ tr = Rota, bir arabalı seyahat rotasına dönüştürülecek uk = Маршрут буде змінено на автомобільний vi = Tuyến đường sẽ được thay đổi thành tuyến dành cho xe ô tô - zh-Hans = 该路线将改为汽车(路线) - zh-Hant = 該路線將改為汽車(路線) + zh-Hans = 路线将转换为汽车路线 + zh-Hant = 路線將轉換為汽車路線 [not_all_shown_bookmarks_carplay] tags = ios @@ -25536,7 +25536,7 @@ tr = Tüm yer imleri gösterilmez uk = Відображаються не всі мітки vi = Không phải tất cả dấu trang đều được hiển thị - zh-Hans = 并非所有书签都会显示 + zh-Hans = 未显示所有书签 zh-Hant = 未顯示所有書籤 [switch_to_phone_bookmarks_carplay] @@ -25581,8 +25581,8 @@ tr = Tüm yer imlerini görmek için telefona geçin uk = Перейдіть на телефон, щоб побачити всі мітки vi = Chuyển sang điện thoại để xem tất cả dấu trang - zh-Hans = 切换到手机查看所有书签 - zh-Hant = 切換到手機查看所有書籤 + zh-Hans = 切换到手机以查看所有书签 + zh-Hant = 切換到手機以查看所有書籤 [ok] tags = android,ios @@ -25628,7 +25628,7 @@ uk = Ок vi = Ok zh-Hans = 好的 - zh-Hant = 好 + zh-Hant = 好的 [speedcams_alert_title_carplay_1] tags = ios @@ -25672,8 +25672,8 @@ tr = Hız kameraları uk = Камери vi = Сam tốc độ - zh-Hans = 摄像头 - zh-Hant = 測速照相機 + zh-Hans = 限速拍照 + zh-Hant = 限速拍照 [speedcams_alert_title_carplay_2] tags = ios @@ -25717,7 +25717,7 @@ tr = Hız uyarıları uk = Інфо о камерах vi = Cảnh báo tốc độ - zh-Hans = 摄像头信息 + zh-Hans = 超速警告 zh-Hant = 超速警告 [download_map_carplay] @@ -25762,8 +25762,8 @@ tr = Lütfen haritaları cihazınıza Organic Maps uygulamasından indirin uk = Завантажте карти в додатку Organic Maps на своєму пристрої vi = Vui lòng tải xuống bản đồ trong ứng dụng Organic Maps trên thiết bị của bạn - zh-Hans = 将Organic Maps软件中的地图下载至个人设备中 - zh-Hant = 將Organic Maps app 中的地圖下載至個人設備中 + zh-Hans = 将 Organic Maps 应用程序中的地图下载至个人设备中 + zh-Hant = 將Organic Maps 應用程式中的地圖下載至個人裝置中 [carplay_roundabout_exit] tags = ios @@ -25807,8 +25807,8 @@ tr = %@ çıkış uk = %@ з’їзд vi = Lối ra %@ của vòng xuyến - zh-Hans = %@号坡道 - zh-Hant = %@號坡道 + zh-Hans = 第 %@ 个出口 + zh-Hant = 第 %@ 个出口 [sort] comment = max. 10 symbols, both iOS and Android @@ -25853,8 +25853,8 @@ tr = Sırala… uk = Сортувати vi = Sắp xếp… - zh-Hans = 分类…… - zh-Hant = 分類…… + zh-Hans = 排序… + zh-Hant = 排序… [sort_bookmarks] comment = Android, title, max 20-22 symbols @@ -25899,8 +25899,8 @@ tr = Yer imlerini sırala uk = Сортувати мітки vi = Sắp xếp dấu trang - zh-Hans = 分类标签 - zh-Hant = 分類書籤 + zh-Hans = 分类排序 + zh-Hant = 分類排序 [sort_default] comment = iOS @@ -25945,7 +25945,7 @@ uk = Сортувати за промовчанням vi = Sắp xếp theo mặc định zh-Hans = 默认排序 - zh-Hant = 按預設值排序 + zh-Hant = 默認排序 [sort_type] tags = ios @@ -26167,8 +26167,8 @@ tr = Varsayılana göre uk = Усталено vi = Theo mặc định - zh-Hans = 默认情况下 - zh-Hant = 採用預設值 + zh-Hans = 使用默认值 + zh-Hant = 使用默認值 [by_type] comment = Android @@ -26439,7 +26439,7 @@ tr = Bir ay önce uk = Місяць тому vi = Tháng trước - zh-Hans = 一月前 + zh-Hans = 一个月前 zh-Hant = 一個月前 [moremonth_ago_sorttype] @@ -26571,8 +26571,8 @@ tr = Bana yakınlarda uk = Поруч зі мною vi = Ở gần tôi - zh-Hans = 在我旁边 - zh-Hant = 附近 + zh-Hans = 在我附近 + zh-Hant = 在我附近 [others_sorttype] tags = android,ios @@ -26705,8 +26705,8 @@ tr = Görülecek yerler uk = Пам’ятки vi = Danh lam thắng cảnh - zh-Hans = 名胜 - zh-Hant = 觀光景點 + zh-Hans = 旅游景点 + zh-Hant = 旅遊景點 [museums] tags = android,ios @@ -26881,7 +26881,7 @@ tr = Dağlar uk = Гори vi = Núi non - zh-Hans = 山 + zh-Hans = 山峰 zh-Hant = 山峰 [animals] @@ -26926,7 +26926,7 @@ uk = Тварини vi = Động vật zh-Hans = 动物 - zh-Hant = 動物園 + zh-Hant = 動物 [hotels] tags = android,ios @@ -27324,8 +27324,8 @@ tr = Dini yerler uk = Святі місця vi = Những nơi tôn nghiêm - zh-Hans = 圣地 - zh-Hant = 宗教聖地 + zh-Hans = 宗教场所 + zh-Hant = 宗教場所 [select_list] tags = android @@ -27462,7 +27462,7 @@ tr = Metro rotası bulunamadı uk = Маршрут метро не знайдено vi = Không tìm thấy tuyến Metro - zh-Hans = 地铁路线图未找到 + zh-Hans = 未找到地铁路线图 zh-Hant = 未找到捷運路線圖 [dialog_pedestrian_route_is_long_message] @@ -28041,7 +28041,7 @@ uk = Складність vi = Độ khó zh-Hans = 难度 - zh-Hant = 難易度 + zh-Hant = 難度 [elevation_profile_distance] tags = android @@ -28130,7 +28130,7 @@ tr = Süre: uk = Шлях: vi = Giờ: - zh-Hans = 在路上: + zh-Hans = 时间: zh-Hant = 時間: [isolines_toast_zooms_1_10] @@ -28263,8 +28263,8 @@ tr = İndiriliyor uk = Завантаження vi = Tải xuống - zh-Hans = 加载 - zh-Hant = 載入 + zh-Hans = 正在下载 + zh-Hant = 正在下載 [download_map_title] tags = android @@ -28590,7 +28590,7 @@ tr = Etkinleştirildiğinde, uygulama çalışırken her seferinde cihazınızın kilidini açmanıza gerek kalmaz. uk = Якщо ввімкнено, вам не потрібно щоразу розблоковувати пристрій під час роботи програми. zh-Hans = 启用后,即使设备已锁定,应用程序仍将在锁屏上运行。 - zh-Hant = 啟用後,即使設備已鎖定,應用程式仍會在鎖定螢幕上運作。 + zh-Hant = 啟用後,即使裝置已鎖定,應用程式仍會在鎖定螢幕上運作。 [whats_new_auto_update_title] comment = Autoupdate dialog on start @@ -28686,7 +28686,7 @@ uk = Оновлення мап дозволяє підтримувати інформацію про об'єкти в актуальному стані vi = Cập nhật bản đồ để cập nhật thông tin về các đối tượng trên đó zh-Hans = 更新地图可以让对象的信息保持最新状态 - zh-Hant = 更新地圖以讓物件資訊保持在最新狀態 + zh-Hant = 更新地圖以讓對象的資訊保持在最新狀態 [whats_new_auto_update_button_size] comment = Autoupdate dialog on start @@ -28924,8 +28924,8 @@ tr = Yol Kaydı uk = Маршрут vi = Dấu chân - zh-Hans = 追踪 - zh-Hant = 追踪 + zh-Hans = 轨迹 + zh-Hant = 軌跡 [splash_subtitle] comment = OpenStreetMap text on splash screen @@ -29137,8 +29137,8 @@ tr = Bağışlarınız ve desteğinizle dünyanın en iyi haritalar uygulamasını oluşturabiliriz! uk = Завдяки вашим пожертвам і підтримці ми зможемо створити найкращі карти світу! vi = Với sự đóng góp và hỗ trợ của bạn, chúng tôi có thể tạo ra những bản đồ tốt nhất trên Thế giới! - zh-Hans = 有了您的捐赠和支持,我们可以创建世界上最好的地图! - zh-Hant = 有了您的捐贈和支持,我們可以創建世界上最好的地圖! + zh-Hans = 有了您的捐赠和支持,我们可以创造世界上最好的地图! + zh-Hant = 有了您的捐贈和支持,我們可以創造世界上最好的地圖! [app_tip_02] comment = App tip #02 @@ -29659,7 +29659,7 @@ uk = Продовжуйте в телефоні vi = Tiếp tục trên điện thoại zh-Hans = 在手机上继续 - zh-Hant = 繼續打電話 + zh-Hant = 在手機上繼續 [car_continue_in_the_car] comment = Displayed on the Android Auto or CarPlay screen. Button to display maps on the car screen instead of a phone. Must be no more than 18 symbols! @@ -29704,7 +29704,7 @@ uk = На екран автомобіля vi = Đến màn hình ô tô zh-Hans = 转到汽车屏幕 - zh-Hant = 到車用螢幕 + zh-Hant = 轉到汽車屏幕 [aa_location_permissions_request] comment = Ask user to grant location permissions @@ -29837,7 +29837,7 @@ uk = Підключено до автомобіля vi = Đã kết nối với ô tô zh-Hans = 与汽车连接 - zh-Hant = 連接到汽車 + zh-Hant = 與汽車連接 [button_layer_outdoor] comment = Outdoors/hiking map style (activity) name in the Styles and Layers dialog @@ -29883,7 +29883,7 @@ uk = Активний відпочинок vi = Đi bộ đường dài zh-Hans = 徒步旅行 - zh-Hant = 遠足 + zh-Hant = 徒步旅行 [browser_not_available] comment = Text displayed when a webview or a browser are disabled, and external links can't be opened. @@ -30017,8 +30017,8 @@ tr = Tüm Yer İmlerini ve Rotaları Dışa Aktar uk = Експортувати всі мітки та маршрути vi = Xuất tất cả Dấu trang và Bản nhạc - zh-Hans = 导出所有书签和曲目 - zh-Hant = 匯出所有書籤和曲目 + zh-Hans = 导出所有书签和轨迹 + zh-Hant = 匯出所有書籤和軌跡 [change_color] comment = Text for the editing the Track's color button. @@ -30063,8 +30063,8 @@ tr = Renk değiştir uk = Змінити колір vi = Thay đổi màu sắc - zh-Hans = 改变颜色 - zh-Hant = 換顏色 + zh-Hans = 更改颜色 + zh-Hant = 更改顏色 [pref_tts_open_system_settings] comment = button in (app) TTS settings, to open the system TTS settings. @@ -30156,7 +30156,7 @@ uk = Налаштування синтезу мовлення не знайдено, ви впевнені, що ваш пристрій його підтримує? vi = Không tìm thấy cài đặt Tổng hợp giọng nói, bạn có chắc thiết bị của mình hỗ trợ nó không? zh-Hans = 未找到语音合成设置,您确定您的设备支持该设置吗? - zh-Hant = 未找到語音合成設置,您確定您的設備支援它嗎? + zh-Hant = 未找到語音合成設定,您確定您的裝置支援該設定嗎? [map] comment = Main screen title "Map" displayed in the navigation back button's menu. @@ -30245,8 +30245,8 @@ tr = Arabaya servis uk = З віконцем для водіїв vi = Lái xe qua - zh-Hans = 驾车通过 - zh-Hant = 免下車服務 + zh-Hans = 面下车通道 + zh-Hant = 免下車通道 [clear_the_search] tags = android @@ -30379,7 +30379,7 @@ tr = Uzaklaştır uk = Зменшити vi = Thu nhỏ - zh-Hans = 放大 + zh-Hans = 缩小 zh-Hant = 縮小 [website_menu] @@ -30517,8 +30517,8 @@ tr = Geliştiricilere bir hata raporu göndermek ister misiniz?\nOrganic Maps otomatik olarak herhangi bir hata bilgisi toplamadığı için kullanıcılarımıza güveniyoruz. Organic Maps'i desteklediğiniz için şimdiden teşekkür ederiz! uk = Бажаєте надіслати розробникам звіт про помилку?\nМи покладаємося на наших користувачів, оскільки Organic Maps не збирає інформацію про помилки автоматично. Заздалегідь дякуємо за підтримку Organic Maps! vi = Bạn có muốn gửi báo cáo lỗi cho nhà phát triển không?\nChúng tôi dựa vào người dùng của mình vì Bản đồ không phải trả tiền không tự động thu thập bất kỳ thông tin lỗi nào. Cảm ơn bạn trước vì đã ủng hộ Organic Maps! - zh-Hans = 您想向开发人员发送错误报告吗?\n由于有机地图不会自动收集任何错误信息,因此我们只能依靠我们的用户。感谢您对有机地图的支持! - zh-Hant = 您想向開發人員發送錯誤報告嗎?\n我們依賴我們的用戶,因為有機地圖不會自動收集任何錯誤訊息。預先感謝您對有機地圖的支持! + zh-Hans = 您想向开发人员发送错误报告吗?\n由于 Organic Maps 不会自动收集任何错误信息,因此我们只能依靠我们的用户。感谢您对 Organic Maps 的支持! + zh-Hant = 您想向開發人員發送錯誤報告嗎?\n由於 Organic Maps 不會自動收集任何錯誤資訊,因此我們只能依靠用戶的協助。感謝您對 Organic Maps 的支持! [enable_icloud_synchronization_title] comment = Title for the "Enable iCloud Syncronization" alert. @@ -30610,8 +30610,8 @@ tr = iCloud senkronizasyonu geliştirme aşamasında olan deneysel bir özelliktir. Tüm yer imlerinizin ve kayıtlı rotalarınızın yedeğini aldığınızdan emin olun. uk = Синхронізація з iCloud - це експериментальна функція, яка перебуває на стадії розробки. Переконайтеся, що ви зробили резервну копію всіх ваших мiток і треків. vi = Đồng bộ hóa iCloud là một tính năng thử nghiệm đang được phát triển. Đảm bảo rằng bạn đã tạo bản sao lưu tất cả dấu trang và bản nhạc của mình. - zh-Hans = iCloud 同步是一项正在开发的实验性功能。请确保备份了所有书签和曲目。 - zh-Hant = iCloud 同步是一項正在開發中的實驗性功能。確保您已備份所有書籤和曲目。 + zh-Hans = iCloud 同步是一项正在开发的实验性功能。请确保备份了所有书签和轨迹。 + zh-Hant = iCloud 同步是一項正在開發中的實驗性功能。確保您已備份所有書籤和軌跡。 [icloud_disabled_title] comment = Title for the "iCloud is Disabled" alert. @@ -30701,7 +30701,7 @@ tr = Bu özelliği kullanmak için lütfen cihazınızın ayarlarında iCloud'u etkinleştirin. uk = Щоб скористатися цією функцією, увімкніть iCloud у налаштуваннях вашого пристрою. vi = Vui lòng bật iCloud trong cài đặt thiết bị của bạn để sử dụng tính năng này. - zh-Hans = 请在设备设置中启用 iCloud,以使用此功能。 + zh-Hans = 请在您的设备设置中启用 iCloud,以使用此功能。 zh-Hant = 請在您的裝置設定中啟用 iCloud 以使用此功能。 [enable] @@ -30747,7 +30747,7 @@ uk = Увімкнути vi = Cho phép zh-Hans = 启用 - zh-Hant = 使能夠 + zh-Hant = 啟用 [backup] comment = Title for the "Enable iCloud Syncronization" alert's "Backup" action button. @@ -30885,8 +30885,8 @@ tr = Hata oluştu: Bağlantı hatası nedeniyle senkronizasyon başarısız oldu uk = Помилка: Не вдалося синхронізувати через помилку з'єднання vi = Lỗi: Không đồng bộ được do lỗi kết nối - zh-Hans = 错误:由于连接错误,同步失败 - zh-Hant = 錯誤:由於連線錯誤而無法同步 + zh-Hans = 错误:由于连接错误,导致同步失败 + zh-Hant = 錯誤:由於連線錯誤,導致無法同步 [icloud_synchronization_error_quota_exceeded] comment = iCloud error message: Failed to synchronize due to iCloud quota exceeded @@ -30931,8 +30931,8 @@ tr = Hata: iCloud depolama alanı dolu olduğu için senkronize edilemedi uk = Помилка: Не вдалося синхронізувати через перевищення квоти iCloud vi = Lỗi: Không thể đồng bộ hóa do vượt quá hạn ngạch iCloud - zh-Hans = 错误:由于超过 iCloud 配额,同步失败 - zh-Hant = 錯誤:由於超出 iCloud 配額而無法同步 + zh-Hans = 错误:由于超过 iCloud 配额,导致同步失败 + zh-Hant = 錯誤:由於超出 iCloud 配額,導致同步失敗 [icloud_synchronization_error_cloud_is_unavailable] comment = iCloud error message: iCloud is not available @@ -31246,5 +31246,5 @@ tr = En doğru navigasyon için, telefonun pil ayarlarında güç tasarrufu modunu devre dışı bırakmanızı öneririz. uk = Для найбільш точної навігації ми рекомендуємо вимкнути режим енергозбереження в налаштуваннях батареї телефону. vi = Để điều hướng chính xác nhất, chúng tôi khuyên bạn nên tắt chế độ tiết kiệm năng lượng trong cài đặt pin của điện thoại. - zh-Hans = 为了获得最准确的导航,我们建议在手机电池设置中禁用省电模式。 + zh-Hans = 为了获得最准确的导航,我们建议在手机电池设置中停用省电模式。 zh-Hant = 為了獲得最準確的導航,我們建議在手機電池設定中停用省電模式。 -- 2.45.3 From e2ca7028163c79ea0110d4414c89a08789148cdc Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Sun, 11 Aug 2024 16:39:44 +0200 Subject: [PATCH 33/38] [strings] Regenerated Signed-off-by: Alexander Borsuk --- .../src/main/res/values-zh-rTW/strings.xml | 332 ++++++++-------- .../app/src/main/res/values-zh/strings.xml | 306 +++++++-------- .../zh-Hans.lproj/Localizable.strings | 342 ++++++++--------- .../zh-Hans.lproj/Localizable.stringsdict | 4 +- .../zh-Hant.lproj/Localizable.strings | 358 +++++++++--------- .../zh-Hant.lproj/Localizable.stringsdict | 4 +- 6 files changed, 673 insertions(+), 673 deletions(-) diff --git a/android/app/src/main/res/values-zh-rTW/strings.xml b/android/app/src/main/res/values-zh-rTW/strings.xml index c138fe994f..ba8a8c6b4c 100644 --- a/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/android/app/src/main/res/values-zh-rTW/strings.xml @@ -12,9 +12,9 @@ 刪除 下載地圖 - 下載失敗,輕觸以再試一次 + 下載失敗,點擊以再試一次 - 下載中… + 正在下載… 公里 @@ -25,13 +25,13 @@ 我的位置 - 稍後 + 以後再說 搜尋 搜尋地圖 - 您目前裝置所有的定位服務或相關應用程式是處於停用的狀態,請從系統設定中選擇啟用。 + 您當前已禁用此裝置或應用程式的所有位置服務,請在設定中啟用。 在地圖上顯示 @@ -42,39 +42,39 @@ 對每個人都免費,用愛製成 - •沒有廣告,不會跟踪您,更不會收集您的數據 + • 沒有廣告,不會跟踪您,更不會收集您的數據 - • 無電池消耗,離線工作 + • 無需耗費太多電量,可離線工作 - • 快速、簡約、由社區開發 + • 快速且簡約,由社區開發 - 由愛好者和志願者創建的開源應用程序。 + 由愛好者和志願者開發的開源應用程式。 位置設定 關閉 - 需要 OpenGL 硬體加速功能的支援。但很不幸的,您的裝置並不支援此功能! + 該應用程式需要硬體加速的 OpenGL。很遺憾,您的裝置不受支持。 下載 請拔除 USB 線或插入 SD 卡以使用 Organic Maps - 如要繼續使用,請先釋放一些 SD 卡/ USB 儲存空間 - 在您開始之前,先讓我們下載世界地圖到您的裝置中以便瀏覽。\n這需要資料的 %s。 - 跳到地圖 - 正在下載 %s。您現在 可以繼續使用地圖了 - 下載 %s? - 更新 %s? + 請先釋放一些 SD 卡 / USB 儲存空間以使用 Organic Maps。 + 在您開始使用此應用程式之前,請下載全球地圖到您的裝置。\n它將使用 %s 的儲存空間。 + 前往地圖 + 正在下載%s。您現在可以\n繼續查看地圖。 + 下載%s的地圖嗎? + 更新%s的地圖嗎? 暫停 繼續 - %s 下載失敗 + %s的地圖下載失敗 - 新增收藏夾 + 新增新的書籤列表 書籤顏色 - 收藏夾名稱 + 書籤列表名稱 書籤 @@ -92,9 +92,9 @@ 將地圖儲存至 - 請選擇下載地圖後要放的位置 + 選擇下載地圖的資料夾。 - 地圖 + 已下載的地圖 內部私人儲存 @@ -110,7 +110,7 @@ 移動地圖檔案時出錯 - 這可能需要幾分鐘\n請稍候… + 這可能需要幾分鐘的時間\n請稍候… 測量單位 @@ -120,9 +120,9 @@ 在哪兒吃 - 食物 + 食品 - 運輸 + 交通 加油站 @@ -130,7 +130,7 @@ 購物 - 二手 + 二手貨 旅館 @@ -138,7 +138,7 @@ 娛樂 - 自動櫃員機 + 自動提款機 夜生活 @@ -162,38 +162,38 @@ - 房車用 + 露營車設施 - 描述說明 + 註釋 - 已分享 Organic Maps 書籤 + 已與您分享 Organic Maps 書籤 您好!\n\n附件是我的書籤,請在 Organic Maps 中打開。如果您沒有安裝 Organic Maps,可以在這裡下載: https://omaps.app/get?kmz\n\n祝您使用 Organic Maps 旅行愉快! 正在載入書籤… - 書籤上傳成功! 您可以在地圖上或是書籤管理畫面中找到書籤。 + 書籤載入成功! 您可以在地圖或書籤管理畫面中找到它們。 - 書籤上傳失敗。 檔案可能有毀損或是不完全。 + 書籤載入失敗,檔案可能已損壞或不完整。 應用程式無法識別該文件類型:\n%1$s - 無法開啟文件 %1$s\n\n%2$s + 無法打開檔案 %1$s\n\n%2$s 編輯 - 您的位置尚未定位完成 + 您的位置尚未確定 很抱歉,地圖儲存設定目前已停用。 - 地圖下載中。 + 地圖下載進行中。 - 嘿,在 Organic Maps 查看我的目前位置吧! %1$s 或%2$s 沒安裝離線地圖?在此下載: https://omaps.app/get + 嘿,在 Organic Maps 查看我的目前的位置吧!請打開 %1$s 或 %2$s 鏈接,還沒安裝離線地圖?在此下載: https://omaps.app/get - 嘿,看看我在 Organic Maps 地圖上的圖釘! + 嘿,看看我在 Organic Maps 上標記的圖釘吧! - 嗨,到 Organic Maps 地圖查看我的目前位置! + 嗨,到 Organic Maps 查看我目前的位置! 嗨,\n\n我現在在這:%1$s。點擊此連結 %2$s 或此連結 %3$s 來查看在地圖上的位置。\n\n謝謝。 @@ -207,7 +207,7 @@ OpenStreetMap 數據:%s - 確定要繼續嗎? + 您確定要繼續嗎? 軌跡 @@ -233,7 +233,7 @@ 3D 建築 - 3D 建築在省電模式下關閉 + 3D 建築在省電模式下處於關閉狀態 語音指示 @@ -243,18 +243,18 @@ 語音語言 - 測試語音指令(TTS、文本轉語音 + 測試語音指令(TTS,文本轉語音系統) - 如果您現在聽不到聲音,請檢查音量或系統文本轉語音設置。 + 如果您現在聽不到聲音,請檢查音量或系統文本轉語音系統的設定。 - 無法使用 + 不可用 自動縮放 關閉 - 1小時 - 2小時 - 6小時 - 12小時 - 1天 + 1 小時 + 2 小時 + 6 小時 + 12 小時 + 1 天 距离 在地圖上查看 @@ -268,7 +268,7 @@ X (推特) - 意見反應 + 反饋 為我們評分 @@ -278,34 +278,34 @@ 捐助我們 - 支持項目 + 支持本項目 版權 報告問題 - 通過以八字形移動手機來校準指南針來改善箭頭方向 + 通過以 8 字形移動手機來改善箭頭方向,以校準羅盤。 - 以 8 字形移動手機以校準指南針並固定地圖上的箭頭方向 + 通過以 8 字形移動手機以校準羅盤,並在地圖上固定箭頭方向。 - 再次長按地圖即可看到介面 + 再次長按地圖即可查看介面 更新全部 - 全部取消 + 取消全部 已下載 - 已加入下載隊列 + 已加入到下載隊列 在我附近 地圖 下載全部 正在下載: - 如欲刪除地圖,請停止導航。 + 要刪除地圖,請停止導航。 - 路程只能完全處在同一地圖裡時才能被建立。 + 路線只能完全處在同一地圖裡時才能被規劃。 下載地圖 @@ -319,9 +319,9 @@ 使用藍牙、WiFi 或行動網路快速確定您的大致位置 - 下載沿線地圖 + 下載路線上的所有地圖 - 建立路線需要下載並更新好所有從您的位置到目的地的地圖。 + 規劃路線需要下載並更新好所有從您的位置到目的地的地圖。 空間不足 @@ -340,7 +340,7 @@ 紫色 - 橘色 + 橙色 棕色 @@ -356,7 +356,7 @@ 青檸 - 深橘色 + 深橙色 灰色 @@ -364,48 +364,48 @@ 依照路線行進時,請牢記: - — 路況、交通規則及號誌優先於導航意見; - — 地圖可能不準確,建議的路線不盡然是最佳選擇; - — 建議的路線僅供推薦參考; - — 小心對待國界區的路線:我們應用程式建立的路線有時會在未經授權的地方跨越國界; - 請保持警戒,一路平安! - 查看 GPS 訊號 - 無法產生路線。 無法定位目前 GPS 座標。 - 請確認您的 GPS 訊號。啟用無線網路將提升地理位置定位準確度。 + — 路況、交通法規和路標始終優先於導航建議; + — 地圖可能不準確,建議的路線可能並非總是前往目的地的最佳路線; + — 建議的路線僅作為推薦路線供您參考; + — 小心對待國界區的路線:我們的應用程式建立的路線有時會在未經授權的地方跨越國界; + 上路時請當心,祝您一路平安! + 檢查 GPS 訊號 + 無法規劃路線。無法識別當前 GPS 座標。 + 請檢查您的 GPS 訊號。啟用無線網路將改善定位精度。 啟用定位服務 - 無法定位目前 GPS 座標。請啟用定位服務以產生路線。 - 路線未找到 - 無法產生路線。 - 請變更起點或最終目的地。 - 變更起點 - 此路線尚未產生。無法定位起點。 + 無法定位目前 GPS 座標。請啟用定位服務以規劃路線。 + 無法定位路線 + 無法規劃路線。 + 請調整您的起點或目的地。 + 調整出發點 + 路線未規劃。無法定位起點。 請選擇更接近道路的起點。 - 變更目的地 - 未產生路線。無法定位目的地。 - 請選擇更接近道路的目的地。 - 找不到中途休息站。 - 請調整您的中途休息站。 + 調整目的地 + 路線未規劃。無法定位目的地。 + 請選擇更接近道路的目的地位置。 + 無法定位途徑點。 + 請調整您的途徑點。 系統錯誤 - 由於此錯誤,尚未建立路線。 + 由於應用程式出錯,因此無法規劃路線。 請再試一次 - 現在不要 - 您是否要下載地圖,產生跨越邊界的更好路線? - 若要產生跨越邊界的更理想路線,您需要下載地圖。 + 以後再說 + 您是否要下載地圖,以規劃跨越邊界的更佳路線? + 下載地圖,以規劃一條跨越邊界的更佳路線。 - 要開始搜索和建立路線,請下載地圖,那您就不再需要網絡連接了。 + 要開始搜索和規劃路線,請下載地圖,然後您就不再需要網絡連接了。 選擇地圖 顯示 隱藏 類別 - 記錄 - 很抱歉,沒有找到任何地點。 + 歷史 + 很抱歉,沒有搜到任何地點。 - 下載您要搜尋的區域或嘗試新增附近的城鎮/村莊名稱。 + 下載您要搜尋的區域的地圖,或嘗試輸入附近的城鎮或村莊名稱。 搜尋歷史紀錄 - 檢視最近的搜尋。 + 查看您最近的搜尋記錄。 清除搜尋記錄 維基百科 @@ -427,8 +427,8 @@ 刪除排程 全天 (24 小時) - 開始營業時間 - 結束營業時間 + 正在營業 + 已歇業 新增休息時間 營業時間 高級模式 @@ -447,12 +447,12 @@ 自動下載 每天 - 全天候 + 24/7 全天候營業 今天不營業 不營業 今天 將於 %s 後開業 - 將於 %s 後停業 + 將於 %s 後歇業 已停止營業 編輯營業時間 沒有 OpenStreetMap 帳號嗎? @@ -487,45 +487,45 @@ 樓層:%s 所有對地圖的修改都將與地圖一起被刪除。 更新地圖 - 為了建立路線,您需要更新全部地圖並重新規劃路線。 - 尋找地圖 - 請檢查您的設定並確保您的設備已連接至網路。 - 無足夠的空間 + 為了規劃路線,您需要更新全部地圖並重新規劃路線。 + 搜尋地圖 + 請檢查您的設定並確保您的裝置已連接至網路。 + 沒有足夠的空間 請刪除不必要的資料 - 登入錯誤。 + 無法登入。 已驗證的變更 拖動地圖以選擇此物件的正確位置。 編輯中 新增中 該地點的名稱 - 因為它是用當地語言寫的 + 當地語言寫道 類別 問題的詳細描述 不同的問題 - 物件無法設置在這裡 + 地點無法放置在這裡 - 截至 %s 的社群創建的 OpenStreetMap 資料。請訪問 OpenStreetMap.org 以了解更多有關如何編輯和更新地圖的更多信息。 + 截至 %s 的社群創建的 OpenStreetMap 資料。請訪問 OpenStreetMap.org 以了解有關如何編輯和更新地圖的更多信息。 登入,讓其他使用者能看到您所作出的修改。 - %1$d個/共%2$d個 + %1$d / %2$d 用手機網路連線下載嗎? 如果您使用行動數據或漫遊來進行下載,將可能導致額外的費用。 輸入正確的門牌號碼 - 樓層數(最大 %d) + 樓層數量(最多 %d 層) - 編輯最多 %d 層的建築 + 最多可編輯 %d 層的建築 郵遞區號 輸入正確的郵遞區號 - 未知的位置 + 未知地點 給 OSM 社區發送標記 詳細註釋 您建議的變更將傳送至 OpenStreetMap 社群。說明無法在 Organic Maps 中編輯的詳細資料。 關於 OpenStreetMap 的更多資訊 - 營運者 + 經營者 找不到合適的類別? - Organic Maps 只允許添加簡單的點類別,即無法添加城鎮、道路、湖泊、建築輪廓等類別。 請直接向OpenStreetMap.org新增此類類別。 請查看我們的指南,以了解詳細的步驟說明。 + Organic Maps 只允許添加簡單的點類別,即無法添加城鎮、道路、湖泊、建築輪廓等類別。請直接向 OpenStreetMap.org 新增此類類別。請查看我們的指南,以了解詳細的步驟說明。 您尚未下載任何地圖 下載地圖來尋找位置和離線瀏覽。 @@ -545,22 +545,22 @@ 照片、評論、預訂 - 透過此連結進行的每次預訂收到的推薦獎金將用於開發 Organic Maps。 + 每次通過此鏈接預定所獲得的推薦獎金將用於 Organic Maps 的開發。 Kayak 上的詳細資訊 編輯書籤 - 註解… + 備註… 重設所有本機變更? 重設 - 移除已新增的位置? + 移除已新增的地點? 移除 該地點不存在 請註明刪除該地點的原因 輸入正確的電話號碼 - 輸入有效網址 - 輸入有效電子郵件 + 請輸入有效的網址 + 請輸入有效的電子郵件 請輸入有效的 Facebook 網頁地址、帳號或頁面名稱 請輸入有效的 Instagram 用戶名或網頁地址 請輸入有效的 Twitter 用戶名或網頁地址 @@ -568,7 +568,7 @@ 請輸入有效的 LINE ID 或網頁地址 將地點新增至 OpenStreetMap - 您想要發給所有用戶嗎? + 您想要發送給所有使用者嗎? 確保您沒有輸入任何個人資料。 OpenStreetMap 編輯人員將檢查更改並在有任何問題時與您聯繫。 @@ -577,70 +577,70 @@ 接受 拒絕 - 使用手機網路顯示詳細資訊? + 使用手機網路顯示更多詳細資訊嗎? 一律使用 僅限今天 今天不使用 手機網路 - 需有手機網路才能顯示相片、價格與評論等詳細資訊和地點。 + 要顯示地點的詳細資訊(例如照片、價格和評價),需要使用手機網絡。 絕不使用 一律詢問 - 若要顯示交通資料,必須更新地圖。 + 諾要顯示交通資料,必須更新地圖。 增加地圖上的字體大小 請更新 Organic Maps - 無法使用交通資訊 - 啟用記錄 + 交通資訊不可用 + 啟用日誌記錄 一般反應 - 我們使用系統 TTS 提供語音指示。許多 Android 裝置使用 Google TTS,您可從 Google Play 下載或更新 (https://play.google.com/store/apps/details?id=com.google.android.tts) - 對於某些語言,您將需要從 App 商店 (Google Play 商店, Galaxy Store) 安裝其他語音合成器或額外的語言套件。\n開啟您裝置的設定 → 語言與輸入 → 語音 → 文字轉換語音輸出。\n在這裡,您可以管理語音合成器的設定(例如,下載語言套件以供離線使用),並選取其他文字轉換語音引擎。 - 如需更多資訊,請參閱本指南。 - 音譯為拉丁文 + 我們的語音導航使用“文本轉語音”系統。許多 Android 裝置使用 Google 的文本轉語音系統,您可以從 Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts) 下載或更新這一功能。 + 對於某些語言,您需要從應用商店(例如 Google Play Store、Galaxy Store)中安裝其他語音合成器或語言包。\n打開您的裝置的設定 → 語言和輸入法 → 語音 → 文字轉語音 (TTS) 輸出。\n您可以在這裡管理語音合成的設定(例如,下載語言包供離線使用)和選擇其他文字轉語音引擎。 + 如需瞭解更多資訊,請參閱此指南。 + 拉丁字母音譯 瞭解更多資訊 退出 - 請使用搜尋或點擊地圖以新增路線起點 + 請搜尋地點或點擊地圖以新增路線起點 - 請使用搜尋或點擊地圖以新增目的地 + 請搜尋地點或點擊地圖以新增目的地 移除 新增經停點 - 請登入 OpenStreetMap 自動上傳您所有的地圖編輯內容。了解更多此處 - 儲存空間存取問題 - 外部儲存空間不可用,很可能是因為 SD 卡已移除、毀損,或檔案系統處於唯讀狀態。請進行檢查,然後以 support\@organicmaps.app 方式聯繫我們 + 請登入 OpenStreetMap 以自動上傳您的所有地圖編輯。諾要了解更多資訊請點擊這裡 + 儲存空間訪問問題 + 外部儲存空間不可用,很可能是因為 SD 卡已移除、毀損,或檔案系統處於唯讀狀態。請進行檢查,然後通過 support\@organicmaps.app 聯絡我們。 模擬不良儲存空間 入口 請輸入正確的名稱 - 清單 + 列表 全部隱藏 全部顯示 %d 個書籤 - 創建新列表 + 創建新的列表 導入書籤和軌跡 - 由於 app 出錯而無法分享 - 分享錯誤 - 無法分享空的列表 + 由於應用程式出錯,導致無法分享 + 無法分享 + 無法分享空列表 名字不能為空 請輸入列表名稱 新的列表 - 這個名字已經被使用了 + 這個名稱已經被使用了 請選擇其他名稱 請稍候… 電話號碼 OpenStreetMap 資料 - 找到%d個文件。 轉換後你會看到它。 + 找到 %d 個文件,轉換後您才能看到它們。 恢復 - %d 軌跡 + %d 個軌跡 隱私 @@ -650,15 +650,15 @@ 捷運 地圖樣式和圖層 捷運圖層不可用 - 列表為空 - 要增加新標籤,請點一下對象卡片中的星型圖標 + 該列表為空 + 要增加新書籤,請點擊對象卡片中的星型圖標 …更多 - 出口KMZ - 導出GPX + 導出為 KMZ + 導出為 GPX 刪除列表 - 開放空間 - 私人空間 - 增加說明(文字或html) + 允許公眾訪問 + 不允許訪問的私人空間 + 增加說明(文字或 html) 私人 限速拍照 地點說明 @@ -673,24 +673,24 @@ 省電模式 如果開啟省電模式,應用程序將根據手機的當前電量關閉耗電功能 從不 - 自動 + 當電量低時 最大程度省電 - 暫時啟用此選項,以便使用「回報問題」功能在幫助對話框中記錄並手動發送詳細的診斷日誌給我們。日誌可能包含位置資訊。 + 暫時啟用此選項,以便使用“報告問題”功能在幫助對話框中記錄並手動發送詳細的診斷日誌給我們。日誌可能包含位置資訊。 線上編輯 繞行設定 避開收費公路 - 避開未鋪設道路 + 避開未鋪砌道路 避開渡輪 避開高速公路 無法規劃路線 - 很遺憾,我們無法使用所選選項規劃路線。請更改設定,然後重試 - 設定繞行路徑 + 很遺憾,我們無法使用所選的繞行設定規劃路線。請更改設定,然後重試 + 選擇要避開的道路 繞行設定已開啟 收費公路 - 土路 + 未鋪砌道路 渡輪 @@ -702,14 +702,14 @@ 容量:%s - 您已經到達了! - + 您已到達目的地! + 好的 - 分類…… + 排序… - 分類書籤 + 分類排序 - 採用預設值 + 使用默認值 按類型 @@ -722,17 +722,17 @@ 一個月前 一個多月前 一年多以前 - 附近 + 在我附近 其他 食物 - 觀光景點 + 旅遊景點 博物館 公園 游泳 山峰 - 動物園 + 動物 旅館 建築物 貨幣 @@ -741,7 +741,7 @@ 加油站 醫療 在列表中搜尋 - 宗教聖地 + 宗教場所 選擇列表 本區域的地鐵導航目前不可用 未找到捷運路線圖 @@ -753,11 +753,11 @@ 下坡 最小高度 最大高度 - 難易度 + 難度 距離: 時間: 放大地圖以查看等高線 - 載入 + 正在下載 下載世界地圖 無法在內部儲存或 SD 卡上建立資料夾和移動檔案 @@ -773,7 +773,7 @@ 在鎖定螢幕上顯示 - 啟用後,即使設備已鎖定,應用程式仍會在鎖定螢幕上運作。 + 啟用後,即使裝置已鎖定,應用程式仍會在鎖定螢幕上運作。 地圖數據來自 OpenStreetMap @@ -783,7 +783,7 @@ 感謝您使用我們社區構建的地圖! - 有了您的捐贈和支持,我們可以創建世界上最好的地圖! + 有了您的捐贈和支持,我們可以創造世界上最好的地圖! 您喜歡我們的應用程序嗎?請捐款以支持發展!還不喜歡嗎?請告訴我們,我們會修復您提到的問題! @@ -807,27 +807,27 @@ 您已連接到 Android Auto - 繼續打電話 + 在手機上繼續 - 到車用螢幕 + 轉到汽車屏幕 此應用程式需要訪問您的位置以進行導航。 授予權限 - 連接到汽車 + 與汽車連接 - 遠足 + 徒步旅行 網路瀏覽器不可用 音量 - 匯出所有書籤和曲目 + 匯出所有書籤和軌跡 文本轉語音系統設定 - 未找到語音合成設置,您確定您的設備支援它嗎? - 免下車服務 + 未找到語音合成設定,您確定您的裝置支援該設定嗎? + 免下車通道 清除搜尋 放大 diff --git a/android/app/src/main/res/values-zh/strings.xml b/android/app/src/main/res/values-zh/strings.xml index 79b0bb8bbe..55b965fd05 100644 --- a/android/app/src/main/res/values-zh/strings.xml +++ b/android/app/src/main/res/values-zh/strings.xml @@ -12,9 +12,9 @@ 删除 下载地图 - 下载失败,重新轻触再试一次 + 下载失败,点击以再试一次 - 下载… + 正在下载… 公里 @@ -25,62 +25,62 @@ 我的位置 - 稍后 + 以后再说 搜索 搜索地图 - 您目前有此设备的所有位置服务或应用已禁用。请在设置中启用它们。 + 您当前已禁用此设备或应用程序的所有位置服务,请在设置中启用。 在地图上显示 下载失败 - 重试 + 再试一次 关于 Organic Maps 对每个人都免费,用爱制成 - •没有广告,不会跟踪您,更不会收集您的数据 + • 没有广告,不会跟踪您,更不会收集您的数据 - • 无需耗费电池,可离线工作 + • 无需耗费太多电量,可离线工作 - • 快速、简约、由社区开发 + • 快速且简约,由社区开发 - 由爱好者和志愿者创建的开源应用程序。 + 由爱好者和志愿者开发的开源应用程序。 位置设置 关闭 - 硬件加速的 OpenGL 是必需的。遗憾的是您的设备不支持此功能。 + 该应用程序需要硬件加速的 OpenGL。很遗憾,您的设备不受支持。 下载 - 请断开 USB 线或插入存储卡以使用 Organic Maps + 请拔除 USB 线或插入 SD 卡以使用 Organic Maps - 请在存储卡/ USB 储存设备上释放一些空间以 使用此应用 - 在您开始前请让我们下载通用世界地图至您的设备中。\n它需要%s的 数据。 + 请先释放一些 SD 卡 / USB 存储空间以使用 Organic Maps。 + 在您开始使用此应用程序之前,请下载全球地图到您的设备。\n它将使用 %s 的存储空间。 前往地图 - 下载 %s。您现在可\n前往地图。 - 下载 %s? - 更新 %s? + 正在下载%s。您现在可以\n继续查看地图。 + 下载%s的地图吗? + 更新%s的地图吗? 暂停 继续 - %s下载失败 + %s的地图下载失败 - 添加新的集合 + 添加新的书签列表 书签颜色 - 书签集名称 + 书签列表名称 书签 书签和轨迹 - 我的位置 + 我的地点 名字 @@ -92,9 +92,9 @@ 将地图保存到 - 选取地图应该下载的位置 + 选择下载地图的文件夹。 - 地图 + 已下载的地图 内部私人存储 @@ -124,7 +124,7 @@ 交通 - 汽油 + 加油站 停车场 @@ -132,7 +132,7 @@ 二手货 - 旅店 + 酒店 旅游景点 @@ -152,7 +152,7 @@ 厕所 - 邮政 + 邮局 警察局 @@ -162,46 +162,46 @@ - 房车用 + 房车设施 注释 - Organic Maps 书签已与您共享 + 已与您分享 Organic Maps 书签 您好!\n\n附件是我的书签,请在 Organic Maps 中打开。如果您没有安装 Organic Maps,可以在这里下载: https://omaps.app/get?kmz\n\n祝您使用 Organic Maps 旅行愉快! - 加载书签 + 正在载入书签… - 书签加载成功!您可以在地图或书签管理窗口中找到它们。 + 书签载入成功!您可以在地图或书签管理页面中找到它们。 - 书签上传失败。该文件可能已损坏或有缺陷。 + 书签载入失败,文件可能已损坏或不完整。 - 应用程序无法识别文件类型:\n%1$s + 应用程序无法识别该文件类型:\n%1$s - 打开文件失败 %1$s\n\n%2$s + 无法打开文件 %1$s\n\n%2$s 编辑 您的位置尚未确定 - 抱歉,地图存储设置目前被禁用 + 很抱歉,地图存储设置目前已停用。 地图下载进行中。 - 嘿,在 Organic Maps 上查看我目前的位置吧!%1$s 或%2$s 未安装离线地图?在此下载: https://omaps.app/get + 嘿,在 Organic Maps 上查看我目前的位置吧!请打开 %1$s 或 %2$s 链接,还没安装离线地图?在此下载: https://omaps.app/get - 嘿,在 Organic Maps 上查看我标注的图钉吧! + 嘿,看看我在 Organic Maps 上标记的图钉吧! - 嗨,到 Organic Maps 查看我的当前位置! + 嗨,到 Organic Maps 查看我当前的位置! 嗨,\n\n我现在在这:%1$s。点击此链接 %2$s 或此链接 %3$s 来查看在地图上的位置。\n\n谢谢。 分享 - 邮件 + 电子邮件 - 复制到剪贴板:%s + 已复制到剪贴板:%s 完成 @@ -212,7 +212,7 @@ 轨迹 长度 - 共享我的位置 + 分享我的位置 常规设置 @@ -233,7 +233,7 @@ 3D 建筑 - 3D 建筑在省电模式下关闭 + 3D 建筑在省电模式下处于关闭状态 语音指导 @@ -243,18 +243,18 @@ 语音语言 - 测试语音指令(TTS,Text-To-Speech) + 测试语音指令(TTS,文本转语音系统) - 如果现在听不到语音,请检查音量或系统文本到语音设置。 + 如果您现在听不到声音,请检查音量或系统文本到语音系统的设置。 - 无法使用 + 不可用 自动缩放 关闭 - 1小时 - 2小时 - 6小时 - 12小时 - 1天 + 1 小时 + 2 小时 + 6 小时 + 12 小时 + 1 天 距离 在地图上查看 @@ -278,21 +278,21 @@ 捐助我们 - 支持项目 + 支持本项目 版权 报告问题 - 通过以八字形运动移动手机来改善箭头方向,以校准罗盘。 + 通过以 8 字形移动手机来改善箭头方向,以校准罗盘。 - 以八字动作移动手机,校准罗盘,并在地图上固定箭头方向。 + 通过以 8 字形移动手机以校准罗盘,并在地图上固定箭头方向。 - 再次长按地图查看界面 + 再次长按地图即可查看界面 更新全部 - 全部取消 + 取消全部 已下载 @@ -305,7 +305,7 @@ 要删除地图,请停止导航。 - 路程只能完全处在同一地图里时才能被创建。 + 路线只能完全处在同一地图里时才能被规划。 下载地图 @@ -319,9 +319,9 @@ 通过蓝牙、WiFi 或移动网络快速确定您的大致位置 - 下载沿线地图 + 下载路线上的所有地图 - 创建路线需要下载并更新好所有从您的位置到目的地的地图。 + 规划路线需要下载并更新好所有从您的位置到目的地的地图。 空间不足 @@ -340,7 +340,7 @@ 紫色 - 橘红色 + 橙色 棕色 @@ -356,7 +356,7 @@ 青柠 - 深橘色 + 深橙色 灰色 @@ -365,35 +365,35 @@ 按照路线行进时,请谨记: — 路况、交通法规和路标始终优先于导航建议; - — 地图可能不准确,建议的路线可能并非总是去往目的地的最佳路径; + — 地图可能不准确,建议的路线可能并非总是去往目的地的最佳路线; — 建议的路线仅作为推荐路线供您采纳; - — 小心对待国界区的路线:我们应用创造的路线有时会在未经授权的地方跨越国界; + — 小心对待国界区的路线:我们的应用程序生成的路线有时会在未经授权的地方跨越国界; 上路时请当心,祝您一路平安! 检查 GPS 信号 - 无法创建路线。当前 GPS 坐标无法识别。 - 请检查您的 GPS 信号。启用无线网络将改善您的定位精度。 + 无法规划路线。无法识别当前 GPS 坐标。 + 请检查您的 GPS 信号。启用无线网络将改善定位精度。 启用定位服务 - 无法定位当前 GPS 坐标。请启用定位服务以计算路线。 + 无法定位当前 GPS 坐标。请启用定位服务以规划路线。 无法定位路线 - 无法创建路线。 + 无法规划路线。 请调整您的起点或目的地。 调整出发点 - 路线未创建。无法定位起点。 + 路线未规划。无法定位起点。 请选择更靠近公路的起点。 调整目的地 - 路线未创建。无法定位目的地。 + 路线未规划。无法定位目的地。 请选择更靠近公路的目的地位置。 - 无法定位中间点。 - 请调整您的中间点。 + 无法定位途径点。 + 请调整您的途径点。 系统错误 - 由于应用程序错误,无法创建路线。 - 请重试 - 现在不用 - 您是否要下载地图并创建一条跨越多张地图的更佳路线? - 下载地图,创建一条跨越此地图边缘的更佳路线。 + 由于应用程序出错,因此无法规划路线。 + 请再试一次 + 以后再说 + 您是否要下载地图,以规划跨越边界的更佳路线? + 下载地图,以规划一条跨越边界的更佳路线。 - 要开始搜索和创建路线,请下载地图,那您就不再需要网络连接了。 + 要开始搜索和规划路线,请下载地图,然后您就不再需要网络连接了。 选择地图 显示 @@ -401,11 +401,11 @@ 隐藏 类别 历史 - 很抱歉,没有找到任何地点。 + 很抱歉,没有搜到任何地点。 - 下载要搜索的地区或尝试添加附近的城镇/村庄名称。 + 下载您要搜索的区域的地图,或尝试输入附近的城镇或村庄名称。 搜索历史记录 - 快速访问最近的搜索查询。 + 查看您最近的搜索记录。 清除搜索记录 维基百科 @@ -426,10 +426,10 @@ 添加计划 删除计划 - 全天(24小时) - 开始营业时间 - 结束营业时间 - 添加非营业时间 + 全天(24 小时) + 正在营业 + 已歇业 + 添加休息时间 营业时间 高级模式 简易模式 @@ -438,7 +438,7 @@ 纠正错误 位置 请详细描述此问题以便 OpenStreetMap 社区能够修复此错误。 - 或者在https://www.openstreetmap.org/上亲自修复此错误。 + 或者在 https://www.openstreetmap.org/ 上亲自修复此错误。 发送 问题 该地点不存在 @@ -447,15 +447,15 @@ 自动下载 每天 - 全天候 + 24/7 全天候营业 今天不营业 不营业 今天 将于 %s 后开业 - 将于 %s 后停业 + 将于 %s 后歇业 已停止营业 - 编辑工作时间 - 在OpenStreetMap上没有账户吗? + 编辑营业时间 + 没有 OpenStreetMap 账户吗? 注册 登录 @@ -480,19 +480,19 @@ 菜肴 选择菜肴 - 邮箱或用户名 + 电子邮件或用户名 新增电话号码 楼层 楼层:%s 所有对地图的修改都将与地图一起被删除。 更新地图 - 为了创建路线,您需要更新全部地图并重新规划路线。 - 找到地图 + 为了规划路线,您需要更新全部地图并重新规划路线。 + 搜索地图 请检查您的设置并确保您的设备已连接至网络。 - 无足够的空间 + 没有足够的空间 请删除不必要的数据 - 登录错误。 + 无法登录。 已验证的更改 拖动地图以选择此对象的正确位置。 编辑中 @@ -502,32 +502,32 @@ 当地语言写道 类别 问题的详细描述 - 一个不同的问题 - 对象无法设置在这里 + 不同的问题 + 地点不能放置在这里 - 截至 %s 的社区创建的 OpenStreetMap 数据。请访问 OpenStreetMap.org 以了解更多有关如何编辑和更新地图的信息。 + 截至 %s 的社区创建的 OpenStreetMap 数据。请访问 OpenStreetMap.org 以了解有关如何编辑和更新地图的信息。 登录,让其他用户能看到您所作出的修改。 - %1$d个/共%2$d个 + %1$d / %2$d 用手机网络连接下载吗? 如果您使用移动数据或漫游来进行下载,将可能导致额外的费用。 - 输入正确的房屋号 - 楼号 (最大 %d) + 输入正确的门牌号码 + 楼层数量 (最多 %d 层) 最多可编辑 %d 层的建筑 邮政编码 输入正确的邮政编码 - 未知位置 + 未知地点 给 OSM 社区发送标记 详细备注 您建议的更改将发送至 OpenStreetMap 社区。说明无法在 Organic Maps 编辑的详情。 关于 OpenStreetMap 的更多信息 - 运营者 + 经营者 找不到合适的类别? - Organic Maps 只允许添加简单的点类别,即无法添加城镇、道路、湖泊、建筑轮廓等类别。请直接向OpenStreetMap.org添加此类类别。请查看我们的指南,了解详细的步骤说明。 + Organic Maps 只允许添加简单的点类别,即无法添加城镇、道路、湖泊、建筑轮廓等类别。请直接向 OpenStreetMap.org 添加此类类别。请查看我们的指南,了解详细的步骤说明。 您尚未下载任何地图 - 下载地图来查找位置和离线浏览 + 下载地图来查找位置和离线浏览。 @@ -547,20 +547,20 @@ 每次通过此链接预订所获得的推荐奖金将用于 Organic Maps 的开发。 - Kayak 上的详细信息 + 客涯 (Kayak) 上的详细信息 编辑书签 备注… 重置所有本地更改? 重置 - 删除已添加的位置? + 删除已添加的地点? 删除 该地点不存在 请注明删除该地点的原因 输入正确的电话号码 - 输入有效网址 - 输入有效电子邮箱 + 请输入有效的网址 + 请输入有效的电子邮件 请输入有效的 Facebook 网页地址、账号或页面名称 请输入有效的 Instagram 用户名或网页地址 请输入有效的 Twitter 用户名或网页地址 @@ -568,7 +568,7 @@ 请输入有效的 LINE ID 或网页地址 将地点添加到 OpenStreetMap - 您想要发给所有用户吗? + 您想要发送给所有用户吗? 确保您没有输入任何个人数据。 OpenStreetMap 编辑人员将检查更改并在有任何问题时与您联系。 @@ -577,7 +577,7 @@ 接受 拒绝 - 使用移动网络显示详细信息? + 使用移动网络显示更多详细信息吗? 始终使用 仅在今天 今天不使用 @@ -586,31 +586,31 @@ 要显示地点的详细信息(例如照片、价格和评价),需要使用移动网络。 从不使用 总是询问 - 要显示交通数据,必须更新地图。 + 诺要显示交通数据,必须更新地图。 增大地图上的字体大小 请更新 Organic Maps 交通数据不可用 - 启用记录 + 启用日志记录 - 一般反馈 - 我们为语音指令使用“文字转语音”系统。许多 Android 设备使用 Google 文字转语音,您可以从 Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts) 下载或更新这一功能 - 对于某些语言,您需要从应用商店(Google Play Market、Galaxy Store)中安装其他语音合成器或语言包。\n打开您的设备的设置 → 语言和输入法 → 语音 → 文字转语音 (TTS) 输出。\n您可以在这里管理语音合成的设置(例如,下载语言包供离线使用)和选择其他文字转语音引擎。 + 常规反馈 + 我们的语音导航使用“文本转语音”系统。许多 Android 设备使用 Google 的文本转语音系统,您可以从 Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts) 下载或更新这一功能 + 对于某些语言,您需要从应用商店(例如 Google Play 商店、Galaxy Store)中安装其他语音合成器或语言包。\n打开您的设备的设置 → 语言和输入法 → 语音 → 文字转语音 (TTS) 输出。\n您可以在这里管理语音合成的设置(例如,下载语言包供离线使用)和选择其他文字转语音引擎。 如需了解更多信息,请查阅此指南。 - 直译成拉丁文 - 了解更多 + 拉丁字母音译 + 了解更多信息 退出 - 请使用搜索或点击地图以添加路线起点 + 请搜索地点或点击地图以添加路线起点 - 请使用搜索或点击地图以添加目的地 + 请搜索地点或点击地图以添加目的地 移除 添加经停点 - 请登录OpenStreetMap,自动上传您编辑的所有地图。了解更多信息请点击这里 + 请登录 OpenStreetMap 以自动上传您的所有地图编辑。诺要了解更多信息请点击这里 存储空间访问问题 - 外部存储空间不可用,可能是存储卡已移除、损坏,或者文件系统为只读。请检查,然后通过以下方式联系我们:support\@organicmaps.app + 外部存储空间不可用,很可能是因为 SD 卡已移除、损毁,或者文件系统为只读状态。请进行检查,然后通过 support\@organicmaps.app 联系我们。 模拟不良存储空间 入口 请输入正确的名称 @@ -624,23 +624,23 @@ 创建新的列表 导入书签和轨迹 - 由于应用程序出错而无法分享 - 分享错误 + 由于应用程序出错,导致无法分享 + 无法分享 无法分享空列表 名字不能为空 请输入列表名称 新的列表 - 这个名字已经被使用了 + 这个名称已经被使用了 请选择其他名称 请稍候… 电话号码 OpenStreetMap 资料 - 找到%d个文件。 转换后你会看到它。 + 找到 %d 个文件,转换后您才能看到它们。 恢复 - %d 跟踪 + %d 个轨迹 隐私 @@ -651,14 +651,14 @@ 地图样式和图层 地铁地图不可用 该列表为空 - 要添加新标签,请单击对象卡中的星形图标 + 要添加新书签,请点击对象卡片中的星形图标 …更多 - 导出 KMZ - 导出 GPX + 导出为 KMZ + 导出为 GPX 删除列表 - 公共访问 - 私人访问 - 请添加说明(文字或html) + 允许公众访问 + 不允许访问的私人空间 + 添加说明(文字或 html) 私人 限速拍照 地点说明 @@ -671,26 +671,26 @@ 永远不会对摄像头发出警告 省电模式 - 如果开启省电模式,应用程序将根据手机的当前电量关耗电功能 + 如果开启省电模式,应用程序将根据手机的当前电量关闭耗电功能 从不 - 自动 + 当电量低时 最大程度省电 - 临时启用此选项,以便使用“报告错误”功能在帮助对话框中记录并手动发送有关您的问题的详细诊断日志给我们。日志可能包含位置信息。 + 临时启用此选项,以便使用“报告错误”功能在帮助对话框中记录并手动发送详细诊断日志给我们。日志可能包含位置信息。 在线编辑 绕行设置 避开收费公路 - 避开未铺设道路 + 避开未铺砌道路 避开轮渡 避开高速公路 无法规划路线 - 很遗憾,我们无法使用所选选项规划路线。请更改设置,然后重试 - 设置绕行路径 + 很遗憾,我们无法使用所选的绕行设置规划路线。请更改设置,然后重试 + 选择要避开的道路 绕行设置已开启 收费公路 - 土路 + 未铺砌道路 轮渡 @@ -702,14 +702,14 @@ 容量:%s - 您已到达! + 您已到达目的地! 好的 - 分类…… + 排序… - 分类标签 + 分类排序 - 默认情况下 + 使用默认值 按类型 @@ -719,19 +719,19 @@ 按名称 一周前 - 一月前 + 一个月前 一个多月前 一年多以前 - 在我旁边 + 在我附近 其他 美食 - 名胜 + 旅游景点 博物馆 公园 游泳 - + 山峰 动物 酒店 建筑物 @@ -741,10 +741,10 @@ 加油站 医疗 在列表中搜索 - 圣地 + 宗教场所 选择列表 本区域的地铁导航目前不可用 - 地铁路线图未找到 + 未找到地铁路线图 选择地铁站附近的起点和终点 等高线 如需使用等高线,请更新或下载所需区域的地图 @@ -755,9 +755,9 @@ 最大高度 难度 距离: - 在路上: + 时间: 放大地图以查看等高线 - 加载 + 正在下载 下载世界地图 无法在内部存储或 SD 卡上创建文件夹和移动文件 @@ -783,7 +783,7 @@ 感谢您使用我们社区构建的地图! - 有了您的捐赠和支持,我们可以创建世界上最好的地图! + 有了您的捐赠和支持,我们可以创造世界上最好的地图! 您喜欢我们的应用程序吗?请捐款以支持发展!还不喜欢吗?请告诉我们,我们会修复您提到的问题! @@ -822,16 +822,16 @@ 网络浏览器不可用 音量 - 导出所有书签和曲目 + 导出所有书签和轨迹 文本转语音系统设置 未找到语音合成设置,您确定您的设备支持该设置吗? - 驾车通过 + 面下车通道 清除搜索 放大 - 放大 + 缩小 菜单链接 @@ -844,7 +844,7 @@ 关闭省电模式 - 为了获得最准确的导航,我们建议在手机电池设置中禁用省电模式。 + 为了获得最准确的导航,我们建议在手机电池设置中停用省电模式。 地址/区块 diff --git a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings index 3f613f248a..d07fa67d19 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings @@ -18,7 +18,7 @@ "download_maps" = "下载地图"; /* Settings/Downloader - info for country which started downloading */ -"downloading" = "下载…"; +"downloading" = "正在下载…"; /* Choose measurement on first launch alert - choose metric system button */ "kilometres" = "公里"; @@ -33,7 +33,7 @@ "core_my_position" = "我的位置"; /* Update maps later button text */ -"later" = "稍后"; +"later" = "以后再说"; /* View and button titles for accessibility, please also edit it in iphone/plist.txt */ "search" = "搜索"; @@ -54,13 +54,13 @@ "about_headline" = "对每个人都免费,用爱制成"; /* Text in About screen */ -"about_proposition_1" = "•没有广告,不会跟踪您,更不会收集您的数据"; +"about_proposition_1" = "• 没有广告,不会跟踪您,更不会收集您的数据"; /* Text in About screen */ -"about_proposition_2" = "• 无需耗费电池,可离线工作"; +"about_proposition_2" = "• 无需耗费太多电量,可离线工作"; /* Text in About screen */ -"about_proposition_3" = "• 快速、简约、由社区开发"; +"about_proposition_3" = "• 快速且简约,由社区开发"; "close" = "关闭"; @@ -70,13 +70,13 @@ "continue_download" = "继续"; /* "Add new bookmark list" dialog title */ -"add_new_set" = "添加新的集合"; +"add_new_set" = "添加新的书签列表"; /* Add Bookmark list dialog - hint when the list name is empty */ -"bookmark_set_name" = "书签集名称"; +"bookmark_set_name" = "书签列表名称"; /* "Bookmark Lists" dialog title */ -"bookmark_sets" = "书签集"; +"bookmark_sets" = "书签列表"; /* Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. */ "bookmarks" = "书签"; @@ -85,7 +85,7 @@ "bookmarks_and_tracks" = "书签和轨迹"; /* Default bookmark list name */ -"core_my_places" = "我的位置"; +"core_my_places" = "我的地点"; /* Editor title above street and house number, duplicates [type.building.address] in types_strings.txt */ "address" = "地址"; @@ -109,7 +109,7 @@ "category_transport" = "交通"; /* Search category for fuel stations; any changes should be duplicated in categories.txt @category_fuel! */ -"category_fuel" = "汽油"; +"category_fuel" = "加油站"; /* Search category for parking lots; any changes should be duplicated in categories.txt @category_parking! */ "category_parking" = "停车场"; @@ -121,7 +121,7 @@ "category_secondhand" = "二手货"; /* Search category for places to stay; any changes should be duplicated in categories.txt @category_hotel! */ -"category_hotel" = "旅店"; +"category_hotel" = "酒店"; /* Search category sight seeings and touristic attractions; any changes should be duplicated in categories.txt @category_tourism! */ "category_tourism" = "旅游景点"; @@ -151,7 +151,7 @@ "category_toilet" = "厕所"; /* Search category for post offices; any changes should be duplicated in categories.txt @category_post! */ -"category_post" = "邮政"; +"category_post" = "邮局"; /* Search category for police; any changes should be duplicated in categories.txt @category_police! */ "category_police" = "警察局"; @@ -166,7 +166,7 @@ "category_water" = "水"; /* Search category for RV facilities; any changes should be duplicated in categories.txt @category_rv! */ -"category_rv" = "房车用"; +"category_rv" = "房车设施"; /********** Other translations **********/ @@ -174,13 +174,13 @@ "share_bookmarks_email_body" = "您好!\n\n附件是我的书签,请在 Organic Maps 中打开。如果您没有安装 Organic Maps,可以在这里下载: https://omaps.app/get?kmz\n\n祝您使用 Organic Maps 旅行愉快!"; /* message title of loading file */ -"load_kmz_title" = "加载书签"; +"load_kmz_title" = "正在载入书签…"; /* Kmz file successful loading */ -"load_kmz_successful" = "书签加载成功!您可以在地图或书签管理窗口中找到它们。"; +"load_kmz_successful" = "书签载入成功!您可以在地图或书签管理页面中找到它们。"; /* Kml file loading failed */ -"load_kmz_failed" = "书签上传失败。该文件可能已损坏或有缺陷。"; +"load_kmz_failed" = "书签载入失败,文件可能已损坏或不完整。"; /* resource for context menu */ "edit" = "编辑"; @@ -189,16 +189,16 @@ "unknown_current_position" = "您的位置尚未确定"; /* Subject for emailed bookmark */ -"bookmark_share_email_subject" = "嘿,在 Organic Maps 上查看我标注的图钉吧!"; +"bookmark_share_email_subject" = "嘿,看看我在 Organic Maps 上标记的图钉吧!"; /* Subject for emailed position */ -"my_position_share_email_subject" = "嗨,到 Organic Maps 查看我的当前位置!"; +"my_position_share_email_subject" = "嗨,到 Organic Maps 查看我当前的位置!"; /* Share by email button text, also used in editor and About. */ -"email" = "邮件"; +"email" = "电子邮件"; /* Text for message when used successfully copied something */ -"copied_to_clipboard" = "复制到剪贴板:%@"; +"copied_to_clipboard" = "已复制到剪贴板:%@"; /* place preview title */ "info" = "信息"; @@ -207,7 +207,7 @@ "done" = "完成"; /* Prints version number in About dialog */ -"version" = "Organic Maps 版本: %@"; +"version" = "Organic Maps 版本:%@"; /* Title for tracks category in bookmarks manager */ "tracks_title" = "轨迹"; @@ -246,7 +246,7 @@ "pref_map_3d_buildings_title" = "3D 建筑"; /* A message in Settings/Preferences explaining why is it not possible to enable 3D buildings when max power saving mode is enabled */ -"pref_map_3d_buildings_disabled_summary" = "3D 建筑在省电模式下关闭"; +"pref_map_3d_buildings_disabled_summary" = "3D 建筑在省电模式下处于关闭状态"; /* Settings «Route» category: «Tts enabled» title */ "pref_tts_enable_title" = "语音指导"; @@ -261,29 +261,29 @@ "pref_tts_language_title" = "语音语言"; /* Settings «Route» category: «Test Voice Directions» title */ -"pref_tts_test_voice_title" = "测试语音指令(TTS,Text-To-Speech)"; +"pref_tts_test_voice_title" = "测试语音指令(TTS,文本转语音系统)"; /* Title for "Other" section in TTS settings. */ "pref_tts_other_section_title" = "其他"; /* Settings «Map» category: «Record track» title */ -"pref_track_record_title" = "最近的路径"; +"pref_track_record_title" = "最近的轨迹"; "pref_map_auto_zoom" = "自动缩放"; "duration_disabled" = "关闭"; -"duration_1_hour" = "1小时"; +"duration_1_hour" = "1 小时"; -"duration_2_hours" = "2小时"; +"duration_2_hours" = "2 小时"; -"duration_6_hours" = "6小时"; +"duration_6_hours" = "6 小时"; -"duration_12_hours" = "12小时"; +"duration_12_hours" = "12 小时"; -"duration_1_day" = "1天"; +"duration_1_day" = "1 天"; -"recent_track_help_text" = "它允许您记录一定时间段内的旅行路径,并在地图上查看。请注意:激活此功能会导致电量消耗加快。过期后,轨迹将从地图中自动移除。"; +"recent_track_help_text" = "记录并显示您在指定时间段内的旅行轨迹。请注意:这会显著增加电池消耗。"; "placepage_distance" = "距离"; @@ -320,7 +320,7 @@ "donate" = "捐助我们"; /* Tex label above the Donate button */ -"donate_description" = "捐赠,共同打造最好的地图!"; +"donate_description" = "捐助,以共同打造最好的地图!"; /* Button in the main Help dialog */ "copyright" = "版权"; @@ -329,25 +329,25 @@ "report_a_bug" = "报告问题"; /* Button in the About screen */ -"report_incorrect_map_bug" = "报告或修复错误的地图数据"; +"report_incorrect_map_bug" = "报告或修复不正确的地图数据"; /* Button in the About screen */ -"volunteer" = "志愿服务"; +"volunteer" = "志愿者"; /* "Social media" section header in the About screen */ "follow_us" = "关注并联系我们:"; /* Alert text */ -"email_error_body" = "电子邮件客户端尚未建立。请配置或使用任何其他方式与我们联系%@"; +"email_error_body" = "电子邮件客户端未设置。请配置电子邮件客户端或通过 %@ 联系我们。"; /* Alert title */ -"email_error_title" = "电子邮件发送错误"; +"email_error_title" = "电子邮件发送失败"; /* Settings item title */ "pref_calibration_title" = "指南针校准"; /* Toast text when user hides UI with a long tap anywhere on the map */ -"long_tap_toast" = "再次长按地图查看界面"; +"long_tap_toast" = "再次长按地图即可查看界面"; /* Update all button text */ "downloader_update_all_button" = "更新全部"; @@ -370,7 +370,7 @@ "downloader_downloading" = "正在下载:"; -"downloader_search_results" = "找到"; +"downloader_search_results" = "已找到"; /* Status of outdated country in the list */ "downloader_status_outdated" = "更新"; @@ -382,7 +382,7 @@ "downloader_delete_map_while_routing_dialog" = "要删除地图,请停止导航。"; /* PointsInDifferentMWM */ -"routing_failed_cross_mwm_building" = "路程只能完全处在同一地图里时才能被创建。"; +"routing_failed_cross_mwm_building" = "路线只能完全处在同一地图里时才能被规划。"; /* Context menu item for downloader. */ "downloader_download_map" = "下载地图"; @@ -394,10 +394,10 @@ "downloader_delete_map" = "删除地图"; /* Text for routing error dialog */ -"routing_download_maps_along" = "下载沿线地图"; +"routing_download_maps_along" = "下载路线上的所有地图"; /* Text for routing error dialog */ -"routing_requires_all_map" = "创建路线需要下载并更新好所有从您的位置到目的地的地图。"; +"routing_requires_all_map" = "规划路线需要下载并更新好所有从您的位置到目的地的地图。"; /* bookmark button text */ "bookmark" = "书签"; @@ -422,7 +422,7 @@ "purple" = "紫色"; /* orange color */ -"orange" = "橘红色"; +"orange" = "橙色"; /* brown color */ "brown" = "棕色"; @@ -446,7 +446,7 @@ "lime" = "青柠"; /* deep orange color */ -"deep_orange" = "深橘色"; +"deep_orange" = "深橙色"; /* gray color */ "gray" = "灰色"; @@ -461,27 +461,27 @@ "dialog_routing_disclaimer_priority" = "— 路况、交通法规和路标始终优先于导航建议;"; -"dialog_routing_disclaimer_precision" = "— 地图可能不准确,建议的路线可能并非总是去往目的地的最佳路径;"; +"dialog_routing_disclaimer_precision" = "— 地图可能不准确,建议的路线可能并非总是去往目的地的最佳路线;"; "dialog_routing_disclaimer_recommendations" = "— 建议的路线仅作为推荐路线供您采纳;"; -"dialog_routing_disclaimer_borders" = "— 小心对待国界区的路线:我们应用创造的路线有时会在未经授权的地方跨越国界;"; +"dialog_routing_disclaimer_borders" = "— 小心对待国界区的路线:我们的应用程序生成的路线有时会在未经授权的地方跨越国界;"; "dialog_routing_disclaimer_beware" = "上路时请当心,祝您一路平安!"; "dialog_routing_check_gps" = "检查 GPS 信号"; -"dialog_routing_error_location_not_found" = "无法创建路线。当前 GPS 坐标无法识别。"; +"dialog_routing_error_location_not_found" = "无法规划路线。无法识别当前 GPS 坐标。"; -"dialog_routing_location_turn_wifi" = "请检查您的 GPS 信号。启用无线网络将改善您的定位精度。"; +"dialog_routing_location_turn_wifi" = "请检查您的 GPS 信号。启用无线网络将改善定位精度。"; "dialog_routing_location_turn_on" = "启用定位服务"; -"dialog_routing_location_unknown_turn_on" = "无法定位当前 GPS 坐标。请启用定位服务以计算路线。"; +"dialog_routing_location_unknown_turn_on" = "无法定位当前 GPS 坐标。请启用定位服务以规划路线。"; "dialog_routing_download_files" = "下载所需文件"; -"dialog_routing_download_and_update_all" = "下载和更新所有地图和预定路径沿途的路线信息,以计算路线。"; +"dialog_routing_download_and_update_all" = "下载或更新沿预计路线的所有地图,以规划路线。"; "dialog_routing_unable_locate_route" = "无法定位路线"; @@ -489,29 +489,29 @@ "dialog_routing_change_start" = "调整出发点"; -"dialog_routing_start_not_determined" = "路线未创建。无法定位起点。"; +"dialog_routing_start_not_determined" = "路线未规划。无法定位起点。"; "dialog_routing_select_closer_start" = "请选择更靠近公路的起点。"; "dialog_routing_change_end" = "调整目的地"; -"dialog_routing_end_not_determined" = "路线未创建。无法定位目的地。"; +"dialog_routing_end_not_determined" = "路线未规划。无法定位目的地。"; "dialog_routing_select_closer_end" = "请选择更靠近公路的目的地位置。"; -"dialog_routing_change_intermediate" = "无法定位中间点。"; +"dialog_routing_change_intermediate" = "无法定位途径点。"; -"dialog_routing_intermediate_not_determined" = "请调整您的中间点。"; +"dialog_routing_intermediate_not_determined" = "请调整您的途径点。"; "dialog_routing_system_error" = "系统错误"; -"dialog_routing_application_error" = "由于应用程序错误,无法创建路线。"; +"dialog_routing_application_error" = "由于应用程序出错,因此无法规划路线。"; -"dialog_routing_try_again" = "请重试"; +"dialog_routing_try_again" = "请再试一次"; -"dialog_routing_download_and_build_cross_route" = "您是否要下载地图并创建一条跨越多张地图的更佳路线?"; +"dialog_routing_download_and_build_cross_route" = "您是否要下载地图,以规划跨越边界的更佳路线?"; -"dialog_routing_download_cross_route" = "下载地图,创建一条跨越此地图边缘的更佳路线。"; +"dialog_routing_download_cross_route" = "下载地图,以规划一条跨越边界的更佳路线。"; /********** Strings for downloading map from search **********/ @@ -526,23 +526,23 @@ "routing_planning_error" = "路线计划失败"; /* Arrive routing message in navigation view */ -"routing_arrive" = "抵達:%@"; +"routing_arrive" = "已到达 %@"; /* Text for routing::RouterResultCode::FileTooOld dialog. */ -"dialog_routing_download_and_update_maps" = "要创建路线,请下载并更新所有沿路线的地图。"; +"dialog_routing_download_and_update_maps" = "要规划路线,请下载并更新所有沿路线的地图。"; "categories" = "类别"; "history" = "历史"; -"search_not_found" = "很抱歉,没有找到任何地点。"; +"search_not_found" = "很抱歉,没有搜到任何地点。"; /* The message when user did not find anything in the search. */ -"search_not_found_query" = "下载要搜索的地区或尝试添加附近的城镇/村庄名称。"; +"search_not_found_query" = "下载您要搜索的区域的地图,或尝试输入附近的城镇或村庄名称。"; "search_history_title" = "搜索历史记录"; -"search_history_text" = "快速访问最近的搜索查询。"; +"search_history_text" = "查看您最近的搜索记录。"; "clear_search" = "清除搜索记录"; @@ -569,13 +569,13 @@ "editor_time_delete" = "删除计划"; /* Text for allday switch. */ -"editor_time_allday" = "全天(24小时)"; +"editor_time_allday" = "全天(24 小时)"; -"editor_time_open" = "开始营业时间"; +"editor_time_open" = "正在营业"; -"editor_time_close" = "结束营业时间"; +"editor_time_close" = "已歇业"; -"editor_time_add_closed" = "添加非营业时间"; +"editor_time_add_closed" = "添加休息时间"; "editor_time_title" = "营业时间"; @@ -589,7 +589,7 @@ "editor_add_select_location" = "位置"; -"editor_done_dialog_1" = "您已经改变了世界地图。请不要隐藏这一点!告诉您的朋友们并一起编辑它。"; +"editor_done_dialog_1" = "您已经改变了世界地图。请别再藏着掖着了!告诉您的朋友们并一起来编辑地图。"; "share_with_friends" = "与朋友分享"; @@ -598,12 +598,12 @@ "autodownload" = "自动下载"; /* Place Page opening hours text */ -"closed_now" = "现在关门"; +"closed_now" = "现已关门"; /* Place Page opening hours text */ "daily" = "每天"; -"twentyfour_seven" = "全天候"; +"twentyfour_seven" = "24/7 全天候营业"; "day_off_today" = "今天不营业"; @@ -621,17 +621,17 @@ "closes_at" = "Closes at %@"; -"closes_in" = "将于 %@ 后停业"; +"closes_in" = "将于 %@ 后歇业"; "closed" = "已停止营业"; "add_opening_hours" = "添加营业时间"; -"no_osm_account" = "在OpenStreetMap上没有账户吗?"; +"no_osm_account" = "没有 OpenStreetMap 账户吗?"; "register_at_openstreetmap" = "注册"; -"password_8_chars_min" = "密码(最少8个字符)"; +"password_8_chars_min" = "密码(至少 8 个字符)"; "invalid_username_or_password" = "无效的用户名或密码。"; @@ -641,18 +641,18 @@ "forgot_password" = "忘记密码"; -"osm_account" = "OSM账户"; +"osm_account" = "OSM 账户"; "logout" = "登出"; /* Information text: "Last upload 11.01.2016" */ -"last_upload" = "上次上传"; +"last_upload" = "最后上传"; "thank_you" = "谢谢您"; "edit_place" = "编辑地点"; -"place_name" = "地点名"; +"place_name" = "地点名称"; "add_language" = "添加语言"; @@ -675,7 +675,7 @@ "select_cuisine" = "选择菜肴"; /* login text field */ -"email_or_username" = "邮箱或用户名"; +"email_or_username" = "电子邮件或用户名"; "phone" = "电话"; @@ -687,13 +687,13 @@ "downloader_update_maps" = "更新地图"; -"downloader_search_field_hint" = "找到地图"; +"downloader_search_field_hint" = "搜索地图"; -"migration_download_error_dialog" = "下载错误"; +"migration_download_error_dialog" = "下载失败"; "common_check_internet_connection_dialog" = "请检查您的设置并确保您的设备已连接至网络。"; -"downloader_no_space_title" = "无足够的空间"; +"downloader_no_space_title" = "没有足够的空间"; "downloader_no_space_message" = "请删除不必要的数据"; @@ -718,32 +718,32 @@ "editor_edit_place_category_title" = "类别"; -"whatsnew_editor_message_1" = "添加新地点到该地图,并直接通过此应用编辑已存在的地点。"; +"whatsnew_editor_message_1" = "添加新地点到地图,并直接通过此应用编辑已存在的地点。"; -"dialog_incorrect_feature_position" = "改变位置"; +"dialog_incorrect_feature_position" = "更改位置"; -"message_invalid_feature_position" = "对象无法设置在这里"; +"message_invalid_feature_position" = "地点不能放置在这里"; /* Text in About and OSM Login screens. First %@ is replaced by a local, human readable date. */ -"osm_presentation" = "截至 %@ 的社区创建的 OpenStreetMap 数据。请访问 OpenStreetMap.org 以了解更多有关如何编辑和更新地图的信息。"; +"osm_presentation" = "截至 %@ 的社区创建的 OpenStreetMap 数据。请访问 OpenStreetMap.org 以了解有关如何编辑和更新地图的信息。"; "login_to_make_edits_visible" = "登录,让其他用户能看到您所作出的修改。"; /* Error dialog no space */ -"migration_no_space_message" = "为了下载,您需要更多的空间。请删除不必要的数据。"; +"migration_no_space_message" = "为了下载,您需要更多的存储空间。请删除不必要的文件。"; -"editor_sharing_title" = "我改进了Organic Maps地图"; +"editor_sharing_title" = "我改进了 Organic Maps 地图"; /* Downloaded 10 **of** 20 <- it is that "of" */ -"downloader_of" = "%1$d个/共%2$d个"; +"downloader_of" = "%1$d / %2$d"; "download_over_mobile_header" = "用手机网络连接下载吗?"; "download_over_mobile_message" = "如果您使用移动数据或漫游来进行下载,将可能导致额外的费用。"; -"error_enter_correct_house_number" = "输入正确的房屋号"; +"error_enter_correct_house_number" = "输入正确的门牌号码"; -"editor_storey_number" = "楼号 (最大 %d)"; +"editor_storey_number" = "楼层数量 (最多 %d 层)"; /* Error message in Editor when a user tries to set the number of floors for a building higher than %d floors */ "error_enter_correct_storey_number" = "最多可编辑 %d 层的建筑"; @@ -753,7 +753,7 @@ "error_enter_correct_zip_code" = "输入正确的邮政编码"; /* Place Page title for long tap */ -"core_placepage_unknown_place" = "未知位置"; +"core_placepage_unknown_place" = "未知地点"; "editor_other_info" = "给 OSM 社区发送标记"; @@ -763,32 +763,32 @@ "editor_more_about_osm" = "关于 OpenStreetMap 的更多信息"; -"editor_operator" = "运营者"; +"editor_operator" = "经营者"; "downloader_no_downloaded_maps_title" = "您尚未下载任何地图"; -"downloader_no_downloaded_maps_message" = "下载地图来查找位置和离线浏览"; +"downloader_no_downloaded_maps_message" = "下载地图来查找位置和离线浏览。"; -"current_location_unknown_error_title" = "当前位置未知"; +"current_location_unknown_error_title" = "当前位置未知。"; "current_location_unknown_error_message" = "定位到您的当前位置时出错。请检查您的设备是否正常运作,然后再试一次。"; -"location_services_disabled_header" = "地点定位被禁用"; +"location_services_disabled_header" = "定位服务已被禁用"; -"location_services_disabled_message" = "启用设备设置中的地理位置定位"; +"location_services_disabled_message" = "启用设备设置中的定位服务"; "location_services_disabled_1" = "1. 打开设置"; "location_services_disabled_2" = "2. 点击位置"; /* iOS Dialog for the case when the location permission is not granted; you might find the exact wording for your language here: https://support.apple.com/en-us/102647 (replace 'en-us' in URL with your language/region) */ -"location_services_disabled_3" = "3. 使用应用时选择"; +"location_services_disabled_3" = "3. 点击“使用 App 期间”"; -"location_services_disabled_on_device_2" = "2. 选择隐私"; +"location_services_disabled_on_device_2" = "2. 点击“隐私和安全性”"; -"location_services_disabled_on_device_3" = "3.选择位置服务"; +"location_services_disabled_on_device_3" = "3. 选择“定位服务”"; -"location_services_disabled_on_device_4" = "4.打开定位服务"; +"location_services_disabled_on_device_4" = "4. 打开“定位服务”"; "location_services_disabled_on_device_additional_message" = "或继续使用 Organic Maps,但无法定位到您目前所在的位置。"; @@ -815,7 +815,7 @@ "placepage_more_button" = "更多"; -"book_button" = "预約"; +"book_button" = "预定"; /* A referral link on the place page for some hotels */ "more_on_kayak" = "照片、评论、预订"; @@ -824,7 +824,7 @@ "dialog_kayak_disclaimer" = "每次通过此链接预订所获得的推荐奖金将用于 Organic Maps 的开发。"; /* A confirmation button text in the explanation dialog that opens hotel details page on Kayak website. */ -"dialog_kayak_button" = "Kayak 上的详细信息"; +"dialog_kayak_button" = "客涯 (Kayak) 上的详细信息"; "placepage_call_button" = "呼叫"; @@ -844,7 +844,7 @@ "editor_reset_edits_button" = "重置"; -"editor_remove_place_message" = "删除已添加的位置?"; +"editor_remove_place_message" = "删除已添加的地点?"; "editor_remove_place_button" = "删除"; @@ -855,16 +855,16 @@ /* Phone number error message */ "error_enter_correct_phone" = "输入正确的电话号码"; -"error_enter_correct_web" = "输入有效网址"; +"error_enter_correct_web" = "请输入有效的网址"; -"error_enter_correct_email" = "输入有效电子邮箱"; +"error_enter_correct_email" = "请输入有效的电子邮件"; "refresh" = "更新"; "placepage_add_place_button" = "将地点添加到 OpenStreetMap"; /* Displayed when saving some edits to the map to warn against publishing personal data */ -"editor_share_to_all_dialog_title" = "您想要发给所有用户吗?"; +"editor_share_to_all_dialog_title" = "您想要发送给所有用户吗?"; /* Dialog before publishing the modifications to the public map. */ "editor_share_to_all_dialog_message_1" = "确保您没有输入任何个人数据。"; @@ -874,14 +874,14 @@ "navigation_stop_button" = "停止"; /* iOS dialog for the case when recent track recording is on and the app comes back from background */ -"recent_track_background_dialog_title" = "禁止记录您最近去过的路径?"; +"recent_track_background_dialog_title" = "禁止记录您最近去过的路线吗?"; "off_recent_track_background_button" = "禁用"; /* For sharing via SMS and so on */ "sharing_call_action_look" = "来看看"; -"recent_track_background_dialog_message" = "Organic Maps使用背景中的地理位置记录您最近去过的路径。"; +"recent_track_background_dialog_message" = "Organic Maps 在后台使用您的位置记录您最近去过的路线。"; "general_settings" = "常规设置"; @@ -894,7 +894,7 @@ /* A noun - a button name used to show search results in list form */ "search_in_table" = "列表"; -"mobile_data_dialog" = "使用移动网络显示详细信息?"; +"mobile_data_dialog" = "使用移动网络显示更多详细信息吗?"; "mobile_data_option_always" = "始终使用"; @@ -911,30 +911,30 @@ "mobile_data_option_ask" = "总是询问"; -"traffic_update_maps_text" = "要显示交通数据,必须更新地图。"; +"traffic_update_maps_text" = "诺要显示交通数据,必须更新地图。"; "big_font" = "增大地图上的字体大小"; /* "traffic" as in road congestion */ -"traffic_update_app_message" = "要显示交通数据,必须更新应用。"; +"traffic_update_app_message" = "诺要显示交通数据,必须更新应用。"; /* "traffic" as in "road congestion" */ "traffic_data_unavailable" = "交通数据不可用"; -"enable_logging" = "启用记录"; +"enable_logging" = "启用日志记录"; -"log_file_size" = "日志文件大小: %@"; +"log_file_size" = "日志文件大小:%@"; -"transliteration_title" = "直译成拉丁文"; +"transliteration_title" = "拉丁字母音译"; /* Subway exits for public transport marks on the map */ "core_exit" = "退出"; /* User selected the destination by pressing Route To, but the current position is unknown. User needs to select a starting point of a route using search or by tapping on the map and then pressing "Route From". */ -"routing_add_start_point" = "请使用搜索或点击地图以添加路线起点"; +"routing_add_start_point" = "请搜索地点或点击地图以添加路线起点"; /* User selected the start of a route by pressing Route From. Now the destination of a route should be selected using search or by tapping on the map and then pressing "Route To". */ -"routing_add_finish_point" = "请使用搜索或点击地图以添加目的地"; +"routing_add_finish_point" = "请搜索地点或点击地图以添加目的地"; "planning_route_manage_route" = "管理路线"; @@ -949,10 +949,10 @@ "start_from_my_position" = "起点"; /* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */ -"alert_reauth_message_ios" = "请登录OpenStreetMap,自动上传您编辑的所有地图。了解更多信息"; +"alert_reauth_message_ios" = "请登录 OpenStreetMap 以自动上传您的所有地图编辑。了解更多"; /* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */ -"alert_reauth_link_text_ios" = "请点击这里"; +"alert_reauth_link_text_ios" = "这里"; "core_entrance" = "入口"; @@ -976,25 +976,25 @@ "downloader_process" = "正在下載 %@…"; -"downloader_applying" = "正在套用 %@…"; +"downloader_applying" = "正在应用 %@…"; -"bookmarks_error_message_share_general" = "由于应用程序出错而无法分享"; +"bookmarks_error_message_share_general" = "由于应用程序出错,导致无法分享"; -"bookmarks_error_title_share_empty" = "分享错误"; +"bookmarks_error_title_share_empty" = "无法分享"; "bookmarks_error_message_share_empty" = "无法分享空列表"; "bookmarks_error_message_empty_list_name" = "请输入列表名称"; -"bookmarks_error_title_list_name_already_taken" = "这个名字已经被使用了"; +"bookmarks_error_title_list_name_already_taken" = "这个名称已经被使用了"; -"bookmarks_error_title_list_name_too_long" = "这个名字太长了"; +"bookmarks_error_title_list_name_too_long" = "这个名称太长了"; "profile" = "OpenStreetMap 资料"; "bookmarks_detect_title" = "检测到新文件"; -"button_convert" = "兑换"; +"button_convert" = "转换"; "bookmarks_convert_error_title" = "错误"; @@ -1016,15 +1016,15 @@ "popular_place" = "Popular"; -"export_file" = "导出 KMZ"; +"export_file" = "导出为 KMZ"; -"export_file_gpx" = "导出 GPX"; +"export_file_gpx" = "导出为 GPX"; "delete_list" = "删除列表"; -"hide_from_map" = "从卡中隐藏"; +"hide_from_map" = "从地图上隐藏"; -"bookmark_list_description_hint" = "请添加说明(文字或html)"; +"bookmark_list_description_hint" = "添加说明(文字或 html)"; "tags_loading_error_subtitle" = "加载标签时出错,请重试"; @@ -1045,15 +1045,15 @@ "power_managment_title" = "省电模式"; -"power_managment_description" = "如果开启省电模式,应用程序将根据手机的当前电量关耗电功能"; +"power_managment_description" = "如果开启省电模式,应用程序将根据手机的当前电量关闭耗电功能"; "power_managment_setting_never" = "从不"; -"power_managment_setting_auto" = "自动"; +"power_managment_setting_auto" = "当电量低时"; "power_managment_setting_manual_max" = "最大程度省电"; -"enable_logging_warning_message" = "临时启用此选项,以便使用“报告错误”功能在帮助对话框中记录并手动发送有关您的问题的详细诊断日志给我们。日志可能包含位置信息。"; +"enable_logging_warning_message" = "临时启用此选项,以便使用“报告错误”功能在帮助对话框中记录并手动发送详细诊断日志给我们。日志可能包含位置信息。"; "driving_options_title" = "绕行设置"; @@ -1061,7 +1061,7 @@ "avoid_tolls" = "避开收费公路"; /* Recommended length for CarPlay and Android Auto is around 25-27 characters */ -"avoid_unpaved" = "避开未铺设道路"; +"avoid_unpaved" = "避开未铺砌道路"; /* Recommended length for CarPlay and Android Auto is around 25-27 characters */ "avoid_ferry" = "避开轮渡"; @@ -1070,29 +1070,29 @@ "unable_to_calc_alert_title" = "无法规划路线"; -"unable_to_calc_alert_subtitle" = "很遗憾,我们无法使用所选选项规划路线。请更改设置,然后重试"; +"unable_to_calc_alert_subtitle" = "很遗憾,我们无法使用所选的绕行设置规划路线。请更改设置,然后重试"; -"define_to_avoid_btn" = "设置绕行路径"; +"define_to_avoid_btn" = "选择要避开的道路"; "change_driving_options_btn" = "绕行设置已开启"; "toll_road" = "收费公路"; -"unpaved_road" = "土路"; +"unpaved_road" = "未铺砌道路"; "ferry_crossing" = "轮渡"; -"trip_start" = "前往"; +"trip_start" = "出发"; -"pick_destination" = "目标"; +"pick_destination" = "目的地"; -"follow_my_position" = "定好中心"; +"follow_my_position" = "重新居中"; "search_results" = "搜索结果"; -"then_turn" = "接下来"; +"then_turn" = "然后"; -"redirect_route_alert" = "想重建路线?"; +"redirect_route_alert" = "您想重新规划路线吗?"; /* A generic "Yes" button in dialogs */ "yes" = "是"; @@ -1109,42 +1109,42 @@ /* To indicate the capacity of car parkings, bicycle parkings, electric vehicle charging stations... */ "capacity" = "容量:%@"; -"trip_finished" = "您已到达!"; +"trip_finished" = "您已到达目的地!"; -"keyboard_availability_alert" = "移动时键盘不可用"; +"keyboard_availability_alert" = "开车时键盘不可用"; -"dialog_routing_change_start_carplay" = "无法从当前位置构建路线"; +"dialog_routing_change_start_carplay" = "无法从当前位置规划路线"; -"dialog_routing_change_end_carplay" = "无法建立到终点的路线。请选择其他(路线)"; +"dialog_routing_change_end_carplay" = "无法规划到终点的路线。请选择其它目的地"; -"dialog_routing_check_gps_carplay" = "无GPS信号。请沿着空旷区域行驶"; +"dialog_routing_check_gps_carplay" = "没有 GPS 信号。请沿着空旷区域行驶"; -"dialog_routing_unable_locate_route_carplay" = "无法建立路线。请选择其他路线点"; +"dialog_routing_unable_locate_route_carplay" = "无法规划路线。请选择其他路线点"; -"dialog_routing_download_files_carplay" = "为了创建线路,请在您的设备中下载所缺少的地图"; +"dialog_routing_download_files_carplay" = "为了规划路线,请在您的设备中下载所缺少的地图"; -"dialog_routing_system_error_carplay" = "发生了错误。请重新启动程序"; +"dialog_routing_system_error_carplay" = "发生了错误,请重新启动应用程序"; "dialog_routing_rebuild_from_current_location_carplay" = "该路线将从您的当前位置重建"; -"dialog_routing_rebuild_for_vehicle_carplay" = "该路线将改为汽车(路线)"; +"dialog_routing_rebuild_for_vehicle_carplay" = "路线将转换为汽车路线"; -"not_all_shown_bookmarks_carplay" = "并非所有书签都会显示"; +"not_all_shown_bookmarks_carplay" = "未显示所有书签"; -"switch_to_phone_bookmarks_carplay" = "切换到手机查看所有书签"; +"switch_to_phone_bookmarks_carplay" = "切换到手机以查看所有书签"; "ok" = "好的"; -"speedcams_alert_title_carplay_1" = "摄像头"; +"speedcams_alert_title_carplay_1" = "限速拍照"; -"speedcams_alert_title_carplay_2" = "摄像头信息"; +"speedcams_alert_title_carplay_2" = "超速警告"; -"download_map_carplay" = "将Organic Maps软件中的地图下载至个人设备中"; +"download_map_carplay" = "将 Organic Maps 应用程序中的地图下载至个人设备中"; -"carplay_roundabout_exit" = "%@号坡道"; +"carplay_roundabout_exit" = "第 %@ 个出口"; /* max. 10 symbols, both iOS and Android */ -"sort" = "分类……"; +"sort" = "排序…"; /* iOS */ "sort_default" = "默认排序"; @@ -1159,13 +1159,13 @@ "week_ago_sorttype" = "一周前"; -"month_ago_sorttype" = "一月前"; +"month_ago_sorttype" = "一个月前"; "moremonth_ago_sorttype" = "一个多月前"; "moreyear_ago_sorttype" = "一年多以前"; -"near_me_sorttype" = "在我旁边"; +"near_me_sorttype" = "在我附近"; "others_sorttype" = "其他"; @@ -1174,7 +1174,7 @@ "food_places" = "美食"; -"tourist_places" = "名胜"; +"tourist_places" = "旅游景点"; "museums" = "博物馆"; @@ -1182,7 +1182,7 @@ "swim_places" = "游泳"; -"mountains" = "山"; +"mountains" = "山峰"; "animals" = "动物"; @@ -1202,11 +1202,11 @@ "search_in_the_list" = "在列表中搜索"; -"religious_places" = "圣地"; +"religious_places" = "宗教场所"; "transit_not_found" = "本区域的地铁导航目前不可用"; -"dialog_pedestrian_route_is_long_header" = "地铁路线图未找到"; +"dialog_pedestrian_route_is_long_header" = "未找到地铁路线图"; "dialog_pedestrian_route_is_long_message" = "选择地铁站附近的起点和终点"; @@ -1234,13 +1234,13 @@ "elevation_profile_difficulty" = "难度"; -"elevation_profile_time" = "在路上:"; +"elevation_profile_time" = "时间:"; "isolines_toast_zooms_1_10" = "放大地图以查看等高线"; "downloader_updating_ios" = "更新"; -"downloader_loading_ios" = "加载"; +"downloader_loading_ios" = "正在下载"; /* Autoupdate dialog on start */ "whats_new_auto_update_title" = "更新已下载的地图"; @@ -1264,7 +1264,7 @@ "move" = "移动"; /* edit track screen title */ -"track_title" = "追踪"; +"track_title" = "轨迹"; /* Telegram group url for the "?" About page */ "telegram_url" = "https://t.me/OrganicMapsApp"; @@ -1282,7 +1282,7 @@ "app_tip_00" = "感谢您使用我们社区构建的地图!"; /* App tip #01 */ -"app_tip_01" = "有了您的捐赠和支持,我们可以创建世界上最好的地图!"; +"app_tip_01" = "有了您的捐赠和支持,我们可以创造世界上最好的地图!"; /* App tip #02 */ "app_tip_02" = "您喜欢我们的应用程序吗?请捐款以支持发展!还不喜欢吗?请告诉我们,我们会修复您提到的问题!"; @@ -1324,33 +1324,33 @@ "button_layer_outdoor" = "徒步旅行"; /* Bookmark categories screen, button that opens share dialog to export all bookmarks and tracks */ -"bookmarks_export" = "导出所有书签和曲目"; +"bookmarks_export" = "导出所有书签和轨迹"; /* Text for the editing the Track's color button. */ -"change_color" = "改变颜色"; +"change_color" = "更改颜色"; /* Main screen title "Map" displayed in the navigation back button's menu. */ "map" = "地图"; -"drive_through" = "驾车通过"; +"drive_through" = "面下车通道"; /* Restaurant or other food place's menu URL field in the Editor */ "website_menu" = "菜单链接"; /* Message for the bug report alert. */ -"bugreport_alert_message" = "您想向开发人员发送错误报告吗?\n由于有机地图不会自动收集任何错误信息,因此我们只能依靠我们的用户。感谢您对有机地图的支持!"; +"bugreport_alert_message" = "您想向开发人员发送错误报告吗?\n由于 Organic Maps 不会自动收集任何错误信息,因此我们只能依靠我们的用户。感谢您对 Organic Maps 的支持!"; /* Title for the "Enable iCloud Syncronization" alert. */ "enable_icloud_synchronization_title" = "启用 iCloud 同步"; /* Message for the "Enable iCloud Syncronization" alert. */ -"enable_icloud_synchronization_message" = "iCloud 同步是一项正在开发的实验性功能。请确保备份了所有书签和曲目。"; +"enable_icloud_synchronization_message" = "iCloud 同步是一项正在开发的实验性功能。请确保备份了所有书签和轨迹。"; /* Title for the "iCloud is Disabled" alert. */ "icloud_disabled_title" = "iCloud 已禁用"; /* Message for the "iCloud is Disabled" alert. */ -"icloud_disabled_message" = "请在设备设置中启用 iCloud,以使用此功能。"; +"icloud_disabled_message" = "请在您的设备设置中启用 iCloud,以使用此功能。"; /* Title for the "Enable iCloud Syncronization" alert's "Enable" action button. */ "enable" = "启用"; @@ -1362,10 +1362,10 @@ "icloud_synchronization_error_alert_title" = "iCloud 同步失败"; /* iCloud error message: Failed to synchronize due to connection error */ -"icloud_synchronization_error_connection_error" = "错误:由于连接错误,同步失败"; +"icloud_synchronization_error_connection_error" = "错误:由于连接错误,导致同步失败"; /* iCloud error message: Failed to synchronize due to iCloud quota exceeded */ -"icloud_synchronization_error_quota_exceeded" = "错误:由于超过 iCloud 配额,同步失败"; +"icloud_synchronization_error_quota_exceeded" = "错误:由于超过 iCloud 配额,导致同步失败"; /* iCloud error message: iCloud is not available */ "icloud_synchronization_error_cloud_is_unavailable" = "错误:iCloud 不可用"; diff --git a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.stringsdict b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.stringsdict index 6e23d3d8b3..20c8ecb0fd 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.stringsdict +++ b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.stringsdict @@ -35,7 +35,7 @@ NSStringFormatValueTypeKey d other - 找到%d个文件。 转换后你会看到它。 + 找到 %d 个文件,转换后您才能看到它们。 @@ -50,7 +50,7 @@ NSStringFormatValueTypeKey d other - %d 跟踪 + %d 个轨迹 diff --git a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings index 6b784a100c..35fb15d5b5 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings @@ -18,7 +18,7 @@ "download_maps" = "下載地圖"; /* Settings/Downloader - info for country which started downloading */ -"downloading" = "下載中…"; +"downloading" = "正在下載…"; /* Choose measurement on first launch alert - choose metric system button */ "kilometres" = "公里"; @@ -33,7 +33,7 @@ "core_my_position" = "我的位置"; /* Update maps later button text */ -"later" = "稍後"; +"later" = "以後再說"; /* View and button titles for accessibility, please also edit it in iphone/plist.txt */ "search" = "搜尋"; @@ -54,13 +54,13 @@ "about_headline" = "對每個人都免費,用愛製成"; /* Text in About screen */ -"about_proposition_1" = "•沒有廣告,不會跟踪您,更不會收集您的數據"; +"about_proposition_1" = "• 沒有廣告,不會跟踪您,更不會收集您的數據"; /* Text in About screen */ -"about_proposition_2" = "• 無電池消耗,離線工作"; +"about_proposition_2" = "• 無需耗費太多電量,可離線工作"; /* Text in About screen */ -"about_proposition_3" = "• 快速、簡約、由社區開發"; +"about_proposition_3" = "• 快速且簡約,由社區開發"; "close" = "關閉"; @@ -70,13 +70,13 @@ "continue_download" = "繼續"; /* "Add new bookmark list" dialog title */ -"add_new_set" = "新增收藏夾"; +"add_new_set" = "新增新的書籤列表"; /* Add Bookmark list dialog - hint when the list name is empty */ -"bookmark_set_name" = "收藏夾名稱"; +"bookmark_set_name" = "書籤列表名稱"; /* "Bookmark Lists" dialog title */ -"bookmark_sets" = "收藏夾"; +"bookmark_sets" = "書籤列表"; /* Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. */ "bookmarks" = "書籤"; @@ -103,10 +103,10 @@ "category_eat" = "在哪兒吃"; /* Search category for grocery stores; any changes should be duplicated in categories.txt @category_food! */ -"category_food" = "食物"; +"category_food" = "食品"; /* Search category for public transport; any changes should be duplicated in categories.txt @category_transport! */ -"category_transport" = "運輸"; +"category_transport" = "交通"; /* Search category for fuel stations; any changes should be duplicated in categories.txt @category_fuel! */ "category_fuel" = "加油站"; @@ -118,7 +118,7 @@ "category_shopping" = "購物"; /* Search category for second_hand/charity/antique/auction shops; any changes should be duplicated in categories.txt @category_secondhand! */ -"category_secondhand" = "二手"; +"category_secondhand" = "二手貨"; /* Search category for places to stay; any changes should be duplicated in categories.txt @category_hotel! */ "category_hotel" = "旅館"; @@ -130,7 +130,7 @@ "category_entertainment" = "娛樂"; /* Search category for ATMs; any changes should be duplicated in categories.txt @category_atm! */ -"category_atm" = "自動櫃員機"; +"category_atm" = "自動提款機"; /* Search category for nightclubs/bars; any changes should be duplicated in categories.txt @category_nightlife! */ "category_nightlife" = "夜生活"; @@ -166,7 +166,7 @@ "category_water" = "水"; /* Search category for RV facilities; any changes should be duplicated in categories.txt @category_rv! */ -"category_rv" = "房車用"; +"category_rv" = "露營車設施"; /********** Other translations **********/ @@ -177,10 +177,10 @@ "load_kmz_title" = "正在載入書籤…"; /* Kmz file successful loading */ -"load_kmz_successful" = "書籤上傳成功! 您可以在地圖上或是書籤管理畫面中找到書籤。"; +"load_kmz_successful" = "書籤載入成功! 您可以在地圖或書籤管理畫面中找到它們。"; /* Kml file loading failed */ -"load_kmz_failed" = "書籤上傳失敗。 檔案可能有毀損或是不完全。"; +"load_kmz_failed" = "書籤載入失敗,檔案可能已損壞或不完整。"; /* resource for context menu */ "edit" = "編輯"; @@ -189,10 +189,10 @@ "unknown_current_position" = "您的位置尚未定位完成"; /* Subject for emailed bookmark */ -"bookmark_share_email_subject" = "嘿,看看我在 Organic Maps 地圖上的圖釘!"; +"bookmark_share_email_subject" = "嘿,看看我在 Organic Maps 上標記的圖釘吧!"; /* Subject for emailed position */ -"my_position_share_email_subject" = "嗨,到 Organic Maps 地圖查看我的目前位置!"; +"my_position_share_email_subject" = "嗨,到 Organic Maps 查看我目前的位置!"; /* Share by email button text, also used in editor and About. */ "email" = "電子郵件"; @@ -201,7 +201,7 @@ "copied_to_clipboard" = "已複製到剪貼簿:%@"; /* place preview title */ -"info" = "簡介"; +"info" = "資訊"; /* Used for bookmark editing */ "done" = "完成"; @@ -246,7 +246,7 @@ "pref_map_3d_buildings_title" = "3D 建築"; /* A message in Settings/Preferences explaining why is it not possible to enable 3D buildings when max power saving mode is enabled */ -"pref_map_3d_buildings_disabled_summary" = "3D 建築在省電模式下關閉"; +"pref_map_3d_buildings_disabled_summary" = "3D 建築在省電模式下處於關閉狀態"; /* Settings «Route» category: «Tts enabled» title */ "pref_tts_enable_title" = "語音指示"; @@ -261,7 +261,7 @@ "pref_tts_language_title" = "語音語言"; /* Settings «Route» category: «Test Voice Directions» title */ -"pref_tts_test_voice_title" = "測試語音指令(TTS、文本轉語音"; +"pref_tts_test_voice_title" = "測試語音指令(TTS,文本轉語音系統)"; /* Title for "Other" section in TTS settings. */ "pref_tts_other_section_title" = "其他"; @@ -273,17 +273,17 @@ "duration_disabled" = "關閉"; -"duration_1_hour" = "1小時"; +"duration_1_hour" = "1 小時"; -"duration_2_hours" = "2小時"; +"duration_2_hours" = "2 小時"; -"duration_6_hours" = "6小時"; +"duration_6_hours" = "6 小時"; -"duration_12_hours" = "12小時"; +"duration_12_hours" = "12 小時"; -"duration_1_day" = "1天"; +"duration_1_day" = "1 天"; -"recent_track_help_text" = "它可讓您記錄特定期間所行經的路徑,並在地圖上看到該路徑。請注意:啟用此項功能會增加電池使用量。在時間間隔過期後,會從地圖中自動移除行進路線。"; +"recent_track_help_text" = "記錄並顯示您在指定時間段內的旅行軌跡。請注意:這會顯著增加電池消耗。"; "placepage_distance" = "距离"; @@ -320,7 +320,7 @@ "donate" = "捐助我們"; /* Tex label above the Donate button */ -"donate_description" = "捐款共同打造最好的地圖!"; +"donate_description" = "捐助,以共同打造最好的地圖!"; /* Button in the main Help dialog */ "copyright" = "版權"; @@ -332,22 +332,22 @@ "report_incorrect_map_bug" = "報告或修復不正確的地圖數據"; /* Button in the About screen */ -"volunteer" = "志工服務"; +"volunteer" = "志願者"; /* "Social media" section header in the About screen */ "follow_us" = "關注並聯絡我們:"; /* Alert text */ -"email_error_body" = "電子郵件客戶端尚未建立。請設定或使用任何其他方式與我們聯絡%@"; +"email_error_body" = "電子郵件客戶端未設定。請配置電子郵件客戶端或通過 %@ 聯絡我們。"; /* Alert title */ -"email_error_title" = "電子郵件發送錯誤"; +"email_error_title" = "電子郵件發送失敗"; /* Settings item title */ "pref_calibration_title" = "指南針校準"; /* Toast text when user hides UI with a long tap anywhere on the map */ -"long_tap_toast" = "再次長按地圖即可看到介面"; +"long_tap_toast" = "再次長按地圖即可查看介面"; /* Update all button text */ "downloader_update_all_button" = "更新全部"; @@ -359,7 +359,7 @@ "downloader_available_maps" = "可用"; /* Country queued for download */ -"downloader_queued" = "已加入下載隊列"; +"downloader_queued" = "已加入到下載隊列"; "downloader_near_me_subtitle" = "在我附近"; @@ -379,10 +379,10 @@ "downloader_status_failed" = "失敗"; /* Displayed in a dialog that appears when a user tries to delete a map while the app is in the follow route mode */ -"downloader_delete_map_while_routing_dialog" = "如欲刪除地圖,請停止導航。"; +"downloader_delete_map_while_routing_dialog" = "要刪除地圖,請停止導航。"; /* PointsInDifferentMWM */ -"routing_failed_cross_mwm_building" = "路程只能完全處在同一地圖裡時才能被建立。"; +"routing_failed_cross_mwm_building" = "路線只能完全處在同一地圖裡時才能被規劃。"; /* Context menu item for downloader. */ "downloader_download_map" = "下載地圖"; @@ -394,10 +394,10 @@ "downloader_delete_map" = "刪除地圖"; /* Text for routing error dialog */ -"routing_download_maps_along" = "下載沿線地圖"; +"routing_download_maps_along" = "下載路線上的所有地圖"; /* Text for routing error dialog */ -"routing_requires_all_map" = "建立路線需要下載並更新好所有從您的位置到目的地的地圖。"; +"routing_requires_all_map" = "規劃路線需要下載並更新好所有從您的位置到目的地的地圖。"; /* bookmark button text */ "bookmark" = "書籤"; @@ -422,7 +422,7 @@ "purple" = "紫色"; /* orange color */ -"orange" = "橘色"; +"orange" = "橙色"; /* brown color */ "brown" = "棕色"; @@ -446,7 +446,7 @@ "lime" = "青檸"; /* deep orange color */ -"deep_orange" = "深橘色"; +"deep_orange" = "深橙色"; /* gray color */ "gray" = "灰色"; @@ -459,59 +459,59 @@ "dialog_routing_disclaimer_title" = "依照路線行進時,請牢記:"; -"dialog_routing_disclaimer_priority" = "— 路況、交通規則及號誌優先於導航意見;"; +"dialog_routing_disclaimer_priority" = "— 路況、交通法規和路標始終優先於導航建議;"; -"dialog_routing_disclaimer_precision" = "— 地圖可能不準確,建議的路線不盡然是最佳選擇;"; +"dialog_routing_disclaimer_precision" = "— 地圖可能不準確,建議的路線可能並非總是前往目的地的最佳路線;"; -"dialog_routing_disclaimer_recommendations" = "— 建議的路線僅供推薦參考;"; +"dialog_routing_disclaimer_recommendations" = "— 建議的路線僅作為推薦路線供您參考;"; -"dialog_routing_disclaimer_borders" = "— 小心對待國界區的路線:我們應用程式建立的路線有時會在未經授權的地方跨越國界;"; +"dialog_routing_disclaimer_borders" = "— 小心對待國界區的路線:我們的應用程式建立的路線有時會在未經授權的地方跨越國界;"; -"dialog_routing_disclaimer_beware" = "請保持警戒,一路平安!"; +"dialog_routing_disclaimer_beware" = "上路時請當心,祝您一路平安!"; -"dialog_routing_check_gps" = "查看 GPS 訊號"; +"dialog_routing_check_gps" = "檢查 GPS 訊號"; -"dialog_routing_error_location_not_found" = "無法產生路線。 無法定位目前 GPS 座標。"; +"dialog_routing_error_location_not_found" = "無法規劃路線。無法識別當前 GPS 座標。"; -"dialog_routing_location_turn_wifi" = "請確認您的 GPS 訊號。啟用無線網路將提升地理位置定位準確度。"; +"dialog_routing_location_turn_wifi" = "請檢查您的 GPS 訊號。啟用無線網路將改善定位精度。"; "dialog_routing_location_turn_on" = "啟用定位服務"; -"dialog_routing_location_unknown_turn_on" = "無法定位目前 GPS 座標。請啟用定位服務以產生路線。"; +"dialog_routing_location_unknown_turn_on" = "無法定位目前 GPS 座標。請啟用定位服務以規劃路線。"; "dialog_routing_download_files" = "下載所需檔案"; -"dialog_routing_download_and_update_all" = "若要產生路線,請下載並更新所有地圖及沿路線的路線檔案。"; +"dialog_routing_download_and_update_all" = "下載或更新沿預期路線的所有地圖,以規劃路線。"; -"dialog_routing_unable_locate_route" = "路線未找到"; +"dialog_routing_unable_locate_route" = "無法定位路線"; -"dialog_routing_change_start_or_end" = "請變更起點或最終目的地。"; +"dialog_routing_change_start_or_end" = "請調整您的起點或目的地。"; -"dialog_routing_change_start" = "變更起點"; +"dialog_routing_change_start" = "調整出發點"; -"dialog_routing_start_not_determined" = "此路線尚未產生。無法定位起點。"; +"dialog_routing_start_not_determined" = "路線未規劃。無法定位起點。"; "dialog_routing_select_closer_start" = "請選擇更接近道路的起點。"; -"dialog_routing_change_end" = "變更目的地"; +"dialog_routing_change_end" = "調整目的地"; -"dialog_routing_end_not_determined" = "未產生路線。無法定位目的地。"; +"dialog_routing_end_not_determined" = "路線未規劃。無法定位目的地。"; -"dialog_routing_select_closer_end" = "請選擇更接近道路的目的地。"; +"dialog_routing_select_closer_end" = "請選擇更接近道路的目的地位置。"; -"dialog_routing_change_intermediate" = "找不到中途休息站。"; +"dialog_routing_change_intermediate" = "無法定位途徑點。"; -"dialog_routing_intermediate_not_determined" = "請調整您的中途休息站。"; +"dialog_routing_intermediate_not_determined" = "請調整您的途徑點。"; "dialog_routing_system_error" = "系統錯誤"; -"dialog_routing_application_error" = "由於此錯誤,尚未建立路線。"; +"dialog_routing_application_error" = "由於應用程式出錯,因此無法規劃路線。"; "dialog_routing_try_again" = "請再試一次"; -"dialog_routing_download_and_build_cross_route" = "您是否要下載地圖,產生跨越邊界的更好路線?"; +"dialog_routing_download_and_build_cross_route" = "您是否要下載地圖,以規劃跨越邊界的更佳路線?"; -"dialog_routing_download_cross_route" = "若要產生跨越邊界的更理想路線,您需要下載地圖。"; +"dialog_routing_download_cross_route" = "下載地圖,以規劃一條跨越邊界的更佳路線。"; /********** Strings for downloading map from search **********/ @@ -526,23 +526,23 @@ "routing_planning_error" = "路線計劃失敗"; /* Arrive routing message in navigation view */ -"routing_arrive" = "抵達:%@"; +"routing_arrive" = "已到達 %@"; /* Text for routing::RouterResultCode::FileTooOld dialog. */ -"dialog_routing_download_and_update_maps" = "要建立路線,請下載並更新所有沿線的地圖。"; +"dialog_routing_download_and_update_maps" = "要規劃路線,請下載並更新所有沿路線的地圖。"; "categories" = "類別"; -"history" = "記錄"; +"history" = "歷史"; -"search_not_found" = "很抱歉,沒有找到任何地點。"; +"search_not_found" = "很抱歉,沒有搜到任何地點。"; /* The message when user did not find anything in the search. */ -"search_not_found_query" = "下載您要搜尋的區域或嘗試新增附近的城鎮/村莊名稱。"; +"search_not_found_query" = "下載您要搜尋的區域的地圖,或嘗試輸入附近的城鎮或村莊名稱。"; "search_history_title" = "搜尋歷史紀錄"; -"search_history_text" = "檢視最近的搜尋。"; +"search_history_text" = "查看您最近的搜尋記錄。"; "clear_search" = "清除搜尋記錄"; @@ -571,9 +571,9 @@ /* Text for allday switch. */ "editor_time_allday" = "全天 (24 小時)"; -"editor_time_open" = "開始營業時間"; +"editor_time_open" = "正在營業"; -"editor_time_close" = "結束營業時間"; +"editor_time_close" = "已歇業"; "editor_time_add_closed" = "新增休息時間"; @@ -589,7 +589,7 @@ "editor_add_select_location" = "位置"; -"editor_done_dialog_1" = "您已經改變了世界地圖。別藏私!告訴您的朋友們一起來編輯。"; +"editor_done_dialog_1" = "您已經改變了世界地圖。請別再藏私了!告訴您的朋友們並一起來編輯地圖。"; "share_with_friends" = "与朋友分享"; @@ -598,12 +598,12 @@ "autodownload" = "自動下載"; /* Place Page opening hours text */ -"closed_now" = "現在關門"; +"closed_now" = "現已關門"; /* Place Page opening hours text */ "daily" = "每天"; -"twentyfour_seven" = "全天候"; +"twentyfour_seven" = "24/7 全天候營業"; "day_off_today" = "今天不營業"; @@ -621,7 +621,7 @@ "closes_at" = "Closes at %@"; -"closes_in" = "將於 %@ 後停業"; +"closes_in" = "將於 %@ 後歇業"; "closed" = "已停止營業"; @@ -631,7 +631,7 @@ "register_at_openstreetmap" = "註冊"; -"password_8_chars_min" = "密碼(最少8個字母)"; +"password_8_chars_min" = "密碼(至少 8 個字符)"; "invalid_username_or_password" = "無效的使用者名稱或密碼。"; @@ -646,7 +646,7 @@ "logout" = "登出"; /* Information text: "Last upload 11.01.2016" */ -"last_upload" = "上次上傳"; +"last_upload" = "最後上傳"; "thank_you" = "謝謝您"; @@ -687,13 +687,13 @@ "downloader_update_maps" = "更新地圖"; -"downloader_search_field_hint" = "尋找地圖"; +"downloader_search_field_hint" = "搜尋地圖"; -"migration_download_error_dialog" = "下載錯誤"; +"migration_download_error_dialog" = "下載失敗"; -"common_check_internet_connection_dialog" = "請檢查您的設定並確保您的設備已連接至網路。"; +"common_check_internet_connection_dialog" = "請檢查您的設定並確保您的裝置已連接至網路。"; -"downloader_no_space_title" = "無足夠的空間"; +"downloader_no_space_title" = "沒有足夠的空間"; "downloader_no_space_message" = "請刪除不必要的資料"; @@ -714,28 +714,28 @@ "editor_edit_place_name_hint" = "該地點的名稱"; /* The second part of the editor_edit_place_name_hint to explain that name should be entered in a local language, see https://wiki.openstreetmap.org/wiki/Key:name */ -"editor_default_language_hint" = "因為它是用當地語言寫的"; +"editor_default_language_hint" = "當地語言寫道"; "editor_edit_place_category_title" = "類別"; -"whatsnew_editor_message_1" = "新增新地點到該地圖,並直接通過此應用程式編輯已存在的地點。"; +"whatsnew_editor_message_1" = "新增新地點到地圖,並直接通過此應用編輯已存在的地點。"; -"dialog_incorrect_feature_position" = "改變位置"; +"dialog_incorrect_feature_position" = "更改位置"; -"message_invalid_feature_position" = "物件無法設置在這裡"; +"message_invalid_feature_position" = "地點無法放置在這裡"; /* Text in About and OSM Login screens. First %@ is replaced by a local, human readable date. */ -"osm_presentation" = "截至 %@ 的社群創建的 OpenStreetMap 資料。請訪問 OpenStreetMap.org 以了解更多有關如何編輯和更新地圖的更多信息。"; +"osm_presentation" = "截至 %@ 的社群創建的 OpenStreetMap 資料。請訪問 OpenStreetMap.org 以了解有關如何編輯和更新地圖的更多信息。"; "login_to_make_edits_visible" = "登入,讓其他使用者能看到您所作出的修改。"; /* Error dialog no space */ -"migration_no_space_message" = "為了下載,您需要更多的空間。請刪除不必要的資料。"; +"migration_no_space_message" = "為了下載,您需要更多的儲存空間。請刪除不必要的檔案。"; "editor_sharing_title" = "我改進了 Organic Maps 地圖"; /* Downloaded 10 **of** 20 <- it is that "of" */ -"downloader_of" = "%1$d個/共%2$d個"; +"downloader_of" = "%1$d / %2$d"; "download_over_mobile_header" = "用手機網路連線下載嗎?"; @@ -743,17 +743,17 @@ "error_enter_correct_house_number" = "輸入正確的門牌號碼"; -"editor_storey_number" = "樓層數(最大 %d)"; +"editor_storey_number" = "樓層數量(最多 %d 層)"; /* Error message in Editor when a user tries to set the number of floors for a building higher than %d floors */ -"error_enter_correct_storey_number" = "編輯最多 %d 層的建築"; +"error_enter_correct_storey_number" = "最多可編輯 %d 層的建築"; "editor_zip_code" = "郵遞區號"; "error_enter_correct_zip_code" = "輸入正確的郵遞區號"; /* Place Page title for long tap */ -"core_placepage_unknown_place" = "未知的位置"; +"core_placepage_unknown_place" = "未知地點"; "editor_other_info" = "給 OSM 社區發送標記"; @@ -763,7 +763,7 @@ "editor_more_about_osm" = "關於 OpenStreetMap 的更多資訊"; -"editor_operator" = "營運者"; +"editor_operator" = "經營者"; "downloader_no_downloaded_maps_title" = "您尚未下載任何地圖"; @@ -773,22 +773,22 @@ "current_location_unknown_error_message" = "定位到您的當前位置時出錯。請檢查您的裝置是否正常運作,然後再試一次。"; -"location_services_disabled_header" = "地點定位被禁用"; +"location_services_disabled_header" = "定位服務已被禁用"; -"location_services_disabled_message" = "啟用設備設置中的地理位置定位"; +"location_services_disabled_message" = "啟用裝置設定中的定位服務"; "location_services_disabled_1" = "1. 開啟設定"; -"location_services_disabled_2" = "2. 點一下位置"; +"location_services_disabled_2" = "2. 點擊位置"; /* iOS Dialog for the case when the location permission is not granted; you might find the exact wording for your language here: https://support.apple.com/en-us/102647 (replace 'en-us' in URL with your language/region) */ -"location_services_disabled_3" = "3. 使用應用時選擇"; +"location_services_disabled_3" = "3. 點擊“使用 App 期間”"; -"location_services_disabled_on_device_2" = "2. 選擇隱私"; +"location_services_disabled_on_device_2" = "2. 點擊“隱私權”"; -"location_services_disabled_on_device_3" = "3. 選擇定位服務"; +"location_services_disabled_on_device_3" = "3. 選擇“定位服務”"; -"location_services_disabled_on_device_4" = "4.開啟定位服務"; +"location_services_disabled_on_device_4" = "4. 開啟“定位服務”"; "location_services_disabled_on_device_additional_message" = "或繼續使用 Organic Maps,但無法定位到您目前所在的位置。"; @@ -815,13 +815,13 @@ "placepage_more_button" = "更多"; -"book_button" = "預約"; +"book_button" = "預定"; /* A referral link on the place page for some hotels */ "more_on_kayak" = "照片、評論、預訂"; /* An explanation dialog shown when clicking on more_on_kayak link. */ -"dialog_kayak_disclaimer" = "透過此連結進行的每次預訂收到的推薦獎金將用於開發 Organic Maps。"; +"dialog_kayak_disclaimer" = "每次通過此鏈接預定所獲得的推薦獎金將用於 Organic Maps 的開發。"; /* A confirmation button text in the explanation dialog that opens hotel details page on Kayak website. */ "dialog_kayak_button" = "Kayak 上的詳細資訊"; @@ -838,13 +838,13 @@ "editor_edits_sent_message" = "您的註釋將發送至 OpenStreetMap"; -"editor_comment_hint" = "註解…"; +"editor_comment_hint" = "備註…"; "editor_reset_edits_message" = "重設所有本機變更?"; "editor_reset_edits_button" = "重設"; -"editor_remove_place_message" = "移除已新增的位置?"; +"editor_remove_place_message" = "移除已新增的地點?"; "editor_remove_place_button" = "移除"; @@ -855,16 +855,16 @@ /* Phone number error message */ "error_enter_correct_phone" = "輸入正確的電話號碼"; -"error_enter_correct_web" = "輸入有效網址"; +"error_enter_correct_web" = "請輸入有效的網址"; -"error_enter_correct_email" = "輸入有效電子郵件"; +"error_enter_correct_email" = "請輸入有效的電子郵件"; "refresh" = "更新"; "placepage_add_place_button" = "將地點新增至 OpenStreetMap"; /* Displayed when saving some edits to the map to warn against publishing personal data */ -"editor_share_to_all_dialog_title" = "您想要發給所有用戶嗎?"; +"editor_share_to_all_dialog_title" = "您想要發送給所有使用者嗎?"; /* Dialog before publishing the modifications to the public map. */ "editor_share_to_all_dialog_message_1" = "確保您沒有輸入任何個人資料。"; @@ -874,14 +874,14 @@ "navigation_stop_button" = "停止"; /* iOS dialog for the case when recent track recording is on and the app comes back from background */ -"recent_track_background_dialog_title" = "禁止記錄您最近去過的路徑?"; +"recent_track_background_dialog_title" = "禁止記錄您最近去過的路線嗎?"; "off_recent_track_background_button" = "禁用"; /* For sharing via SMS and so on */ -"sharing_call_action_look" = "看一看"; +"sharing_call_action_look" = "來看看"; -"recent_track_background_dialog_message" = "Organic Maps使用背景中的地理位置記錄您最近去過的路徑。"; +"recent_track_background_dialog_message" = "Organic Maps 在後臺使用您的位置記錄您最近去過的路線。"; "general_settings" = "一般設定"; @@ -892,9 +892,9 @@ "decline" = "拒絕"; /* A noun - a button name used to show search results in list form */ -"search_in_table" = "清單"; +"search_in_table" = "列表"; -"mobile_data_dialog" = "使用手機網路顯示詳細資訊?"; +"mobile_data_dialog" = "使用手機網路顯示更多詳細資訊嗎?"; "mobile_data_option_always" = "一律使用"; @@ -905,36 +905,36 @@ "mobile_data" = "手機網路"; /* NOTE to translators: please synchronize your translation with the English one. */ -"mobile_data_description" = "需有手機網路才能顯示相片、價格與評論等詳細資訊和地點。"; +"mobile_data_description" = "要顯示地點的詳細資訊(例如照片、價格和評價),需要使用手機網絡。"; "mobile_data_option_never" = "絕不使用"; "mobile_data_option_ask" = "一律詢問"; -"traffic_update_maps_text" = "若要顯示交通資料,必須更新地圖。"; +"traffic_update_maps_text" = "諾要顯示交通資料,必須更新地圖。"; "big_font" = "增加地圖上的字體大小"; /* "traffic" as in road congestion */ -"traffic_update_app_message" = "若要顯示交通資訊,必須更新 app。"; +"traffic_update_app_message" = "諾要顯示交通資訊,必須更新應用。"; /* "traffic" as in "road congestion" */ -"traffic_data_unavailable" = "無法使用交通資訊"; +"traffic_data_unavailable" = "交通資訊不可用"; -"enable_logging" = "啟用記錄"; +"enable_logging" = "啟用日誌記錄"; "log_file_size" = "日誌檔案大小:%@"; -"transliteration_title" = "音譯為拉丁文"; +"transliteration_title" = "拉丁字母音譯"; /* Subway exits for public transport marks on the map */ "core_exit" = "退出"; /* User selected the destination by pressing Route To, but the current position is unknown. User needs to select a starting point of a route using search or by tapping on the map and then pressing "Route From". */ -"routing_add_start_point" = "請使用搜尋或點擊地圖以新增路線起點"; +"routing_add_start_point" = "請搜尋地點或點擊地圖以新增路線起點"; /* User selected the start of a route by pressing Route From. Now the destination of a route should be selected using search or by tapping on the map and then pressing "Route To". */ -"routing_add_finish_point" = "請使用搜尋或點擊地圖以新增目的地"; +"routing_add_finish_point" = "請搜尋地點或點擊地圖以新增目的地"; "planning_route_manage_route" = "管理路線"; @@ -949,52 +949,52 @@ "start_from_my_position" = "起點"; /* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */ -"alert_reauth_message_ios" = "請登入 OpenStreetMap 自動上傳您所有的地圖編輯內容。了解更多"; +"alert_reauth_message_ios" = "請登入 OpenStreetMap 以自動上傳您的所有地圖編輯。了解更多"; /* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */ -"alert_reauth_link_text_ios" = "此處"; +"alert_reauth_link_text_ios" = "這裡"; "core_entrance" = "入口"; "error_enter_correct_name" = "請輸入正確的名稱"; -"bookmark_lists" = "清單"; +"bookmark_lists" = "列表"; /* Do not display all bookmark lists on the map */ "bookmark_lists_hide_all" = "全部隱藏"; "bookmark_lists_show_all" = "全部顯示"; -"bookmarks_create_new_group" = "創建新列表"; +"bookmarks_create_new_group" = "創建新的列表"; /* Bookmark categories screen, button that opens folder selection dialog to import KML/KMZ/GPX/KMB files */ "bookmarks_import" = "導入書籤和軌跡"; "downloader_hide_screen" = "隱藏畫面"; -"downloader_percent" = "%@ (%@,共%@)"; +"downloader_percent" = "%@ (%@ / %@)"; -"downloader_process" = "下載 %@ 中……"; +"downloader_process" = "正在下載 %@…"; -"downloader_applying" = "應用 %@ 中……"; +"downloader_applying" = "正在應用 %@…"; -"bookmarks_error_message_share_general" = "由於 app 出錯而無法分享"; +"bookmarks_error_message_share_general" = "由於應用程式出錯,導致無法分享"; -"bookmarks_error_title_share_empty" = "分享錯誤"; +"bookmarks_error_title_share_empty" = "無法分享"; -"bookmarks_error_message_share_empty" = "無法分享空的列表"; +"bookmarks_error_message_share_empty" = "無法分享空列表"; "bookmarks_error_message_empty_list_name" = "請輸入列表名稱"; -"bookmarks_error_title_list_name_already_taken" = "這個名字已經被使用了"; +"bookmarks_error_title_list_name_already_taken" = "這個名稱已經被使用了"; -"bookmarks_error_title_list_name_too_long" = "這個名字太長了"; +"bookmarks_error_title_list_name_too_long" = "這個名稱太長了"; "profile" = "OpenStreetMap 資料"; "bookmarks_detect_title" = "檢測到新文件"; -"button_convert" = "兌換"; +"button_convert" = "轉換"; "bookmarks_convert_error_title" = "錯誤"; @@ -1016,15 +1016,15 @@ "popular_place" = "受歡迎的"; -"export_file" = "出口KMZ"; +"export_file" = "導出為 KMZ"; -"export_file_gpx" = "導出GPX"; +"export_file_gpx" = "導出為 GPX"; "delete_list" = "刪除列表"; -"hide_from_map" = "從卡中隱藏"; +"hide_from_map" = "從地圖上隱藏"; -"bookmark_list_description_hint" = "增加說明(文字或html)"; +"bookmark_list_description_hint" = "增加說明(文字或 html)"; "tags_loading_error_subtitle" = "載入標籤時出錯,請重試"; @@ -1049,11 +1049,11 @@ "power_managment_setting_never" = "從不"; -"power_managment_setting_auto" = "自動"; +"power_managment_setting_auto" = "當電量低時"; "power_managment_setting_manual_max" = "最大程度省電"; -"enable_logging_warning_message" = "暫時啟用此選項,以便使用「回報問題」功能在幫助對話框中記錄並手動發送詳細的診斷日誌給我們。日誌可能包含位置資訊。"; +"enable_logging_warning_message" = "暫時啟用此選項,以便使用“報告問題”功能在幫助對話框中記錄並手動發送詳細的診斷日誌給我們。日誌可能包含位置資訊。"; "driving_options_title" = "繞行設定"; @@ -1061,7 +1061,7 @@ "avoid_tolls" = "避開收費公路"; /* Recommended length for CarPlay and Android Auto is around 25-27 characters */ -"avoid_unpaved" = "避開未鋪設道路"; +"avoid_unpaved" = "避開未鋪砌道路"; /* Recommended length for CarPlay and Android Auto is around 25-27 characters */ "avoid_ferry" = "避開渡輪"; @@ -1070,29 +1070,29 @@ "unable_to_calc_alert_title" = "無法規劃路線"; -"unable_to_calc_alert_subtitle" = "很遺憾,我們無法使用所選選項規劃路線。請更改設定,然後重試"; +"unable_to_calc_alert_subtitle" = "很遺憾,我們無法使用所選的繞行設定規劃路線。請更改設定,然後重試"; -"define_to_avoid_btn" = "設定繞行路徑"; +"define_to_avoid_btn" = "選擇要避開的道路"; "change_driving_options_btn" = "繞行設定已開啟"; "toll_road" = "收費公路"; -"unpaved_road" = "土路"; +"unpaved_road" = "未鋪砌道路"; "ferry_crossing" = "渡輪"; -"trip_start" = "前往"; +"trip_start" = "出發"; -"pick_destination" = "目標"; +"pick_destination" = "目的地"; -"follow_my_position" = "重新設定中心點"; +"follow_my_position" = "重新居中"; "search_results" = "搜尋結果"; -"then_turn" = "接下來"; +"then_turn" = "然後"; -"redirect_route_alert" = "想重建路線?"; +"redirect_route_alert" = "您想重新規劃路線嗎?"; /* A generic "Yes" button in dialogs */ "yes" = "是"; @@ -1109,45 +1109,45 @@ /* To indicate the capacity of car parkings, bicycle parkings, electric vehicle charging stations... */ "capacity" = "容量:%@"; -"trip_finished" = "您已經到達了!"; +"trip_finished" = "您已到達目的地!"; "keyboard_availability_alert" = "開車時鍵盤不可用"; -"dialog_routing_change_start_carplay" = "無法從當前位置構建路線"; +"dialog_routing_change_start_carplay" = "無法從當前位置規劃路線"; -"dialog_routing_change_end_carplay" = "無法建立到終點的路線。請選擇其他(路線)"; +"dialog_routing_change_end_carplay" = "無法規劃到終點的路線。請選擇其它目的地"; -"dialog_routing_check_gps_carplay" = "無GPS信號。請沿著空曠區域行駛"; +"dialog_routing_check_gps_carplay" = "沒有 GPS 信號。請沿著空曠區域行駛"; -"dialog_routing_unable_locate_route_carplay" = "無法建立路線。請選擇其他路線點"; +"dialog_routing_unable_locate_route_carplay" = "無法規劃路線。請選擇其他路線點"; -"dialog_routing_download_files_carplay" = "爲了創建線路,請在您的設備中下載所缺少的地圖"; +"dialog_routing_download_files_carplay" = "為了規劃路線,請在您的裝置中下載所缺少的地圖"; -"dialog_routing_system_error_carplay" = "發生錯誤,請重新啟動 app"; +"dialog_routing_system_error_carplay" = "發生了錯誤,請重新啟動應用程式"; "dialog_routing_rebuild_from_current_location_carplay" = "該路線將從您的當前位置重建"; -"dialog_routing_rebuild_for_vehicle_carplay" = "該路線將改為汽車(路線)"; +"dialog_routing_rebuild_for_vehicle_carplay" = "路線將轉換為汽車路線"; "not_all_shown_bookmarks_carplay" = "未顯示所有書籤"; -"switch_to_phone_bookmarks_carplay" = "切換到手機查看所有書籤"; +"switch_to_phone_bookmarks_carplay" = "切換到手機以查看所有書籤"; -"ok" = "好"; +"ok" = "好的"; -"speedcams_alert_title_carplay_1" = "測速照相機"; +"speedcams_alert_title_carplay_1" = "限速拍照"; "speedcams_alert_title_carplay_2" = "超速警告"; -"download_map_carplay" = "將Organic Maps app 中的地圖下載至個人設備中"; +"download_map_carplay" = "將Organic Maps 應用程式中的地圖下載至個人裝置中"; -"carplay_roundabout_exit" = "%@號坡道"; +"carplay_roundabout_exit" = "第 %@ 个出口"; /* max. 10 symbols, both iOS and Android */ -"sort" = "分類……"; +"sort" = "排序…"; /* iOS */ -"sort_default" = "按預設值排序"; +"sort_default" = "默認排序"; "sort_type" = "按類型排序"; @@ -1165,7 +1165,7 @@ "moreyear_ago_sorttype" = "一年多以前"; -"near_me_sorttype" = "附近"; +"near_me_sorttype" = "在我附近"; "others_sorttype" = "其他"; @@ -1174,7 +1174,7 @@ "food_places" = "食物"; -"tourist_places" = "觀光景點"; +"tourist_places" = "旅遊景點"; "museums" = "博物館"; @@ -1184,7 +1184,7 @@ "mountains" = "山峰"; -"animals" = "動物園"; +"animals" = "動物"; "hotels" = "旅館"; @@ -1202,7 +1202,7 @@ "search_in_the_list" = "在列表中搜尋"; -"religious_places" = "宗教聖地"; +"religious_places" = "宗教場所"; "transit_not_found" = "本區域的地鐵導航目前不可用"; @@ -1232,7 +1232,7 @@ "elevation_profile_maxaltitude" = "最大高度"; -"elevation_profile_difficulty" = "難易度"; +"elevation_profile_difficulty" = "難度"; "elevation_profile_time" = "時間:"; @@ -1240,13 +1240,13 @@ "downloader_updating_ios" = "更新"; -"downloader_loading_ios" = "載入"; +"downloader_loading_ios" = "正在下載"; /* Autoupdate dialog on start */ "whats_new_auto_update_title" = "更新已下載的地圖"; /* Autoupdate dialog on start */ -"whats_new_auto_update_message" = "更新地圖以讓物件資訊保持在最新狀態"; +"whats_new_auto_update_message" = "更新地圖以讓對象的資訊保持在最新狀態"; /* Autoupdate dialog on start */ "whats_new_auto_update_button_size" = "更新 (%@)"; @@ -1264,7 +1264,7 @@ "move" = "移動"; /* edit track screen title */ -"track_title" = "追踪"; +"track_title" = "軌跡"; /* Telegram group url for the "?" About page */ "telegram_url" = "https://t.me/OrganicMapsApp"; @@ -1282,7 +1282,7 @@ "app_tip_00" = "感謝您使用我們社區構建的地圖!"; /* App tip #01 */ -"app_tip_01" = "有了您的捐贈和支持,我們可以創建世界上最好的地圖!"; +"app_tip_01" = "有了您的捐贈和支持,我們可以創造世界上最好的地圖!"; /* App tip #02 */ "app_tip_02" = "您喜歡我們的應用程序嗎?請捐款以支持發展!還不喜歡嗎?請告訴我們,我們會修復您提到的問題!"; @@ -1315,36 +1315,36 @@ "car_used_on_the_car_screen" = "您現在正在汽車螢幕上使用 Organic Maps"; /* Displayed on the phone screen. Button to display maps on the phone screen instead of a car */ -"car_continue_on_the_phone" = "繼續打電話"; +"car_continue_on_the_phone" = "在手機上繼續"; /* Displayed on the Android Auto or CarPlay screen. Button to display maps on the car screen instead of a phone. Must be no more than 18 symbols! */ -"car_continue_in_the_car" = "到車用螢幕"; +"car_continue_in_the_car" = "轉到汽車屏幕"; /* Outdoors/hiking map style (activity) name in the Styles and Layers dialog */ -"button_layer_outdoor" = "遠足"; +"button_layer_outdoor" = "徒步旅行"; /* Bookmark categories screen, button that opens share dialog to export all bookmarks and tracks */ -"bookmarks_export" = "匯出所有書籤和曲目"; +"bookmarks_export" = "匯出所有書籤和軌跡"; /* Text for the editing the Track's color button. */ -"change_color" = "換顏色"; +"change_color" = "更改顏色"; /* Main screen title "Map" displayed in the navigation back button's menu. */ "map" = "地圖"; -"drive_through" = "免下車服務"; +"drive_through" = "免下車通道"; /* Restaurant or other food place's menu URL field in the Editor */ "website_menu" = "選單連結"; /* Message for the bug report alert. */ -"bugreport_alert_message" = "您想向開發人員發送錯誤報告嗎?\n我們依賴我們的用戶,因為有機地圖不會自動收集任何錯誤訊息。預先感謝您對有機地圖的支持!"; +"bugreport_alert_message" = "您想向開發人員發送錯誤報告嗎?\n由於 Organic Maps 不會自動收集任何錯誤資訊,因此我們只能依靠用戶的協助。感謝您對 Organic Maps 的支持!"; /* Title for the "Enable iCloud Syncronization" alert. */ "enable_icloud_synchronization_title" = "啟用 iCloud 同步"; /* Message for the "Enable iCloud Syncronization" alert. */ -"enable_icloud_synchronization_message" = "iCloud 同步是一項正在開發中的實驗性功能。確保您已備份所有書籤和曲目。"; +"enable_icloud_synchronization_message" = "iCloud 同步是一項正在開發中的實驗性功能。確保您已備份所有書籤和軌跡。"; /* Title for the "iCloud is Disabled" alert. */ "icloud_disabled_title" = "iCloud 已停用"; @@ -1353,7 +1353,7 @@ "icloud_disabled_message" = "請在您的裝置設定中啟用 iCloud 以使用此功能。"; /* Title for the "Enable iCloud Syncronization" alert's "Enable" action button. */ -"enable" = "使能夠"; +"enable" = "啟用"; /* Title for the "Enable iCloud Syncronization" alert's "Backup" action button. */ "backup" = "备份"; @@ -1362,10 +1362,10 @@ "icloud_synchronization_error_alert_title" = "iCloud 同步失敗"; /* iCloud error message: Failed to synchronize due to connection error */ -"icloud_synchronization_error_connection_error" = "錯誤:由於連線錯誤而無法同步"; +"icloud_synchronization_error_connection_error" = "錯誤:由於連線錯誤,導致無法同步"; /* iCloud error message: Failed to synchronize due to iCloud quota exceeded */ -"icloud_synchronization_error_quota_exceeded" = "錯誤:由於超出 iCloud 配額而無法同步"; +"icloud_synchronization_error_quota_exceeded" = "錯誤:由於超出 iCloud 配額,導致同步失敗"; /* iCloud error message: iCloud is not available */ "icloud_synchronization_error_cloud_is_unavailable" = "錯誤:iCloud 不可用"; diff --git a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.stringsdict b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.stringsdict index cd908ff122..2e583114ac 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.stringsdict +++ b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.stringsdict @@ -35,7 +35,7 @@ NSStringFormatValueTypeKey d other - 找到%d個文件。 轉換後你會看到它。 + 找到 %d 個文件,轉換後您才能看到它們。 @@ -50,7 +50,7 @@ NSStringFormatValueTypeKey d other - %d 軌跡 + %d 個軌跡 -- 2.45.3 From a7233ac166f81c3455dba19fdf34fdc98f67dbf5 Mon Sep 17 00:00:00 2001 From: Sergiy Kozyr Date: Wed, 14 Aug 2024 21:44:39 +0300 Subject: [PATCH 34/38] Changed V9MM format to read multiple geometries Signed-off-by: Sergiy Kozyr --- kml/types.cpp | 15 +++++++++++++++ kml/types_v9mm.hpp | 25 +++++++++++++++++++++---- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/kml/types.cpp b/kml/types.cpp index 68d96d34ba..149e89f85d 100644 --- a/kml/types.cpp +++ b/kml/types.cpp @@ -38,4 +38,19 @@ void MultiGeometry::FromPoints(std::vector const & points) ASSERT(line.size() > 1, ()); m_lines.push_back(std::move(line)); } + +MultiGeometry mergeGeometry(std::vector aGeometries) +{ + MultiGeometry merged; + for (auto const & geometry : aGeometries) + { + for (auto const & line : geometry.m_lines) + { + merged.m_lines.push_back(line); + } + } + + return merged; +} + } // namespace kml diff --git a/kml/types_v9mm.hpp b/kml/types_v9mm.hpp index 69a3fd97d5..ea8075f850 100644 --- a/kml/types_v9mm.hpp +++ b/kml/types_v9mm.hpp @@ -5,6 +5,9 @@ namespace kml { + +MultiGeometry mergeGeometry(std::vector aGeometries); + struct TrackDataV9MM : TrackDataV8MM { DECLARE_VISITOR_AND_DEBUG_PRINT(TrackDataV9MM, visitor(m_id, "id"), @@ -13,8 +16,7 @@ struct TrackDataV9MM : TrackDataV8MM visitor(m_description, "description"), visitor(m_layers, "layers"), visitor(m_timestamp, "timestamp"), - visitor(m_flag1, "flag1"), // Extra field introduced in V9MM. - visitor(m_geometry, "geometry"), + visitor(m_multiGeometry, "multiGeometry"), // V9MM introduced multiGeometry instead of a single one visitor(m_visible, "visible"), visitor(m_constant1, "constant1"), visitor(m_constant2, "constant2"), @@ -25,8 +27,23 @@ struct TrackDataV9MM : TrackDataV8MM DECLARE_COLLECTABLE(LocalizableStringIndex, m_name, m_description, m_nearestToponyms, m_properties) - // Extra field introduced in V9MM for tracks. - bool m_flag1 = true; + TrackData ConvertToLatestVersion() const + { + TrackData data; + data.m_id = m_id; + data.m_localId = m_localId; + data.m_name = m_name; + data.m_description = m_description; + data.m_layers = m_layers; + data.m_timestamp = m_timestamp; + data.m_geometry = mergeGeometry(m_multiGeometry); + data.m_visible = m_visible; + data.m_nearestToponyms = m_nearestToponyms; + data.m_properties = m_properties; + return data; + } + + std::vector m_multiGeometry; }; -- 2.45.3 From 07df47bf6676a5f67e3e3299e7659a4e6e06503c Mon Sep 17 00:00:00 2001 From: Sergiy Kozyr Date: Wed, 14 Aug 2024 21:53:55 +0300 Subject: [PATCH 35/38] Added KMB V9MM multi-geometry test case. Signed-off-by: Sergiy Kozyr --- kml/kml_tests/serdes_tests.cpp | 28 ++++++++++++++++++++++++++++ kml/kml_tests/tests_data.hpp | 25 +++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/kml/kml_tests/serdes_tests.cpp b/kml/kml_tests/serdes_tests.cpp index b33d4fddde..062533a369 100644 --- a/kml/kml_tests/serdes_tests.cpp +++ b/kml/kml_tests/serdes_tests.cpp @@ -910,6 +910,34 @@ UNIT_TEST(Kml_Deserialization_From_KMB_V8_And_V9MM) TEST_EQUAL(dataFromBinV8.m_tracksData, dataFromBinV9MM.m_tracksData, ()); } +UNIT_TEST(Kml_Deserialization_From_KMB_V9MM_With_MultiGeometry) +{ + kml::FileData dataFromBinV9MM; + try + { + MemReader reader(kBinKmlMultiGeometryV9MM.data(), kBinKmlMultiGeometryV9MM.size()); + kml::binary::DeserializerKml des(dataFromBinV9MM); + des.Deserialize(reader); + } + catch (kml::binary::DeserializerKml::DeserializeException const & exc) + { + TEST(false, ("Failed to deserialize data from KMB V9MM", exc.what())); + } + + TEST_EQUAL(dataFromBinV9MM.m_tracksData.size(), 1, ()); + + // Verify that geometry has two lines + auto lines = dataFromBinV9MM.m_tracksData[0].m_geometry.m_lines; + TEST_EQUAL(lines.size(), 2, ()); + + // Verify that each line has 3 points + auto line1 = lines[0]; + auto line2 = lines[1]; + + TEST_EQUAL(line1.size(), 3, ()); + TEST_EQUAL(line2.size(), 3, ()); +} + UNIT_TEST(Kml_Ver_2_3) { std::string_view constexpr data = R"( diff --git a/kml/kml_tests/tests_data.hpp b/kml/kml_tests/tests_data.hpp index 809c95b3d5..0b5f0d848f 100644 --- a/kml/kml_tests/tests_data.hpp +++ b/kml/kml_tests/tests_data.hpp @@ -1706,3 +1706,28 @@ std::vector const kBinKmlV9MM = { 0xe8, 0xfd, 0x26, 0x13, 0x8b, 0x1c, 0xc8, 0xc3, 0x06, 0xa4, 0xac, 0xb4, 0x49, 0x06, 0x01, 0x00, 0x29 }; + +// kBinKmlMultiGeometryV9MM contains the track with two lines in geometry +std::vector const kBinKmlMultiGeometryV9MM = { + 0x09, 0x26, 0x41, 0x3a, 0x33, 0x39, 0x37, 0x33, 0x65, 0x66, 0x34, 0x64, 0x2d, 0x66, 0x35, 0x31, + 0x65, 0x2d, 0x34, 0x61, 0x37, 0x31, 0x2d, 0x38, 0x65, 0x64, 0x34, 0x2d, 0x64, 0x65, 0x61, 0x33, + 0x63, 0x31, 0x39, 0x30, 0x64, 0x61, 0x63, 0x35, 0x00, 0x1e, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd3, 0xd0, 0xc3, 0x90, 0x95, 0x32, 0x00, 0x00, 0x09, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x13, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb3, 0xe6, 0xcc, 0x19, 0x00, 0xff, 0xc7, 0x6e, + 0x00, 0x00, 0x02, 0x03, 0x84, 0x92, 0xe7, 0x90, 0x04, 0xe2, 0x85, 0x84, 0x9f, 0x05, 0xf5, 0x02, + 0xad, 0x05, 0xa3, 0x01, 0x85, 0x02, 0xff, 0xff, 0x03, 0x00, 0x00, 0x03, 0xa0, 0x8a, 0xe9, 0x90, + 0x04, 0xdc, 0x89, 0x87, 0x9f, 0x05, 0x0c, 0xe9, 0x02, 0x9b, 0x02, 0x09, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0b, 0x11, 0x06, 0x1d, 0x00, 0x04, 0x01, 0x01, 0x05, 0x0b, + 0x02, 0x04, 0x6d, 0x03, 0x05, 0x3c, 0x04, 0x06, 0x03, 0x05, 0x04, 0x10, 0x06, 0x04, 0x71, 0x07, + 0x05, 0x66, 0x08, 0x04, 0x75, 0x09, 0x05, 0x0f, 0x0a, 0x05, 0x73, 0x0b, 0x05, 0x57, 0x0c, 0x05, + 0x06, 0x0d, 0x05, 0x32, 0x0e, 0x05, 0x77, 0x0f, 0x05, 0x6c, 0x11, 0x05, 0x0d, 0x13, 0x05, 0x4e, + 0x14, 0x06, 0x05, 0x17, 0x05, 0x69, 0x19, 0x05, 0x2f, 0x1a, 0x05, 0x74, 0x1b, 0x05, 0x5d, 0x1c, + 0x05, 0x08, 0x1d, 0x05, 0x37, 0x1e, 0x05, 0x79, 0x1f, 0x05, 0x6e, 0x24, 0x06, 0x04, 0x34, 0x06, + 0x0a, 0x28, 0xfe, 0xa0, 0xf5, 0xf6, 0xc1, 0xf4, 0xbb, 0x38, 0xe8, 0x29, 0x99, 0xe0, 0x0b, 0xa4, + 0x4a, 0x99, 0x03, 0xce, 0x28, 0x46, 0x46, 0xc0, 0x90, 0x36, 0x01, 0x00, 0x04 +}; -- 2.45.3 From bfb066d87d522932a78dcf700838875a28762078 Mon Sep 17 00:00:00 2001 From: Sergiy Kozyr Date: Wed, 14 Aug 2024 22:03:40 +0300 Subject: [PATCH 36/38] Update comment Signed-off-by: Sergiy Kozyr --- kml/header_binary.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kml/header_binary.hpp b/kml/header_binary.hpp index afcf501639..ffb965596c 100644 --- a/kml/header_binary.hpp +++ b/kml/header_binary.hpp @@ -30,8 +30,8 @@ enum class Version : uint8_t // (first byte is 0x08), but it's not compatible with V8 from this repo. It has // no compilations. V9MM = 11 // In July 2024 MapsMe released version with a new KMB format. Technically its version is 9 - // (first byte is 0x09), but it's not compatible with OrganicMaps V9 from this repo. It has - // extra flag in tracks data. + // (first byte is 0x09), but it's not compatible with OrganicMaps V9 from this repo. + // It supports multiline geometry. }; struct Header -- 2.45.3 From ab6d10bf7929b20cc1809a61ee35af31fcaf2c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20W=C3=BCthrich?= Date: Tue, 13 Aug 2024 16:46:46 -0500 Subject: [PATCH 37/38] [ios] Remove updateFrameworkInfo from LocationManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The LocationManager updates the framework location quite complicated. On every location update the LocationManager sets the frameworkUpdateMode property. The setter of this property calls updateFrameworkInfo and passes the update to the framework. A quick test revealed that calling the framework directly without going over the property also works. Removing the frameworkUpdateMode property and the updateFrmeworkInfo makes the code clearer and easier to read. Signed-off-by: Fabian Wüthrich --- .../Maps/Core/Location/MWMLocationManager.mm | 62 +------------------ 1 file changed, 3 insertions(+), 59 deletions(-) diff --git a/iphone/Maps/Core/Location/MWMLocationManager.mm b/iphone/Maps/Core/Location/MWMLocationManager.mm index c7ea911c29..2fe6cdca55 100644 --- a/iphone/Maps/Core/Location/MWMLocationManager.mm +++ b/iphone/Maps/Core/Location/MWMLocationManager.mm @@ -3,7 +3,6 @@ #import "MWMLocationObserver.h" #import "MWMLocationPredictor.h" #import "MWMRouter.h" -#import "MapsAppDelegate.h" #import "SwiftBridge.h" #import "location_util.h" @@ -16,13 +15,6 @@ namespace using Observer = id; using Observers = NSHashTable; -typedef NS_OPTIONS(NSUInteger, MWMLocationFrameworkUpdate) { - MWMLocationFrameworkUpdateNone = 0, - MWMLocationFrameworkUpdateLocation = 1 << 0, - MWMLocationFrameworkUpdateHeading = 1 << 1, - MWMLocationFrameworkUpdateStatus = 1 << 2 -}; - enum class GeoMode { Pending, @@ -162,7 +154,6 @@ void setShowLocationAlert(BOOL needShow) { @property(nonatomic) MWMLocationStatus lastLocationStatus; @property(nonatomic) MWMLocationPredictor * predictor; @property(nonatomic) Observers * observers; -@property(nonatomic) MWMLocationFrameworkUpdate frameworkUpdateMode; @property(nonatomic) location::TLocationSource locationSource; @end @@ -272,7 +263,7 @@ void setShowLocationAlert(BOOL needShow) { LOG(LINFO, ("Location status updated from", DebugPrint(self.lastLocationStatus), "to", DebugPrint(locationStatus))); self.lastLocationStatus = locationStatus; if (self.lastLocationStatus != MWMLocationStatusNoError) - self.frameworkUpdateMode |= MWMLocationFrameworkUpdateStatus; + GetFramework().OnLocationError((location::TLocationError)self.lastLocationStatus); for (Observer observer in self.observers) { if ([observer respondsToSelector:@selector(onLocationError:)]) @@ -283,8 +274,7 @@ void setShowLocationAlert(BOOL needShow) { - (void)processHeadingUpdate:(CLHeading *)headingInfo { self.lastHeadingInfo = headingInfo; - self.frameworkUpdateMode |= MWMLocationFrameworkUpdateHeading; -// location::CompassInfo const compassInfo = compassInfoFromHeading(headingInfo); + GetFramework().OnCompassUpdate(location_util::compassInfoFromHeading(headingInfo)); for (Observer observer in self.observers) { if ([observer respondsToSelector:@selector(onHeadingUpdate:)]) @@ -305,10 +295,10 @@ void setShowLocationAlert(BOOL needShow) { { location::GpsInfo const gpsInfo = location_util::gpsInfoFromLocation(locationInfo, source); GpsTracker::Instance().OnLocationUpdated(gpsInfo); + GetFramework().OnLocationUpdate(gpsInfo); self.lastLocationInfo = locationInfo; self.locationSource = source; - self.frameworkUpdateMode |= MWMLocationFrameworkUpdateLocation; for (Observer observer in self.observers) { if ([observer respondsToSelector:@selector(onLocationUpdate:)]) @@ -588,52 +578,6 @@ void setShowLocationAlert(BOOL needShow) { [locationManager stopUpdatingHeading]; } -#pragma mark - Framework - -- (void)updateFrameworkInfo -{ - auto app = UIApplication.sharedApplication; - auto delegate = static_cast(app.delegate); - if (delegate.isDrapeEngineCreated) - { - auto & f = GetFramework(); - if (self.frameworkUpdateMode & MWMLocationFrameworkUpdateLocation) - { - location::GpsInfo const gpsInfo = - location_util::gpsInfoFromLocation(self.lastLocationInfo, self.locationSource); - f.OnLocationUpdate(gpsInfo); - } - if (self.frameworkUpdateMode & MWMLocationFrameworkUpdateHeading) - f.OnCompassUpdate(location_util::compassInfoFromHeading(self.lastHeadingInfo)); - if (self.frameworkUpdateMode & MWMLocationFrameworkUpdateStatus) - f.OnLocationError((location::TLocationError)self.lastLocationStatus); - self.frameworkUpdateMode = MWMLocationFrameworkUpdateNone; - } - else - { - dispatch_async(dispatch_get_main_queue(), ^{ - [self updateFrameworkInfo]; - }); - } -} - -#pragma mark - Property - -- (void)setFrameworkUpdateMode:(MWMLocationFrameworkUpdate)frameworkUpdateMode -{ - if (frameworkUpdateMode != _frameworkUpdateMode && - _frameworkUpdateMode == MWMLocationFrameworkUpdateNone && - frameworkUpdateMode != MWMLocationFrameworkUpdateNone) - { - _frameworkUpdateMode = frameworkUpdateMode; - [self updateFrameworkInfo]; - } - else - { - _frameworkUpdateMode = frameworkUpdateMode; - } -} - #pragma mark - Location alert + (void)enableLocationAlert { -- 2.45.3 From c82ee7b0473a0f39f99b50f624e378ab17faa60b Mon Sep 17 00:00:00 2001 From: Viktor Govako Date: Wed, 14 Aug 2024 21:16:03 -0300 Subject: [PATCH 38/38] Code cleanup. Signed-off-by: Viktor Govako --- kml/header_binary.hpp | 7 +++-- kml/kml_tests/serdes_tests.cpp | 3 +- kml/serdes_binary.hpp | 31 +++++---------------- kml/types.cpp | 12 +++----- kml/types_v8mm.hpp | 13 +++++---- kml/types_v9mm.hpp | 51 +++------------------------------- 6 files changed, 30 insertions(+), 87 deletions(-) diff --git a/kml/header_binary.hpp b/kml/header_binary.hpp index ffb965596c..cc00eab3f9 100644 --- a/kml/header_binary.hpp +++ b/kml/header_binary.hpp @@ -1,8 +1,6 @@ #pragma once -#include "coding/reader.hpp" #include "coding/serdes_binary_header.hpp" -#include "coding/write_to_sink.hpp" #include @@ -34,6 +32,11 @@ enum class Version : uint8_t // It supports multiline geometry. }; +inline std::string DebugPrint(Version v) +{ + return ::DebugPrint(static_cast(v)); +} + struct Header { template diff --git a/kml/kml_tests/serdes_tests.cpp b/kml/kml_tests/serdes_tests.cpp index 062533a369..f61c439119 100644 --- a/kml/kml_tests/serdes_tests.cpp +++ b/kml/kml_tests/serdes_tests.cpp @@ -7,6 +7,8 @@ #include "indexer/classificator_loader.hpp" +#include "platform/platform.hpp" + #include "coding/file_reader.hpp" #include "coding/file_writer.hpp" #include "coding/hex.hpp" @@ -19,7 +21,6 @@ #include #include -#include #include #include diff --git a/kml/serdes_binary.hpp b/kml/serdes_binary.hpp index 63448b5f8d..32302fb5af 100644 --- a/kml/serdes_binary.hpp +++ b/kml/serdes_binary.hpp @@ -10,10 +10,6 @@ #include "kml/types.hpp" #include "kml/visitors.hpp" -#include "platform/platform.hpp" - -#include "coding/read_write_utils.hpp" -#include "coding/sha1.hpp" #include "coding/text_storage.hpp" #include @@ -262,36 +258,23 @@ private: NonOwningReaderSource source(reader); m_header.Deserialize(source); - if (m_header.m_version == Version::V8) + if (m_header.m_version == Version::V8 || m_header.m_version == Version::V9) { - // Check if file has Opensource V8 or MapsMe V8 format. - // Actual V8 format has 6 offsets (uint64_t) in header. While V8MM has 5 offsets. + // Check if file has Opensource V8/V9 or MapsMe V8/V9 format. + // Actual V8/V9 format has 6 offsets (uint64_t) in header. While V8MM/V9MM has 5 offsets. // It means that first section (usually categories) has offset 0x28 = 40 = 5 * 8. if (m_header.m_categoryOffset == 0x28 || m_header.m_bookmarksOffset == 0x28 || m_header.m_tracksOffset == 0x28 || m_header.m_stringsOffset == 0x28 || m_header.m_compilationsOffset == 0x28) { - LOG(LINFO, ("KMB file has version V8MM")); - m_header.m_version = Version::V8MM; - m_header.m_eosOffset = m_header.m_stringsOffset; - m_header.m_stringsOffset = m_header.m_compilationsOffset; - } - } - if (m_header.m_version == Version::V9) - { - // Check if file has Opensource V9 or MapsMe V9 format. - // Actual V9 format has 6 offsets (uint64_t) in header. While V9MM has 5 offsets. - // It means that first section (usually categories) has offset 0x28 = 40 = 5 * 8. - if (m_header.m_categoryOffset == 0x28 || m_header.m_bookmarksOffset == 0x28 || - m_header.m_tracksOffset == 0x28 || m_header.m_stringsOffset == 0x28 || - m_header.m_compilationsOffset == 0x28) - { - LOG(LINFO, ("KMB file has version V9MM")); - m_header.m_version = Version::V9MM; + m_header.m_version = (m_header.m_version == Version::V8 ? Version::V8MM : Version::V9MM); + LOG(LINFO, ("KMB file has version", m_header.m_version)); + m_header.m_eosOffset = m_header.m_stringsOffset; m_header.m_stringsOffset = m_header.m_compilationsOffset; } } + m_initialized = true; } diff --git a/kml/types.cpp b/kml/types.cpp index 149e89f85d..713cbdeabf 100644 --- a/kml/types.cpp +++ b/kml/types.cpp @@ -39,16 +39,12 @@ void MultiGeometry::FromPoints(std::vector const & points) m_lines.push_back(std::move(line)); } -MultiGeometry mergeGeometry(std::vector aGeometries) +MultiGeometry mergeGeometry(std::vector && aGeometries) { MultiGeometry merged; - for (auto const & geometry : aGeometries) - { - for (auto const & line : geometry.m_lines) - { - merged.m_lines.push_back(line); - } - } + for (auto && geometry : aGeometries) + for (auto && line : geometry.m_lines) + merged.m_lines.push_back(std::move(line)); return merged; } diff --git a/kml/types_v8mm.hpp b/kml/types_v8mm.hpp index 52dd0b4f35..d5ef985b83 100644 --- a/kml/types_v8mm.hpp +++ b/kml/types_v8mm.hpp @@ -264,20 +264,20 @@ struct CategoryDataV8MM }; // FileDataV8MM contains the same sections as FileDataV8 but with no compilations -struct FileDataV8MM +template struct FileDataMMImpl { - DECLARE_VISITOR_AND_DEBUG_PRINT(FileDataV8MM, visitor(m_serverId, "serverId"), + DECLARE_VISITOR_AND_DEBUG_PRINT(FileDataMMImpl, visitor(m_serverId, "serverId"), visitor(m_categoryData, "category"), visitor(m_bookmarksData, "bookmarks"), visitor(m_tracksData, "tracks")) - bool operator==(FileDataV8MM const & data) const + bool operator==(FileDataMMImpl const & data) const { return m_serverId == data.m_serverId && m_categoryData == data.m_categoryData && m_bookmarksData == data.m_bookmarksData && m_tracksData == data.m_tracksData; } - bool operator!=(FileDataV8MM const & data) const { return !operator==(data); } + bool operator!=(FileDataMMImpl const & data) const { return !operator==(data); } FileData ConvertToLatestVersion() { @@ -307,6 +307,9 @@ struct FileDataV8MM // Bookmarks collection. std::vector m_bookmarksData; // Tracks collection. - std::vector m_tracksData; + std::vector m_tracksData; }; + +using FileDataV8MM = FileDataMMImpl; + } // namespace kml diff --git a/kml/types_v9mm.hpp b/kml/types_v9mm.hpp index ea8075f850..685ab6d57f 100644 --- a/kml/types_v9mm.hpp +++ b/kml/types_v9mm.hpp @@ -6,7 +6,7 @@ namespace kml { -MultiGeometry mergeGeometry(std::vector aGeometries); +MultiGeometry mergeGeometry(std::vector && aGeometries); struct TrackDataV9MM : TrackDataV8MM { @@ -27,7 +27,7 @@ struct TrackDataV9MM : TrackDataV8MM DECLARE_COLLECTABLE(LocalizableStringIndex, m_name, m_description, m_nearestToponyms, m_properties) - TrackData ConvertToLatestVersion() const + TrackData ConvertToLatestVersion() { TrackData data; data.m_id = m_id; @@ -36,7 +36,7 @@ struct TrackDataV9MM : TrackDataV8MM data.m_description = m_description; data.m_layers = m_layers; data.m_timestamp = m_timestamp; - data.m_geometry = mergeGeometry(m_multiGeometry); + data.m_geometry = mergeGeometry(std::move(m_multiGeometry)); data.m_visible = m_visible; data.m_nearestToponyms = m_nearestToponyms; data.m_properties = m_properties; @@ -48,49 +48,6 @@ struct TrackDataV9MM : TrackDataV8MM // Contains the same sections as FileDataV8MM but with changed m_tracksData format -struct FileDataV9MM -{ - DECLARE_VISITOR_AND_DEBUG_PRINT(FileDataV9MM, visitor(m_serverId, "serverId"), - visitor(m_categoryData, "category"), - visitor(m_bookmarksData, "bookmarks"), - visitor(m_tracksData, "tracks")) +using FileDataV9MM = FileDataMMImpl; - bool operator==(FileDataV9MM const & data) const - { - return m_serverId == data.m_serverId && m_categoryData == data.m_categoryData && - m_bookmarksData == data.m_bookmarksData && m_tracksData == data.m_tracksData; - } - - bool operator!=(FileDataV9MM const & data) const { return !operator==(data); } - - FileData ConvertToLatestVersion() - { - FileData data; - data.m_deviceId = m_deviceId; - data.m_serverId = m_serverId; - - data.m_categoryData = m_categoryData.ConvertToLatestVersion(); - - data.m_bookmarksData.reserve(m_bookmarksData.size()); - for (auto & d : m_bookmarksData) - data.m_bookmarksData.emplace_back(d.ConvertToLatestVersion()); - - data.m_tracksData.reserve(m_tracksData.size()); - for (auto & t : m_tracksData) - data.m_tracksData.emplace_back(t.ConvertToLatestVersion()); - - return data; - } - - // Device id (it will not be serialized in text files). - std::string m_deviceId; - // Server id. - std::string m_serverId; - // Category's data. - CategoryDataV8MM m_categoryData; - // Bookmarks collection. - std::vector m_bookmarksData; - // Tracks collection. - std::vector m_tracksData; -}; } // namespace kml -- 2.45.3