From 62a80f420cb295f98f76129820497fd7043db416 Mon Sep 17 00:00:00 2001 From: Maurice Date: Mon, 12 Oct 2026 20:42:48 +0200 Subject: [PATCH] fix(bookings): an end time before the start time on the same day shows a warning in the booking dialog A booking saved with 18:00 to 09:00 and no end date was stored as ending earlier on its start day without a word. The dialog now says that the end time lies before the start time and that an end date is needed if it ends the next day, on desktop and on the phone. It only warns and does not block the save, since time zones can make such times correct. Refs #2604 --- .../components/Planner/ReservationModal.tsx | 7 +++++-- .../Planner/reservationFormModel.test.ts | 21 ++++++++++++++++++- .../Planner/reservationFormModel.ts | 11 ++++++++++ .../Planner/useReservationForm.test.ts | 11 ++++++++++ .../components/Planner/useReservationForm.ts | 2 ++ .../screens/trip/sheets/MReservationSheet.tsx | 7 ++++++- shared/src/i18n/ar/reservations.ts | 1 + shared/src/i18n/az/reservations.ts | 1 + shared/src/i18n/br/reservations.ts | 1 + shared/src/i18n/ca/reservations.ts | 1 + shared/src/i18n/cs/reservations.ts | 1 + shared/src/i18n/de/reservations.ts | 1 + shared/src/i18n/en/reservations.ts | 1 + shared/src/i18n/es/reservations.ts | 1 + shared/src/i18n/et/reservations.ts | 1 + shared/src/i18n/fr/reservations.ts | 1 + shared/src/i18n/gr/reservations.ts | 1 + shared/src/i18n/hu/reservations.ts | 1 + shared/src/i18n/id/reservations.ts | 1 + shared/src/i18n/it/reservations.ts | 1 + shared/src/i18n/ja/reservations.ts | 1 + shared/src/i18n/ko/reservations.ts | 1 + shared/src/i18n/nl/reservations.ts | 1 + shared/src/i18n/pl/reservations.ts | 1 + shared/src/i18n/ru/reservations.ts | 1 + shared/src/i18n/sk/reservations.ts | 1 + shared/src/i18n/sv/reservations.ts | 1 + shared/src/i18n/th/reservations.ts | 1 + shared/src/i18n/tr/reservations.ts | 1 + shared/src/i18n/uk/reservations.ts | 1 + shared/src/i18n/vi/reservations.ts | 1 + shared/src/i18n/zh-TW/reservations.ts | 1 + shared/src/i18n/zh/reservations.ts | 1 + 33 files changed, 82 insertions(+), 4 deletions(-) diff --git a/client/src/components/Planner/ReservationModal.tsx b/client/src/components/Planner/ReservationModal.tsx index 58b61b849..d282e22c3 100644 --- a/client/src/components/Planner/ReservationModal.tsx +++ b/client/src/components/Planner/ReservationModal.tsx @@ -80,7 +80,7 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p const { form, setForm, set, isSaving, setIsSaving, pendingFiles, setPendingFiles, travelerIds, setTravelerIds, toggleTraveler, - isEndBeforeStart, dateBounds: tripDateRange, startDate, startTime, setStartDate, setStartTime, takeStopDay, + isEndBeforeStart, endTimeBeforeStartTime, dateBounds: tripDateRange, startDate, startTime, setStartDate, setStartTime, takeStopDay, pickPlace, pickHotelPlace, pickHotelStart, pickHotelEnd, saveData: buildSaveData, } = useReservationForm(EMPTY_FORM, days, places) const attach = useBookingFileAttach({ reservation, files, onFileUpload, setPendingFiles, toast, t }) @@ -277,7 +277,10 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p max={tripDateRange.max} /> - + {t('reservations.validation.endTimeBeforeStartTime')} : undefined} + > set('reservation_end_time', v)} /> diff --git a/client/src/components/Planner/reservationFormModel.test.ts b/client/src/components/Planner/reservationFormModel.test.ts index f1462d9bc..9eae38102 100644 --- a/client/src/components/Planner/reservationFormModel.test.ts +++ b/client/src/components/Planner/reservationFormModel.test.ts @@ -1,4 +1,4 @@ -// FE-PLANNER-RESFORM-001 to -015: the booking form both the desktop ReservationModal +// FE-PLANNER-RESFORM-001 to -016: the booking form both the desktop ReservationModal // and the phone's booking sheet save through. import { describe, expect, it } from 'vitest'; @@ -8,6 +8,7 @@ import type { BookingReviewDraft } from './parsedItemToDraft'; import { RESERVATION_TYPE_OPTIONS, type ReservationFields, + endTimeBeforeStartTime, isEndBeforeStart, reservationFieldsFrom, reservationFieldsFromPrefill, @@ -175,6 +176,24 @@ describe('reservation dates', () => { expect(isEndBeforeStart(form({ end_date: '2026-07-01' }))).toBe(false); }); + it('FE-PLANNER-RESFORM-016: an end time before the start time without an end date warns but does not block (#2604)', () => { + const overnight = form({ reservation_time: '2026-11-24T18:00', reservation_end_time: '09:00' }); + expect(endTimeBeforeStartTime(overnight)).toBe(true); + // Time zones can make a booking end "before" it starts, so the save stays open. + expect(isEndBeforeStart(overnight)).toBe(false); + expect(endTimeBeforeStartTime(form({ reservation_time: '2026-11-24T09:00', reservation_end_time: '18:00' }))).toBe(false); + expect(endTimeBeforeStartTime(form({ reservation_time: '2026-11-24T18:00', reservation_end_time: '18:00' }))).toBe(false); + // With the next day as end date the times are fine, and an end date of its own is checked by isEndBeforeStart. + expect( + endTimeBeforeStartTime(form({ reservation_time: '2026-11-24T18:00', end_date: '2026-11-25', reservation_end_time: '09:00' })) + ).toBe(false); + expect(endTimeBeforeStartTime(form({ reservation_time: '2026-11-24', reservation_end_time: '09:00' }))).toBe(false); + expect(endTimeBeforeStartTime(form({ reservation_end_time: '09:00' }))).toBe(false); + expect( + endTimeBeforeStartTime(form({ type: 'hotel', reservation_time: '2026-11-24T18:00', reservation_end_time: '09:00' })) + ).toBe(false); + }); + it('FE-PLANNER-RESFORM-006: the start is edited as a date and a time', () => { expect(startParts('2026-07-02T10:00')).toEqual({ date: '2026-07-02', time: '10:00' }); expect(startParts('')).toEqual({ date: '', time: '' }); diff --git a/client/src/components/Planner/reservationFormModel.ts b/client/src/components/Planner/reservationFormModel.ts index 4a876a637..c1a3e8c58 100644 --- a/client/src/components/Planner/reservationFormModel.ts +++ b/client/src/components/Planner/reservationFormModel.ts @@ -164,6 +164,17 @@ export function isEndBeforeStart(form: DateFields): boolean { return `${form.end_date}T${endTime}` <= `${startDate}T${startTime}`; } +/** + * Whether an end time without an end date comes before the start time, which saves + * as an end earlier on the start day. That only warns: with time zones (a flight + * landing "before" it took off) the times can be right as they are (#2604). + */ +export function endTimeBeforeStartTime(form: DateFields): boolean { + if (form.type === 'hotel' || form.end_date || !form.reservation_end_time) return false; + const startTime = (form.reservation_time || '').split('T')[1] || ''; + return !!startTime && form.reservation_end_time < startTime; +} + /** The start's date and time as the two pickers show them. */ export function startParts(reservationTime: string): { date: string; time: string } { const [date, time] = (reservationTime || '').split('T'); diff --git a/client/src/components/Planner/useReservationForm.test.ts b/client/src/components/Planner/useReservationForm.test.ts index 72334f5c4..a98efd0e8 100644 --- a/client/src/components/Planner/useReservationForm.test.ts +++ b/client/src/components/Planner/useReservationForm.test.ts @@ -91,4 +91,15 @@ describe('useReservationForm', () => { endpoints: [], }); }); + + it('FE-PLANNER-RESFORMHOOK-006: an end time before the start time on the same day raises the warning (#2604)', () => { + const { result } = renderHook(() => useReservationForm(EMPTY, days, places)); + act(() => result.current.setStartTime('18:00', '2026-07-01')); + expect(result.current.endTimeBeforeStartTime).toBe(false); + act(() => result.current.set('reservation_end_time', '09:00')); + expect(result.current.endTimeBeforeStartTime).toBe(true); + expect(result.current.isEndBeforeStart).toBe(false); + act(() => result.current.set('end_date', '2026-07-02')); + expect(result.current.endTimeBeforeStartTime).toBe(false); + }); }); diff --git a/client/src/components/Planner/useReservationForm.ts b/client/src/components/Planner/useReservationForm.ts index 2d94a9018..d7db218b1 100644 --- a/client/src/components/Planner/useReservationForm.ts +++ b/client/src/components/Planner/useReservationForm.ts @@ -4,6 +4,7 @@ import type { Day, Place } from '../../types'; import { toggledTraveler } from './bookingFormModel'; import { type CheckInEndField, + endTimeBeforeStartTime, isEndBeforeStart, type ReservationFields, reservationSaveData, @@ -56,6 +57,7 @@ export function useReservationForm )} + {endTimeBeforeStartTime && ( +
+ {t('reservations.validation.endTimeBeforeStartTime')} +
+ )} {/* PLACE / ACTIVITY */} {t('reservations.meta.linkPlace')} diff --git a/shared/src/i18n/ar/reservations.ts b/shared/src/i18n/ar/reservations.ts index 68b092a42..2467e248b 100644 --- a/shared/src/i18n/ar/reservations.ts +++ b/shared/src/i18n/ar/reservations.ts @@ -131,6 +131,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'النهاية', 'reservations.span.ongoing': 'جارٍ', 'reservations.validation.endBeforeStart': 'يجب أن يكون تاريخ/وقت الانتهاء بعد تاريخ/وقت البدء', + 'reservations.validation.endTimeBeforeStartTime': 'وقت الانتهاء قبل وقت البدء. إذا كان ينتهي في اليوم التالي، فحدّد تاريخ انتهاء.', 'reservations.addBooking': 'إضافة حجز', 'reservations.import.title': 'استيراد تأكيدات الحجز', 'reservations.import.cta': 'استيراد من ملف', diff --git a/shared/src/i18n/az/reservations.ts b/shared/src/i18n/az/reservations.ts index c3f47deba..f987698d4 100644 --- a/shared/src/i18n/az/reservations.ts +++ b/shared/src/i18n/az/reservations.ts @@ -159,6 +159,7 @@ const reservations: TranslationStrings = { 'reservations.span.ongoing': 'Davam edir', 'reservations.validation.endBeforeStart': 'Bitmə tarixi və vaxtı başlanğıc tarixi və vaxtından sonra olmalıdır', + 'reservations.validation.endTimeBeforeStartTime': 'Bitmə vaxtı başlanğıc vaxtından əvvəldir. Növbəti gün bitirsə, bitmə tarixi təyin edin.', 'reservations.addBooking': 'Rezervasiya əlavə et', diff --git a/shared/src/i18n/br/reservations.ts b/shared/src/i18n/br/reservations.ts index db710bc81..e766aba46 100644 --- a/shared/src/i18n/br/reservations.ts +++ b/shared/src/i18n/br/reservations.ts @@ -131,6 +131,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Fim', 'reservations.span.ongoing': 'Em andamento', 'reservations.validation.endBeforeStart': 'A data/hora final deve ser posterior à data/hora inicial', + 'reservations.validation.endTimeBeforeStartTime': 'O horário final é anterior ao inicial. Se terminar no dia seguinte, defina uma data final.', 'reservations.addBooking': 'Adicionar reserva', 'reservations.import.title': 'Importar confirmações de reserva', 'reservations.import.cta': 'Importar de arquivo', diff --git a/shared/src/i18n/ca/reservations.ts b/shared/src/i18n/ca/reservations.ts index 00cd3623a..5a364f631 100644 --- a/shared/src/i18n/ca/reservations.ts +++ b/shared/src/i18n/ca/reservations.ts @@ -100,6 +100,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Fi', 'reservations.span.ongoing': 'En curs', 'reservations.validation.endBeforeStart': "La data/hora de fi ha de ser posterior a la d'inici", + 'reservations.validation.endTimeBeforeStartTime': "L'hora de fi és anterior a la d'inici. Si acaba l'endemà, indica una data de fi.", 'reservations.addBooking': 'Afegeix una reserva', 'reservations.meta.airline': 'Aerolínia', 'reservations.meta.flightNumber': 'Núm. de vol', diff --git a/shared/src/i18n/cs/reservations.ts b/shared/src/i18n/cs/reservations.ts index 4dcbfe916..e4097ff3d 100644 --- a/shared/src/i18n/cs/reservations.ts +++ b/shared/src/i18n/cs/reservations.ts @@ -131,6 +131,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Konec', 'reservations.span.ongoing': 'Probíhá', 'reservations.validation.endBeforeStart': 'Datum/čas konce musí být po datu/čase začátku', + 'reservations.validation.endTimeBeforeStartTime': 'Čas konce je dříve než čas začátku. Pokud končí následující den, nastavte datum konce.', 'reservations.addBooking': 'Přidat rezervaci', 'reservations.import.title': 'Importovat potvrzení rezervace', 'reservations.import.cta': 'Importovat ze souboru', diff --git a/shared/src/i18n/de/reservations.ts b/shared/src/i18n/de/reservations.ts index 7aacb409d..11664e3b4 100644 --- a/shared/src/i18n/de/reservations.ts +++ b/shared/src/i18n/de/reservations.ts @@ -134,6 +134,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Ende', 'reservations.span.ongoing': 'Laufend', 'reservations.validation.endBeforeStart': 'Enddatum/-zeit muss nach dem Startdatum/-zeit liegen', + 'reservations.validation.endTimeBeforeStartTime': 'Die Endzeit liegt vor der Startzeit. Endet die Buchung am nächsten Tag, wähle ein Enddatum.', 'reservations.addBooking': 'Buchung hinzufügen', 'reservations.import.title': 'Buchungsbestätigungen importieren', 'reservations.import.cta': 'Aus Datei importieren', diff --git a/shared/src/i18n/en/reservations.ts b/shared/src/i18n/en/reservations.ts index b38779437..a2626ee97 100644 --- a/shared/src/i18n/en/reservations.ts +++ b/shared/src/i18n/en/reservations.ts @@ -136,6 +136,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'End', 'reservations.span.ongoing': 'Ongoing', 'reservations.validation.endBeforeStart': 'End date/time must be after start date/time', + 'reservations.validation.endTimeBeforeStartTime': 'The end time is before the start time. If it ends the next day, set an end date.', 'reservations.addBooking': 'Add booking', 'reservations.import.title': 'Import booking confirmations', 'reservations.import.cta': 'Import from file', diff --git a/shared/src/i18n/es/reservations.ts b/shared/src/i18n/es/reservations.ts index 187070411..ba344eb48 100644 --- a/shared/src/i18n/es/reservations.ts +++ b/shared/src/i18n/es/reservations.ts @@ -100,6 +100,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Fin', 'reservations.span.ongoing': 'En curso', 'reservations.validation.endBeforeStart': 'La fecha/hora de fin debe ser posterior a la de inicio', + 'reservations.validation.endTimeBeforeStartTime': 'La hora de fin es anterior a la de inicio. Si termina al día siguiente, indica una fecha de fin.', 'reservations.addBooking': 'Añadir reserva', 'reservations.meta.airline': 'Aerolínea', 'reservations.meta.flightNumber': 'N° de vuelo', diff --git a/shared/src/i18n/et/reservations.ts b/shared/src/i18n/et/reservations.ts index 25334d04d..774eaffd3 100644 --- a/shared/src/i18n/et/reservations.ts +++ b/shared/src/i18n/et/reservations.ts @@ -136,6 +136,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Lõpp', 'reservations.span.ongoing': 'Käimas', 'reservations.validation.endBeforeStart': 'Lõppkuupäev ja -aeg peavad olema algusest hilisemad', + 'reservations.validation.endTimeBeforeStartTime': 'Lõpuaeg on enne algusaega. Kui see lõpeb järgmisel päeval, määra lõppkuupäev.', 'reservations.addBooking': 'Lisa broneering', 'reservations.import.title': 'Impordi broneeringukinnitused', 'reservations.import.cta': 'Impordi failist', diff --git a/shared/src/i18n/fr/reservations.ts b/shared/src/i18n/fr/reservations.ts index 158adb631..d62f0b2db 100644 --- a/shared/src/i18n/fr/reservations.ts +++ b/shared/src/i18n/fr/reservations.ts @@ -133,6 +133,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Fin', 'reservations.span.ongoing': 'En cours', 'reservations.validation.endBeforeStart': 'La date/heure de fin doit être postérieure à la date/heure de début', + 'reservations.validation.endTimeBeforeStartTime': "L'heure de fin est antérieure à l'heure de début. Si elle se termine le lendemain, indiquez une date de fin.", 'reservations.addBooking': 'Ajouter une réservation', 'reservations.import.title': 'Importer des confirmations de réservation', 'reservations.import.cta': 'Importer depuis un fichier', diff --git a/shared/src/i18n/gr/reservations.ts b/shared/src/i18n/gr/reservations.ts index 5a8133fa5..db5ec7076 100644 --- a/shared/src/i18n/gr/reservations.ts +++ b/shared/src/i18n/gr/reservations.ts @@ -133,6 +133,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Λήξη', 'reservations.span.ongoing': 'Σε εξέλιξη', 'reservations.validation.endBeforeStart': 'Η ημερομηνία/ώρα λήξης πρέπει να είναι μετά την ημερομηνία/ώρα έναρξης', + 'reservations.validation.endTimeBeforeStartTime': 'Η ώρα λήξης είναι πριν από την ώρα έναρξης. Αν λήγει την επόμενη μέρα, ορίστε ημερομηνία λήξης.', 'reservations.addBooking': 'Προσθήκη κράτησης', 'reservations.import.title': 'Εισαγωγή επιβεβαιώσεων κράτησης', 'reservations.import.cta': 'Εισαγωγή από αρχείο', diff --git a/shared/src/i18n/hu/reservations.ts b/shared/src/i18n/hu/reservations.ts index 7c1eef6cf..6b01944bd 100644 --- a/shared/src/i18n/hu/reservations.ts +++ b/shared/src/i18n/hu/reservations.ts @@ -132,6 +132,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Vége', 'reservations.span.ongoing': 'Folyamatban', 'reservations.validation.endBeforeStart': 'A befejezés dátuma/időpontja a kezdés utáni kell legyen', + 'reservations.validation.endTimeBeforeStartTime': 'A befejezés időpontja a kezdés előtt van. Ha a következő napon ér véget, adj meg befejezési dátumot.', 'reservations.addBooking': 'Foglalás hozzáadása', 'reservations.import.title': 'Foglalási visszaigazolások importálása', 'reservations.import.cta': 'Importálás fájlból', diff --git a/shared/src/i18n/id/reservations.ts b/shared/src/i18n/id/reservations.ts index 7a426e6e7..ac08a437d 100644 --- a/shared/src/i18n/id/reservations.ts +++ b/shared/src/i18n/id/reservations.ts @@ -132,6 +132,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Selesai', 'reservations.span.ongoing': 'Berlangsung', 'reservations.validation.endBeforeStart': 'Tanggal/waktu selesai harus setelah tanggal/waktu mulai', + 'reservations.validation.endTimeBeforeStartTime': 'Waktu selesai lebih awal dari waktu mulai. Jika berakhir keesokan harinya, atur tanggal selesai.', 'reservations.addBooking': 'Tambah pemesanan', 'reservations.import.title': 'Impor konfirmasi pemesanan', 'reservations.import.cta': 'Impor dari file', diff --git a/shared/src/i18n/it/reservations.ts b/shared/src/i18n/it/reservations.ts index 9aa79a958..c5c458a2d 100644 --- a/shared/src/i18n/it/reservations.ts +++ b/shared/src/i18n/it/reservations.ts @@ -132,6 +132,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Fine', 'reservations.span.ongoing': 'In corso', 'reservations.validation.endBeforeStart': 'La data/ora di fine deve essere successiva alla data/ora di inizio', + 'reservations.validation.endTimeBeforeStartTime': "L'ora di fine è precedente all'ora di inizio. Se termina il giorno dopo, imposta una data di fine.", 'reservations.addBooking': 'Aggiungi prenotazione', 'reservations.import.title': 'Importa conferme di prenotazione', 'reservations.import.cta': 'Importa da file', diff --git a/shared/src/i18n/ja/reservations.ts b/shared/src/i18n/ja/reservations.ts index 940278836..3120fb19a 100644 --- a/shared/src/i18n/ja/reservations.ts +++ b/shared/src/i18n/ja/reservations.ts @@ -131,6 +131,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': '終了', 'reservations.span.ongoing': '進行中', 'reservations.validation.endBeforeStart': '終了日時は開始日時より後である必要があります', + 'reservations.validation.endTimeBeforeStartTime': '終了時刻が開始時刻より前です。翌日に終わる場合は終了日を設定してください。', 'reservations.addBooking': '予約を追加', 'reservations.import.title': '予約確認書のインポート', 'reservations.import.cta': 'ファイルからインポート', diff --git a/shared/src/i18n/ko/reservations.ts b/shared/src/i18n/ko/reservations.ts index 28e67ad9c..90d6b78a6 100644 --- a/shared/src/i18n/ko/reservations.ts +++ b/shared/src/i18n/ko/reservations.ts @@ -131,6 +131,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': '종료', 'reservations.span.ongoing': '진행 중', 'reservations.validation.endBeforeStart': '종료 날짜/시간은 시작 날짜/시간 이후여야 합니다', + 'reservations.validation.endTimeBeforeStartTime': '종료 시간이 시작 시간보다 이릅니다. 다음 날 끝나면 종료 날짜를 설정하세요.', 'reservations.addBooking': '예약 추가', 'reservations.import.title': '예약 확인서 가져오기', 'reservations.import.cta': '파일에서 가져오기', diff --git a/shared/src/i18n/nl/reservations.ts b/shared/src/i18n/nl/reservations.ts index 1081ae784..5cc3466e4 100644 --- a/shared/src/i18n/nl/reservations.ts +++ b/shared/src/i18n/nl/reservations.ts @@ -132,6 +132,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Einde', 'reservations.span.ongoing': 'Lopend', 'reservations.validation.endBeforeStart': 'Einddatum/-tijd moet na de startdatum/-tijd liggen', + 'reservations.validation.endTimeBeforeStartTime': 'De eindtijd ligt vóór de starttijd. Eindigt het de volgende dag, kies dan een einddatum.', 'reservations.addBooking': 'Boeking toevoegen', 'reservations.import.title': 'Boekingsbevestigingen importeren', 'reservations.import.cta': 'Importeren vanuit bestand', diff --git a/shared/src/i18n/pl/reservations.ts b/shared/src/i18n/pl/reservations.ts index d2b7a6e36..f2c071fcb 100644 --- a/shared/src/i18n/pl/reservations.ts +++ b/shared/src/i18n/pl/reservations.ts @@ -132,6 +132,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Koniec', 'reservations.span.ongoing': 'W trakcie', 'reservations.validation.endBeforeStart': 'Data/godzina zakończenia musi być późniejsza niż data/godzina rozpoczęcia', + 'reservations.validation.endTimeBeforeStartTime': 'Godzina zakończenia jest wcześniejsza niż godzina rozpoczęcia. Jeśli kończy się następnego dnia, ustaw datę zakończenia.', 'reservations.addBooking': 'Dodaj rezerwację', 'reservations.import.title': 'Importuj potwierdzenia rezerwacji', 'reservations.import.cta': 'Importuj z pliku', diff --git a/shared/src/i18n/ru/reservations.ts b/shared/src/i18n/ru/reservations.ts index 8b4b613ff..bef16c550 100644 --- a/shared/src/i18n/ru/reservations.ts +++ b/shared/src/i18n/ru/reservations.ts @@ -131,6 +131,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Конец', 'reservations.span.ongoing': 'Продолжается', 'reservations.validation.endBeforeStart': 'Дата/время окончания должны быть позже даты/времени начала', + 'reservations.validation.endTimeBeforeStartTime': 'Время окончания раньше времени начала. Если бронирование заканчивается на следующий день, укажите дату окончания.', 'reservations.addBooking': 'Добавить бронирование', 'reservations.import.title': 'Импорт подтверждений бронирования', 'reservations.import.cta': 'Импортировать из файла', diff --git a/shared/src/i18n/sk/reservations.ts b/shared/src/i18n/sk/reservations.ts index 3d3477dc5..ed8ed0f64 100644 --- a/shared/src/i18n/sk/reservations.ts +++ b/shared/src/i18n/sk/reservations.ts @@ -137,6 +137,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Koniec', 'reservations.span.ongoing': 'Prebieha', 'reservations.validation.endBeforeStart': 'Dátum/čas konca musí byť po dátume/čase začiatku', + 'reservations.validation.endTimeBeforeStartTime': 'Čas konca je skôr ako čas začiatku. Ak končí nasledujúci deň, nastavte dátum konca.', 'reservations.addBooking': 'Pridať rezerváciu', 'reservations.import.title': 'Importovať potvrdenia rezervácií', 'reservations.import.cta': 'Importovať zo súboru', diff --git a/shared/src/i18n/sv/reservations.ts b/shared/src/i18n/sv/reservations.ts index a489065aa..f9bde02fb 100644 --- a/shared/src/i18n/sv/reservations.ts +++ b/shared/src/i18n/sv/reservations.ts @@ -132,6 +132,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Slut', 'reservations.span.ongoing': 'Pågår', 'reservations.validation.endBeforeStart': 'Slutdatum och -tid måste ligga efter startdatum och -tid', + 'reservations.validation.endTimeBeforeStartTime': 'Sluttiden ligger före starttiden. Om den slutar nästa dag, ange ett slutdatum.', 'reservations.addBooking': 'Lägg till bokning', 'reservations.import.title': 'Importera bokningsbekräftelser', 'reservations.import.cta': 'Importera från fil', diff --git a/shared/src/i18n/th/reservations.ts b/shared/src/i18n/th/reservations.ts index b0a3ed54b..b4e873eb0 100644 --- a/shared/src/i18n/th/reservations.ts +++ b/shared/src/i18n/th/reservations.ts @@ -136,6 +136,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'สิ้นสุด', 'reservations.span.ongoing': 'กำลังดำเนินการอยู่', 'reservations.validation.endBeforeStart': 'วันที่/เวลาสิ้นสุดต้องอยู่หลังวันที่/เวลาเริ่มต้น', + 'reservations.validation.endTimeBeforeStartTime': 'เวลาสิ้นสุดอยู่ก่อนเวลาเริ่มต้น หากสิ้นสุดในวันถัดไป ให้กำหนดวันที่สิ้นสุด', 'reservations.addBooking': 'เพิ่มการจอง', 'reservations.import.title': 'นำเข้าการยืนยันการจอง', 'reservations.import.cta': 'นำเข้าจากไฟล์', diff --git a/shared/src/i18n/tr/reservations.ts b/shared/src/i18n/tr/reservations.ts index 3c9017928..ea6586124 100644 --- a/shared/src/i18n/tr/reservations.ts +++ b/shared/src/i18n/tr/reservations.ts @@ -132,6 +132,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Son', 'reservations.span.ongoing': 'Devam ediyor', 'reservations.validation.endBeforeStart': 'Bitiş tarihi/saati başlangıçtan sonra olmalı', + 'reservations.validation.endTimeBeforeStartTime': 'Bitiş saati başlangıç saatinden önce. Ertesi gün bitiyorsa bir bitiş tarihi belirleyin.', 'reservations.addBooking': 'Rezervasyon ekle', 'reservations.import.title': 'Rezervasyon onaylarını içe aktar', 'reservations.import.cta': 'Dosyadan içe aktar', diff --git a/shared/src/i18n/uk/reservations.ts b/shared/src/i18n/uk/reservations.ts index cca068cef..ba302de8d 100644 --- a/shared/src/i18n/uk/reservations.ts +++ b/shared/src/i18n/uk/reservations.ts @@ -131,6 +131,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Кінець', 'reservations.span.ongoing': 'Триває', 'reservations.validation.endBeforeStart': 'Дата/час закінчення повинен бути пізніше дати/часу початку', + 'reservations.validation.endTimeBeforeStartTime': 'Час закінчення раніший за час початку. Якщо бронювання закінчується наступного дня, вкажіть дату закінчення.', 'reservations.addBooking': 'Додати бронювання', 'reservations.import.title': 'Імпорт підтверджень бронювання', 'reservations.import.cta': 'Імпортувати з файлу', diff --git a/shared/src/i18n/vi/reservations.ts b/shared/src/i18n/vi/reservations.ts index bd67673dc..bee121855 100644 --- a/shared/src/i18n/vi/reservations.ts +++ b/shared/src/i18n/vi/reservations.ts @@ -132,6 +132,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': 'Kết thúc', 'reservations.span.ongoing': 'Đang thực hiện', 'reservations.validation.endBeforeStart': 'Ngày/giờ kết thúc phải sau ngày/giờ bắt đầu', + 'reservations.validation.endTimeBeforeStartTime': 'Giờ kết thúc sớm hơn giờ bắt đầu. Nếu kết thúc vào ngày hôm sau, hãy đặt ngày kết thúc.', 'reservations.addBooking': 'Thêm đặt chỗ', 'reservations.import.title': 'Nhập xác nhận đặt chỗ', 'reservations.import.cta': 'Nhập từ tập tin', diff --git a/shared/src/i18n/zh-TW/reservations.ts b/shared/src/i18n/zh-TW/reservations.ts index 4b137d8db..0a4139e71 100644 --- a/shared/src/i18n/zh-TW/reservations.ts +++ b/shared/src/i18n/zh-TW/reservations.ts @@ -131,6 +131,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': '結束', 'reservations.span.ongoing': '進行中', 'reservations.validation.endBeforeStart': '結束日期/時間必須晚於開始日期/時間', + 'reservations.validation.endTimeBeforeStartTime': '結束時間早於開始時間。如果在隔天結束,請設定結束日期。', 'reservations.addBooking': '新增預訂', 'reservations.import.title': '匯入訂位確認', 'reservations.import.cta': '從檔案匯入', diff --git a/shared/src/i18n/zh/reservations.ts b/shared/src/i18n/zh/reservations.ts index 343c86293..9a9d0a41f 100644 --- a/shared/src/i18n/zh/reservations.ts +++ b/shared/src/i18n/zh/reservations.ts @@ -131,6 +131,7 @@ const reservations: TranslationStrings = { 'reservations.span.end': '结束', 'reservations.span.ongoing': '进行中', 'reservations.validation.endBeforeStart': '结束日期/时间必须晚于开始日期/时间', + 'reservations.validation.endTimeBeforeStartTime': '结束时间早于开始时间。如果在次日结束,请设置结束日期。', 'reservations.addBooking': '添加预订', 'reservations.import.title': '导入预订确认', 'reservations.import.cta': '从文件导入',