mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
154c88b48a
A visit's End could be edited and was shown in road trip mode, but the schedule never read it: the drive always left a stop after its stay, so a traveller who knew when they had to leave but not how long they would stand there had no way to say so. The End is now the time the drive leaves. RoadtripStop.leaveAt is filled from the visit's End (or its place's) on the client by useRoadtripRoutes and on the server by roadtrip-plan.service, so calculate_roadtrip and get_roadtrip_context agree with the planner, and computeSchedule takes it as the departure it already knew how to hold. With Start and End both set the stay is the time between them. With daily travel times on, the stay is the time until then, and an End before the window start starts the day early the way a Start does. Before the first fixed time the chain works backwards through an End as it does through a pinned Start. An End is read against the drive: the last passing of that clock time counts as missed when the drive went past it on the road or earlier the same day, anything else is the next one, so a drive across midnight neither waits a whole day nor pretends to be on time. A drive that gets there after the End leaves on arrival and files a missedLeave finding, shown beside the late badge in the rail and on the phone. The rail's STAY badge, the inspector's Stay tile, the phone stop sheet and the phone chain show the stay the End makes, with an "until 14:00" hint. It is read off the schedule and never written to duration_minutes: the stay belongs to the place, the End to one visit, and a stored copy would go stale as soon as the arrival moved. For such a stop the stay dialog, desktop and phone, shows that stay read only and offers to remove the End, through the visit's time route with an offline path (assignmentRepo.setTimes, setAssignmentTimes). While the road trip is on, the End field in both place forms says the drive leaves at that time. The dead checkoutAt in the plan service is gone. New strings in all 23 locales.
264 lines
14 KiB
TypeScript
264 lines
14 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
||
|
||
const roadtrip: TranslationStrings = {
|
||
'roadtrip.stay.portals': 'Find accommodation',
|
||
'roadtrip.stay.portalHint': 'Check destination, dates and guests on the portal. CHECK24 requires a manual search.',
|
||
'roadtrip.charging.available': 'available',
|
||
'roadtrip.charging.unknown': 'No reliable data available',
|
||
'roadtrip.charging.stale': 'Status outdated',
|
||
'roadtrip.charging.prices': 'Published tariffs',
|
||
'roadtrip.charging.note':
|
||
'Published tariff; taxes, conditions and extra fees may apply. Your charging-card price can differ.',
|
||
'roadtrip.charging.coverage': 'Open data; coverage varies by region and operator.',
|
||
'roadtrip.charging.availability': 'Availability and prices',
|
||
'roadtrip.import.title': 'Import Google Maps route',
|
||
'roadtrip.import.note': 'Stops are appended to the selected day. TREK recalculates the route.',
|
||
'roadtrip.import.unresolved': 'Location unresolved; this stop will be skipped.',
|
||
'roadtrip.import.day': 'Day',
|
||
'roadtrip.hazards.show': 'Show hazard areas',
|
||
'roadtrip.hazards.current': 'Current warnings',
|
||
'roadtrip.hazards.note': 'Warnings are not road closures. Routes stay unchanged.',
|
||
'roadtrip.hazards.point': 'Location only; affected area unknown.',
|
||
'roadtrip.hazards.loading': 'Loading warnings…',
|
||
'roadtrip.hazards.unavailable': 'Unavailable',
|
||
'roadtrip.hazards.offline': 'Offline: live warnings unavailable',
|
||
'roadtrip.hazards.partial': 'Limited coverage',
|
||
'roadtrip.stops.section': 'Service stops',
|
||
'roadtrip.stops.inDays': 'Show in Days too',
|
||
'roadtrip.stops.daysHint': 'Off keeps all service stops in Roadtrip only.',
|
||
'roadtrip.window.dragHint':
|
||
'While online, drag a day ending along the route or onto a place; right-click it to restore the automatic ending.',
|
||
'roadtrip.window.resetBoundaries': 'Restore automatic day endings',
|
||
'roadtrip.window.endHere': 'End the day here',
|
||
'roadtrip.window.endHereHint':
|
||
'You can end a day at a specific stop in its place details while Roadtrip mode and daily travel times are active.',
|
||
'roadtrip.window.endAt': 'End the day',
|
||
'roadtrip.window.onRoute': 'Along the route',
|
||
'roadtrip.window.atStop': 'At the last place',
|
||
'roadtrip.window.routeHint': 'Pause on the route at the end time.',
|
||
'roadtrip.window.stopHint': 'Stop before the next place would exceed the end time.',
|
||
'roadtrip.window.legTooLong':
|
||
'A drive exceeds the daily travel window. Add a place along the way or choose to pause along the route.',
|
||
'roadtrip.window.pointLabel': 'End of day {day} at {time}',
|
||
'roadtrip.window.title': 'Daily travel times',
|
||
'roadtrip.window.start': 'Day start time',
|
||
'roadtrip.window.end': 'Day end time',
|
||
'roadtrip.window.hint': 'Set both times to enable. Manual times take priority.',
|
||
'roadtrip.window.invalid': 'The end time must be later than the start time.',
|
||
'roadtrip.window.stop': 'End of day',
|
||
'roadtrip.window.resume': 'Continue journey',
|
||
'roadtrip.window.pointHint': 'This is your estimated overnight pause point.',
|
||
'roadtrip.window.departure': 'Continue after the remaining visit at {time}',
|
||
'roadtrip.window.showPoint': 'Show on map',
|
||
'roadtrip.window.incomplete': 'Daily breaks cannot be calculated until all connecting routes are available.',
|
||
'roadtrip.window.conflict':
|
||
'A fixed time conflicts with the drive and daily breaks. Manual times are unchanged; automatic scheduling is paused.',
|
||
'roadtrip.window.tooLong': 'These travel times would require more than 365 extra days. Choose a longer daily window.',
|
||
'roadtrip.mode.roadtrip': 'Road trip',
|
||
'roadtrip.mode.days': 'Days',
|
||
'roadtrip.mode.label': 'Plan view',
|
||
'roadtrip.title': 'Road trip',
|
||
'roadtrip.subtitle': 'Stops, driving times and arrival times for this trip',
|
||
'roadtrip.empty.title': 'No route yet',
|
||
'roadtrip.stops.label': 'Stops along the way',
|
||
'roadtrip.stops.remove': 'Remove stop',
|
||
'roadtrip.poi.title': 'Along the route',
|
||
'roadtrip.poi.scope': 'Day',
|
||
'roadtrip.poi.looking': 'Looking for',
|
||
'roadtrip.poi.searchingHint': 'Searching the route…',
|
||
'roadtrip.poi.found': '{count} on the way',
|
||
'roadtrip.poi.fuel': 'Fuel',
|
||
'roadtrip.poi.charging': 'Charging',
|
||
'roadtrip.stop.offRoad': '{distance} from the road',
|
||
'roadtrip.via.plugin': 'Stop on the way',
|
||
'roadtrip.limit.title': 'Driving settings',
|
||
'roadtrip.limit.legLabel': 'Longest drive at once',
|
||
'roadtrip.limit.dayLabel': 'Driving per day',
|
||
'roadtrip.limit.rangeLabel': 'Range on one tank',
|
||
'roadtrip.limit.fillLabel': 'Fill up to',
|
||
'roadtrip.limit.fillFull': 'full',
|
||
'roadtrip.limit.fillBadge': 'fills to {percent} %',
|
||
'roadtrip.limit.wearNote': '{percent} % lost to age',
|
||
'roadtrip.limit.rangeLabelCharge': 'Range on one charge',
|
||
'roadtrip.limit.sectionTrip': 'This trip',
|
||
'roadtrip.limit.sectionDriving': 'Driving',
|
||
'roadtrip.limit.sectionVehicle': 'Vehicle',
|
||
'roadtrip.limit.tankLabel': 'Tank size',
|
||
'roadtrip.limit.batteryLabel': 'Battery',
|
||
'roadtrip.limit.useLabel': 'Consumption',
|
||
'roadtrip.limit.wearLabel': 'Battery wear',
|
||
'roadtrip.limit.computed': 'Worked out from the vehicle’s figures',
|
||
'roadtrip.limit.perFill': 'per tank',
|
||
'roadtrip.limit.perCharge': 'per charge',
|
||
'roadtrip.limit.afterFill': 'A {percent} % stop gives {distance}',
|
||
'roadtrip.limit.fullNote': 'A stop fills right up',
|
||
'roadtrip.limit.rangeEmpty': 'No range set',
|
||
'roadtrip.limit.rangeEmptyHint': 'Type a range, or fill in the figures below and TREK works it out.',
|
||
'roadtrip.limit.specHint': 'Vehicle details determine the range.',
|
||
'roadtrip.limit.vehicleHint': 'Choose a vehicle to calculate its range.',
|
||
'roadtrip.limit.minutes': 'min',
|
||
'roadtrip.limit.off': 'off',
|
||
'roadtrip.limit.blockNote': 'One block = {distance}',
|
||
'roadtrip.limit.echoOver': '{over} of {days} days over your limit.',
|
||
'roadtrip.limit.echoNone': 'All {days} days within your limits.',
|
||
'roadtrip.limit.echoDry': '{count} stretches with no reachable stop.',
|
||
'roadtrip.limit.echoEmpty': 'Open a road trip to see what these do to it.',
|
||
'roadtrip.limit.specToggle': 'Work it out from the car',
|
||
'roadtrip.limit.hint': 'Driving only, excluding stays and overnight legs.',
|
||
'roadtrip.limit.legOver': '{time} over your longest drive',
|
||
'roadtrip.limit.dayOver': '{time} over',
|
||
'roadtrip.limit.range': '{distance} since the last fill-up',
|
||
'roadtrip.limit.none': 'None set',
|
||
'roadtrip.line.section': 'Route line',
|
||
'roadtrip.line.connect': 'Connect the days',
|
||
'roadtrip.line.dayColors': 'A colour per day',
|
||
'roadtrip.line.hint': 'Connecting drives count toward the arrival day.',
|
||
'roadtrip.avoid.section': 'Avoid where possible',
|
||
'roadtrip.avoid.toll': 'Toll roads',
|
||
'roadtrip.avoid.motorway': 'Motorways',
|
||
'roadtrip.avoid.ferry': 'Ferries',
|
||
'roadtrip.avoid.hint': 'Avoids where possible; exceptions are flagged.',
|
||
'roadtrip.avoid.unavailable': 'Your routing provider does not support avoidance.',
|
||
'roadtrip.avoid.badge': '{count} avoided',
|
||
'roadtrip.avoid.missed': '{classes} unavoidable',
|
||
'roadtrip.avoid.missedHint':
|
||
'This day has no route around it, so the drive uses it. Every other day still avoids what it can.',
|
||
'roadtrip.refuel.dry': 'Tank runs out here',
|
||
'roadtrip.refuel.after': 'after {distance}',
|
||
'roadtrip.limit.vehicleLabel': 'What you drive',
|
||
'roadtrip.limit.vehicleAny': 'Either',
|
||
'roadtrip.limit.vehicleCombustion': 'Petrol',
|
||
'roadtrip.limit.vehicleElectric': 'Electric',
|
||
'roadtrip.refuel.dryElectric': 'Battery runs out here',
|
||
'roadtrip.refuel.findElectric': 'Find charging',
|
||
'roadtrip.refuel.find': 'Find fuel',
|
||
'roadtrip.refuel.again': 'Try again',
|
||
'roadtrip.refuel.looking': 'Looking along the route…',
|
||
'roadtrip.refuel.spare': '{distance} to spare',
|
||
'roadtrip.refuel.add': 'Add {name} as a fuel stop',
|
||
'roadtrip.refuel.addElectric': 'Add {name} as a charging stop',
|
||
'roadtrip.refuel.none': 'Nothing found on the reachable stretch.',
|
||
'roadtrip.refuel.incomplete': 'The search was cut short, so this stretch was not fully checked.',
|
||
'roadtrip.refuel.failed': 'The place search did not answer.',
|
||
'roadtrip.stop.none': 'A destination',
|
||
'roadtrip.stay.mode.pause': 'Pause',
|
||
'roadtrip.stay.mode.night': 'Overnight',
|
||
'roadtrip.stay.nightAdded': 'Added as an overnight stay',
|
||
'roadtrip.stay.nightAction': 'Add as an overnight stay',
|
||
'roadtrip.stop.makeService': 'Make it a stop on the way',
|
||
'roadtrip.stop.changeKind': 'Change what kind of stop this is',
|
||
'roadtrip.stop.backToDestination': 'Back to a destination',
|
||
'roadtrip.poi.anySocket': 'Any plug',
|
||
'roadtrip.poi.anyPower': 'Any power',
|
||
'roadtrip.poi.free': 'Free',
|
||
'roadtrip.poi.wholeDay': 'The whole day',
|
||
'roadtrip.poi.midLeg': 'Halfway, {from} to {to}',
|
||
'roadtrip.track.title': 'Day {number} follows a track',
|
||
'roadtrip.track.hint': 'Make this day follow an imported track',
|
||
'roadtrip.track.badge': 'Track',
|
||
'roadtrip.track.untitled': 'Unnamed track',
|
||
'roadtrip.track.empty': 'No tracks in this trip',
|
||
'roadtrip.track.emptyHint': 'Import a GPX or KML file and its tracks land here.',
|
||
'roadtrip.track.length': '{distance} long',
|
||
'roadtrip.track.gap': '{distance} off this day',
|
||
'roadtrip.track.onDay': 'along this day',
|
||
'roadtrip.track.explain':
|
||
'The drive is pulled onto the track with a handful of via points. Existing via points on those legs are replaced.',
|
||
'roadtrip.track.action': 'Follow this track',
|
||
'roadtrip.track.working': 'Fitting the drive to the track, round {round}',
|
||
'roadtrip.track.done': '{count} via points placed. The drive stays within {distance} of the track.',
|
||
'roadtrip.track.capped': '{count} via points placed. The drive gets no closer than {distance} at its widest.',
|
||
'roadtrip.track.already': 'The drive already followed this track.',
|
||
'roadtrip.track.errorRoute': 'The routing service did not answer.',
|
||
'roadtrip.track.errorSave': 'The via points could not be saved.',
|
||
'roadtrip.track.clear': 'Drop {count} via points',
|
||
'roadtrip.track.current': 'Currently following {name}',
|
||
'roadtrip.poi.rest': 'Rest area',
|
||
'roadtrip.poi.campsite': 'Campsite',
|
||
'roadtrip.poi.food': 'Food',
|
||
'roadtrip.poi.sights': 'Sights',
|
||
'roadtrip.poi.within': 'Within',
|
||
'roadtrip.poi.filter': 'Filter by name',
|
||
'roadtrip.poi.noMatch': 'Nothing on the way matches “{name}”.',
|
||
'roadtrip.poi.noneMatchFilters': 'Nothing on the way matches these filters.',
|
||
'roadtrip.poi.foundFiltered': '{count} of {total} on the way',
|
||
'roadtrip.poi.truncated': '{count} stretches had more than fits in one answer — narrow the corridor to see the rest.',
|
||
'roadtrip.poi.search': 'Search',
|
||
'roadtrip.poi.searching': 'Searching {done} of {total}',
|
||
'roadtrip.poi.capped': 'The route is long — only the first stretch was searched.',
|
||
'roadtrip.poi.partial': '{count} stretches could not be searched — the place search did not answer.',
|
||
'roadtrip.poi.failed': 'The place search is not answering right now.',
|
||
'roadtrip.poi.empty': 'Pick what you need and search.',
|
||
'roadtrip.poi.add': 'Add',
|
||
'roadtrip.poi.offRoute': '{distance} off the route',
|
||
'roadtrip.poi.atStart': 'near the start',
|
||
'roadtrip.poi.alongRoute': 'after {distance}',
|
||
'roadtrip.poi.clearResults': 'Clear results',
|
||
'roadtrip.poi.addManual': 'Add manually',
|
||
'roadtrip.poi.addManualShort': 'Manual',
|
||
'roadtrip.poi.manualHint':
|
||
'The place search does not find every charger or pump. Look one up by name and say where on the drive it goes.',
|
||
'roadtrip.poi.addBetween': 'Add between',
|
||
'roadtrip.poi.manualOffRoute': '{distance} from the route, so check which leg it belongs on.',
|
||
'roadtrip.poi.manualAppend': 'Nothing has routed yet, so it goes at the end of day {number}.',
|
||
'roadtrip.poi.manualNoResults': 'No places found.',
|
||
'roadtrip.poi.manualNoCoords':
|
||
'Without a position this goes to the trip\'s places rather than onto a drive. Pick one from the search above, or fill in the coordinates.',
|
||
'roadtrip.summary.distance': 'Distance',
|
||
'roadtrip.summary.driving': 'Driving time',
|
||
'roadtrip.alt.ask': 'Other ways',
|
||
'roadtrip.alt.title': 'Ways to drive this leg',
|
||
'roadtrip.alt.loading': 'Asking the router…',
|
||
'roadtrip.alt.onlyOne': 'Only one sensible way to drive this one.',
|
||
'roadtrip.alt.failed': 'The router is not answering right now.',
|
||
'roadtrip.alt.current': 'Current',
|
||
'roadtrip.alt.fastest': 'Fastest',
|
||
'roadtrip.alt.slower': '{time} slower',
|
||
'roadtrip.alt.quicker': '{time} quicker',
|
||
'roadtrip.alt.otherEngine': 'Timed by the avoidance router, not the main one.',
|
||
'roadtrip.day': 'Day {number}',
|
||
'roadtrip.quietDay.empty': 'No stops yet — drop one here',
|
||
'roadtrip.quietDay.one': 'Only {name} so far — drop a stop here',
|
||
'roadtrip.leg.driveText': '{distance} in {time}',
|
||
'roadtrip.day.stopCount': '{count} stops',
|
||
'roadtrip.day.fold': 'Fold',
|
||
'roadtrip.day.folded': 'Folded',
|
||
'roadtrip.stop.stayShort': 'Stay',
|
||
'roadtrip.stop.fillTitle': 'Fills to',
|
||
'roadtrip.stop.fillGives': 'about {distance} from here',
|
||
'roadtrip.stop.fillNoRange': 'Set a range to see what that buys.',
|
||
'roadtrip.stop.fillDefault': 'Use my default',
|
||
'roadtrip.stop.fillSet': 'Set how full this stop fills',
|
||
'roadtrip.leg.pending': 'No route',
|
||
'roadtrip.stop.addTitle': 'Add as a stop',
|
||
'roadtrip.stop.kind': 'Kind of stop',
|
||
'roadtrip.stop.landsOn': 'Day {day}, as stop {position}',
|
||
'roadtrip.stop.duplicate': '“{name}” is already on this trip.',
|
||
'roadtrip.stop.moreDetails': 'More details',
|
||
'roadtrip.stop.stay': 'Time at this stop',
|
||
'roadtrip.stop.pinned': 'Time you set',
|
||
'roadtrip.stop.computed': 'Calculated from the drive',
|
||
'roadtrip.stop.endIsLeave': 'On the road trip, the drive leaves at this time.',
|
||
'roadtrip.via.hint': 'Drag to reshape the route, right-click to remove',
|
||
'roadtrip.warn.late': 'Arrives {minutes} min after the time you set',
|
||
'roadtrip.warn.missedLeave': 'Arrives {minutes} min after the time you set to leave',
|
||
'roadtrip.warn.overnight': 'Next day',
|
||
'roadtrip.spill.title': 'From day {number}',
|
||
'roadtrip.spill.departs': 'leaves {time}',
|
||
'roadtrip.summary.stops': 'Stops',
|
||
'roadtrip.stay.add': 'Add a stay',
|
||
'roadtrip.stay.none': 'No stay',
|
||
'roadtrip.stay.custom': 'Minutes',
|
||
'roadtrip.stay.arrive': 'Arrive',
|
||
'roadtrip.stay.leave': 'Leave',
|
||
'roadtrip.stay.until': 'until {time}',
|
||
'roadtrip.stay.leavesAt': 'This visit has an end time, so the drive leaves at {time}.',
|
||
'roadtrip.stay.dayEndsFirst': 'The travel day ends before {time}, so the drive goes on the next morning.',
|
||
'roadtrip.stay.clearLeave': 'Remove end time',
|
||
'roadtrip.alt.noMotorway': 'No motorway',
|
||
'roadtrip.alt.noToll': 'No tolls',
|
||
'roadtrip.alt.noFerry': 'No ferry',
|
||
'roadtrip.summary.partial': 'Still working out the rest of the drive',
|
||
};
|
||
export default roadtrip;
|