Merge commit '05cc660641' into traffic

# Conflicts:
#	CMakeLists.txt
#	android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java
#	android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.hpp
#	android/sdk/src/main/cpp/app/organicmaps/sdk/OrganicMaps.cpp
#	android/sdk/src/main/cpp/app/organicmaps/sdk/util/Config.cpp
#	libs/indexer/data_source.hpp
#	libs/indexer/feature.hpp
#	libs/indexer/ftypes_matcher.hpp
#	libs/map/framework.cpp
#	libs/map/traffic_manager.cpp
#	libs/routing/absent_regions_finder.cpp
#	libs/routing/edge_estimator.hpp
#	libs/routing/index_router.cpp
#	libs/routing/index_router.hpp
#	libs/routing/routing_session.hpp
#	libs/routing_common/num_mwm_id.hpp
#	libs/traffic/traffic_info.cpp
#	qt/mainwindow.hpp
#	qt/preferences_dialog.cpp
#	tools/openlr/helpers.hpp
#	tools/openlr/openlr_decoder.cpp
#	tools/openlr/openlr_decoder.hpp
#	tools/openlr/openlr_stat/openlr_stat.cpp
#	tools/openlr/router.hpp
#	tools/openlr/score_candidate_paths_getter.cpp
#	tools/openlr/score_candidate_paths_getter.hpp
#	xcode/CoMaps.xcworkspace/contents.xcworkspacedata
This commit is contained in:
mvglasow
2025-09-10 21:22:40 +03:00
4644 changed files with 82377 additions and 85029 deletions

View File

