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': '从文件导入',