diff --git a/client/src/components/Roadtrip/RoadtripSidebar.tsx b/client/src/components/Roadtrip/RoadtripSidebar.tsx index 84adc3f51..e3c2cc51e 100644 --- a/client/src/components/Roadtrip/RoadtripSidebar.tsx +++ b/client/src/components/Roadtrip/RoadtripSidebar.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useState } from 'react' import { MapPin, CarFront, Footprints, Bike, Zap, AlertTriangle, Moon, ParkingSquare, Shuffle, Fuel, Clock, @@ -12,6 +12,8 @@ import { formatDate, formatClockTime } from '../../utils/formatters' import { formatDurationShort, isServiceStopType, serviceColor, type ScheduleEntry, type ScheduleWarning } from './roadtripModel' import { STOP_KIND_BY_KEY } from './stopKinds' import { spurWorthLabelling } from './accessSpur' +import StopKindPicker from './StopKindPicker' +import type { RoadtripStopType } from '@trek/shared' import type { QuietDay, RoadtripDay, RoadtripRoutes, RoadtripStop } from './useRoadtripRoutes' import type { RouteVia } from '../../types' import { FS } from './typeScale' @@ -38,6 +40,12 @@ interface RoadtripSidebarProps { * which is also what a viewer sees. */ onEditStay?: (stop: { placeId: number; name: string; minutes: number | null; arrival: string | null }) => void + /** + * Turns a stop into a pause on the drive, or back into a destination. + * + * Absent leaves every disc read-only, which is also what a viewer sees. + */ + onSetStopKind?: (placeId: number, kind: RoadtripStopType | null) => Promise | void } const MODE_ICON: Record = { @@ -352,12 +360,14 @@ function DriveBand({ leg, onAskAlternatives, alternativesOpen }: { * the trip is actually for. Its own icon on one flat disc: three kinds of pause that all * mean "we are still driving", and the icon is what tells them apart. */ -function ServiceStop({ stop, entry, driveFindings, selected, onSelect, onEditStay }: { +function ServiceStop({ stop, entry, driveFindings, selected, onSelect, onEditStay, onPickKind }: { stop: RoadtripStop entry: ScheduleEntry | undefined /** Findings about the drive that ARRIVES here. A charging halt is a stop like any other * as far as the tank is concerned, so it carries them the same way a numbered one does. */ driveFindings?: ScheduleWarning[] + /** Opens the kind picker on the disc. Absent leaves the rail read-only. */ + onPickKind?: (anchor: HTMLElement) => void selected: boolean onSelect?: () => void /** Opens the dialog for how long this pause takes. Absent means the rail is read-only. */ @@ -371,15 +381,39 @@ function ServiceStop({ stop, entry, driveFindings, selected, onSelect, onEditSta
- - - + {onPickKind ? ( + // The same control the other way round: the disc says what this is, and it is + // also where it stops being that. + + { e.stopPropagation(); onPickKind(e.currentTarget as HTMLElement) }} + onKeyDown={e => { + if (e.key !== 'Enter' && e.key !== ' ') return + e.preventDefault() + e.stopPropagation() + onPickKind(e.currentTarget as HTMLElement) + }} + className={`${DISC} cursor-pointer transition-transform hover:scale-110 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2`} + // theme-lint-disable — the road-signage palette in `roadtripModel`, shared + // with the corridor list and the map pin so one kind of stop looks like + // itself wherever it turns up. + style={{ background: serviceColor(stop.stopType), color: '#fff' }} + > + + + + ) : ( + + + + )} + + ) + })} +
+ + {/* Only once there is something to undo. On an ordinary place it would be a button + that says "leave everything as it is". */} + {current ? ( + + ) : null} + , + document.body, + ) +} diff --git a/client/src/pages/TripPlannerPage.tsx b/client/src/pages/TripPlannerPage.tsx index 05bf9a715..a254ff1f5 100644 --- a/client/src/pages/TripPlannerPage.tsx +++ b/client/src/pages/TripPlannerPage.tsx @@ -261,6 +261,7 @@ function TripPlannerPageDesktop(): React.ReactElement | null { showPlaceForm, setShowPlaceForm, editingPlace, setEditingPlace, prefillCoords, setPrefillCoords, editingAssignmentId, setEditingAssignmentId, stopDraft, setStopDraft, saveStopDraft, saveStopDraftAsNight, stopDraftToForm, stopDraftDuplicate, reorderRoadtripStop, + setRoadtripStopKind, saveRoadtripLimit, roadtripVias, addRoadtripVia, moveRoadtripVia, removeRoadtripVia, routeAlternatives, askRouteAlternatives, chooseRouteAlternative, alternativeOverlays, alternativeFocusPoints, @@ -536,6 +537,7 @@ function TripPlannerPageDesktop(): React.ReactElement | null { onAskAlternatives={can('day_edit', trip) ? askRouteAlternatives : undefined} openAlternatives={routeAlternatives.open} onEditStay={can('place_edit', trip) ? setStayDraft : undefined} + onSetStopKind={can('place_edit', trip) ? setRoadtripStopKind : undefined} /> ) : ( diff --git a/client/src/pages/tripPlanner/useTripPlanner.ts b/client/src/pages/tripPlanner/useTripPlanner.ts index 1846bb0b2..0091f53ed 100644 --- a/client/src/pages/tripPlanner/useTripPlanner.ts +++ b/client/src/pages/tripPlanner/useTripPlanner.ts @@ -859,6 +859,21 @@ export function useTripPlanner() { } }, [stopDraft, tripId, tripActions, updateRouteForDay, toast, t, roadtripVias, viaLiesBefore, loadAccommodations]) + /** + * Turns a stop on the drive into a pause, or back into a destination. + * + * The only difference between the two is `stop_type`, which decides whether the stop + * takes a number, counts in the day's total and appears in the printout. So this is one + * field on one place, and the rail redraws itself off the store the moment it lands. + */ + const setRoadtripStopKind = useCallback(async (placeId: number, kind: RoadtripStopType | null) => { + try { + await tripActions.updatePlace(tripId, placeId, { stop_type: kind }) + } catch (err: unknown) { + toast.error(err instanceof Error ? err.message : t('common.unknownError')) + } + }, [tripId, tripActions, toast, t]) + /** * Moves a stop within its day, from the road trip rail. * @@ -1709,6 +1724,7 @@ export function useTripPlanner() { prefillCoords, setPrefillCoords, editingAssignmentId, setEditingAssignmentId, placeFormDayId, setPlaceFormDayId, reservationModalDayId, setReservationModalDayId, stopDraft, setStopDraft, saveStopDraft, saveStopDraftAsNight, stopDraftToForm, stopDraftDuplicate, reorderRoadtripStop, + setRoadtripStopKind, saveRoadtripLimit, roadtripVias, addRoadtripVia, moveRoadtripVia, removeRoadtripVia, routeAlternatives, askRouteAlternatives, chooseRouteAlternative, alternativeOverlays, alternativeFocusPoints, diff --git a/shared/src/i18n/ar/roadtrip.ts b/shared/src/i18n/ar/roadtrip.ts index 0b4535992..1e777e015 100644 --- a/shared/src/i18n/ar/roadtrip.ts +++ b/shared/src/i18n/ar/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'اليوم {number}', 'roadtrip.stay.nightAdded': 'أُضيف كمبيت', 'roadtrip.stay.nightAction': 'إضافة كمبيت', + 'roadtrip.stop.makeService': 'اجعله توقفاً في الطريق', + 'roadtrip.stop.changeKind': 'تغيير نوع التوقف', + 'roadtrip.stop.backToDestination': 'العودة إلى وجهة', 'roadtrip.poi.rest': 'استراحة', 'roadtrip.poi.campsite': 'مخيم', 'roadtrip.poi.food': 'طعام', diff --git a/shared/src/i18n/br/roadtrip.ts b/shared/src/i18n/br/roadtrip.ts index f9048e136..85d0e33f1 100644 --- a/shared/src/i18n/br/roadtrip.ts +++ b/shared/src/i18n/br/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Dia {number}', 'roadtrip.stay.nightAdded': 'Adicionado como pernoite', 'roadtrip.stay.nightAction': 'Adicionar como pernoite', + 'roadtrip.stop.makeService': 'Tornar uma parada no caminho', + 'roadtrip.stop.changeKind': 'Alterar o tipo de parada', + 'roadtrip.stop.backToDestination': 'Voltar a ser um destino', 'roadtrip.poi.rest': 'Área de descanso', 'roadtrip.poi.campsite': 'Camping', 'roadtrip.poi.food': 'Comida', diff --git a/shared/src/i18n/ca/roadtrip.ts b/shared/src/i18n/ca/roadtrip.ts index 0cb15311a..c85143320 100644 --- a/shared/src/i18n/ca/roadtrip.ts +++ b/shared/src/i18n/ca/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Dia {number}', 'roadtrip.stay.nightAdded': 'Afegit com a pernoctació', 'roadtrip.stay.nightAction': 'Afegeix com a pernoctació', + 'roadtrip.stop.makeService': 'Converteix en parada del camí', + 'roadtrip.stop.changeKind': 'Canvia el tipus de parada', + 'roadtrip.stop.backToDestination': 'Torna a ser una destinació', 'roadtrip.poi.rest': 'Àrea de descans', 'roadtrip.poi.campsite': 'Càmping', 'roadtrip.poi.food': 'Menjar', diff --git a/shared/src/i18n/cs/roadtrip.ts b/shared/src/i18n/cs/roadtrip.ts index 5d65b343e..81fade817 100644 --- a/shared/src/i18n/cs/roadtrip.ts +++ b/shared/src/i18n/cs/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Den {number}', 'roadtrip.stay.nightAdded': 'Přidáno jako nocleh', 'roadtrip.stay.nightAction': 'Přidat jako nocleh', + 'roadtrip.stop.makeService': 'Změnit na zastávku po cestě', + 'roadtrip.stop.changeKind': 'Změnit typ zastávky', + 'roadtrip.stop.backToDestination': 'Zpět na cíl cesty', 'roadtrip.poi.rest': 'Odpočívadlo', 'roadtrip.poi.campsite': 'Kemp', 'roadtrip.poi.food': 'Jídlo', diff --git a/shared/src/i18n/de/roadtrip.ts b/shared/src/i18n/de/roadtrip.ts index eaa85f6f7..0a318c59a 100644 --- a/shared/src/i18n/de/roadtrip.ts +++ b/shared/src/i18n/de/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Tag {number}', 'roadtrip.stay.nightAdded': 'Als Übernachtung hinzugefügt', 'roadtrip.stay.nightAction': 'Als Übernachtung hinzufügen', + 'roadtrip.stop.makeService': 'Zum Halt unterwegs machen', + 'roadtrip.stop.changeKind': 'Art des Halts ändern', + 'roadtrip.stop.backToDestination': 'Wieder ein Ziel', 'roadtrip.poi.rest': 'Rastplatz', 'roadtrip.poi.campsite': 'Campingplatz', 'roadtrip.poi.food': 'Essen', diff --git a/shared/src/i18n/en/roadtrip.ts b/shared/src/i18n/en/roadtrip.ts index 4e4c18ffb..16243b2e8 100644 --- a/shared/src/i18n/en/roadtrip.ts +++ b/shared/src/i18n/en/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Day {number}', '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.rest': 'Rest area', 'roadtrip.poi.campsite': 'Campsite', 'roadtrip.poi.food': 'Food', diff --git a/shared/src/i18n/es/roadtrip.ts b/shared/src/i18n/es/roadtrip.ts index 3d767f934..635b126f5 100644 --- a/shared/src/i18n/es/roadtrip.ts +++ b/shared/src/i18n/es/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Día {number}', 'roadtrip.stay.nightAdded': 'Añadido como pernoctación', 'roadtrip.stay.nightAction': 'Añadir como pernoctación', + 'roadtrip.stop.makeService': 'Convertir en parada del camino', + 'roadtrip.stop.changeKind': 'Cambiar el tipo de parada', + 'roadtrip.stop.backToDestination': 'Volver a ser un destino', 'roadtrip.poi.rest': 'Área de descanso', 'roadtrip.poi.campsite': 'Camping', 'roadtrip.poi.food': 'Comida', diff --git a/shared/src/i18n/fr/roadtrip.ts b/shared/src/i18n/fr/roadtrip.ts index a76d8eacc..eceae62ba 100644 --- a/shared/src/i18n/fr/roadtrip.ts +++ b/shared/src/i18n/fr/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Jour {number}', 'roadtrip.stay.nightAdded': 'Ajouté comme nuitée', 'roadtrip.stay.nightAction': 'Ajouter comme nuitée', + 'roadtrip.stop.makeService': 'En faire un arrêt en chemin', + 'roadtrip.stop.changeKind': 'Changer le type d’arrêt', + 'roadtrip.stop.backToDestination': 'Redevenir une destination', 'roadtrip.poi.rest': 'Aire de repos', 'roadtrip.poi.campsite': 'Camping', 'roadtrip.poi.food': 'Restauration', diff --git a/shared/src/i18n/gr/roadtrip.ts b/shared/src/i18n/gr/roadtrip.ts index b3338f053..636d53954 100644 --- a/shared/src/i18n/gr/roadtrip.ts +++ b/shared/src/i18n/gr/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Ημέρα {number}', 'roadtrip.stay.nightAdded': 'Προστέθηκε ως διανυκτέρευση', 'roadtrip.stay.nightAction': 'Προσθήκη ως διανυκτέρευση', + 'roadtrip.stop.makeService': 'Μετατροπή σε στάση στον δρόμο', + 'roadtrip.stop.changeKind': 'Αλλαγή είδους στάσης', + 'roadtrip.stop.backToDestination': 'Πίσω σε προορισμό', 'roadtrip.poi.rest': 'Χώρος ανάπαυσης', 'roadtrip.poi.campsite': 'Κάμπινγκ', 'roadtrip.poi.food': 'Φαγητό', diff --git a/shared/src/i18n/hu/roadtrip.ts b/shared/src/i18n/hu/roadtrip.ts index 6594941d6..e9669ede2 100644 --- a/shared/src/i18n/hu/roadtrip.ts +++ b/shared/src/i18n/hu/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': '{number}. nap', 'roadtrip.stay.nightAdded': 'Hozzáadva éjszakázásként', 'roadtrip.stay.nightAction': 'Hozzáadás éjszakázásként', + 'roadtrip.stop.makeService': 'Legyen útközbeni megálló', + 'roadtrip.stop.changeKind': 'Megálló típusának módosítása', + 'roadtrip.stop.backToDestination': 'Vissza úti céllá', 'roadtrip.poi.rest': 'Pihenőhely', 'roadtrip.poi.campsite': 'Kemping', 'roadtrip.poi.food': 'Étkezés', diff --git a/shared/src/i18n/id/roadtrip.ts b/shared/src/i18n/id/roadtrip.ts index c76908285..e161af9d2 100644 --- a/shared/src/i18n/id/roadtrip.ts +++ b/shared/src/i18n/id/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Hari {number}', 'roadtrip.stay.nightAdded': 'Ditambahkan sebagai menginap', 'roadtrip.stay.nightAction': 'Tambahkan sebagai menginap', + 'roadtrip.stop.makeService': 'Jadikan perhentian di jalan', + 'roadtrip.stop.changeKind': 'Ubah jenis perhentian', + 'roadtrip.stop.backToDestination': 'Kembali jadi tujuan', 'roadtrip.poi.rest': 'Tempat istirahat', 'roadtrip.poi.campsite': 'Perkemahan', 'roadtrip.poi.food': 'Makanan', diff --git a/shared/src/i18n/it/roadtrip.ts b/shared/src/i18n/it/roadtrip.ts index 5c6ebbbda..93103a10a 100644 --- a/shared/src/i18n/it/roadtrip.ts +++ b/shared/src/i18n/it/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Giorno {number}', 'roadtrip.stay.nightAdded': 'Aggiunto come pernottamento', 'roadtrip.stay.nightAction': 'Aggiungi come pernottamento', + 'roadtrip.stop.makeService': 'Trasforma in sosta lungo il percorso', + 'roadtrip.stop.changeKind': 'Cambia il tipo di sosta', + 'roadtrip.stop.backToDestination': 'Torna a essere una destinazione', 'roadtrip.poi.rest': 'Area di sosta', 'roadtrip.poi.campsite': 'Campeggio', 'roadtrip.poi.food': 'Ristoro', diff --git a/shared/src/i18n/ja/roadtrip.ts b/shared/src/i18n/ja/roadtrip.ts index 21ecbce17..718472611 100644 --- a/shared/src/i18n/ja/roadtrip.ts +++ b/shared/src/i18n/ja/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': '{number}日目', 'roadtrip.stay.nightAdded': '宿泊として追加しました', 'roadtrip.stay.nightAction': '宿泊として追加', + 'roadtrip.stop.makeService': '途中の立ち寄りにする', + 'roadtrip.stop.changeKind': '立ち寄りの種類を変更', + 'roadtrip.stop.backToDestination': '目的地に戻す', 'roadtrip.poi.rest': 'サービスエリア', 'roadtrip.poi.campsite': 'キャンプ場', 'roadtrip.poi.food': '食事', diff --git a/shared/src/i18n/ko/roadtrip.ts b/shared/src/i18n/ko/roadtrip.ts index 6625efc92..d94e66a0b 100644 --- a/shared/src/i18n/ko/roadtrip.ts +++ b/shared/src/i18n/ko/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': '{number}일차', 'roadtrip.stay.nightAdded': '숙박으로 추가했습니다', 'roadtrip.stay.nightAction': '숙박으로 추가', + 'roadtrip.stop.makeService': '경유 정차로 변경', + 'roadtrip.stop.changeKind': '정차 유형 변경', + 'roadtrip.stop.backToDestination': '다시 목적지로', 'roadtrip.poi.rest': '휴게소', 'roadtrip.poi.campsite': '캠핑장', 'roadtrip.poi.food': '식사', diff --git a/shared/src/i18n/nl/roadtrip.ts b/shared/src/i18n/nl/roadtrip.ts index caa162ce4..68625fc71 100644 --- a/shared/src/i18n/nl/roadtrip.ts +++ b/shared/src/i18n/nl/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Dag {number}', 'roadtrip.stay.nightAdded': 'Toegevoegd als overnachting', 'roadtrip.stay.nightAction': 'Toevoegen als overnachting', + 'roadtrip.stop.makeService': 'Maak er een stop onderweg van', + 'roadtrip.stop.changeKind': 'Soort stop wijzigen', + 'roadtrip.stop.backToDestination': 'Weer een bestemming', 'roadtrip.poi.rest': 'Rustplaats', 'roadtrip.poi.campsite': 'Camping', 'roadtrip.poi.food': 'Eten', diff --git a/shared/src/i18n/pl/roadtrip.ts b/shared/src/i18n/pl/roadtrip.ts index 17249cd7c..cd7c3f573 100644 --- a/shared/src/i18n/pl/roadtrip.ts +++ b/shared/src/i18n/pl/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Dzień {number}', 'roadtrip.stay.nightAdded': 'Dodano jako nocleg', 'roadtrip.stay.nightAction': 'Dodaj jako nocleg', + 'roadtrip.stop.makeService': 'Zamień w postój po drodze', + 'roadtrip.stop.changeKind': 'Zmień rodzaj postoju', + 'roadtrip.stop.backToDestination': 'Z powrotem cel podróży', 'roadtrip.poi.rest': 'Miejsce odpoczynku', 'roadtrip.poi.campsite': 'Kemping', 'roadtrip.poi.food': 'Jedzenie', diff --git a/shared/src/i18n/ru/roadtrip.ts b/shared/src/i18n/ru/roadtrip.ts index e2c309045..a87e396c2 100644 --- a/shared/src/i18n/ru/roadtrip.ts +++ b/shared/src/i18n/ru/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'День {number}', 'roadtrip.stay.nightAdded': 'Добавлено как ночёвка', 'roadtrip.stay.nightAction': 'Добавить как ночёвку', + 'roadtrip.stop.makeService': 'Сделать остановкой в пути', + 'roadtrip.stop.changeKind': 'Изменить тип остановки', + 'roadtrip.stop.backToDestination': 'Снова пункт назначения', 'roadtrip.poi.rest': 'Зона отдыха', 'roadtrip.poi.campsite': 'Кемпинг', 'roadtrip.poi.food': 'Еда', diff --git a/shared/src/i18n/sv/roadtrip.ts b/shared/src/i18n/sv/roadtrip.ts index 5c490df95..36252d4dd 100644 --- a/shared/src/i18n/sv/roadtrip.ts +++ b/shared/src/i18n/sv/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Dag {number}', 'roadtrip.stay.nightAdded': 'Tillagd som övernattning', 'roadtrip.stay.nightAction': 'Lägg till som övernattning', + 'roadtrip.stop.makeService': 'Gör det till ett stopp på vägen', + 'roadtrip.stop.changeKind': 'Byt typ av stopp', + 'roadtrip.stop.backToDestination': 'Tillbaka till ett resmål', 'roadtrip.poi.rest': 'Rastplats', 'roadtrip.poi.campsite': 'Campingplats', 'roadtrip.poi.food': 'Mat', diff --git a/shared/src/i18n/tr/roadtrip.ts b/shared/src/i18n/tr/roadtrip.ts index 0550743f8..9193ced10 100644 --- a/shared/src/i18n/tr/roadtrip.ts +++ b/shared/src/i18n/tr/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': '{number}. gün', 'roadtrip.stay.nightAdded': 'Konaklama olarak eklendi', 'roadtrip.stay.nightAction': 'Konaklama olarak ekle', + 'roadtrip.stop.makeService': 'Yol üzerinde molaya dönüştür', + 'roadtrip.stop.changeKind': 'Mola türünü değiştir', + 'roadtrip.stop.backToDestination': 'Yeniden varış noktası yap', 'roadtrip.poi.rest': 'Dinlenme alanı', 'roadtrip.poi.campsite': 'Kamp alanı', 'roadtrip.poi.food': 'Yemek', diff --git a/shared/src/i18n/uk/roadtrip.ts b/shared/src/i18n/uk/roadtrip.ts index 4c4f90543..44b8fd8a0 100644 --- a/shared/src/i18n/uk/roadtrip.ts +++ b/shared/src/i18n/uk/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'День {number}', 'roadtrip.stay.nightAdded': 'Додано як ночівлю', 'roadtrip.stay.nightAction': 'Додати як ночівлю', + 'roadtrip.stop.makeService': 'Зробити зупинкою в дорозі', + 'roadtrip.stop.changeKind': 'Змінити тип зупинки', + 'roadtrip.stop.backToDestination': 'Знову пункт призначення', 'roadtrip.poi.rest': 'Зона відпочинку', 'roadtrip.poi.campsite': 'Кемпінг', 'roadtrip.poi.food': 'Їжа', diff --git a/shared/src/i18n/vi/roadtrip.ts b/shared/src/i18n/vi/roadtrip.ts index 2f00b4aa5..54f822522 100644 --- a/shared/src/i18n/vi/roadtrip.ts +++ b/shared/src/i18n/vi/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': 'Ngày {number}', 'roadtrip.stay.nightAdded': 'Đã thêm làm nơi nghỉ đêm', 'roadtrip.stay.nightAction': 'Thêm làm nơi nghỉ đêm', + 'roadtrip.stop.makeService': 'Biến thành điểm dừng dọc đường', + 'roadtrip.stop.changeKind': 'Đổi loại điểm dừng', + 'roadtrip.stop.backToDestination': 'Trở lại là điểm đến', 'roadtrip.poi.rest': 'Trạm dừng nghỉ', 'roadtrip.poi.campsite': 'Khu cắm trại', 'roadtrip.poi.food': 'Đồ ăn', diff --git a/shared/src/i18n/zh-TW/roadtrip.ts b/shared/src/i18n/zh-TW/roadtrip.ts index a08c257fb..f4ced7272 100644 --- a/shared/src/i18n/zh-TW/roadtrip.ts +++ b/shared/src/i18n/zh-TW/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': '第 {number} 天', 'roadtrip.stay.nightAdded': '已新增為過夜住宿', 'roadtrip.stay.nightAction': '新增為過夜住宿', + 'roadtrip.stop.makeService': '設為途中停靠', + 'roadtrip.stop.changeKind': '變更停靠類型', + 'roadtrip.stop.backToDestination': '恢復為目的地', 'roadtrip.poi.rest': '休息站', 'roadtrip.poi.campsite': '露營地', 'roadtrip.poi.food': '餐飲', diff --git a/shared/src/i18n/zh/roadtrip.ts b/shared/src/i18n/zh/roadtrip.ts index c1dd71b28..fa4cef276 100644 --- a/shared/src/i18n/zh/roadtrip.ts +++ b/shared/src/i18n/zh/roadtrip.ts @@ -38,6 +38,9 @@ const roadtrip: TranslationStrings = { 'roadtrip.stay.dayNumber': '第 {number} 天', 'roadtrip.stay.nightAdded': '已添加为过夜住宿', 'roadtrip.stay.nightAction': '添加为过夜住宿', + 'roadtrip.stop.makeService': '设为途中停靠', + 'roadtrip.stop.changeKind': '更改停靠类型', + 'roadtrip.stop.backToDestination': '恢复为目的地', 'roadtrip.poi.rest': '服务区', 'roadtrip.poi.campsite': '露营地', 'roadtrip.poi.food': '餐饮',