@@ -94,7 +94,7 @@ final class ChartPointInfoView: UIView {
func update(x: CGFloat, label: String, points: [ChartLineInfo]) {
distanceLabel.text = label
altitudeLabel.text = altitudeText(points[0])
layoutIfNeeded()
setNeedsLayout()
}
private func altitudeText(_ point: ChartLineInfo) -> String {

View File

@@ -16,6 +16,7 @@ public class ChartView: UIView {
var showPreview: Bool = false // Set true to show the preview
private var tapGR: UITapGestureRecognizer!
private var selectedPointDistance: Double = 0
private var panStartPoint = 0
private var panGR: UIPanGestureRecognizer!
private var pinchStartLower = 0
@@ -142,6 +143,8 @@ public class ChartView: UIView {
}
private func setup() {
isUserInteractionEnabled = false
xAxisView.font = font
xAxisView.textColor = textColor
yAxisView.font = font
@@ -168,6 +171,8 @@ public class ChartView: UIView {
}
public func setSelectedPoint(_ x: Double) {
guard selectedPointDistance != x else { return }
selectedPointDistance = x
let routeLength = chartData.xAxisValueAt(CGFloat(chartData.pointsCount - 1))
let upper = chartData.xAxisValueAt(CGFloat(chartPreviewView.maxX))
var lower = chartData.xAxisValueAt(CGFloat(chartPreviewView.minX))
@@ -244,10 +249,10 @@ public class ChartView: UIView {
let lower = max(pinchStartLower + dx, 0)
let upper = min(pinchStartUpper - dx, chartData.labels.count - 1)
if upper - lower < chartData.labels.count / 10 {
guard upper - lower > max(1, chartData.labels.count / 10) else {
return
}
chartPreviewView.setX(min: lower, max: upper)
xAxisView.setBounds(lower: lower, upper: upper)
updateCharts(animationStyle: .none)

View File

@@ -40,7 +40,7 @@ NS_SWIFT_NAME(FrameworkHelper)
+ (MWMMarkGroupID)invalidCategoryId;
+ (void)zoomMap:(MWMZoomMode)mode;
+ (void)moveMap:(UIOffset)offset;
+ (void)scrollMap:(double)distanceX :(double) distanceY;
+ (void)scrollMapToDistanceX:(double)x andY:(double)y;
+ (void)deactivateMapSelection;
+ (void)switchMyPositionMode;
+ (void)stopLocationFollow;

View File

@@ -114,8 +114,9 @@
GetFramework().Move(offset.horizontal, offset.vertical, true);
}
+ (void)scrollMap:(double) distanceX :(double) distanceY {
GetFramework().Scroll(distanceX, distanceY);
+ (void)scrollMapToDistanceX:(double)x andY:(double)y
{
GetFramework().Scroll(x, y);
}
+ (void)deactivateMapSelection {

View File

@@ -8,6 +8,8 @@ NS_ASSUME_NONNULL_BEGIN
@interface PlacePageInfoData : NSObject
@property(nonatomic, readonly, nullable) NSString *openingHoursString;
@property(nonatomic, readonly, nullable) NSDate *checkDate;
@property(nonatomic, readonly, nullable) NSDate *checkDateOpeningHours;
@property(nonatomic, readonly, nullable) OpeningHours *openingHours;
@property(nonatomic, readonly) NSArray<PlacePagePhone *> *phones;
@property(nonatomic, readonly, nullable) NSString *website;
@@ -38,6 +40,8 @@ NS_ASSUME_NONNULL_BEGIN
@property(nonatomic, readonly, nullable) NSString *outdoorSeating;
@property(nonatomic, readonly, nullable) NSString *network;
- (NSDate * _Nullable)getMostRecentCheckDate;
@end
NS_ASSUME_NONNULL_END

View File

@@ -20,8 +20,41 @@ NSString * GetLocalizedMetadataValueString(MapObject::MetadataID metaID, std::st
return ToNSString(platform::GetLocalizedTypeName(feature::ToString(metaID) + "." + value));
}
/// Parse date string in YYYY-MM-DD format to NSDate
NSDate * _Nullable ParseDateString(NSString * _Nullable dateString) {
if (!dateString || dateString.length == 0) {
return nil;
}
static NSDateFormatter *dateFormatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd";
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
});
return [dateFormatter dateFromString:dateString];
}
@implementation PlacePageInfoData
- (NSDate * _Nullable)getMostRecentCheckDate {
// CheckDate can utilize checkDateOpeningHours if that is available
// As surveying opening hours would confirm presence
if (_checkDate && _checkDateOpeningHours) {
// Both available - return the more recent date
return [_checkDate compare:_checkDateOpeningHours] == NSOrderedDescending ? _checkDate : _checkDateOpeningHours;
} else if (_checkDate) {
return _checkDate;
} else if (_checkDateOpeningHours) {
return _checkDateOpeningHours;
} else {
return nil;
}
}
@end
@implementation PlacePageInfoData (Core)
@@ -45,6 +78,12 @@ NSString * GetLocalizedMetadataValueString(MapObject::MetadataID metaID, std::st
_openingHours = [[OpeningHours alloc] initWithRawString:_openingHoursString
localization:localization];
break;
case MetadataID::FMD_CHECK_DATE:
_checkDate = ParseDateString(ToNSString(value));
break;
case MetadataID::FMD_CHECK_DATE_OPEN_HOURS:
_checkDateOpeningHours = ParseDateString(ToNSString(value));
break;
case MetadataID::FMD_PHONE_NUMBER:
{
NSArray<NSString *> *phones = [ToNSString(value) componentsSeparatedByString:@";"];
@@ -100,7 +139,7 @@ NSString * GetLocalizedMetadataValueString(MapObject::MetadataID metaID, std::st
}
});
_atm = rawData.HasAtm() ? NSLocalizedString(@"type.amenity.atm", nil) : nil;
_atm = rawData.HasAtm() ? NSLocalizedStringFromTable(@"type.amenity.atm", @"LocalizableTypes", nil) : nil;
_address = rawData.GetSecondarySubtitle().empty() ? nil : @(rawData.GetSecondarySubtitle().c_str());
_coordFormats = @[@(rawData.GetFormattedCoordinate(place_page::CoordinatesFormat::LatLonDMS).c_str()),

View File

@@ -115,8 +115,9 @@ static PlacePageRoadType convertRoadType(RoadWarningMarkType roadType) {
self.onTrackRecordingProgressUpdate();
}
- (void)handleActiveTrackSelectionPointChanged {
if (!self || !rawData().IsTrack())
- (void)handleActiveTrackSelectionPointChanged
{
if (!self || !PlacePageData.hasData || !rawData().IsTrack())
return;
auto const & trackInfo = GetFramework().GetBookmarkManager().GetTrackSelectionInfo(rawData().GetTrackId());
auto const latlon = mercator::ToLatLon(trackInfo.m_trackPoint);

View File

@@ -7,9 +7,7 @@ final class RangeFirstCell: Cell {
contentView.addSubview(rangeBgView)
rangeBgView.alignToSuperview(UIEdgeInsets(top: 4, left: 4, bottom: -4, right: 0))
rangeBgView.layer.cornerRadius = 8
if #available(iOS 13.0, *) {
rangeBgView.layer.cornerCurve = .continuous
}
rangeBgView.layer.cornerCurve = .continuous
rangeBgView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMinXMaxYCorner]
super.addSubviews()
}

View File

@@ -7,9 +7,7 @@ final class RangeLastCell: Cell {
contentView.addSubview(rangeBgView)
rangeBgView.alignToSuperview(UIEdgeInsets(top: 4, left: 0, bottom: -4, right: -4))
rangeBgView.layer.cornerRadius = 8
if #available(iOS 13.0, *) {
rangeBgView.layer.cornerCurve = .continuous
}
rangeBgView.layer.cornerCurve = .continuous
rangeBgView.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMaxXMaxYCorner]
super.addSubviews()
}

View File

@@ -7,9 +7,7 @@ final class RangeSingleCell: Cell {
contentView.addSubview(rangeBgView)
rangeBgView.alignToSuperview(UIEdgeInsets(top: 4, left: 4, bottom: -4, right: -4))
rangeBgView.layer.cornerRadius = 8
if #available(iOS 13.0, *) {
rangeBgView.layer.cornerCurve = .continuous
}
rangeBgView.layer.cornerCurve = .continuous
super.addSubviews()
}

View File

@@ -7,9 +7,7 @@ class SelectedSingleCell: Cell {
contentView.addSubview(selectedBgView)
selectedBgView.alignToSuperview(UIEdgeInsets(top: 4, left: 4, bottom: -4, right: -4))
selectedBgView.layer.cornerRadius = 8
if #available(iOS 13.0, *) {
selectedBgView.layer.cornerCurve = .continuous
}
selectedBgView.layer.cornerCurve = .continuous
super.addSubviews()
}

View File

@@ -5,9 +5,7 @@ extension CALayer {
if let maskedCorners {
self.maskedCorners = maskedCorners
}
if #available(iOS 13.0, *) {
cornerCurve = .continuous
}
cornerCurve = .continuous
}
}

View File

@@ -181,17 +181,15 @@
- (BOOL)openUrl:(NSString *)urlString externally:(BOOL)externally skipEncoding:(BOOL)skipEncoding
{
// TODO: This is a temporary workaround to open cyrillic/non-ASCII URLs.
// URLs in OSM are stored in UTF-8. NSURL constructor documentation says:
// > Must be a URL that conforms to RFC 2396. This method parses URLString according to RFCs 1738 and 1808.
// The right way to encode the URL string should be:
// 1. Split the (non-ASCII) string into components (host, path, query, fragment, etc.)
// 2. Encode each component separately (they have different allowed characters).
// 3. Merge them back into the string and create NSURL.
NSString * encoded;
if (skipEncoding) {
encoded = urlString;
} else {
NSString * encoded = urlString;
if (!skipEncoding && ![urlString canBeConvertedToEncoding:NSASCIIStringEncoding]) {
// TODO: This is a temporary workaround to open cyrillic/non-ASCII URLs.
// URLs in OSM are stored in UTF-8. NSURL constructor documentation says:
// > Must be a URL that conforms to RFC 2396. This method parses URLString according to RFCs 1738 and 1808.
// The right way to encode the URL string should be:
// 1. Split the (non-ASCII) string into components (host, path, query, fragment, etc.)
// 2. Encode each component separately (they have different allowed characters).
// 3. Merge them back into the string and create NSURL.
NSMutableCharacterSet * charset = [[NSMutableCharacterSet alloc] init];
[charset formUnionWithCharacterSet:NSCharacterSet.URLHostAllowedCharacterSet];
[charset formUnionWithCharacterSet:NSCharacterSet.URLPathAllowedCharacterSet];
@@ -200,7 +198,7 @@
[charset addCharactersInString:@"#;/?:@&=+$,"];
encoded = [urlString stringByAddingPercentEncodingWithAllowedCharacters:charset];
}
// Matrix has an url with two hashes which doesn't work for NSURL and NSURLComponent.
NSRange const matrixUrl = [encoded rangeOfString:@"#/#"];
if (matrixUrl.location != NSNotFound)

View File

@@ -54,9 +54,7 @@ final class CarPlayService: NSObject {
applyBaseRootTemplate()
router.restoreTripPreviewOnCarplay(beforeRootTemplateDidAppear: true)
}
if #available(iOS 13.0, *) {
updateContentStyle(configuration.contentStyle)
}
updateContentStyle(configuration.contentStyle)
FrameworkHelper.updatePositionArrowOffset(false, offset: 5)
CarPlayWindowScaleAdjuster.updateAppearance(
@@ -399,31 +397,36 @@ extension CarPlayService: CPMapTemplateDelegate {
FrameworkHelper.switchMyPositionMode()
}
func mapTemplate(_ mapTemplate: CPMapTemplate, panEndedWith direction: CPMapTemplate.PanDirection) {
@objc(mapTemplate:panEndedWithDirection:)
func mapTemplate(_ mapTemplate: CPMapTemplate, panEndedWith direction: Int) {
var offset = UIOffset(horizontal: 0.0, vertical: 0.0)
let offsetStep: CGFloat = 0.25
if direction.contains(.up) { offset.vertical -= offsetStep }
if direction.contains(.down) { offset.vertical += offsetStep }
if direction.contains(.left) { offset.horizontal += offsetStep }
if direction.contains(.right) { offset.horizontal -= offsetStep }
let panDirection = CPMapTemplate.PanDirection(rawValue: direction)
if panDirection.contains(.up) { offset.vertical -= offsetStep }
if panDirection.contains(.down) { offset.vertical += offsetStep }
if panDirection.contains(.left) { offset.horizontal += offsetStep }
if panDirection.contains(.right) { offset.horizontal -= offsetStep }
FrameworkHelper.moveMap(offset)
isUserPanMap = true
}
func mapTemplate(_ mapTemplate: CPMapTemplate, panWith direction: CPMapTemplate.PanDirection) {
@objc(mapTemplate:panWithDirection:)
func mapTemplate(_ mapTemplate: CPMapTemplate, panWith direction: Int) {
var offset = UIOffset(horizontal: 0.0, vertical: 0.0)
let offsetStep: CGFloat = 0.1
if direction.contains(.up) { offset.vertical -= offsetStep }
if direction.contains(.down) { offset.vertical += offsetStep }
if direction.contains(.left) { offset.horizontal += offsetStep }
if direction.contains(.right) { offset.horizontal -= offsetStep }
let panDirection = CPMapTemplate.PanDirection(rawValue: direction)
if panDirection.contains(.up) { offset.vertical -= offsetStep }
if panDirection.contains(.down) { offset.vertical += offsetStep }
if panDirection.contains(.left) { offset.horizontal += offsetStep }
if panDirection.contains(.right) { offset.horizontal -= offsetStep }
FrameworkHelper.moveMap(offset)
isUserPanMap = true
}
func mapTemplate(_ mapTemplate: CPMapTemplate, didUpdatePanGestureWithTranslation translation: CGPoint, velocity: CGPoint) {
let scaleFactor = self.carplayVC?.mapView?.contentScaleFactor ?? 1
FrameworkHelper.scrollMap(-scaleFactor * translation.x, -scaleFactor * translation.y);
FrameworkHelper.scrollMap(toDistanceX:-scaleFactor * translation.x, andY:-scaleFactor * translation.y);
}
func mapTemplate(_ mapTemplate: CPMapTemplate, startedTrip trip: CPTrip, using routeChoice: CPRouteChoice) {

View File

@@ -96,14 +96,12 @@ final class ListTemplateBuilder {
bookmarkId: bookmark.bookmarkId))
return item
})
if #available(iOS 15.0, *) {
let maxItemCount = CPListTemplate.maximumItemCount - 1
if items.count >= maxItemCount {
items = Array(items.prefix(maxItemCount))
let cropWarning = CPListItem(text: L("not_all_shown_bookmarks_carplay"), detailText: L("switch_to_phone_bookmarks_carplay"))
cropWarning.isEnabled = false
items.append(cropWarning)
}
let maxItemCount = CPListTemplate.maximumItemCount - 1
if items.count >= maxItemCount {
items = Array(items.prefix(maxItemCount))
let cropWarning = CPListItem(text: L("not_all_shown_bookmarks_carplay"), detailText: L("switch_to_phone_bookmarks_carplay"))
cropWarning.isEnabled = false
items.append(cropWarning)
}
let section = CPListSection(items: items)
template.updateSections([section])
@@ -125,9 +123,9 @@ final class ListTemplateBuilder {
private class func buildBarButton(type: BarButtonType, action: ((CPBarButton) -> Void)?) -> CPBarButton {
switch type {
case .bookmarks:
return CPBarButton(image: UIImage(named: "ic_carplay_bookmark")!, handler: action)
return CPBarButton(image: UIImage(systemName: "list.star")!, handler: action)
case .search:
return CPBarButton(image: UIImage(named: "ic_carplay_keyboard")!, handler: action)
return CPBarButton(image: UIImage(systemName: "keyboard.fill")!, handler: action)
}
}
}

View File

@@ -172,7 +172,7 @@ final class MapTemplateBuilder {
case .recenter:
return CPBarButton(title: L("follow_my_position"), handler: action)
case .settings:
return CPBarButton(image: UIImage(named: "ic_carplay_settings")!, handler: action)
return CPBarButton(image: UIImage(systemName: "gearshape.fill")!, handler: action)
case .mute:
return CPBarButton(image: UIImage(named: "ic_carplay_unmuted")!, handler: action)
case .unmute:

View File

@@ -29,12 +29,7 @@ class CopyableLabel: UILabel {
var rect = bounds
rect.origin = locationOfTouchInLabel
rect.size = CGSize(width: 1, height: 1)
if #available(iOS 13, *) {
menu.showMenu(from: self, rect: rect)
} else {
menu.setTargetRect(rect, in: self)
menu.setMenuVisible(true, animated: false)
}
menu.showMenu(from: self, rect: rect)
}
}

View File

@@ -117,10 +117,18 @@ NSString *const kNavigationControlViewXibName = @"NavigationControlView";
- (void)onRouteReady:(BOOL)hasWarnings {
if (self.state != MWMNavigationDashboardStateNavigation)
self.state = MWMNavigationDashboardStateReady;
if ([MWMRouter hasActiveDrivingOptions]) {
self.routePreview.drivingOptionsState = MWMDrivingOptionsStateChange;
MWMRouterType const routerType = [MWMRouter type];
if (routerType == MWMRouterTypePublicTransport || routerType == MWMRouterTypeRuler) {
// For Public Transport and Ruler modes, there are no road restrictions, so always hide the button.
self.routePreview.drivingOptionsState = MWMDrivingOptionsStateNone;
} else {
self.routePreview.drivingOptionsState = hasWarnings ? MWMDrivingOptionsStateDefine : MWMDrivingOptionsStateNone;
// For all other modes (Vehicle, Pedestrian, Bicycle), show the button.
if ([MWMRouter hasActiveDrivingOptions]) {
self.routePreview.drivingOptionsState = MWMDrivingOptionsStateChange;
} else {
self.routePreview.drivingOptionsState = MWMDrivingOptionsStateDefine;
}
}
}

View File

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23727" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@@ -37,7 +37,7 @@
<rect key="frame" x="0.0" y="68" width="320" height="48"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Opi-yT-xIZ">
<rect key="frame" x="72.5" y="12" width="175" height="24"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="48"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
<state key="normal" title="DEFINE ROADS TO AVOID" image="ic_options_warning"/>
<connections>
@@ -50,9 +50,11 @@
<constraints>
<constraint firstItem="Opi-yT-xIZ" firstAttribute="centerX" secondItem="l7E-Ns-2Nn" secondAttribute="centerX" id="5DK-9d-8qb"/>
<constraint firstItem="Opi-yT-xIZ" firstAttribute="centerY" secondItem="l7E-Ns-2Nn" secondAttribute="centerY" id="JFn-Vg-Wby"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Opi-yT-xIZ" secondAttribute="trailing" constant="16" id="aCy-jn-U2B"/>
<constraint firstItem="THL-V3-3xS" firstAttribute="bottom" secondItem="Opi-yT-xIZ" secondAttribute="bottom" id="LbO-Ze-Pwl"/>
<constraint firstItem="Opi-yT-xIZ" firstAttribute="top" secondItem="THL-V3-3xS" secondAttribute="top" id="OnE-Yh-Inw"/>
<constraint firstAttribute="trailing" secondItem="Opi-yT-xIZ" secondAttribute="trailing" id="aCy-jn-U2B"/>
<constraint firstAttribute="height" constant="48" id="mCi-1V-xX4"/>
<constraint firstItem="Opi-yT-xIZ" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="l7E-Ns-2Nn" secondAttribute="leading" constant="16" id="vdk-Ef-Kk1"/>
<constraint firstItem="Opi-yT-xIZ" firstAttribute="leading" secondItem="l7E-Ns-2Nn" secondAttribute="leading" id="vdk-Ef-Kk1"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="SecondaryBackground"/>
@@ -139,10 +141,10 @@
</constraints>
<variation key="default">
<mask key="constraints">
<exclude reference="BWr-hr-pwo"/>
<exclude reference="Cd3-ev-uFS"/>
<exclude reference="Zs5-bj-AR6"/>
<exclude reference="qTV-BL-cX4"/>
<exclude reference="BWr-hr-pwo"/>
<exclude reference="Zs5-bj-AR6"/>
</mask>
</variation>
</view>
@@ -282,7 +284,7 @@
</userDefinedRuntimeAttributes>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NAs-km-8uw">
<rect key="frame" x="20" y="12" width="127" height="24"/>
<rect key="frame" x="20" y="12" width="119" height="24"/>
<state key="normal" title="ManageRoute" image="ic_24px_manager"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="medium14:MWMBlack"/>

View File

@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23727" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/>
<capability name="Image references" minToolsVersion="12.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@@ -25,7 +26,7 @@
<rect key="frame" x="0.0" y="48" width="320" height="48"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZXA-Og-q2I">
<rect key="frame" x="72.5" y="12" width="175" height="24"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="48"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="12"/>
<state key="normal" title="DEFINE ROADS TO AVOID" image="ic_options_warning"/>
<connections>
@@ -35,11 +36,13 @@
</subviews>
<color key="backgroundColor" red="0.12156862745098039" green="0.59999999999999998" blue="0.32156862745098036" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="ZXA-Og-q2I" secondAttribute="trailing" constant="16" id="9bx-3j-h0U"/>
<constraint firstItem="ZXA-Og-q2I" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Ib5-qh-Cmo" secondAttribute="leading" constant="16" id="IYq-Pa-Tai"/>
<constraint firstAttribute="trailing" secondItem="ZXA-Og-q2I" secondAttribute="trailing" id="9bx-3j-h0U"/>
<constraint firstItem="ZXA-Og-q2I" firstAttribute="leading" secondItem="Ib5-qh-Cmo" secondAttribute="leading" id="IYq-Pa-Tai"/>
<constraint firstItem="ZXA-Og-q2I" firstAttribute="centerX" secondItem="Ib5-qh-Cmo" secondAttribute="centerX" id="Uq2-QA-bWZ"/>
<constraint firstAttribute="bottom" secondItem="ZXA-Og-q2I" secondAttribute="bottom" id="ga1-Mh-GwC"/>
<constraint firstItem="ZXA-Og-q2I" firstAttribute="centerY" secondItem="Ib5-qh-Cmo" secondAttribute="centerY" id="l5z-Dg-joz"/>
<constraint firstAttribute="height" constant="48" id="l8l-Ii-g5U"/>
<constraint firstItem="ZXA-Og-q2I" firstAttribute="top" secondItem="Ib5-qh-Cmo" secondAttribute="top" id="oca-09-5v4"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="SecondaryBackground"/>

View File

@@ -81,7 +81,7 @@ double getExactDPI(double contentScaleFactor)
if (tempContext != nil)
apiVersion = dp::ApiVersion::OpenGLES3;
else
apiVersion = dp::ApiVersion::OpenGLES2;
CHECK(false, ("OpenGL ES3 is not supported"));
}
return apiVersion;

View File

@@ -1,11 +1,7 @@
final class LoadingOverlayViewController: UIViewController {
private var activityIndicator: UIActivityIndicatorView = {
let indicator: UIActivityIndicatorView
if #available(iOS 13.0, *) {
indicator = UIActivityIndicatorView(style: .large)
} else {
indicator = UIActivityIndicatorView(style: .whiteLarge)
}
indicator = UIActivityIndicatorView(style: .large)
indicator.color = .white
indicator.startAnimating()
indicator.translatesAutoresizingMaskIntoConstraints = false

View File

@@ -908,19 +908,29 @@ NSString *const kAboutSegue = @"Map2About";
CGPoint translation = [recognizer translationInView:self.view];
if (translation.x == 0 && translation.y == 0 && CGPointEqualToPoint(translation, CGPointZero))
return;
self.userTouchesAction = UserTouchesActionDrag;
CGPoint velocity = [recognizer velocityInView:self.view];
CGFloat velocityX = ABS(velocity.x * 0.001);
velocityX = MAX(1, velocityX);
if (velocityX > 2.5) {
velocityX = 2.5;
BOOL isShiftPressed = [recognizer modifierFlags] & UIKeyModifierShift;
if (isShiftPressed) {
self.userTouchesAction = UserTouchesActionScale;
static const CGFloat kScaleFactor = 0.9;
const CGFloat factor = translation.y > 0 ? kScaleFactor : 1 / kScaleFactor;
GetFramework().Scale(factor, [self getZoomPoint], false);
} else {
self.userTouchesAction = UserTouchesActionDrag;
CGPoint velocity = [recognizer velocityInView:self.view];
CGFloat velocityX = ABS(velocity.x * 0.001);
velocityX = MAX(1, velocityX);
if (velocityX > 2.5) {
velocityX = 2.5;
}
CGFloat velocityY = ABS(velocity.y * 0.001);
velocityY = MAX(1, velocityY);
if (velocityY > 2.5) {
velocityY = 2.5;
}
GetFramework().Scroll((translation.x * velocityX) * -1, (translation.y * velocityY) * -1);
}
CGFloat velocityY = ABS(velocity.y * 0.001);
velocityY = MAX(1, velocityY);
if (velocityY > 2.5) {
velocityY = 2.5;
}
GetFramework().Scroll((translation.x * velocityX) * -1, (translation.y * velocityY) * -1);
[recognizer setTranslation:CGPointZero inView:self.view];
break;
}
@@ -938,7 +948,7 @@ NSString *const kAboutSegue = @"Map2About";
case UIGestureRecognizerStateChanged:
{
CGPoint translation = [recognizer translationInView:self.view];
if (translation.x == 0 && CGPointEqualToPoint(translation, CGPointZero))
if (translation.y == 0)
return;
self.userTouchesAction = UserTouchesActionScale;
static const CGFloat kScaleFactor = 0.9;

View File

@@ -11,34 +11,34 @@ public:
: dp::metal::MetalBaseContext(metalLayer.device, screenSize, [this]{ return [m_metalLayer nextDrawable]; })
, m_metalLayer(metalLayer)
{}
void Resize(int w, int h) override
void Resize(uint32_t w, uint32_t h) override
{
m_metalLayer.drawableSize = CGSize{static_cast<float>(w), static_cast<float>(h)};
ResetFrameDrawable();
dp::metal::MetalBaseContext::Resize(w, h);
}
private:
CAMetalLayer * m_metalLayer;
};
class UploadMetalContext : public dp::metal::MetalBaseContext
{
public:
explicit UploadMetalContext(id<MTLDevice> device)
: dp::metal::MetalBaseContext(device, {}, nullptr)
{}
void Present() override {}
void MakeCurrent() override {}
void Resize(int w, int h) override {}
void Resize(uint32_t w, uint32_t h) override {}
void SetFramebuffer(ref_ptr<dp::BaseFramebuffer> framebuffer) override {}
void Init(dp::ApiVersion apiVersion) override
{
CHECK_EQUAL(apiVersion, dp::ApiVersion::Metal, ());
}
void SetClearColor(dp::Color const & color) override {}
void Clear(uint32_t clearBits, uint32_t storeBits) override {}
void Flush() override {}

View File

@@ -18,7 +18,7 @@ public:
void MakeCurrent() override;
void Present() override;
void SetFramebuffer(ref_ptr<dp::BaseFramebuffer> framebuffer) override;
void Resize(int w, int h) override;
void Resize(uint32_t w, uint32_t h) override;
void SetPresentAvailable(bool available) override;
private:

View File

@@ -17,20 +17,14 @@ iosOGLContext::iosOGLContext(CAEAGLLayer * layer, dp::ApiVersion apiVersion,
, m_frameBufferId(0)
, m_presentAvailable(true)
{
EAGLRenderingAPI api;
if (m_apiVersion == dp::ApiVersion::OpenGLES3)
api = kEAGLRenderingAPIOpenGLES3;
else
api = kEAGLRenderingAPIOpenGLES2;
if (contextToShareWith != NULL)
{
m_nativeContext = [[EAGLContext alloc] initWithAPI:api
m_nativeContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3
sharegroup: contextToShareWith->m_nativeContext.sharegroup];
}
else
{
m_nativeContext = [[EAGLContext alloc] initWithAPI:api];
m_nativeContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
}
}
@@ -87,7 +81,7 @@ void iosOGLContext::SetFramebuffer(ref_ptr<dp::BaseFramebuffer> framebuffer)
}
}
void iosOGLContext::Resize(int w, int h)
void iosOGLContext::Resize(uint32_t w, uint32_t h)
{
if (m_needBuffers && m_hasBuffers)
{
@@ -95,7 +89,7 @@ void iosOGLContext::Resize(int w, int h)
GLint height = 0;
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);
if (width == w && height == h)
if (width == static_cast<GLint>(w) && height == static_cast<GLint>(h))
return;
DestroyBuffers();

View File

@@ -8,6 +8,8 @@
<array>
<string>applinks:comaps.at</string>
</array>
<key>com.apple.developer.carplay-maps</key>
<true/>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.app.comaps.debug</string>

View File

@@ -8,6 +8,8 @@
<array>
<string>applinks:comaps.at</string>
</array>
<key>com.apple.developer.carplay-maps</key>
<true/>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.app.comaps</string>

View File

@@ -1,7 +1,7 @@
import Foundation
var isiPad: Bool {
if #available(iOS 14.0, *), ProcessInfo.processInfo.isiOSAppOnMac {
if ProcessInfo.processInfo.isiOSAppOnMac {
return true
}
return UIDevice.current.userInterfaceIdiom == .pad

View File

@@ -4,6 +4,7 @@
#include <string>
#include <map>
#include <functional>
#include "editor/osm_editor.hpp"
@implementation MWMEditorHelper

View File

@@ -146,6 +146,10 @@ char const *kRenderAltitudeImagesQueueLabel = "mapsme.mwmrouter.renderAltitudeIm
_canAutoAddLastLocation = YES;
_routingOptions = [MWMRoutingOptions new];
_isRestoreProcessCompleted = NO;
[NSNotificationCenter.defaultCenter addObserverForName:@"RoutingOptionsChanged" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull notification) {
[MWMRouter updateRoute];
}];
}
return self;
}
@@ -570,7 +574,7 @@ char const *kRenderAltitudeImagesQueueLabel = "mapsme.mwmrouter.renderAltitudeIm
+ (void)updateRoute {
MWMRoutingOptions *newOptions = [MWMRoutingOptions new];
if ((self.isRoutingActive && !self.isOnRoute) && ![newOptions isEqual:[self router].routingOptions]) {
if (self.isRoutingActive && !self.isOnRoute && ![newOptions isEqual:[self router].routingOptions]) {
[self rebuildWithBestRouter:YES];
}
}

View File

@@ -66,13 +66,20 @@
}
case osm::No: {
const int minutes = result.GetMinutesUntilOpen();
if (minutes < 60) { // less than 1 hour
if (minutes < 15) { // less than 15 minutes
_openStatusColor = [UIColor colorNamed:@"Base Colors/Yellow Color"];
NSString * time = [NSString stringWithFormat:@"%d %@", minutes, L(@"minute")];
_openStatusText = [NSString stringWithFormat:L(@"opens_in"), time];
} else {
}
else if (minutes < 60) { // less than an hour (but more than 15 mins)
_openStatusColor = [UIColor colorNamed:@"Base Colors/Red Color"];
NSString * time = [NSString stringWithFormat:@"%d %@", minutes, L(@"minute")];
_openStatusText = [NSString stringWithFormat:L(@"opens_in"), time];
}
else { // opens later or schedule is unknown
_openStatusColor = [UIColor colorNamed:@"Base Colors/Red Color"];
_openStatusText = L(@"closed");
}
_openStatusColor = [UIColor colorNamed:@"Base Colors/Red Color"];
break;
}
case osm::Unknown: {

View File

@@ -45,10 +45,6 @@
listener.applyTheme()
}
}
if #available(iOS 13, *) {} else {
UISearchBarRenderer.setAppearance()
}
}
private func updateView(_ view: UIView?) {

View File

@@ -10,31 +10,19 @@ final class ThemeManager: NSObject {
}
private func update(theme: MWMTheme) {
if #available(iOS 13.0, *) {
updateSystemUserInterfaceStyle(theme)
}
updateSystemUserInterfaceStyle(theme)
let actualTheme: MWMTheme = { theme in
let isVehicleRouting = MWMRouter.isRoutingActive() && (MWMRouter.type() == .vehicle)
let isVehicleRouting = MWMRouter.isRoutingActive() && (MWMRouter.type() == .vehicle) && MWMRouter.hasSavedRoute()
switch theme {
case .day: fallthrough
case .vehicleDay: return isVehicleRouting ? .vehicleDay : .day
case .night: fallthrough
case .vehicleNight: return isVehicleRouting ? .vehicleNight : .night
case .auto:
if #available(iOS 13.0, *) {
let isDarkModeEnabled = UIScreen.main.traitCollection.userInterfaceStyle == .dark
guard isVehicleRouting else { return isDarkModeEnabled ? .night : .day }
return isDarkModeEnabled ? .vehicleNight : .vehicleDay
} else {
guard isVehicleRouting else { return .day }
switch FrameworkHelper.daytime(at: LocationManager.lastLocation()) {
case .day: return .vehicleDay
case .night: return .vehicleNight
@unknown default:
fatalError()
}
}
let isDarkModeEnabled = UIScreen.main.traitCollection.userInterfaceStyle == .dark
guard isVehicleRouting else { return isDarkModeEnabled ? .night : .day }
return isDarkModeEnabled ? .vehicleNight : .vehicleDay
@unknown default:
fatalError()
}

View File

@@ -92,13 +92,14 @@ extension MapStyleSheet: IStyleSheet {
s.backgroundColor = colors.linkBlue
s.cornerRadius = .buttonSmall
s.shadowRadius = 2
s.shadowColor = colors.blackHintText
s.shadowOpacity = 1
s.shadowColor = colors.shadow
s.shadowOpacity = 0.2
s.shadowOffset = CGSize(width: 0, height: 2)
}
case .mapSecondTurnView:
return .addFrom(Self.mapFirstTurnView) { s in
s.backgroundColor = colors.white
s.shadowColor = colors.blackPrimaryText
}
case .mapAutoupdateView:
return .add { s in

View File

@@ -15,23 +15,15 @@ class UINavigationBarRenderer: UIViewRenderer {
class func render(_ control: UINavigationBar, style: Style) {
super.render(control, style: style)
if let barTintColor = style.barTintColor {
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = barTintColor
control.standardAppearance = appearance
control.scrollEdgeAppearance = appearance
} else {
control.barTintColor = barTintColor
}
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = barTintColor
control.standardAppearance = appearance
control.scrollEdgeAppearance = appearance
}
if let shadowImage = style.shadowImage {
if #available(iOS 13.0, *) {
control.standardAppearance.shadowImage = shadowImage
control.scrollEdgeAppearance!.shadowImage = shadowImage
} else {
control.shadowImage = shadowImage
}
control.standardAppearance.shadowImage = shadowImage
control.scrollEdgeAppearance!.shadowImage = shadowImage
}
var attributes = [NSAttributedString.Key: Any]()
@@ -41,11 +33,7 @@ class UINavigationBarRenderer: UIViewRenderer {
if let fontColor = style.fontColor {
attributes[NSAttributedString.Key.foregroundColor] = fontColor
}
if #available(iOS 13.0, *) {
control.standardAppearance.titleTextAttributes = attributes
control.scrollEdgeAppearance!.titleTextAttributes = attributes
} else {
control.titleTextAttributes = attributes
}
control.standardAppearance.titleTextAttributes = attributes
control.scrollEdgeAppearance!.titleTextAttributes = attributes
}
}

View File

@@ -24,43 +24,34 @@ extension UISearchBar {
class UISearchBarRenderer: UIViewRenderer {
class func render(_ control: UISearchBar, style: Style) {
super.render(control, style: style)
if #available(iOS 13, *) {
let searchTextField = control.searchTextField
// Default search bar implementation adds the grey transparent image for background. This code removes it and updates the corner radius. This is not working on iPad designed for mac.
if #available(iOS 14.0, *), ProcessInfo.processInfo.isiOSAppOnMac {
} else {
control.setSearchFieldBackgroundImage(UIImage(), for: .normal)
}
searchTextField.layer.setCornerRadius(.buttonDefault)
searchTextField.layer.masksToBounds = true
// Placeholder color
if let placeholder = searchTextField.placeholder {
searchTextField.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: [.foregroundColor: UIColor.gray])
}
if let backgroundColor = style.backgroundColor {
searchTextField.backgroundColor = backgroundColor
}
if let font = style.font {
searchTextField.font = font
}
if let fontColor = style.fontColor {
searchTextField.textColor = fontColor
}
if let tintColor = style.tintColor {
searchTextField.leftView?.tintColor = tintColor
// Placeholder indicator color
searchTextField.tintColor = tintColor
// Clear button image
let clearButtonImage = UIImage(named: "ic_clear")?.withRenderingMode(.alwaysTemplate).withTintColor(tintColor)
control.setImage(clearButtonImage, for: .clear, state: .normal)
}
} else {
// Default search bar implementation for iOS12 adds the dark grey transparent image for background. This code removes it and replace with the custom image accordingly to the documentation - see 'setSearchFieldBackgroundImage'.
if let backgroundColor = style.backgroundColor {
let image = getSearchBarBackgroundImage(color: backgroundColor)
control.setSearchFieldBackgroundImage(image, for: .normal)
control.searchTextPositionAdjustment = UIOffset(horizontal: 6.0, vertical: 0.0)
}
let searchTextField = control.searchTextField
// Default search bar implementation adds the grey transparent image for background. This code removes it and updates the corner radius. This is not working on iPad designed for mac.
if !ProcessInfo.processInfo.isiOSAppOnMac {
control.setSearchFieldBackgroundImage(UIImage(), for: .normal)
}
searchTextField.layer.setCornerRadius(.buttonDefault)
searchTextField.layer.masksToBounds = true
// Placeholder color
if let placeholder = searchTextField.placeholder {
searchTextField.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: [.foregroundColor: UIColor.gray])
}
if let backgroundColor = style.backgroundColor {
searchTextField.backgroundColor = backgroundColor
}
if let font = style.font {
searchTextField.font = font
}
if let fontColor = style.fontColor {
searchTextField.textColor = fontColor
}
if let tintColor = style.tintColor {
searchTextField.leftView?.tintColor = tintColor
// Placeholder indicator color
searchTextField.tintColor = tintColor
// Clear button image
let clearButtonImage = UIImage(named: "ic_clear")?.withRenderingMode(.alwaysTemplate).withTintColor(tintColor)
control.setImage(clearButtonImage, for: .clear, state: .normal)
}
if let barTintColor = style.barTintColor {
let position = control.delegate?.position?(for: control) ?? control.barPosition

View File

@@ -57,8 +57,6 @@ class UIViewRenderer {
if let round = style.round, round == true {
control.layer.cornerRadius = control.size.height / 2
}
if #available(iOS 13.0, *) {
control.layer.cornerCurve = .continuous
}
control.layer.cornerCurve = .continuous
}
}

View File

@@ -2,6 +2,8 @@ import ActivityKit
#if canImport(ActivityKit)
private let kCurrentTrackRecordingLiveActivityIDKey = "kCurrentTrackRecordingLiveActivityIDKey"
protocol TrackRecordingActivityManager {
func start(with info: TrackInfo) throws
func update(_ info: TrackInfo)
@@ -22,25 +24,39 @@ final class TrackRecordingLiveActivityManager {
@available(iOS 16.2, *)
extension TrackRecordingLiveActivityManager: TrackRecordingActivityManager {
func start(with info: TrackInfo) throws {
guard activity == nil else { return }
stop()
let state = TrackRecordingLiveActivityAttributes.ContentState(trackInfo: info)
let content = ActivityContent<TrackRecordingLiveActivityAttributes.ContentState>(state: state, staleDate: nil)
let attributes = TrackRecordingLiveActivityAttributes()
activity = try LiveActivityManager.startActivity(attributes, content: content)
let activity = try LiveActivityManager.startActivity(attributes, content: content)
self.activity = activity
UserDefaults.standard.set(activity.id, forKey: kCurrentTrackRecordingLiveActivityIDKey)
}
func update(_ info: TrackInfo) {
guard let activity else { return }
guard let activity = activity ?? fetchCurrentActivity() else {
LOG(.warning, "No active TrackRecordingLiveActivity found to update.")
return
}
let state = TrackRecordingLiveActivityAttributes.ContentState(trackInfo: info)
let content = ActivityContent<TrackRecordingLiveActivityAttributes.ContentState>(state: state, staleDate: nil)
self.activity = activity
LiveActivityManager.update(activity, content: content)
}
func stop() {
guard let activity else { return }
LiveActivityManager.stop(activity)
self.activity = nil
let activities = Activity<TrackRecordingLiveActivityAttributes>.activities
activities.forEach(LiveActivityManager.stop)
activity = nil
UserDefaults.standard.removeObject(forKey: kCurrentTrackRecordingLiveActivityIDKey)
}
private func fetchCurrentActivity() -> Activity<TrackRecordingLiveActivityAttributes>? {
guard let id = UserDefaults.standard.string(forKey: kCurrentTrackRecordingLiveActivityIDKey) else { return nil }
let activities = Activity<TrackRecordingLiveActivityAttributes>.activities
return activities.first(where: { $0.id == id })
}
}

View File

@@ -57,7 +57,7 @@ final class TrackRecordingManager: NSObject {
let locationManager = LocationManager.self
var activityManager: TrackRecordingActivityManager? = nil
#if canImport(ActivityKit)
if #available(iOS 16.2, *) {
if #available(iOS 16.2, *), !ProcessInfo.processInfo.isiOSAppOnMac {
activityManager = TrackRecordingLiveActivityManager.shared
}
#endif

View File

@@ -14,6 +14,7 @@ struct CloudMetadataItem: MetadataItem {
let fileName: String
let fileUrl: URL
var isDownloaded: Bool
var percentDownloaded: NSNumber
var lastModificationDate: TimeInterval
let downloadingError: NSError?
let uploadingError: NSError?
@@ -42,6 +43,7 @@ extension CloudMetadataItem {
guard let fileName = metadataItem.value(forAttribute: NSMetadataItemFSNameKey) as? String,
let fileUrl = metadataItem.value(forAttribute: NSMetadataItemURLKey) as? URL,
let downloadStatus = metadataItem.value(forAttribute: NSMetadataUbiquitousItemDownloadingStatusKey) as? String,
let percentDownloaded = metadataItem.value(forAttribute: NSMetadataUbiquitousItemPercentDownloadedKey) as? NSNumber,
let lastModificationDate = (metadataItem.value(forAttribute: NSMetadataItemFSContentChangeDateKey) as? Date)?.roundedTime,
let hasUnresolvedConflicts = metadataItem.value(forAttribute: NSMetadataUbiquitousItemHasUnresolvedConflictsKey) as? Bool else {
let allAttributes = metadataItem.values(forAttributes: metadataItem.attributes)
@@ -51,6 +53,7 @@ extension CloudMetadataItem {
self.fileName = fileName
self.fileUrl = fileUrl.standardizedFileURL
self.isDownloaded = downloadStatus == NSMetadataUbiquitousItemDownloadingStatusCurrent
self.percentDownloaded = percentDownloaded
self.lastModificationDate = lastModificationDate
self.hasUnresolvedConflicts = hasUnresolvedConflicts
self.downloadingError = metadataItem.value(forAttribute: NSMetadataUbiquitousItemDownloadingErrorKey) as? NSError
@@ -65,6 +68,8 @@ extension CloudMetadataItem {
.ubiquitousItemDownloadingErrorKey,
.ubiquitousItemUploadingErrorKey])
guard let downloadStatus = resources.ubiquitousItemDownloadingStatus,
// Not used.
// let percentDownloaded = resources.ubiquitousItemDownloadingStatus,
let lastModificationDate = resources.contentModificationDate?.roundedTime,
let hasUnresolvedConflicts = resources.ubiquitousItemHasUnresolvedConflicts else {
LOG(.error, "Failed to initialize CloudMetadataItem from \(fileUrl) resources: \(resources.allValues)")
@@ -72,7 +77,9 @@ extension CloudMetadataItem {
}
self.fileName = fileUrl.lastPathComponent
self.fileUrl = fileUrl.standardizedFileURL
self.isDownloaded = downloadStatus.rawValue == NSMetadataUbiquitousItemDownloadingStatusCurrent
let isDownloaded = downloadStatus.rawValue == NSMetadataUbiquitousItemDownloadingStatusCurrent
self.isDownloaded = isDownloaded
self.percentDownloaded = isDownloaded ? 0.0 : 100.0
self.lastModificationDate = lastModificationDate
self.hasUnresolvedConflicts = hasUnresolvedConflicts
self.downloadingError = resources.ubiquitousItemDownloadingError
@@ -115,7 +122,7 @@ extension Array where Element == CloudMetadataItem {
}
var notDownloaded: Self {
filter { !$0.isDownloaded }
filter { !$0.isDownloaded && $0.percentDownloaded == 0.0 }
}
func withUnresolvedConflicts(_ hasUnresolvedConflicts: Bool) -> Self {

View File

@@ -39,18 +39,16 @@ final class SynchronizationFileWriter {
// MARK: - Read/Write/Downloading/Uploading
private func startDownloading(_ cloudMetadataItem: CloudMetadataItem, completion: WritingResultCompletionHandler) {
var coordinationError: NSError?
fileCoordinator.coordinate(writingItemAt: cloudMetadataItem.fileUrl, options: [], error: &coordinationError) { cloudItemUrl in
do {
LOG(.info, "Start downloading file: \(cloudItemUrl.path)...")
try fileManager.startDownloadingUbiquitousItem(at: cloudItemUrl)
completion(.success)
} catch {
completion(.failure(error))
LOG(.info, "Start downloading file: \(cloudMetadataItem.fileUrl.path)...")
do {
if fileManager.isUbiquitousItem(at: cloudMetadataItem.fileUrl) {
try fileManager.startDownloadingUbiquitousItem(at: cloudMetadataItem.fileUrl)
} else {
LOG(.warning, "File \(cloudMetadataItem.fileUrl.path) is not a ubiquitous item. Skipping download.")
}
}
if let coordinationError {
completion(.failure(coordinationError))
completion(.success)
} catch {
completion(.failure(error))
}
}

View File

@@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "ic_menu_bookmark_track_recordign.png",
"filename" : "ic_menu_track_recording.svg",
"idiom" : "universal"
}
],

View File

@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 16.25C13.1758 16.25 14.1781 15.8356 15.0069 15.0069C15.8356 14.1781 16.25 13.1758 16.25 12C16.25 10.8242 15.8356 9.82188 15.0069 8.99313C14.1781 8.16438 13.1758 7.75 12 7.75C10.8242 7.75 9.82188 8.16438 8.99312 8.99313C8.16437 9.82188 7.75 10.8242 7.75 12C7.75 13.1758 8.16437 14.1781 8.99312 15.0069C9.82188 15.8356 10.8242 16.25 12 16.25ZM12 20.5C10.8242 20.5 9.71917 20.2769 8.685 19.8306C7.65083 19.3844 6.75125 18.7788 5.98625 18.0138C5.22125 17.2488 4.61563 16.3492 4.16938 15.315C3.72313 14.2808 3.5 13.1758 3.5 12C3.5 10.8242 3.72313 9.71917 4.16938 8.685C4.61563 7.65083 5.22125 6.75125 5.98625 5.98625C6.75125 5.22125 7.65083 4.61563 8.685 4.16938C9.71917 3.72313 10.8242 3.5 12 3.5C13.1758 3.5 14.2808 3.72313 15.315 4.16938C16.3492 4.61563 17.2488 5.22125 18.0138 5.98625C18.7788 6.75125 19.3844 7.65083 19.8306 8.685C20.2769 9.71917 20.5 10.8242 20.5 12C20.5 13.1758 20.2769 14.2808 19.8306 15.315C19.3844 16.3492 18.7788 17.2488 18.0138 18.0138C17.2488 18.7788 16.3492 19.3844 15.315 19.8306C14.2808 20.2769 13.1758 20.5 12 20.5ZM12 18.8C13.8983 18.8 15.5063 18.1413 16.8238 16.8238C18.1413 15.5063 18.8 13.8983 18.8 12C18.8 10.1017 18.1413 8.49375 16.8238 7.17625C15.5063 5.85875 13.8983 5.2 12 5.2C10.1017 5.2 8.49375 5.85875 7.17625 7.17625C5.85875 8.49375 5.2 10.1017 5.2 12C5.2 13.8983 5.85875 15.5063 7.17625 16.8238C8.49375 18.1413 10.1017 18.8 12 18.8Z" fill="#0000FF"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,6 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@@ -1,15 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_carplay_bookmark.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}

View File

@@ -1,15 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_carplay_keyboard.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}

View File

@@ -1,15 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_carplay_settings.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}

View File

@@ -0,0 +1,38 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.961",
"green" : "0.961",
"red" : "0.961"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.118",
"green" : "0.110",
"red" : "0.110"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -750,12 +750,6 @@
/* Title for button when a route was saved. */
"saved" = "Gestoor";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Meld asseblief aan by OpenStreetMap om al jou kaartwysigings outomaties op te laai. Kom meer te wete";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "hier";
"core_entrance" = "Ingang";
"error_enter_correct_name" = "Voer asb. n korrekte naam in";
"bookmark_lists" = "Lyste";
@@ -1097,3 +1091,5 @@
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Waterpunt";
"type.amenity.water_point.drinking_water_no" = "Waterpunt";
"type.barrier" = "Versperring";
"type.barrier.yes" = "Versperring";
"type.barrier.block" = "Blok";
"type.barrier.bollard" = "Bolder";
"type.barrier.border_control" = "Grensbeheer";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking";
"type.post_office.post_partner" = "Post Partner";
"type.barrier.wicket_gate" = "Wicket gate";
"type.amenity.animal_shelter" = "Animal Shelter";

View File

@@ -750,12 +750,6 @@
/* Title for button when a route was saved. */
"saved" = "تم الحفظ";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"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" = "هنا";
"core_entrance" = "المدخل";
"error_enter_correct_name" = "الرجاء إدخال اسم صحيح";
"bookmark_lists" = "قوائم";
@@ -1097,3 +1091,5 @@
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "نقطة إعادة تعبة قنينة المياه";
"type.amenity.water_point.drinking_water_no" = "نقطة إعادة تعبة قنينة المياه";
"type.barrier" = "حاجز";
"type.barrier.yes" = "حاجز";
"type.barrier.block" = "حاجز";
"type.barrier.bollard" = "حاجز سيارات";
"type.barrier.border_control" = "أمن الحدود";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking";
"type.post_office.post_partner" = "Post Partner";
"type.barrier.wicket_gate" = "Wicket gate";
"type.amenity.animal_shelter" = "Animal Shelter";

View File

@@ -218,7 +218,6 @@
"osm_profile_register" = "Register at OpenStreetMap";
"osm_more_about_url" = "https://wiki.openstreetmap.org/wiki/About_OpenStreetMap";
"mi" = "mi";
"alert_reauth_message_ios" = "Please login to OpenStreetMap to automatically upload all your map edits. Learn more";
"planning_route_remove_title" = "Drag here to remove";
"sort_distance" = "Sort by distance";
"downloader_search_results" = "Found";
@@ -246,7 +245,6 @@
"downloader_process" = "Downloading %@…";
"bookmark_lists_hide_all" = "Hide all";
"downloader_applying" = "Applying %@…";
"alert_reauth_link_text_ios" = "here";
"bookmarks_error_title_share_empty" = "Sharing error";
"bookmarks_error_title_list_name_already_taken" = "This name is already taken";
"downloader_percent" = "%@ (%@ of %@)";
@@ -589,3 +587,5 @@
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -368,6 +368,7 @@
"type.leisure.fitness_centre" = "Fitness Centre";
"type.junction.circular" = "Roundabout";
"type.barrier" = "Barrier";
"type.barrier.yes" = "Barrier";
"type.cuisine.italian" = "Italian";
"type.shop.erotic" = "Erotic Shop";
"type.cuisine.steak_house" = "Steak House";
@@ -1295,3 +1296,5 @@
"type.post_office.post_partner" = "Post Partner";
"type.amenity.luggage_locker" = "Luggage Locker";
"type.amenity.ranger_station" = "Ranger Station";
"type.barrier.wicket_gate" = "Wicket gate";
"type.amenity.animal_shelter" = "Animal Shelter";

View File

@@ -754,12 +754,6 @@
/* Title for button when a route was saved. */
"saved" = "Saxlandı";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Bütün xəritə redaktələrinizi avtomatik yükləmək üçün OpenStreetMap-a daxil olun";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "burada";
"core_entrance" = "Giriş";
"error_enter_correct_name" = "Düzgün ad daxil edin";
"bookmark_lists" = "Siyahılar";
@@ -1083,3 +1077,5 @@
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Karvanlar üçün su nöqtəsi";
"type.amenity.water_point.drinking_water_no" = "Karvanlar üçün su nöqtəsi";
"type.barrier" = "Maneə";
"type.barrier.yes" = "Maneə";
"type.barrier.block" = "Blok";
"type.barrier.bollard" = "Birbaşa";
"type.barrier.border_control" = "Sərhəd Nəzarəti";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking";
"type.post_office.post_partner" = "Post Partner";
"type.barrier.wicket_gate" = "Wicket gate";
"type.amenity.animal_shelter" = "Animal Shelter";

View File

@@ -751,12 +751,6 @@
/* Title for button when a route was saved. */
"saved" = "Захавана";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"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" = "тут";
"core_entrance" = "Уваход";
"error_enter_correct_name" = "Увядзіце правільную назву";
"bookmark_lists" = "Спісы";
@@ -1097,3 +1091,5 @@
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"hours_confirmed_time_ago" = "Confirmed %@";
"existence_confirmed_time_ago" = "Existence confirmed %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Вада для аўтадомаў";
"type.amenity.water_point.drinking_water_no" = "Вада для аўтадомаў";
"type.barrier" = "Barrier";
"type.barrier.yes" = "Barrier";
"type.barrier.block" = "Block";
"type.barrier.bollard" = "Bollard";
"type.barrier.border_control" = "Border Control";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking";
"type.post_office.post_partner" = "Post Partner";
"type.amenity.animal_shelter" = "Animal Shelter";
"type.barrier.wicket_gate" = "Wicket gate";

View File

@@ -60,7 +60,7 @@
"bookmark_set_name" = "Име на група";
/* "Bookmark Lists" dialog title */
"bookmark_sets" = "Bookmark Lists";
"bookmark_sets" = "Списък с отметки";
/* Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. */
"bookmarks" = "Отметки";
@@ -148,7 +148,7 @@
/* Search category for RV facilities; any changes should be duplicated in categories.txt @category_rv! */
"category_rv" = "За RV";
"share_bookmarks_email_body" = "Hello!\n\nAttached are my bookmarks; please open them in CoMaps. If you don't have it installed you can download it here: https://www.comaps.app/download/\n\nEnjoy travelling with CoMaps!";
"share_bookmarks_email_body" = "Здравей!\n\nПрикачени са отметките ми; моля отвори ги в CoMaps. Ако го нямаш инсталирано, можеш да го изтеглиш тук: https://www.comaps.app/download/\n\nПриятно пътуване с CoMaps!";
/* message title of loading file */
"load_kmz_title" = "Зареждане на отметки";
@@ -199,7 +199,7 @@
"share_my_location" = "Споделяне на местоположение";
"prefs_group_route" = "Навигация";
"pref_zoom_title" = "Мащабни бутони";
"pref_left_button_type" = "Left Main Button";
"pref_left_button_type" = "Ляв главен бутон";
/* Settings «Map» category: «Appearance» title */
"pref_appearance_title" = "Изглед";
@@ -211,7 +211,7 @@
"pref_appearance_dark" = "Тъмен";
/* Generic «Disabled» string */
"disabled" = "Disabled";
"disabled" = "Изключено";
/* Generic «Off» string */
"off" = "Изключен";
@@ -235,7 +235,7 @@
"pref_tts_title" = "Гласови инструкции";
/* Settings «Route» category: «Tts enable» title */
"pref_tts_enable_title" = "Enable Voice Instructions";
"pref_tts_enable_title" = "Включи гласовите инструкции";
/* Settings «Route» category: «Tts announce street names» title */
"pref_tts_street_names_title" = "Обявете имена на улици";
@@ -247,7 +247,7 @@
"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" = "Тестване на гласови указания";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Друго";
@@ -319,10 +319,10 @@
"report_incorrect_map_bug" = "Докладване или поправяне на неправилни данни на картата";
/* Button in the About screen */
"volunteer" = "За доброволчество";
"volunteer" = "Доброволчество и подобряване на CoMaps";
/* "Social media" section header in the About screen */
"follow_us" = "Следвайте и се свържете с нас";
"follow_us" = "Свържете се с нас";
/* Alert text */
"email_error_body" = "Имейл клиентът не е настроен. Моля, конфигурирайте го или използвайте друг начин, за да се свържете с нас на %@";
@@ -343,7 +343,7 @@
"downloader_downloaded_subtitle" = "Изтеглено";
/* Downloaded maps category */
"downloader_available_maps" = "Available";
"downloader_available_maps" = "Налично";
/* Country queued for download */
"downloader_queued" = "На опашка";
@@ -353,7 +353,7 @@
"downloader_status_maps" = "Карти";
"downloader_download_all_button" = "Изтегляне на всичко";
"downloader_downloading" = "Теглене:";
"downloader_search_results" = "Found";
"downloader_search_results" = "Намерено";
/* Status of outdated country in the list */
"downloader_status_outdated" = "Обновление";
@@ -476,7 +476,7 @@
"routing_arrive" = "Пристигане в %@";
/* Text for routing::RouterResultCode::FileTooOld dialog. */
"dialog_routing_download_and_update_maps" = "Download and update all map along the projected path to calculate route.";
"dialog_routing_download_and_update_maps" = "Изтегли и обнови всичи карти заедно с планирания път за изчисляване на маршрута.";
"categories" = "Категории";
"history" = "История";
"search_not_found" = "За съжаление не са намерени резултати.";
@@ -526,9 +526,9 @@
"day_off_today" = "Затворено днес";
"day_off" = "Затворено";
"today" = "Днес";
"opens_tomorrow_at" = "Opens tomorrow at %@";
"opens_dayoftheweek_at" = "Opens %1$@ at %2$@";
"opens_at" = "Opens at %@";
"opens_tomorrow_at" = "Отваря утре в %@";
"opens_dayoftheweek_at" = "Отваря %1$@ в %2$@";
"opens_at" = "Отваря в %@";
"opens_in" = "Opens in %@";
"closes_at" = "Closes at %@";
"closes_in" = "Closes in %@";
@@ -751,12 +751,6 @@
/* Title for button when a route was saved. */
"saved" = "Запазено";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"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" = "тук";
"core_entrance" = "Вход";
"error_enter_correct_name" = "Моля, въведете правилно име";
"bookmark_lists" = "Списъци";
@@ -1091,9 +1085,11 @@
"edit_track" = "Редактиране на маршрут";
"osm_profile_view_notes" = "Преглед на бележки";
"osm_profile_view_edit_history" = "Преглед на историята на промените";
"about_headline" = "Open project powered by the community";
"about_proposition_3" = "Transparent and not for profit";
"pref_mapappearance_title" = "Map Appearance";
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"about_headline" = "Отворен проект, захранван от общността";
"about_proposition_3" = "Прозрачен и не за печалба";
"pref_mapappearance_title" = "Външен вид на картата";
"pref_maplanguage_title" = "Език на Картата";
"transliteration_title_disabled_summary" = "Изключено при постоянно използване на локален език за картата";
"pref_maplanguage_local" = "Локален Език";
"existence_confirmed_time_ago" = "Наличие потвърдено%@";
"hours_confirmed_time_ago" = "Потвърдено %@";

View File

@@ -188,6 +188,7 @@
"type.amenity.water_point" = "Остановка за пълнене на водни хранилища";
"type.amenity.water_point.drinking_water_no" = "Остановка за пълнене на водни хранилища";
"type.barrier" = "Бариера";
"type.barrier.yes" = "Бариера";
"type.barrier.block" = "Блокова преграда";
"type.barrier.bollard" = "Колчета";
"type.barrier.border_control" = "Гранична остановка";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Станция за рейнджъри";
"type.amenity.luggage_locker" = "Шкафче за багаж";
"type.amenity.bicycle_parking.covered" = "Покрит паркинг за колела";
"type.barrier.wicket_gate" = "Wicket gate";
"type.amenity.animal_shelter" = "Animal Shelter";

View File

@@ -146,8 +146,6 @@
"core_entrance" = "Entrance";
"bookmarks_import" = "Import Bookmarks and Tracks";
"bookmark_lists_hide_all" = "Hide all";
"alert_reauth_link_text_ios" = "here";
"alert_reauth_message_ios" = "Please login to OpenStreetMap to automatically upload all your map edits. Learn more";
"bookmark_lists" = "Lists";
"bookmarks_create_new_group" = "Create a new list";
"error_enter_correct_name" = "Please enter a correct name";
@@ -589,3 +587,5 @@
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -960,6 +960,7 @@
"type.leisure.fitness_centre" = "Fitness Centre";
"type.junction.circular" = "Roundabout";
"type.barrier" = "Barrier";
"type.barrier.yes" = "Barrier";
"type.railway.station.subway.santiago" = "Subway Station";
"type.cuisine.italian" = "Italian";
"type.man_made.bridge" = "Bridge";
@@ -1295,3 +1296,5 @@
"type.post_office.post_partner" = "Post Partner";
"type.amenity.luggage_locker" = "Luggage Locker";
"type.amenity.ranger_station" = "Ranger Station";
"type.barrier.wicket_gate" = "Wicket gate";
"type.amenity.animal_shelter" = "Animal Shelter";

View File

@@ -751,12 +751,6 @@
/* Title for button when a route was saved. */
"saved" = "S'ha desat";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Si us plau, inicieu sessió a OpenStreetMap per carregar automàticament totes les edicions de mapes. Més informació";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "aquí";
"core_entrance" = "Entrada";
"error_enter_correct_name" = "Introduïu un nom correcte";
"bookmark_lists" = "Llistes";
@@ -1097,3 +1091,5 @@
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Punt daigua";
"type.amenity.water_point.drinking_water_no" = "Punt daigua";
"type.barrier" = "Barrera";
"type.barrier.yes" = "Barrera";
"type.barrier.block" = "Bloc";
"type.barrier.bollard" = "Bol·lard";
"type.barrier.border_control" = "Control fronterer";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking";
"type.post_office.post_partner" = "Post Partner";
"type.amenity.animal_shelter" = "Animal Shelter";
"type.barrier.wicket_gate" = "Wicket gate";

View File

@@ -144,7 +144,7 @@
"category_police" = "Policie";
/* Search category for WiFi access; any changes should be duplicated in categories.txt @category_wifi! */
"category_wifi" = "WiFi";
"category_wifi" = "Wi-Fi";
/* Search category for recycling; any changes should be duplicated in categories.txt @category_recycling! */
"category_recycling" = "Recyklace";
@@ -325,7 +325,7 @@
"report_incorrect_map_bug" = "Nahlášení nebo oprava nesprávných mapových dat";
/* Button in the About screen */
"volunteer" = "Dobrovolnictví";
"volunteer" = "Staňte se dobrovolníkem a vylepšete CoMaps";
/* "Social media" section header in the About screen */
"follow_us" = "Spojte se s námi";
@@ -448,7 +448,7 @@
"dialog_routing_disclaimer_beware" = "Na silnici buďte pozorní a chovejte se bezpečně!";
"dialog_routing_check_gps" = "Zkontrolovat signál GPS";
"dialog_routing_error_location_not_found" = "Trasu se nepodařilo vytvořit. Nelze zjistit aktuální souřadnice GPS.";
"dialog_routing_location_turn_wifi" = "Zkontrolujte signál GPS. Povolením připojení WiFi zpřesníte určení vaší polohy.";
"dialog_routing_location_turn_wifi" = "Zkontrolujte signál GPS. Povolením připojení Wi-Fi zlepšíte přesnost určování vaší polohy.";
"dialog_routing_location_turn_on" = "Povolit služby určování polohy";
"dialog_routing_location_unknown_turn_on" = "Aktuální souřadnice GPS se nepodařilo zjistit. Pro výpočet trasy povolte služby určování polohy.";
"dialog_routing_download_files" = "Stáhnout požadované soubory";
@@ -757,12 +757,6 @@
/* Title for button when a route was saved. */
"saved" = "Uloženo";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Přihlaste se do OpenStreetMap, abyste mohli automaticky nahrávat všechny své úpravy mapy. Více informací";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "zde";
"core_entrance" = "Vstup";
"error_enter_correct_name" = "Zadejte prosím správný název";
"bookmark_lists" = "Seznamy";
@@ -1101,3 +1095,5 @@
"pref_maplanguage_title" = "Jazyk mapy";
"transliteration_title_disabled_summary" = "Neaktivní, pokud se pro mapu vždy používá místní jazyk";
"pref_maplanguage_local" = "Místní jazyk";
"existence_confirmed_time_ago" = "Existence potvrzena %@";
"hours_confirmed_time_ago" = "Potvrzeno %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Doplňovací místo vodní nádrže";
"type.amenity.water_point.drinking_water_no" = "Doplňovací místo vodní nádrže";
"type.barrier" = "Bariéra";
"type.barrier.yes" = "Bariéra";
"type.barrier.block" = "Blok";
"type.barrier.bollard" = "Sloupek";
"type.barrier.border_control" = "Pohraniční kontrola";
@@ -280,7 +281,7 @@
"type.cuisine.beef_bowl" = "Miska hovězího";
"type.cuisine.brazilian" = "Brazilská kuchyně";
"type.cuisine.breakfast" = "Snídaně";
"type.cuisine.bubble_tea" = "Bubble Tea";
"type.cuisine.bubble_tea" = "Bublinkový čaj";
"type.cuisine.burger" = "Burger";
"type.cuisine.buschenschank" = "Buschenschank";
"type.cuisine.cake" = "Dort";
@@ -1461,7 +1462,7 @@
/* https://wiki.openstreetmap.org/wiki/Tag:leisure=sports_hall */
"type.leisure.sports_hall" = "Sportovní hala";
"type.amenity.studio" = "Studio";
"type.amenity.love_hotel" = "Love Hotel";
"type.amenity.love_hotel" = "Hodinový hotel";
"type.highway.ladder" = "Žebřík";
"type.barrier.guard_rail" = "Svodidla";
"type.landuse.plant_nursery" = "Pěstitelská školka";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Správci parku";
"type.amenity.bicycle_parking.covered" = "Kryté parkování kol";
"type.post_office.post_partner" = "Poštovní partner";
"type.amenity.animal_shelter" = "Útulek pro zvířata";
"type.barrier.wicket_gate" = "Branka";

View File

@@ -193,7 +193,6 @@
"planning_route_remove_title" = "Drag here to remove";
"p2p_your_location" = "Eich Lleoliad";
"category_transport" = "Trafnidiaeth";
"alert_reauth_link_text_ios" = "here";
"text_more_button" = "…more";
"downloader_of" = "%1$d o %2$d";
"mobile_data_option_ask" = "Gofyn Bob Amser";
@@ -256,7 +255,6 @@
"pref_appearance_light" = "Golau";
"dialog_routing_change_end" = "Addasu cylchfan";
"planning_route_manage_route" = "Rheoli Llwybr";
"alert_reauth_message_ios" = "Please login to OpenStreetMap to automatically upload all your map edits. Learn more";
"place_name" = "Enw Lle";
"navigation_stop_button" = "Stopio";
"load_kmz_successful" = "Bookmarks loaded successfully! You can find them on the map or on the Bookmarks Manager screen.";
@@ -589,3 +587,5 @@
"thank_you" = "Diolch";
"yes_available" = "Ie";
"osm_profile_reauthorize" = "Reconnect with OpenStreetMap";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -13,6 +13,7 @@
"type.natural.water.wastewater" = "Wastewater";
"type.barrier.bollard" = "Bollard";
"type.barrier" = "Barrier";
"type.barrier.yes" = "Barrier";
"type.barrier.chain" = "Chain";
"type.amenity.water_point.drinking_water_no" = "Water Tank Refill Point";
"type.barrier.stile" = "Stile";
@@ -1295,3 +1296,5 @@
"type.place.city" = "City";
"type.amenity.parking_entrance.permissive" = "Parking Entrance";
"type.cuisine.italian_pizza" = "Italian, Pizza";
"type.amenity.animal_shelter" = "Animal Shelter";
"type.barrier.wicket_gate" = "Wicket gate";

View File

@@ -754,12 +754,6 @@
/* Title for button when a route was saved. */
"saved" = "Gemt";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Log ind på OpenStreetMap for automatisk at uploade alle dine kortredigeringer. Få mere at vide";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "her";
"core_entrance" = "Indgang";
"error_enter_correct_name" = "Angiv et korrekt navn";
"bookmark_lists" = "Lister";
@@ -1099,3 +1093,5 @@
"pref_maplanguage_title" = "Kortsprog";
"transliteration_title_disabled_summary" = "Deaktiveret, når det lokale sprog altid bruges til kortet";
"pref_maplanguage_local" = "Lokalt sprog";
"hours_confirmed_time_ago" = "Confirmed %@";
"existence_confirmed_time_ago" = "Existence confirmed %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Vandpost";
"type.amenity.water_point.drinking_water_no" = "Vandstation";
"type.barrier" = "Barriere";
"type.barrier.yes" = "Barriere";
"type.barrier.block" = "Blokering";
"type.barrier.bollard" = "Pullert";
"type.barrier.border_control" = "Grænsekontrol";
@@ -1481,3 +1482,5 @@
"type.post_office.post_partner" = "Postpartner";
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Overdækket cykelparkering";
"type.barrier.wicket_gate" = "Wicket gate";
"type.amenity.animal_shelter" = "Animal Shelter";

View File

@@ -325,7 +325,7 @@
"report_incorrect_map_bug" = "Falsche Kartendaten melden oder korrigieren";
/* Button in the About screen */
"volunteer" = "Freiwillig helfen";
"volunteer" = "Freiwillig helfen und CoMaps verbessern";
/* "Social media" section header in the About screen */
"follow_us" = "Bleib in Kontakt";
@@ -759,12 +759,6 @@
/* Title for button when a route was saved. */
"saved" = "Gespeichert";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Bitte melde dich bei OpenStreetMap an, um alle deine Kartenbearbeitungen automatisch hochzuladen. Erfahre mehr";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "hier";
"core_entrance" = "Eingang";
"error_enter_correct_name" = "Bitte geben Sie einen korrekten Namen ein";
"bookmark_lists" = "Listen";
@@ -1101,3 +1095,5 @@
"pref_maplanguage_title" = "Kartensprache";
"transliteration_title_disabled_summary" = "Bei der Nutzung der lokalen Sprache für die Karte ausgeschaltet";
"pref_maplanguage_local" = "Lokale Sprache";
"existence_confirmed_time_ago" = "Existenz bestätigt %@";
"hours_confirmed_time_ago" = "Bestätigt %@";

View File

@@ -65,7 +65,7 @@
"type.amenity.fast_food" = "Fast-Food";
"type.amenity.ferry_terminal" = "Fähranleger";
"type.amenity.fire_station" = "Feuerwehr";
"type.amenity.food_court" = "Food Court";
"type.amenity.food_court" = "Gastronomiebereich";
"type.amenity.fountain" = "Springbrunnen";
"type.amenity.fuel" = "Tankstelle";
@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Wasseranschluss";
"type.amenity.water_point.drinking_water_no" = "Wasseranschluss";
"type.barrier" = "Barriere";
"type.barrier.yes" = "Barriere";
"type.barrier.block" = "Block";
"type.barrier.bollard" = "Poller";
"type.barrier.border_control" = "Grenzkontrolle";
@@ -790,7 +791,7 @@
"type.natural.water.lake" = "See";
"type.natural.water.lock" = "Schleusenkammer";
"type.natural.water.pond" = "Teich";
"type.natural.water.reservoir" = "Reservoir";
"type.natural.water.reservoir" = "Stausee";
"type.natural.water.basin" = "Wasserbecken";
"type.natural.water.river" = "Fluss";
"type.natural.land" = "Land";
@@ -1333,7 +1334,7 @@
"type.sport.tennis" = "Tennisplatz";
"type.sport.volleyball" = "Volleyball";
"type.sport.10pin" = "Bowling";
"type.sport.9pin" = "Bowling";
"type.sport.9pin" = "Kegeln";
"type.sport.padel" = "Padel";
"type.sport.futsal" = "Futsal";
"type.sport.ice_hockey" = "Eishockey";
@@ -1380,7 +1381,7 @@
"type.tourism.motel" = "Motel";
"type.tourism.museum" = "Museum";
"type.tourism.picnic_site" = "Picknickplatz";
"type.leisure.resort" = "Resort";
"type.leisure.resort" = "Freizeitanlage";
"type.tourism.theme_park" = "Freizeitpark";
"type.tourism.viewpoint" = "Aussichtspunkt";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Försterstation";
"type.amenity.bicycle_parking.covered" = "Überdachter Fahrradparkplatz";
"type.post_office.post_partner" = "Postpartner";
"type.barrier.wicket_gate" = "Schlupfpforte";
"type.amenity.animal_shelter" = "Tierheim";

View File

@@ -751,12 +751,6 @@
/* Title for button when a route was saved. */
"saved" = "Αποθηκεύτηκε";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"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" = "εδώ";
"core_entrance" = "Είσοδος";
"error_enter_correct_name" = "Εισάγετε ένα σωστό όνομα";
"bookmark_lists" = "Λίστες";
@@ -1097,3 +1091,5 @@
"pref_maplanguage_title" = "Γλώσσα χάρτη";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Τοπική γλώσσα";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Παροχή νερού";
"type.amenity.water_point.drinking_water_no" = "Παροχή νερού";
"type.barrier" = "Εμπόδιο";
"type.barrier.yes" = "Εμπόδιο";
"type.barrier.block" = "Εμπόδιο";
"type.barrier.bollard" = "Πυλώνας";
"type.barrier.border_control" = "Έλεγχος συνόρων";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking";
"type.post_office.post_partner" = "Post Partner";
"type.barrier.wicket_gate" = "Wicket gate";
"type.amenity.animal_shelter" = "Animal Shelter";

View File

@@ -533,6 +533,10 @@
"editor_report_problem_send_button" = "Send";
"autodownload" = "Auto-download maps";
/* Place page confirmation messages and time ago formatting */
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";
/* Place Page opening hours text */
"closed_now" = "Closed now";
@@ -777,12 +781,6 @@
/* Title for button when a route was saved. */
"saved" = "Saved";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Please login to OpenStreetMap to automatically upload all your map edits. Learn more";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "here";
"core_entrance" = "Entrance";
"error_enter_correct_name" = "Please enter a correct name";
"bookmark_lists" = "Lists";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Water Tank Refill Point";
"type.amenity.water_point.drinking_water_no" = "Water Tank Refill Point";
"type.barrier" = "Barrier";
"type.barrier.yes" = "Barrier";
"type.barrier.block" = "Block";
"type.barrier.bollard" = "Bollard";
"type.barrier.border_control" = "Border Control";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking";
"type.post_office.post_partner" = "Post Partner";
"type.amenity.animal_shelter" = "Animal Shelter";
"type.barrier.wicket_gate" = "Wicket gate";

View File

@@ -346,7 +346,7 @@
"report_incorrect_map_bug" = "Report or fix incorrect map data";
/* Button in the About screen */
"volunteer" = "Volunteer";
"volunteer" = "Volunteer and improve CoMaps";
/* "Social media" section header in the About screen */
"follow_us" = "Connect with us";
@@ -552,6 +552,12 @@
"editor_report_problem_send_button" = "Send";
"autodownload" = "Auto-download maps";
/* Place page confirmation messages and time ago formatting */
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";
/* Place Page opening hours text */
"closed_now" = "Closed now";
@@ -797,11 +803,6 @@
/* Title for button when a route was saved. */
"saved" = "Saved";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Please login to OpenStreetMap to automatically upload all your map edits. Learn more";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "here";
"core_entrance" = "Entrance";
"error_enter_correct_name" = "Please enter a correct name";
"bookmark_lists" = "Lists";

View File

@@ -197,12 +197,14 @@
"type.amenity.vehicle_inspection" = "Vehicle Inspection";
"type.amenity.vending_machine.fuel" = "Fuel Pump";
"type.amenity.veterinary" = "Veterinary Doctor";
"type.amenity.animal_shelter" = "Animal Shelter";
"type.amenity.waste_basket" = "Trash Bin";
"type.amenity.waste_disposal" = "Dumpster";
"type.amenity.waste_transfer_station" = "Waste Transfer Station";
"type.amenity.water_point" = "Water Tank Refill Point";
"type.amenity.water_point.drinking_water_no" = "Water Tank Refill Point";
"type.barrier" = "Barrier";
"type.barrier.yes" = "Barrier";
"type.barrier.block" = "Block";
"type.barrier.bollard" = "Bollard";
"type.barrier.border_control" = "Border Control";
@@ -222,6 +224,7 @@
"type.barrier.retaining_wall" = "Retaining Wall";
"type.barrier.stile" = "Stile";
"type.barrier.turnstile" = "Turnstile";
"type.barrier.wicket_gate" = "Wicket Gate";
"type.barrier.swing_gate" = "Swing Gate";
"type.barrier.toll_booth" = "Toll Booth";
"type.barrier.wall" = "Wall";

View File

@@ -754,12 +754,6 @@
/* Title for button when a route was saved. */
"saved" = "Guardado";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Inicie sesión en OpenStreetMap para cargar automáticamente todas las ediciones de su mapa. Obtenga más información";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "aquí";
"core_entrance" = "Entrada";
"error_enter_correct_name" = "Introduzca el nombre correcto";
"bookmark_lists" = "Listas";
@@ -1101,3 +1095,5 @@
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Fuente de agua para caravanas";
"type.amenity.water_point.drinking_water_no" = "Fuente de agua para caravanas";
"type.barrier" = "Barrera";
"type.barrier.yes" = "Barrera";
"type.barrier.block" = "Bloque";
"type.barrier.bollard" = "Bolardo";
"type.barrier.border_control" = "Control fronterizo";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking";
"type.post_office.post_partner" = "Post Partner";
"type.barrier.wicket_gate" = "Wicket gate";
"type.amenity.animal_shelter" = "Animal Shelter";

View File

@@ -527,7 +527,7 @@
"closed_now" = "Cerrado ahora";
/* Place Page opening hours text */
"daily" = "Diario";
"daily" = "Diariamente";
"twentyfour_seven" = "24/7";
"day_off_today" = "Cerrado hoy";
"day_off" = "Cerrado";
@@ -717,7 +717,7 @@
"accept" = "Aceptar";
/* For the first routing */
"decline" = "Declinar";
"decline" = "Rechazar";
"mobile_data_dialog" = "¿Usar Internet móvil para mostrar información detallada?";
"mobile_data_option_always" = "Usar siempre";
"mobile_data_option_today" = "Sólo hoy";
@@ -757,14 +757,8 @@
/* Title for button when a route was saved. */
"saved" = "Guardado";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Inicia sesión en OpenStreetMap para cargar automáticamente todas tus ediciones de mapas. Más información";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "aquí";
"core_entrance" = "Entrada";
"error_enter_correct_name" = "Por favor, introduzca el nombre correcto";
"error_enter_correct_name" = "Por favor, introduce un nombre válido";
"bookmark_lists" = "Listas";
/* Do not display all bookmark lists on the map */
@@ -903,10 +897,10 @@
"mountains" = "Montañas";
"animals" = "Animales";
"hotels" = "Hoteles";
"buildings" = "Edificios";
"buildings" = "Edificaciones";
"money" = "Dinero";
"shops" = "Tiendas";
"parkings" = "Estacionamiento";
"parkings" = "Aparcamiento";
"fuel_places" = "Gasolineras";
"medicine" = "Medicina";
"search_in_the_list" = "Buscar en la lista";
@@ -963,37 +957,37 @@
"app_tip_00" = "¡Gracias por utilizar nuestros mapas creados por la comunidad!";
/* App tip #01 */
"app_tip_01" = "¡Con sus donaciones y apoyo, podemos crear los mejores mapas del mundo!";
"app_tip_01" = "¡Con tus donaciones y apoyo, podemos crear los mejores mapas del mundo!";
/* App tip #02 */
"app_tip_02" = "¿Le gusta nuestra aplicación? ¡Por favor done para apoyar su desarrollo! ¿Todavía no le gusta? ¡Díganos por qué y lo arreglaremos!";
"app_tip_02" = "¿Te gusta nuestra aplicación? ¡Por favor dona para apoyar su desarrollo! ¿Todavía no te gusta? ¡Dinos por qué y lo arreglaremos!";
/* App tip #03 */
"app_tip_03" = "Si conoce a algún desarrollador o desarrolladora de software, le puede pedir que implemente alguna funcionalidad que usted necesite.";
/* App tip #04 */
"app_tip_04" = "Toque en cualquier lugar del mapa para seleccionar cualquier elemento. Mantenga pulsado para ocultar y volver a mostrar la interfaz.";
"app_tip_04" = "Toca en cualquier lugar del mapa para seleccionar cualquier elemento. Manten pulsado para ocultar y volver a mostrar la interfaz.";
/* App tip #05 */
"app_tip_05" = "¿Sabía que su ubicación actual en el mapa se puede seleccionar?";
"app_tip_05" = "¿Sabías que tu ubicación actual en el mapa se puede seleccionar?";
/* App tip #06 */
"app_tip_06" = "Puede ayudar a traducir nuestra aplicación a su idioma.";
"app_tip_06" = "Puedes ayudar a traducir nuestra aplicación a tu idioma.";
/* App tip #07 */
"app_tip_07" = "Nuestra aplicación está desarrollada por unos pocos entusiastas y la comunidad.";
/* App tip #08 */
"app_tip_08" = "Puede arreglar y mejorar fácilmente los datos del mapa.";
"app_tip_08" = "Puedes arreglar y mejorar fácilmente los datos del mapa.";
/* App tip #09 */
"app_tip_09" = "Nuestro principal objetivo es crear mapas rápidos, centrados en la privacidad y fáciles de utilizar que le encantarán.";
"app_tip_09" = "Nuestro principal objetivo es crear mapas rápidos, centrados en la privacidad y fáciles de utilizar, que te encantarán.";
/* Text on the Android Auto or CarPlay placeholder screen that maps are displayed on the phone screen */
"car_used_on_the_phone_screen" = "Ahora usa CoMaps en la pantalla del teléfono";
"car_used_on_the_phone_screen" = "Ahora estás usando CoMaps en la pantalla del teléfono";
/* Text on the phone placeholder screen that maps are displayed on the car screen */
"car_used_on_the_car_screen" = "Ahora usa CoMaps en la pantalla del coche";
"car_used_on_the_car_screen" = "Ahora estás usando CoMaps en la pantalla del coche";
/* Displayed on the phone screen. Button to display maps on the phone screen instead of a car */
"car_continue_on_the_phone" = "Pasar al teléfono";
@@ -1005,7 +999,7 @@
"button_layer_outdoor" = "Senderismo";
/* Bookmark categories screen, button that opens share dialog to export all bookmarks and tracks */
"bookmarks_export" = "Exportar todos los marcadores y trayectos";
"bookmarks_export" = "Exportar todos los marcadores y trazas";
/* Text for the editing the Track's color button. */
"change_color" = "Cambiar color";
@@ -1101,3 +1095,5 @@
"pref_maplanguage_title" = "Idioma del mapa";
"transliteration_title_disabled_summary" = "Deshabilitado cuando siempre se usa el idioma local para el mapa";
"pref_maplanguage_local" = "Idioma local";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Fuente de agua para caravanas";
"type.amenity.water_point.drinking_water_no" = "Fuente de agua para caravanas";
"type.barrier" = "Barrera";
"type.barrier.yes" = "Barrera";
"type.barrier.block" = "Bloque";
"type.barrier.bollard" = "Bolardo";
"type.barrier.border_control" = "Control fronterizo";
@@ -329,19 +330,19 @@
"type.cuisine.noodles" = "Fideos";
"type.cuisine.oriental" = "Oriental";
"type.cuisine.pancake" = "Tortitas";
"type.cuisine.pasta" = "Pastas";
"type.cuisine.pasta" = "Pasta";
"type.cuisine.persian" = "Persa";
"type.cuisine.peruvian" = "Peruana";
"type.cuisine.pizza" = "Pizzas";
"type.cuisine.polish" = "Polaca";
"type.cuisine.portuguese" = "Portuguesa";
"type.cuisine.ramen" = "Ramen";
"type.cuisine.regional" = "Cocina regional";
"type.cuisine.regional" = "Regional";
"type.cuisine.russian" = "Rusa";
"type.cuisine.sandwich" = "Sándwiches";
"type.cuisine.sausage" = "Salchichas";
"type.cuisine.savory_pancakes" = "Tortitas saladas";
"type.cuisine.seafood" = "Mariscos";
"type.cuisine.seafood" = "del mar";
"type.cuisine.soba" = "Soba";
"type.cuisine.spanish" = "Española";
"type.cuisine.steak_house" = "Asador";
@@ -384,11 +385,11 @@
"type.healthcare.sample_collection" = "Muestreo";
"type.healthcare.speech_therapist" = "Logopedia";
"type.highway" = "Carretera";
"type.highway.bridleway" = "Camino de caballos";
"type.highway.bridleway" = "Camino ecuestre";
/* These translations are used for all type.highway.*.bridge. */
"type.highway.bridleway.bridge" = "Puente";
"type.highway.bridleway.permissive" = "Camino de caballos";
"type.highway.bridleway.permissive" = "Camino ecuestre";
/* These translations are used for all type.highway.*.tunnel. */
"type.highway.bridleway.tunnel" = "Túnel";
@@ -399,7 +400,7 @@
/* These translations are used for all type.highway.*.tunnel. */
"type.highway.busway.tunnel" = "Túnel";
"type.highway.bus_stop" = "Parada de autobús";
"type.highway.bus_stop" = "Parada de bus";
"type.highway.construction" = "Vía en construcción";
"type.highway.cycleway" = "Ciclovía";
@@ -473,7 +474,7 @@
"type.highway.primary.bridge" = "Puente";
/* These translations are used for all type.highway.*.tunnel. */
"type.highway.primary.tunnel" = "Túnel de carretera principal";
"type.highway.primary.tunnel" = "Túnel";
"type.highway.primary_link" = "Enlace de carretera principal";
/* These translations are used for all type.highway.*.bridge. */
@@ -664,7 +665,7 @@
"type.landuse.farmland" = "Tierras agrícolas";
"type.landuse.farmyard" = "Granja";
"type.landuse.field" = "Campo";
"type.landuse.flowerbed" = "Cama de flores";
"type.landuse.flowerbed" = "Parterre";
"type.landuse.forest" = "Bosque";
"type.landuse.forest.coniferous" = "Bosque de coníferas";
"type.landuse.forest.deciduous" = "Bosque caducifolio";
@@ -863,18 +864,18 @@
"type.power.generator" = "Generador";
"type.power.generator.solar" = "Generador solar";
"type.power.generator.wind" = "Generador de viento";
"type.power.generator.gas" = "Planta de energía de turbina de gas";
"type.power.generator.hydro" = "Planta de energía hidroeléctrica";
"type.power.generator.gas" = "Planta termoeléctrica de gas";
"type.power.generator.hydro" = "Planta hidroeléctrica";
"type.power.line" = "Línea eléctrica";
"type.power.line.underground" = "Línea eléctrica subterránea";
"type.power.minor_line" = "Línea eléctrica de baja tensión";
"type.power.plant" = "Planta de energía";
"type.power.minor_line" = "Línea eléctrica menor";
"type.power.plant" = "Planta eléctrica";
"type.power.plant.coal" = "Central eléctrica de carbón";
"type.power.plant.gas" = "Planta de energía de turbina de gas";
"type.power.plant.hydro" = "Planta de energía hidroeléctrica";
"type.power.plant.gas" = "Planta termoeléctrica de gas";
"type.power.plant.hydro" = "Planta hidroeléctrica";
"type.power.plant.solar" = "Planta de energía solar";
"type.power.plant.wind" = "Planta eólica";
"type.power.substation" = "Subestación eléctrica";
"type.power.substation" = "Subestación";
/* A tower or pylon carrying high voltage electricity cables. */
"type.power.tower" = "Torre eléctrica";
@@ -901,13 +902,13 @@
"type.railway.light_rail" = "Tren ligero";
"type.railway.light_rail.bridge" = "Puente de tren ligero";
"type.railway.light_rail.tunnel" = "Túnel de tren ligero";
"type.railway.monorail" = "Monorrl";
"type.railway.monorail.bridge" = "Puente de monorrl";
"type.railway.monorail.tunnel" = "Túnel de monorrl";
"type.railway.monorail" = "Monorriel";
"type.railway.monorail.bridge" = "Puente de monorriel";
"type.railway.monorail.tunnel" = "Túnel de monorriel";
"type.railway.narrow_gauge" = "Vía férrea estrecha";
"type.railway.narrow_gauge.bridge" = "Puente de vía férrea estrecha";
"type.railway.narrow_gauge.tunnel" = "Túnel de vía férrea estrecha";
"type.railway.platform" = "Plataforma de vía férrea";
"type.railway.platform" = "Plataforma ferroviaria";
"type.railway.preserved" = "Raíl conservado";
"type.railway.preserved.bridge" = "Puente ferroviario conservado";
"type.railway.preserved.tunnel" = "Túnel ferroviario conservado";
@@ -1245,7 +1246,7 @@
"type.shop.mobile_phone" = "Tienda de Móviles";
"type.shop.money_lender" = "Prestamista";
"type.shop.motorcycle" = "Tienda de motos";
"type.shop.motorcycle_repair" = "Reparación de motos";
"type.shop.motorcycle_repair" = "Taller de motos";
"type.shop.music" = "Tienda de discos";
"type.shop.musical_instrument" = "Instrumentos musicales";
"type.shop.newsagent" = "Puesto de venta de periódicos";
@@ -1263,7 +1264,7 @@
"type.shop.seafood" = "Pescadería";
"type.shop.second_hand" = "Tienda de segunda mano";
"type.shop.shoes" = "Zapatería";
"type.shop.sports" = "Artículos de deporte";
"type.shop.sports" = "Tienda deportiva";
"type.shop.stationery" = "Papelería";
"type.shop.supermarket" = "Supermercado";
"type.shop.tattoo" = "Estudio de tatuajes";
@@ -1481,3 +1482,5 @@
"type.amenity.luggage_locker" = "Casillero de maletas";
"type.amenity.ranger_station" = "Estación de guardabosques";
"type.amenity.bicycle_parking.covered" = "Parking de bici cubierto";
"type.amenity.animal_shelter" = "Refugio de animales";
"type.barrier.wicket_gate" = "Wicket gate";

View File

@@ -322,7 +322,7 @@
"report_incorrect_map_bug" = "Paranda vigaseid kaardiandmeid või teata neist";
/* Button in the About screen */
"volunteer" = "Vabatahtlik kaastöö";
"volunteer" = "Osale ühistöös CoMapsi täiendamisel";
/* "Social media" section header in the About screen */
"follow_us" = "Suhtle meiega";
@@ -755,12 +755,6 @@
/* Title for button when a route was saved. */
"saved" = "Salvestatud";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Oma kaardimuudatuste automaatseks üleslaadimiseks palun logi sisse OpenStreetMappi. Lisateave";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "kuskil siin";
"core_entrance" = "Sissepääs";
"error_enter_correct_name" = "Palun sisesta korrektne nimi";
"bookmark_lists" = "Loendid";
@@ -1099,3 +1093,5 @@
"pref_maplanguage_title" = "Kaardi keel";
"transliteration_title_disabled_summary" = "Kui kaardil on alati kasutusel kohalik keel, siis see eelistus on välja lülitatud";
"pref_maplanguage_local" = "Kohalik keel";
"existence_confirmed_time_ago" = "Olemasolu on kontrollitud %@";
"hours_confirmed_time_ago" = "Kontrollitud %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Joogivee tankimispunkt";
"type.amenity.water_point.drinking_water_no" = "Joogivee tankimispunkt";
"type.barrier" = "Barjäär";
"type.barrier.yes" = "Barjäär";
"type.barrier.block" = "Kiviplokk";
"type.barrier.bollard" = "Piirdetulp";
"type.barrier.border_control" = "Piirikontroll";
@@ -304,10 +305,10 @@
"type.cuisine.georgian" = "Gruusia";
"type.cuisine.german" = "Saksa";
"type.cuisine.greek" = "Kreeka";
"type.cuisine.grill" = "Grill";
"type.cuisine.grill" = "Grillroad";
"type.cuisine.heuriger" = "Austria hooajaline veinikõrts (heuriger)";
"type.cuisine.hotdog" = "Viinersai";
"type.cuisine.hungarian" = "Ungari";
"type.cuisine.hungarian" = "Ungari köök";
"type.cuisine.ice_cream" = "Jäätis";
"type.cuisine.indian" = "India";
"type.cuisine.indonesian" = "Indoneesia";
@@ -329,7 +330,7 @@
"type.cuisine.noodles" = "Nuudliroad";
"type.cuisine.oriental" = "Kaug-Ida";
"type.cuisine.pancake" = "Pannkoogid";
"type.cuisine.pasta" = "Pasta";
"type.cuisine.pasta" = "Pastaroad";
"type.cuisine.persian" = "Pärsia";
"type.cuisine.peruvian" = "Peruu köök";
"type.cuisine.pizza" = "Pitsa";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Pargivahi maja";
"type.amenity.luggage_locker" = "Pagasihoid";
"type.post_office.post_partner" = "Postiteenused partneri juures";
"type.barrier.wicket_gate" = "Jalgvärav";
"type.amenity.animal_shelter" = "Loomade varjupaik";

View File

@@ -3,13 +3,13 @@
"search" = "Bilatu";
/* Used in home screen quick actions. */
"bookmarks_and_tracks" = "Markagailuak eta ibilbideak";
"bookmarks_and_tracks" = "Markagailuak eta arrastoak";
/* Used in home screen quick actions. */
"route" = "Ibilbidea";
/* Needed to explain why we always require access to GPS coordinates, and not only when the app is active. */
"NSLocationAlwaysUsageDescription" = "Beharrezkoa da inguruneko egungo kokapena definitzea aplikazioaren funtzionaltasunaz guztiz gozatzeko. Ibilbidea jarraitu eta duela gutxi egindako bidea gordetzeko aukeretan erabiltzen da.";
"NSLocationAlwaysUsageDescription" = "Beharrezkoa da inguruneko egungo kokapena definitzea aplikazioaren funtzionaltasunaz guztiz gozatzeko. Ibilbidea jarraitu eta duela gutxi egindako arrastoa gordetzeko aukeretan erabiltzen da.";
/* Needed to explain why we require access to GPS coordinates when the app is active. */
"NSLocationWhenInUseUsageDescription" = "Uneko kokapenaren definizioa ibilbidea jarraitu eta duela gutxi egindako bidea gordetzeko aukeretan erabiltzen da.";
"NSLocationWhenInUseUsageDescription" = "Uneko kokapenaren definizioa ibilbidea jarraitu eta duela gutxi egindako arrastoa gordetzeko aukeretan erabiltzen da.";

View File

@@ -69,7 +69,7 @@
"bookmarks" = "Markagailuak";
/* "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt */
"bookmarks_and_tracks" = "Markagailuak eta ibilbideak";
"bookmarks_and_tracks" = "Markagailuak eta arrastoak";
/* Default bookmark list name */
"core_my_places" = "Nire tokiak";
@@ -195,7 +195,7 @@
"version: %@ (%@)\nmap data: %@" = "Bertsioa: %@ (%@)\nMaparen datuak: %@";
/* Title for tracks category in bookmarks manager */
"tracks_title" = "Arrasto";
"tracks_title" = "Arrastoak";
/* Length of track in cell that describes route */
"length" = "Luzera";
@@ -250,7 +250,7 @@
"pref_tts_language_title" = "Ahots hizkuntza";
/* Settings «Route» category: «Test Voice Directions» title */
"pref_tts_test_voice_title" = "Probatu ahots bidezko jarraibideak (TTS, Text-To-Speech)";
"pref_tts_test_voice_title" = "Probatu ahots bidezko jarraibideak";
/* Title for "Other" section in TTS settings. */
"pref_tts_other_section_title" = "Beste batzuk";
@@ -325,7 +325,7 @@
"volunteer" = "Boluntario izateko";
/* "Social media" section header in the About screen */
"follow_us" = "Jarraitu eta jarri gurekin harremanetan";
"follow_us" = "Jarri gurekin harremanetan";
/* Alert text */
"email_error_body" = "Posta elektronikoko bezeroa ez da konfiguratu. Mesedez, konfigura ezazu edo erabili beste moduren bat gurekin harremanetan jartzeko %@ helbidean";
@@ -754,12 +754,6 @@
/* Title for button when a route was saved. */
"saved" = "Gordeta";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Hasi saioa OpenStreetMap-en zure mapen aldaketa guztiak automatikoki kargatzeko. Lortu informazio gehiago";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "hemen";
"core_entrance" = "Sarrera";
"error_enter_correct_name" = "Mesedez, idatzi baliozko izen bat";
"bookmark_lists" = "Zerrendak";
@@ -770,7 +764,7 @@
"bookmarks_create_new_group" = "Sortu zerrenda berria";
/* Bookmark categories screen, button that opens folder selection dialog to import KML/KMZ/GPX/KMB files */
"bookmarks_import" = "Inportatu markagailuak eta ibilbideak";
"bookmarks_import" = "Inportatu markagailuak eta arrastoak";
"downloader_hide_screen" = "Ezkutatu pantaila";
"downloader_percent" = "%@ (%@/%@)";
"downloader_process" = "%@ deskargatzen…";
@@ -942,7 +936,7 @@
"placepage_delete_track_button" = "Ezabatu arrastoa";
/* The track deletion confirmaion alert message. */
"placepage_delete_track_confirmation_alert_message" = "Ziur pista hau ezabatu nahi duzula?";
"placepage_delete_track_confirmation_alert_message" = "Ziur arrasto hau ezabatu nahi duzula?";
/* Placeholder for track name input on track edit screen */
"placepage_track_name_hint" = "Arrastoaren izena";
@@ -1002,7 +996,7 @@
"button_layer_outdoor" = "Landa-eremua";
/* Bookmark categories screen, button that opens share dialog to export all bookmarks and tracks */
"bookmarks_export" = "Esportatu Laster-marka eta Pista guztiak";
"bookmarks_export" = "Esportatu markagailu eta arrasto guztiak";
/* Text for the editing the Track's color button. */
"change_color" = "Kolorea aldatu";
@@ -1024,7 +1018,7 @@
"enable_icloud_synchronization_title" = "Gaitu iCloud sinkronizazioa";
/* Message for the "Enable iCloud Syncronization" alert. */
"enable_icloud_synchronization_message" = "iCloud sinkronizazioa garatzen ari den ezaugarri esperimental bat da. Ziurtatu zure laster-marka eta ibilbide guztien babeskopia egin duzula.";
"enable_icloud_synchronization_message" = "iCloud sinkronizazioa garatzen ari den ezaugarri esperimental bat da. Ziurtatu zure markagailu eta arrasto guztien babeskopia egin duzula.";
/* Title for the "iCloud Is Disabled" alert. */
"icloud_disabled_title" = "iCloud desgaituta dago";
@@ -1075,10 +1069,10 @@
"recover_all" = "Guztia berreskuratu";
/* Prompt to start recording a track. */
"start_track_recording" = "Ibilbidearen grabaketa";
"start_track_recording" = "Grabatu arrastoa";
/* Prompt for stopping a track recording. */
"stop_track_recording" = "Gelditu ibilbidearen grabaketa";
"stop_track_recording" = "Gelditu arrastoaren grabaketa";
/* Title for the "Stop Without Saving" action for the alert when saving a track recording. */
"stop_without_saving" = "Gelditu gorde gabe";
@@ -1087,15 +1081,17 @@
"continue_recording" = "Jarraitu grabatzen";
/* Title for the alert when saving a track recording. */
"track_recording_alert_title" = "Ibilbidearen grabaketa markagailuetan eta ibilbideetan gorde nahi duzu?";
"track_recording_alert_title" = "Markagailu eta arrastoetan gorde nahi duzu?";
/* Message for the toast when saving the track recording is finished but nothing to save. */
"track_recording_toast_nothing_to_save" = "Ibilbidea hutsik dago; ez dago ezer gordetzeko";
"track_recording_toast_nothing_to_save" = "Arrastoa hutsik dago; ez dago ezer gordetzeko";
"edit_track" = "Editatu arrastoa";
"osm_profile_view_notes" = "Oharrak ikusi";
"osm_profile_view_edit_history" = "Aldaketen historia ikusi";
"about_proposition_3" = "Transparent and not for profit";
"pref_mapappearance_title" = "Map Appearance";
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"about_proposition_3" = "Gardena eta irabazi asmorik gabekoa";
"pref_mapappearance_title" = "Mapen itxura";
"pref_maplanguage_title" = "Mapen hizkuntza";
"transliteration_title_disabled_summary" = "Desgaituta maparako hizkuntza lokala beti erabiltzean";
"pref_maplanguage_local" = "Hizkuntza lokala";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Ur iturria";
"type.amenity.water_point.drinking_water_no" = "Ur iturria";
"type.barrier" = "Hesia";
"type.barrier.yes" = "Hesia";
"type.barrier.block" = "Blokea";
"type.barrier.bollard" = "Pibotea";
"type.barrier.border_control" = "Muga kontrola";
@@ -548,13 +549,13 @@
/* These translations are used for all type.highway.*.tunnel. */
"type.highway.tertiary_link.tunnel" = "Tunel";
"type.highway.track" = "Kalea";
"type.highway.track.area" = "Kalea";
"type.highway.track" = "Arrastoa";
"type.highway.track.area" = "Arrastoa";
/* These translations are used for all type.highway.*.bridge. */
"type.highway.track.bridge" = "Zubia";
"type.highway.track.grade1" = "Kalea";
"type.highway.track.no.access" = "Kalea";
"type.highway.track.grade1" = "Arrastoa";
"type.highway.track.no.access" = "Arrastoa";
/* These translations are used for all type.highway.*.tunnel. */
"type.highway.track.tunnel" = "Tunel";
@@ -593,7 +594,7 @@
"type.area_highway.service" = "Kalea";
"type.area_highway.tertiary" = "Kalea";
"type.area_highway.steps" = "Bidea";
"type.area_highway.track" = "Kalea";
"type.area_highway.track" = "Arrastoa";
"type.area_highway.trunk" = "Kalea";
"type.area_highway.unclassified" = "Kalea";
"type.historic" = "Objektu historikoa";
@@ -718,8 +719,8 @@
"type.leisure.stadium" = "Estadioa";
"type.leisure.swimming_pool" = "Igerilekua";
"type.leisure.swimming_pool.private" = "Igerilekua";
"type.leisure.track" = "Pista";
"type.leisure.track.area" = "Pista";
"type.leisure.track" = "Arrastoa";
"type.leisure.track.area" = "Arrastoa";
"type.leisure.water_park" = "Ur-parkea";
"type.leisure.beach_resort" = "Hondartzako oporleku";
"type.man_made" = "Artifiziala";
@@ -924,7 +925,7 @@
"type.railway.rail.spur" = "Trenbide-spur";
/* Short service tracks: siding, yard, crossover. */
"type.railway.rail.service" = "Trenbide laguntzailea";
"type.railway.rail.service" = "Zerbitzuko trenbidea";
"type.railway.rail.bridge" = "Trenbide zubia";
"type.railway.rail.highspeed.bridge" = "Trenbide zubia";
"type.railway.rail.tourism.bridge" = "Trenbide zubia";
@@ -1481,3 +1482,5 @@
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Txirrinduen aparkaleku estalia";
"type.post_office.post_partner" = "Post Partner";
"type.amenity.animal_shelter" = "Animal Shelter";
"type.barrier.wicket_gate" = "Wicket gate";

View File

@@ -751,12 +751,6 @@
/* Title for button when a route was saved. */
"saved" = "ذخیره شد";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"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" = "اینجا";
"core_entrance" = "ورودی";
"error_enter_correct_name" = "لطفا نام صحیح را وارد کنید";
"bookmark_lists" = "لیست‌ها";
@@ -1097,3 +1091,5 @@
"pref_maplanguage_title" = "زبان نقشه";
"transliteration_title_disabled_summary" = "زمانی که همیشه از زبان محلی برای نقشه استفاده می کنید غیرفعال است";
"pref_maplanguage_local" = "زبان محلی";
"existence_confirmed_time_ago" = "Existence confirmed %@";
"hours_confirmed_time_ago" = "Confirmed %@";

View File

@@ -1,31 +1,31 @@
"type.addr_interpolation" = "آدرس/بلاک";
"type.addr_interpolation.even" = "آدرس/بلاک";
"type.addr_interpolation.odd" = "آدرس/بلاک";
"type.addr_interpolation" = "نشانی/بست";
"type.addr_interpolation.even" = "نشانی/بست";
"type.addr_interpolation.odd" = "نشانی/بست";
"type.aerialway" = "راه هوایی";
"type.aerialway.cable_car" = "ماشین کابلی";
"type.aerialway.cable_car" = "خودردو کابلی";
"type.aerialway.chair_lift" = "Chair Lift";
"type.aerialway.drag_lift" = "Drag Lift";
"type.aerialway.gondola" = "Gondola";
"type.aerialway.mixed_lift" = "Mixed Lift";
"type.aerialway.station" = "ایستگاه راه هوایی";
"type.aeroway" = "­زیرساخت هوا و فضا";
"type.aerialway.station" = "ایستگاه راههوایی";
"type.aeroway" = "زیرساخت مرز‌هوایی";
"type.aeroway.aerodrome" = "فرودگاه";
"type.aeroway.aerodrome.international" = "فرودگاه";
"type.aeroway.apron" = "Apron";
"type.aeroway.gate" = "Gate";
"type.aeroway.helipad" = "پد فرود بالگرد";
"type.aeroway.aerodrome.international" = "فرودگاه فرامرزی";
"type.aeroway.apron" = "پیشگاه";
"type.aeroway.gate" = "دروازه";
"type.aeroway.helipad" = "بالگَردنشین";
"type.aeroway.runway" = "Runway";
"type.aeroway.taxiway" = "Taxiway";
"type.aeroway.terminal" = "Terminal";
"type.amenity" = "زیر ساخت";
"type.amenity.arts_centre" = "مرکز هنری";
"type.aeroway.taxiway" = "رج وزیگ";
"type.aeroway.terminal" = "پایانه";
"type.amenity" = "امکانات آسایشی";
"type.amenity.arts_centre" = "کانون هنری";
"type.amenity.atm" = "خودپرداز";
"type.amenity.bank" = "بانک";
"type.amenity.bar" = "میکده";
"type.amenity.bbq" = "منقل کباب";
"type.amenity.bench" = "سَکو";
"type.amenity.bicycle_parking" = "پارکینگ دوچرخه";
"type.amenity.bicycle_rental" = "مکان اجاره دوچرخه";
"type.amenity.bar" = "میکده";
"type.amenity.bbq" = "اَدیشت کباب";
"type.amenity.bench" = "نیمکت";
"type.amenity.bicycle_parking" = "ایستگاه دوچرخه";
"type.amenity.bicycle_rental" = "جایگاه کرایه دوچرخه";
"type.amenity.bicycle_repair_station" = "ایستگاه تعمیر دوچرخه";
"type.amenity.biergarten" = "غذا";
"type.amenity.brothel" = "فاحشه خانه";
@@ -190,6 +190,7 @@
"type.amenity.water_point" = "شیر آب قابل شرب";
"type.amenity.water_point.drinking_water_no" = "شیر آب قابل شرب";
"type.barrier" = "Barrier";
"type.barrier.yes" = "Barrier";
"type.barrier.block" = "بلوک";
"type.barrier.bollard" = "ستون";
"type.barrier.border_control" = "کنترل مرزی";
@@ -1479,5 +1480,7 @@
"type.leisure.escape_game" = "Escape Room";
"type.amenity.luggage_locker" = "Luggage Locker";
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking";
"type.amenity.bicycle_parking.covered" = "ایستگاه پوشیده‌ی دوچرخه";
"type.post_office.post_partner" = "Post Partner";
"type.amenity.animal_shelter" = "Animal Shelter";
"type.barrier.wicket_gate" = "Wicket gate";

View File

@@ -325,7 +325,7 @@
"report_incorrect_map_bug" = "Ilmoita tai korjaa virheelliset karttatiedot";
/* Button in the About screen */
"volunteer" = "Vapaaehtoiseksi";
"volunteer" = "Ryhdy vapaaehtoiseksi ja auta parantamaan CoMapsia";
/* "Social media" section header in the About screen */
"follow_us" = "Ota yhteyttä";
@@ -757,12 +757,6 @@
/* Title for button when a route was saved. */
"saved" = "Tallennettu";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Kirjaudu sisään OpenStreetMapiin, jotta voit ladata kaikki karttamuutoksesi automaattisesti. Lisätietoja";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "täältä";
"core_entrance" = "Sisäänkäynti";
"error_enter_correct_name" = "Anna oikea nimi";
"bookmark_lists" = "Luettelot";
@@ -1101,3 +1095,5 @@
"pref_maplanguage_title" = "Karttakieli";
"transliteration_title_disabled_summary" = "Kytke pois käytöstä, jos käytät aina paikallista kieltä kartalle";
"pref_maplanguage_local" = "Paikallinen kieli";
"existence_confirmed_time_ago" = "Olemassaolo varmistettu %@";
"hours_confirmed_time_ago" = "Varmistettu %@";

View File

@@ -8,7 +8,7 @@
"type.aerialway.gondola" = "Gondolihissi";
"type.aerialway.mixed_lift" = "Köysirata";
"type.aerialway.station" = "Köysirata-asema";
"type.aeroway" = "Airspace Infrastructure";
"type.aeroway" = "Ilmatilan Infrastruktuuri";
"type.aeroway.aerodrome" = "Lentokenttä";
"type.aeroway.aerodrome.international" = "Kansainvälinen lentokenttä";
"type.aeroway.apron" = "Lentokentän asemataso";
@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Vesipiste";
"type.amenity.water_point.drinking_water_no" = "Vesipiste";
"type.barrier" = "Este";
"type.barrier.yes" = "Este";
"type.barrier.block" = "Este";
"type.barrier.bollard" = "Tolppa";
"type.barrier.border_control" = "Rajavalvonta";
@@ -687,7 +688,7 @@
"type.landuse.salt_pond" = "Suolalampi";
"type.landuse.village_green" = "Maa";
"type.landuse.vineyard" = "Viinitarha";
"type.leisure" = "Leisure";
"type.leisure" = "Vapaa-aika";
"type.leisure.common" = "Julkinen paikka";
"type.leisure.dog_park" = "Koirien ulkoilupaikka";
"type.leisure.fitness_centre" = "Kuntosali";
@@ -722,7 +723,7 @@
"type.leisure.track.area" = "Juoksurata";
"type.leisure.water_park" = "Vesipuisto";
"type.leisure.beach_resort" = "Rantalomakohde";
"type.man_made" = "Man Made";
"type.man_made" = "Ihmisen Tekemä";
"type.man_made.breakwater" = "Aallonmurtaja";
"type.man_made.cairn" = "Kiviröykkiö";
"type.man_made.chimney" = "Tehtaan piippu";
@@ -809,7 +810,7 @@
"type.natural.water" = "Vettä";
"type.natural.wetland" = "Soistuva maa";
"type.natural.wetland.bog" = "Suo";
"type.natural.wetland.marsh" = "Marsh";
"type.natural.wetland.marsh" = "Suo";
"type.noexit" = "Umpikuja";
"type.office" = "Toimisto";
"type.office.company" = "Yhtiön toimisto";
@@ -1285,7 +1286,7 @@
"type.shop.baby_goods" = "Lasten kauppa";
"type.shop.bag" = "Laukkukauppa";
"type.shop.bed" = "Sänkykauppa";
"type.shop.boutique" = "Boutique";
"type.shop.boutique" = "Putiikki";
"type.shop.charity" = "Hyväntekeväisyysmyymälä";
"type.shop.cheese" = "Juustokauppa";
"type.shop.craft" = "Käsityöt";
@@ -1437,10 +1438,10 @@
"type.piste_type.nordic" = "Latu";
"type.piste_type.sled" = "Kelkkarata";
"type.piste_type.sled.area" = "Kelkkarata";
"type.piste_type.snow_park" = "Snow Park";
"type.piste_type.snow_park" = "Lumipuisto";
"type.piste_type.hike" = "Lumi vaellusreitti";
"type.piste_type.connection" = "Pisteen yhteys";
"type.piste_type.skitour" = "Skitour Trail";
"type.piste_type.skitour" = "Hiihtovaellusreitti";
"type.amenity.events_venue" = "Tapahtumakeskus";
"type.shop.auction" = "Huutokauppa";
"type.shop.collector" = "Keräilyesineet";
@@ -1481,3 +1482,5 @@
"type.post_office.post_partner" = "Postikumppani";
"type.amenity.ranger_station" = "Vartioasema";
"type.amenity.bicycle_parking.covered" = "Pyöräkatos";
"type.amenity.animal_shelter" = "Eläinsuoja";
"type.barrier.wicket_gate" = "Käyntiportti";

View File

@@ -87,7 +87,7 @@
"measurement_units" = "Unités de mesure";
/* Search category for cafes, bars, restaurants; any changes should be duplicated in categories.txt @category_eat! */
"category_eat" = "Un endroit pour manger";
"category_eat" = " manger";
/* Search category for grocery stores; any changes should be duplicated in categories.txt @category_food! */
"category_food" = "Épiceries";
@@ -172,7 +172,7 @@
"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 CoMaps !";
"bookmark_share_email_subject" = "Hé, regardez ce lieu dans CoMaps !";
/* Subject for emailed position */
"my_position_share_email_subject" = "Hé, regardez ma position actuelle sur la carte CoMaps !";
@@ -250,7 +250,7 @@
"pref_tts_street_names_description" = "Quand activé, le nom de la rue ou de la sortie à prendre sera prononcé à haute voix.";
/* Settings «Route» category: «Tts language» title */
"pref_tts_language_title" = "Langue vocale";
"pref_tts_language_title" = "Langue des annonces vocales";
/* Settings «Route» category: «Test Voice Directions» title */
"pref_tts_test_voice_title" = "Tester les instructions vocales";
@@ -262,7 +262,7 @@
"search_show_on_map" = "Voir sur la carte";
/* Text in menu */
"website" = "Site internet";
"website" = "Site web";
/* Text in About menu, opens CoMaps news website */
"news" = "Nouvelles";
@@ -325,7 +325,7 @@
"report_incorrect_map_bug" = "Signaler ou corriger des données cartographiques incorrectes";
/* Button in the About screen */
"volunteer" = "Se porter volontaire";
"volunteer" = "Contribuer à CoMaps";
/* "Social media" section header in the About screen */
"follow_us" = "Rentrez en contact avec nous";
@@ -441,10 +441,10 @@
/* blue gray color */
"blue_gray" = "Gris-bleu";
"dialog_routing_disclaimer_title" = "Lorsque vous suivez l'itinéraire, gardez à l'esprit les points suivants :";
"dialog_routing_disclaimer_priority" = "— Les conditions de circulation, le code de la route et les panneaux de signalisation ont la priorité sur l'appareil de navigation;";
"dialog_routing_disclaimer_precision" = "— La carte peut être imprécise et l'itinéraire proposé n'est pas forcément le plus direct pour arriver à destination ;";
"dialog_routing_disclaimer_priority" = "— Les conditions de circulation, le code de la route et les panneaux de signalisation ont la priorité sur les conseils de navigation ;";
"dialog_routing_disclaimer_precision" = "— La carte peut être erronée et l'itinéraire proposé n'est pas forcément optimal pour arriver à destination ;";
"dialog_routing_disclaimer_recommendations" = "— L'itinéraire proposé doit être considéré comme une simple recommandation ;";
"dialog_routing_disclaimer_borders" = "— Faites attention aux itinéraires traversant des zones frontalières : les itinéraires générés par l'application peuvent parfois franchir des frontières étatiques dans des zones interdites ;";
"dialog_routing_disclaimer_borders" = "— Faites attention à proximité des zones frontalières : les itinéraires générés par l'application peuvent parfois franchir les frontières entre états dans des zones interdites;";
"dialog_routing_disclaimer_beware" = "Restez vigilants et soyez prudents sur la route !";
"dialog_routing_check_gps" = "Vérifiez le signal GPS";
"dialog_routing_error_location_not_found" = "Impossible de créer l'itinéraire. Les coordonnées GPS actuelles n'ont pas pu être déterminées.";
@@ -467,7 +467,7 @@
"dialog_routing_application_error" = "Impossible de créer l'itinéraire à cause d'une erreur dans l'application.";
"dialog_routing_try_again" = "Veuillez réessayer";
"dialog_routing_download_and_build_cross_route" = "Voulez-vous télécharger la carte et créer un itinéraire plus direct s'étendant sur plus d'une carte ?";
"dialog_routing_download_cross_route" = "Téléchargez des cartes supplémentaires pour cer un itinéraire plus direct sortant des limites de cette carte.";
"dialog_routing_download_cross_route" = "Téléchargez des cartes supplémentaires pour calculer un meilleur itinéraire sortant des limites de la carte courante.";
/* «Show» context menu */
"show" = "Afficher";
@@ -683,7 +683,7 @@
"editor_edits_sent_message" = "Ta note sera envoyée à OpenStreetMap";
"editor_comment_hint" = "Commentaire…";
"editor_reset_edits_message" = "Abandonner toutes les modifications locales ?";
"editor_reset_edits_button" = "Réinitialiser";
"editor_reset_edits_button" = "Ignorer";
"editor_remove_place_message" = "Supprimer le lieu ajouté ?";
"editor_remove_place_button" = "Supprimer";
"editor_place_doesnt_exist" = "Ce lieu n'existe pas";
@@ -692,7 +692,7 @@
/* Phone number error message */
"error_enter_correct_phone" = "Saisissez un numéro de téléphone valide";
"error_enter_correct_web" = "Saisissez une adresse Internet valide";
"error_enter_correct_email" = "Saisissez un email valide";
"error_enter_correct_email" = "Saisissez une adresse de courriel valide";
"refresh" = "Mettre à jour";
"placepage_add_place_button" = "Ajouter un lieu sur OpenStreetMap";
@@ -757,12 +757,6 @@
/* Title for button when a route was saved. */
"saved" = "Enregistré";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's first part */
"alert_reauth_message_ios" = "Connecte-toi à OpenStreetMap pour télécharger automatiquement toutes tes modifications de cartes. En savoir plus";
/* For iOS message 'alert_reauth_message' should be splitted in two parts: message + link. Here's link part */
"alert_reauth_link_text_ios" = "ici";
"core_entrance" = "Entrée";
"error_enter_correct_name" = "Veuillez entrer un nom correct";
"bookmark_lists" = "Listes";
@@ -832,7 +826,7 @@
"avoid_ferry" = "Éviter les ferries";
"avoid_motorways" = "Éviter les autoroutes";
"unable_to_calc_alert_title" = "Impossible de calculer l'itinéraire";
"unable_to_calc_alert_subtitle" = "Malheureusement, nous n'avons pas pu créer l'itinéraire avec les options sélectionnées. Modifiez les paramètres et réessayez";
"unable_to_calc_alert_subtitle" = "Malheureusement, nous n'avons pas pu créer l'itinéraire avec les options sélectionnées. Modifiez les paramètres et réessayez.";
"define_to_avoid_btn" = "Définissez les routes à éviter";
"change_driving_options_btn" = "Paramètres d'itinéraire activés";
"toll_road" = "Route à péage";
@@ -1094,10 +1088,12 @@
/* Message for the toast when saving the track recording is finished but nothing to save. */
"track_recording_toast_nothing_to_save" = "L'itinéraire est vide - il n'y a rien à sauvegarder";
"edit_track" = "Modifier le trace";
"edit_track" = "Modifier la trace";
"osm_profile_view_notes" = "Afficher les notes";
"osm_profile_view_edit_history" = "Afficher l'historique des modifications";
"pref_mapappearance_title" = "Apparence de la carte";
"pref_maplanguage_title" = "Langue de la carte";
"transliteration_title_disabled_summary" = "Désactivé lorsque la langue locale est toujours utilisée pour la carte";
"pref_maplanguage_local" = "Langue locale";
"existence_confirmed_time_ago" = "Existance confirmée %@";
"hours_confirmed_time_ago" = "Confirmées %@";

View File

@@ -190,6 +190,7 @@
"type.amenity.water_point" = "Point deau";
"type.amenity.water_point.drinking_water_no" = "Point deau";
"type.barrier" = "Barrière";
"type.barrier.yes" = "Barrière";
"type.barrier.block" = "Bloc";
"type.barrier.bollard" = "Poteau";
"type.barrier.border_control" = "Contrôle aux frontières";
@@ -208,7 +209,7 @@
"type.barrier.retaining_wall" = "Mur de soutènement";
"type.barrier.stile" = "Échalier";
"type.barrier.turnstile" = "Tourniquet";
"type.barrier.swing_gate" = "Barrière tournante";
"type.barrier.swing_gate" = "Portail Battant";
"type.barrier.toll_booth" = "Poste de péage";
"type.barrier.wall" = "Mur";
"type.boundary" = "Frontière";
@@ -1481,3 +1482,5 @@
"type.post_office.post_partner" = "Partenaire de publication";
"type.amenity.ranger_station" = "Poste de garde forestier";
"type.amenity.bicycle_parking.covered" = "Parking vélo couvert";
"type.amenity.animal_shelter" = "Abri pour animaux";
"type.barrier.wicket_gate" = "Portillon";

View File

@@ -366,8 +366,6 @@
"planning_route_remove_title" = "Arrastre aquí para eliminar";
"placepage_add_stop" = "Engadir parada";
"start_from_my_position" = "Empezar desde";
"alert_reauth_message_ios" = "Inicia sesión en OpenStreetMap para cargar automaticamente todas as túas edicións de mapas. Más información";
"alert_reauth_link_text_ios" = "aquí";
"core_entrance" = "Entrada";
"error_enter_correct_name" = "Por favor, introduza o nome correcto";
"bookmark_lists" = "Listas";
@@ -589,3 +587,5 @@
"pref_maplanguage_title" = "Map Language";
"transliteration_title_disabled_summary" = "Disabled when always using the local language for the map";
"pref_maplanguage_local" = "Local Language";
"hours_confirmed_time_ago" = "Confirmed %@";
"existence_confirmed_time_ago" = "Existence confirmed %@";

View File

@@ -288,6 +288,7 @@
"type.amenity.water_point" = "Fonte de auga para caravanas";
"type.amenity.water_point.drinking_water_no" = "Fonte de auga para caravanas";
"type.barrier" = "Barreira";
"type.barrier.yes" = "Barreira";
"type.barrier.block" = "Bloque";
"type.barrier.bollard" = "Bolardo";
"type.barrier.border_control" = "Control fronteirizo";
@@ -1295,3 +1296,5 @@
"type.amenity.ranger_station" = "Ranger Station";
"type.amenity.bicycle_parking.covered" = "Covered Bicycle Parking";
"type.post_office.post_partner" = "Post Partner";
"type.barrier.wicket_gate" = "Wicket gate";
"type.amenity.animal_shelter" = "Animal Shelter";

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