fix(planner): the delete question says plainly what goes with a booked place

"The night booked at "Rostock" goes with the place, together with the
booking "Rostock" and any expense linked to it" named the place twice and
read awkwardly. The note now says "This also deletes the stay booked at
"Rostock", its booking and any expense linked to it", quotes the booking
only when its title differs from the place, and reads the same in all 23
languages.
This commit is contained in:
Maurice
2026-09-23 21:56:02 +02:00
parent 1423ba8933
commit 436f0740fb
25 changed files with 132 additions and 50 deletions
@@ -1314,6 +1314,25 @@ describe('useTripPlanner — place CRUD', () => {
expect(result.current.deletePlaceNote).toBeNull() expect(result.current.deletePlaceNote).toBeNull()
}) })
it('FE-TP-HOOK-140: a booking named after its hotel is not quoted a second time', async () => {
const hotel = buildPlace({ id: 1, name: 'Rostock', lat: 54.09, lng: 12.1 })
seedTrip({
places: [hotel],
reservations: [buildReservation({ id: 9, type: 'hotel', title: 'Rostock', accommodation_id: 7 })],
})
vi.mocked(accommodationRepo.list).mockResolvedValue({
accommodations: [{ id: 7, trip_id: 42, place_id: 1, start_day_id: 5, end_day_id: 6 }] as never,
})
const { result } = await renderPlanner()
await waitFor(() => expect(result.current.tripAccommodations).toHaveLength(1))
const { result: i18n } = renderHook(() => useTranslation(), { wrapper })
act(() => { result.current.handleDeletePlace(1) })
expect(result.current.deletePlaceNote).toBe(i18n.current.t('trip.confirm.deletePlaceBookedSame', { name: 'Rostock' }))
expect(result.current.deletePlaceNote).toBe('This also deletes the stay booked at “Rostock”, its booking and any expense linked to it.')
})
it('FE-TP-HOOK-119: a bulk delete warns once any of the places carries a night, booking or not', async () => { it('FE-TP-HOOK-119: a bulk delete warns once any of the places carries a night, booking or not', async () => {
const hotel = buildPlace({ id: 1, name: 'Hotel Fjord', lat: 60.39, lng: 5.32 }) const hotel = buildPlace({ id: 1, name: 'Hotel Fjord', lat: 60.39, lng: 5.32 })
const cafe = buildPlace({ id: 2, name: 'Cafe', lat: 1, lng: 2 }) const cafe = buildPlace({ id: 2, name: 'Cafe', lat: 1, lng: 2 })
@@ -513,7 +513,8 @@ export function useTripPlanner() {
* itself only names the place, and those are the rows the traveller least expects * itself only names the place, and those are the rows the traveller least expects
* to lose, so the dialog says so before the yes. The expense list is loaded with * to lose, so the dialog says so before the yes. The expense list is loaded with
* the costs tab, not here, so the sentence speaks of any expense rather than * the costs tab, not here, so the sentence speaks of any expense rather than
* counting them. Null when nothing beyond the place is at stake. * counting them. A booking named after its hotel, which is how most are named,
* is not quoted a second time. Null when nothing beyond the place is at stake.
*/ */
const bookedNightsNote = useCallback((placeIds: number[]): string | null => { const bookedNightsNote = useCallback((placeIds: number[]): string | null => {
const stays = tripAccommodations.filter(stay => stay.place_id != null && placeIds.includes(stay.place_id)) const stays = tripAccommodations.filter(stay => stay.place_id != null && placeIds.includes(stay.place_id))
@@ -525,9 +526,10 @@ export function useTripPlanner() {
?? stay.reservation_title ?? null) ?? stay.reservation_title ?? null)
.filter((title): title is string => !!title) .filter((title): title is string => !!title)
const name = names.join(', ') const name = names.join(', ')
return bookings.length > 0 if (bookings.length === 0) return t('trip.confirm.deletePlaceNight', { name })
? t('trip.confirm.deletePlaceBooked', { name, booking: bookings.join(', ') }) return bookings.every(title => names.includes(title))
: t('trip.confirm.deletePlaceNight', { name }) ? t('trip.confirm.deletePlaceBookedSame', { name })
: t('trip.confirm.deletePlaceBooked', { name, booking: bookings.join(', ') })
}, [tripAccommodations, allPlaces, reservations, t]) }, [tripAccommodations, allPlaces, reservations, t])
const deletePlaceNote = useMemo( const deletePlaceNote = useMemo(
() => (deletePlaceId ? bookedNightsNote([deletePlaceId]) : null), () => (deletePlaceId ? bookedNightsNote([deletePlaceId]) : null),
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'التحويلات', 'transit.transfersLabel': 'التحويلات',
'transit.walkLabel': 'المشي', 'transit.walkLabel': 'المشي',
'transit.searchHint': 'ابحث عن رحلات فعلية وأضفها مباشرة إلى اليوم — البيانات عبر Transitous.', 'transit.searchHint': 'ابحث عن رحلات فعلية وأضفها مباشرة إلى اليوم — البيانات عبر Transitous.',
'trip.confirm.deletePlaceNight': 'ستُحذف الليلة المحجوزة في "{name}" مع المكان.', 'trip.confirm.deletePlaceNight': 'سيؤدي ذلك أيضًا إلى حذف الإقامة المحجوزة في "{name}".',
'trip.confirm.deletePlaceBooked': 'ستُحذف الليلة المحجوزة في "{name}" مع المكان، ومعها الحجز "{booking}" وأي مصروف مرتبط به.', 'trip.confirm.deletePlaceBooked':
'سيؤدي ذلك أيضًا إلى حذف الإقامة المحجوزة في "{name}" والحجز "{booking}" وأي مصروف مرتبط به.',
'trip.confirm.deletePlaceBookedSame':
'سيؤدي ذلك أيضًا إلى حذف الإقامة المحجوزة في "{name}" وحجزها وأي مصروف مرتبط به.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Baldeações', 'transit.transfersLabel': 'Baldeações',
'transit.walkLabel': 'A pé', 'transit.walkLabel': 'A pé',
'transit.searchHint': 'Busque conexões reais e adicione direto ao dia — dados via Transitous.', 'transit.searchHint': 'Busque conexões reais e adicione direto ao dia — dados via Transitous.',
'trip.confirm.deletePlaceNight': 'A noite reservada em “{name}” desaparece com o local.', 'trip.confirm.deletePlaceNight': 'Isso também exclui a estadia reservada em “{name}”.',
'trip.confirm.deletePlaceBooked': 'A noite reservada em “{name}” desaparece com o local, juntamente com a reserva “{booking}” e qualquer despesa associada.', 'trip.confirm.deletePlaceBooked':
'Isso também exclui a estadia reservada em “{name}”, a reserva “{booking}” e qualquer despesa vinculada a ela.',
'trip.confirm.deletePlaceBookedSame':
'Isso também exclui a estadia reservada em “{name}”, a reserva dela e qualquer despesa vinculada.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'trip.loadingSteps.road': 'Sortint de camí...', 'trip.loadingSteps.road': 'Sortint de camí...',
'trip.loadingSteps.arrive': 'Gairebé hi som...', 'trip.loadingSteps.arrive': 'Gairebé hi som...',
'trip.toast.tripUpdated': 'Viatge actualitzat', 'trip.toast.tripUpdated': 'Viatge actualitzat',
'trip.confirm.deletePlaceNight': 'La nit reservada a «{name}» es perd amb el lloc.', 'trip.confirm.deletePlaceNight': 'També s’elimina l’estada reservada a «{name}».',
'trip.confirm.deletePlaceBooked': 'La nit reservada a «{name}» es perd amb el lloc, juntament amb la reserva «{booking}» i qualsevol despesa vinculada.', 'trip.confirm.deletePlaceBooked':
'També s’eliminen l’estada reservada a «{name}», la reserva «{booking}» i qualsevol despesa vinculada.',
'trip.confirm.deletePlaceBookedSame':
'També s’eliminen l’estada reservada a «{name}», la seva reserva i qualsevol despesa vinculada.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Přestupy', 'transit.transfersLabel': 'Přestupy',
'transit.walkLabel': 'Chůze', 'transit.walkLabel': 'Chůze',
'transit.searchHint': 'Vyhledejte reálná spojení a přidejte je rovnou do dne — data přes Transitous.', 'transit.searchHint': 'Vyhledejte reálná spojení a přidejte je rovnou do dne — data přes Transitous.',
'trip.confirm.deletePlaceNight': 'Noc rezervovaná v „{name}“ zmizí spolu s místem.', 'trip.confirm.deletePlaceNight': 'Tím se smaže i ubytování rezervované v „{name}“.',
'trip.confirm.deletePlaceBooked': 'Noc rezervovaná v „{name}“ zmizí spolu s místem, včetně rezervace „{booking}“ a všech navázaných výdajů.', 'trip.confirm.deletePlaceBooked':
'Tím se smažou i ubytování rezervované v „{name}“, rezervace „{booking}“ a všechny navázané výdaje.',
'trip.confirm.deletePlaceBookedSame':
'Tím se smažou i ubytování rezervované v „{name}“, jeho rezervace a všechny navázané výdaje.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Umstiege', 'transit.transfersLabel': 'Umstiege',
'transit.walkLabel': 'Fußweg', 'transit.walkLabel': 'Fußweg',
'transit.searchHint': 'Echte Verbindungen suchen und direkt zum Tag hinzufügen — Daten via Transitous.', 'transit.searchHint': 'Echte Verbindungen suchen und direkt zum Tag hinzufügen — Daten via Transitous.',
'trip.confirm.deletePlaceNight': 'Die in „{name}“ gebuchte Nacht geht mit dem Ort verloren.', 'trip.confirm.deletePlaceNight': 'Damit wird auch die in „{name}“ gebuchte Unterkunft gelöscht.',
'trip.confirm.deletePlaceBooked': 'Die in „{name}“ gebuchte Nacht geht mit dem Ort verloren, zusammen mit der Buchung „{booking}“ und jeder damit verknüpften Ausgabe.', 'trip.confirm.deletePlaceBooked':
'Damit werden auch die in „{name}“ gebuchte Unterkunft, die Buchung „{booking}“ und alle damit verknüpften Ausgaben gelöscht.',
'trip.confirm.deletePlaceBookedSame':
'Damit werden auch die in „{name}“ gebuchte Unterkunft, ihre Buchung und alle damit verknüpften Ausgaben gelöscht.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Transfers', 'transit.transfersLabel': 'Transfers',
'transit.walkLabel': 'Walking', 'transit.walkLabel': 'Walking',
'transit.searchHint': 'Search real connections and add them straight to the day — data via Transitous.', 'transit.searchHint': 'Search real connections and add them straight to the day — data via Transitous.',
'trip.confirm.deletePlaceNight': 'The night booked at “{name}” goes with the place.', 'trip.confirm.deletePlaceNight': 'This also deletes the stay booked at “{name}”.',
'trip.confirm.deletePlaceBooked': 'The night booked at “{name}” goes with the place, together with the booking “{booking}” and any expense linked to it.', 'trip.confirm.deletePlaceBooked':
'This also deletes the stay booked at “{name}”, the booking “{booking}” and any expense linked to it.',
'trip.confirm.deletePlaceBookedSame':
'This also deletes the stay booked at “{name}”, its booking and any expense linked to it.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Transbordos', 'transit.transfersLabel': 'Transbordos',
'transit.walkLabel': 'A pie', 'transit.walkLabel': 'A pie',
'transit.searchHint': 'Busca conexiones reales y añádelas directamente al día — datos vía Transitous.', 'transit.searchHint': 'Busca conexiones reales y añádelas directamente al día — datos vía Transitous.',
'trip.confirm.deletePlaceNight': 'La noche reservada en «{name}» se pierde con el lugar.', 'trip.confirm.deletePlaceNight': 'También se elimina la estancia reservada en «{name}».',
'trip.confirm.deletePlaceBooked': 'La noche reservada en «{name}» se pierde con el lugar, junto con la reserva «{booking}» y cualquier gasto vinculado.', 'trip.confirm.deletePlaceBooked':
'También se eliminan la estancia reservada en «{name}», la reserva «{booking}» y cualquier gasto vinculado.',
'trip.confirm.deletePlaceBookedSame':
'También se eliminan la estancia reservada en «{name}», su reserva y cualquier gasto vinculado.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -89,7 +89,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Correspondances', 'transit.transfersLabel': 'Correspondances',
'transit.walkLabel': 'Marche', 'transit.walkLabel': 'Marche',
'transit.searchHint': 'Recherchez de vraies liaisons et ajoutez-les directement au jour — données via Transitous.', 'transit.searchHint': 'Recherchez de vraies liaisons et ajoutez-les directement au jour — données via Transitous.',
'trip.confirm.deletePlaceNight': 'La nuit réservée à « {name} » disparaît avec le lieu.', 'trip.confirm.deletePlaceNight': 'Le séjour réservé à « {name} » sera également supprimé.',
'trip.confirm.deletePlaceBooked': 'La nuit réservée à « {name} » disparaît avec le lieu, ainsi que la réservation « {booking} » et toute dépense qui y est liée.', 'trip.confirm.deletePlaceBooked':
'Le séjour réservé à « {name} », la réservation « {booking} » et toute dépense liée seront également supprimés.',
'trip.confirm.deletePlaceBookedSame':
'Le séjour réservé à « {name} », sa réservation et toute dépense liée seront également supprimés.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -90,7 +90,10 @@ const trip: TranslationStrings = {
'transit.walkLabel': 'Περπάτημα', 'transit.walkLabel': 'Περπάτημα',
'transit.searchHint': 'transit.searchHint':
'Αναζητήστε πραγματικές συνδέσεις και προσθέστε τις απευθείας στην ημέρα — δεδομένα μέσω Transitous.', 'Αναζητήστε πραγματικές συνδέσεις και προσθέστε τις απευθείας στην ημέρα — δεδομένα μέσω Transitous.',
'trip.confirm.deletePlaceNight': 'Η διανυκτέρευση που κρατήθηκε στο «{name}» χάνεται μαζί με το μέρος.', 'trip.confirm.deletePlaceNight': 'Θα διαγραφεί επίσης η διαμονή που κρατήθηκε στο «{name}».',
'trip.confirm.deletePlaceBooked': 'Η διανυκτέρευση που κρατήθηκε στο «{name}» χάνεται μαζί με το μέρος, μαζί με την κράτηση «{booking}» και κάθε συνδεδεμένο έξοδο.', 'trip.confirm.deletePlaceBooked':
'Θα διαγραφούν επίσης η διαμονή που κρατήθηκε στο «{name}», η κράτηση «{booking}» και κάθε συνδεδεμένο έξοδο.',
'trip.confirm.deletePlaceBookedSame':
'Θα διαγραφούν επίσης η διαμονή που κρατήθηκε στο «{name}», η κράτησή της και κάθε συνδεδεμένο έξοδο.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -90,7 +90,10 @@ const trip: TranslationStrings = {
'transit.walkLabel': 'Gyaloglás', 'transit.walkLabel': 'Gyaloglás',
'transit.searchHint': 'transit.searchHint':
'Keress valós összeköttetéseket, és add hozzá őket közvetlenül a naphoz – adatok a Transitous révén.', 'Keress valós összeköttetéseket, és add hozzá őket közvetlenül a naphoz – adatok a Transitous révén.',
'trip.confirm.deletePlaceNight': 'A(z) „{name}” helyre foglalt éjszaka a hellyel együtt törlődik.', 'trip.confirm.deletePlaceNight': 'Ezzel a(z) „{name}” helyen foglalt szállás is törlődik.',
'trip.confirm.deletePlaceBooked': 'A(z) „{name}” helyre foglalt éjszaka a hellyel együtt törlődik, a(z) „{booking}” foglalással és a hozzá kapcsolt kiadásokkal.', 'trip.confirm.deletePlaceBooked':
'Ezzel a(z) „{name}” helyen foglalt szállás, a(z) „{booking}” foglalás és a hozzá kapcsolt kiadások is törlődnek.',
'trip.confirm.deletePlaceBookedSame':
'Ezzel a(z) „{name}” helyen foglalt szállás, a foglalása és a hozzá kapcsolt kiadások is törlődnek.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -89,7 +89,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Transit', 'transit.transfersLabel': 'Transit',
'transit.walkLabel': 'Jalan kaki', 'transit.walkLabel': 'Jalan kaki',
'transit.searchHint': 'Cari koneksi nyata dan tambahkan langsung ke hari itu — data melalui Transitous.', 'transit.searchHint': 'Cari koneksi nyata dan tambahkan langsung ke hari itu — data melalui Transitous.',
'trip.confirm.deletePlaceNight': 'Malam yang dipesan di “{name}” ikut hilang bersama tempat ini.', 'trip.confirm.deletePlaceNight': 'Ini juga menghapus penginapan yang dipesan di “{name}”.',
'trip.confirm.deletePlaceBooked': 'Malam yang dipesan di “{name}” ikut hilang bersama tempat ini, beserta pemesanan “{booking}” dan pengeluaran yang terkait.', 'trip.confirm.deletePlaceBooked':
'Ini juga menghapus penginapan yang dipesan di “{name}”, pemesanan “{booking}”, dan pengeluaran yang terkait.',
'trip.confirm.deletePlaceBookedSame':
'Ini juga menghapus penginapan yang dipesan di “{name}”, pemesanannya, dan pengeluaran yang terkait.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Cambi', 'transit.transfersLabel': 'Cambi',
'transit.walkLabel': 'A piedi', 'transit.walkLabel': 'A piedi',
'transit.searchHint': 'Cerca collegamenti reali e aggiungili direttamente alla giornata — dati via Transitous.', 'transit.searchHint': 'Cerca collegamenti reali e aggiungili direttamente alla giornata — dati via Transitous.',
'trip.confirm.deletePlaceNight': 'La notte prenotata a «{name}» va via con il luogo.', 'trip.confirm.deletePlaceNight': 'Verrà eliminato anche il soggiorno prenotato a «{name}».',
'trip.confirm.deletePlaceBooked': 'La notte prenotata a «{name}» va via con il luogo, insieme alla prenotazione «{booking}» e a ogni spesa collegata.', 'trip.confirm.deletePlaceBooked':
'Verranno eliminati anche il soggiorno prenotato a «{name}», la prenotazione «{booking}» e ogni spesa collegata.',
'trip.confirm.deletePlaceBookedSame':
'Verranno eliminati anche il soggiorno prenotato a «{name}», la sua prenotazione e ogni spesa collegata.',
}; };
export default trip; export default trip;
+3 -2
View File
@@ -88,7 +88,8 @@ const trip: TranslationStrings = {
'transit.transfersLabel': '乗り換え', 'transit.transfersLabel': '乗り換え',
'transit.walkLabel': '徒歩', 'transit.walkLabel': '徒歩',
'transit.searchHint': '実際の経路を検索して、そのまま日程に追加できます — データは Transitous 提供。', 'transit.searchHint': '実際の経路を検索して、そのまま日程に追加できます — データは Transitous 提供。',
'trip.confirm.deletePlaceNight': '「{name}」で予約した宿泊も場所と一緒に削除されます。', 'trip.confirm.deletePlaceNight': '「{name}」で予約した宿泊も削除されます。',
'trip.confirm.deletePlaceBooked': '「{name}」で予約した宿泊も場所と一緒に削除され、予約「{booking}」と関連する支出も失われます。', 'trip.confirm.deletePlaceBooked': '「{name}」で予約した宿泊、予約「{booking}」、関連する支出も削除されます。',
'trip.confirm.deletePlaceBookedSame': '「{name}」で予約した宿泊とその予約、関連する支出も削除されます。',
}; };
export default trip; export default trip;
+3 -2
View File
@@ -88,7 +88,8 @@ const trip: TranslationStrings = {
'transit.transfersLabel': '환승', 'transit.transfersLabel': '환승',
'transit.walkLabel': '도보', 'transit.walkLabel': '도보',
'transit.searchHint': '실제 연결편을 검색하고 바로 일정에 추가하세요 — 데이터 제공: Transitous.', 'transit.searchHint': '실제 연결편을 검색하고 바로 일정에 추가하세요 — 데이터 제공: Transitous.',
'trip.confirm.deletePlaceNight': '“{name}”에 예약된 숙박도 장소와 함께 삭제됩니다.', 'trip.confirm.deletePlaceNight': '“{name}”에 예약된 숙박도 함께 삭제됩니다.',
'trip.confirm.deletePlaceBooked': '“{name}”에 예약된 숙박이 장소와 함께 삭제되며, 예약 “{booking}” 및 연결된 지출도 함께 삭제됩니다.', 'trip.confirm.deletePlaceBooked': '“{name}”에 예약된 숙박, 예약 “{booking}” 및 연결된 지출도 함께 삭제됩니다.',
'trip.confirm.deletePlaceBookedSame': '“{name}”에 예약된 숙박과 그 예약, 연결된 지출도 함께 삭제됩니다.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Overstappen', 'transit.transfersLabel': 'Overstappen',
'transit.walkLabel': 'Lopen', 'transit.walkLabel': 'Lopen',
'transit.searchHint': 'Zoek echte verbindingen en voeg ze direct toe aan de dag — gegevens via Transitous.', 'transit.searchHint': 'Zoek echte verbindingen en voeg ze direct toe aan de dag — gegevens via Transitous.',
'trip.confirm.deletePlaceNight': 'De nacht geboekt bij ‘{name}’ verdwijnt met de plek.', 'trip.confirm.deletePlaceNight': 'Hiermee wordt ook het verblijf geboekt bij ‘{name}’ verwijderd.',
'trip.confirm.deletePlaceBooked': 'De nacht geboekt bij ‘{name}’ verdwijnt met de plek, samen met de boeking ‘{booking}’ en elke gekoppelde uitgave.', 'trip.confirm.deletePlaceBooked':
'Hiermee worden ook het verblijf geboekt bij ‘{name}’, de boeking ‘{booking}’ en elke gekoppelde uitgave verwijderd.',
'trip.confirm.deletePlaceBookedSame':
'Hiermee worden ook het verblijf geboekt bij ‘{name}’, de bijbehorende boeking en elke gekoppelde uitgave verwijderd.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Przesiadki', 'transit.transfersLabel': 'Przesiadki',
'transit.walkLabel': 'Pieszo', 'transit.walkLabel': 'Pieszo',
'transit.searchHint': 'Wyszukaj prawdziwe połączenia i dodaj je od razu do dnia — dane z Transitous.', 'transit.searchHint': 'Wyszukaj prawdziwe połączenia i dodaj je od razu do dnia — dane z Transitous.',
'trip.confirm.deletePlaceNight': 'Nocleg zarezerwowany w „{name}” zniknie razem z miejscem.', 'trip.confirm.deletePlaceNight': 'Zostanie też usunięty nocleg zarezerwowany w „{name}”.',
'trip.confirm.deletePlaceBooked': 'Nocleg zarezerwowany w „{name}” zniknie razem z miejscem, wraz z rezerwacją „{booking}” i powiązanymi wydatkami.', 'trip.confirm.deletePlaceBooked':
'Zostaną też usunięte nocleg zarezerwowany w „{name}”, rezerwacja „{booking}” i powiązane wydatki.',
'trip.confirm.deletePlaceBookedSame':
'Zostaną też usunięte nocleg zarezerwowany w „{name}”, jego rezerwacja i powiązane wydatki.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Пересадки', 'transit.transfersLabel': 'Пересадки',
'transit.walkLabel': 'Пешком', 'transit.walkLabel': 'Пешком',
'transit.searchHint': 'Ищите реальные маршруты и добавляйте их прямо в день — данные от Transitous.', 'transit.searchHint': 'Ищите реальные маршруты и добавляйте их прямо в день — данные от Transitous.',
'trip.confirm.deletePlaceNight': 'Ночёвка, забронированная в «{name}», исчезнет вместе с местом.', 'trip.confirm.deletePlaceNight': 'Также будет удалено проживание, забронированное в «{name}».',
'trip.confirm.deletePlaceBooked': 'Ночёвка, забронированная в «{name}», исчезнет вместе с местом, а с ней бронирование «{booking}» и связанные расходы.', 'trip.confirm.deletePlaceBooked':
'Также будут удалены проживание, забронированное в «{name}», бронирование «{booking}» и связанные расходы.',
'trip.confirm.deletePlaceBookedSame':
'Также будут удалены проживание, забронированное в «{name}», его бронирование и связанные расходы.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Byten', 'transit.transfersLabel': 'Byten',
'transit.walkLabel': 'Gång', 'transit.walkLabel': 'Gång',
'transit.searchHint': 'Sök verkliga förbindelser och lägg till dem direkt i dagen – data via Transitous.', 'transit.searchHint': 'Sök verkliga förbindelser och lägg till dem direkt i dagen – data via Transitous.',
'trip.confirm.deletePlaceNight': 'Natten som är bokad på ”{name}” försvinner med platsen.', 'trip.confirm.deletePlaceNight': 'Då raderas även vistelsen som är bokad på ”{name}”.',
'trip.confirm.deletePlaceBooked': 'Natten som är bokad på ”{name}” försvinner med platsen, tillsammans med bokningen ”{booking}” och alla utgifter som hör till den.', 'trip.confirm.deletePlaceBooked':
'Då raderas även vistelsen som är bokad på ”{name}”, bokningen ”{booking}” och alla utgifter som hör till den.',
'trip.confirm.deletePlaceBookedSame':
'Då raderas även vistelsen som är bokad på ”{name}”, dess bokning och alla utgifter som hör till den.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -89,7 +89,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Aktarma', 'transit.transfersLabel': 'Aktarma',
'transit.walkLabel': 'Yürüyüş', 'transit.walkLabel': 'Yürüyüş',
'transit.searchHint': 'Gerçek bağlantıları ara ve doğrudan güne ekle — veriler Transitous üzerinden.', 'transit.searchHint': 'Gerçek bağlantıları ara ve doğrudan güne ekle — veriler Transitous üzerinden.',
'trip.confirm.deletePlaceNight': '“{name}” için ayrılan gece yerle birlikte silinir.', 'trip.confirm.deletePlaceNight': '“{name}” için ayrılan konaklama da silinir.',
'trip.confirm.deletePlaceBooked': '“{name}” için ayrılan gece, “{booking}” rezervasyonu ve ona bağlı tüm harcamalarla birlikte yerle beraber silinir.', 'trip.confirm.deletePlaceBooked':
'“{name}” için ayrılan konaklama, “{booking}” rezervasyonu ve ona bağlı tüm harcamalar da silinir.',
'trip.confirm.deletePlaceBookedSame':
'“{name}” için ayrılan konaklama, rezervasyonu ve ona bağlı tüm harcamalar da silinir.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Пересадки', 'transit.transfersLabel': 'Пересадки',
'transit.walkLabel': 'Пішки', 'transit.walkLabel': 'Пішки',
'transit.searchHint': 'Шукайте справжні маршрути та додавайте їх одразу до дня — дані від Transitous.', 'transit.searchHint': 'Шукайте справжні маршрути та додавайте їх одразу до дня — дані від Transitous.',
'trip.confirm.deletePlaceNight': 'Ночівля, заброньована в «{name}», зникне разом із місцем.', 'trip.confirm.deletePlaceNight': 'Також буде видалено проживання, заброньоване в «{name}».',
'trip.confirm.deletePlaceBooked': 'Ночівля, заброньована в «{name}», зникне разом із місцем, а з нею бронювання «{booking}» і пов’язані витрати.', 'trip.confirm.deletePlaceBooked':
'Також буде видалено проживання, заброньоване в «{name}», бронювання «{booking}» і пов’язані витрати.',
'trip.confirm.deletePlaceBookedSame':
'Також буде видалено проживання, заброньоване в «{name}», його бронювання і пов’язані витрати.',
}; };
export default trip; export default trip;
+5 -2
View File
@@ -88,7 +88,10 @@ const trip: TranslationStrings = {
'transit.transfersLabel': 'Chuyển tuyến', 'transit.transfersLabel': 'Chuyển tuyến',
'transit.walkLabel': 'Đi bộ', 'transit.walkLabel': 'Đi bộ',
'transit.searchHint': 'Tìm các kết nối thực tế và thêm thẳng vào ngày — dữ liệu qua Transitous.', 'transit.searchHint': 'Tìm các kết nối thực tế và thêm thẳng vào ngày — dữ liệu qua Transitous.',
'trip.confirm.deletePlaceNight': 'Đêm đã đặt tại “{name}” sẽ mất cùng với địa điểm.', 'trip.confirm.deletePlaceNight': 'Thao tác này cũng xóa chỗ lưu trú đã đặt tại “{name}”.',
'trip.confirm.deletePlaceBooked': 'Đêm đã đặt tại “{name}” sẽ mất cùng với địa điểm, kèm theo đặt chỗ “{booking}” và mọi chi phí liên quan.', 'trip.confirm.deletePlaceBooked':
'Thao tác này cũng xóa chỗ lưu trú đã đặt tại “{name}”, đặt chỗ “{booking}” và mọi chi phí liên quan.',
'trip.confirm.deletePlaceBookedSame':
'Thao tác này cũng xóa chỗ lưu trú đã đặt tại “{name}”, đặt chỗ của nó và mọi chi phí liên quan.',
}; };
export default trip; export default trip;
+3 -2
View File
@@ -87,7 +87,8 @@ const trip: TranslationStrings = {
'transit.transfersLabel': '轉乘次數', 'transit.transfersLabel': '轉乘次數',
'transit.walkLabel': '步行', 'transit.walkLabel': '步行',
'transit.searchHint': '搜尋實際交通連線,並直接加入當天行程 — 資料由 Transitous 提供。', 'transit.searchHint': '搜尋實際交通連線,並直接加入當天行程 — 資料由 Transitous 提供。',
'trip.confirm.deletePlaceNight': '在「{name}」預訂的過夜會隨該地點一起刪除。', 'trip.confirm.deletePlaceNight': '在「{name}」預訂的住宿也會一併刪除。',
'trip.confirm.deletePlaceBooked': '在「{name}」預訂的過夜會隨該地點一起刪除,同時刪除預訂「{booking}」及其關聯的費用。', 'trip.confirm.deletePlaceBooked': '在「{name}」預訂的住宿、預訂「{booking}」及其關聯的費用也會一併刪除。',
'trip.confirm.deletePlaceBookedSame': '在「{name}」預訂的住宿及其預訂和關聯的費用也會一併刪除。',
}; };
export default trip; export default trip;
+3 -2
View File
@@ -87,7 +87,8 @@ const trip: TranslationStrings = {
'transit.transfersLabel': '换乘', 'transit.transfersLabel': '换乘',
'transit.walkLabel': '步行', 'transit.walkLabel': '步行',
'transit.searchHint': '搜索真实班次并直接添加到当天行程 — 数据来自 Transitous。', 'transit.searchHint': '搜索真实班次并直接添加到当天行程 — 数据来自 Transitous。',
'trip.confirm.deletePlaceNight': '在“{name}”预订的过夜会随该地点一起删除。', 'trip.confirm.deletePlaceNight': '在“{name}”预订的住宿也会一并删除。',
'trip.confirm.deletePlaceBooked': '在“{name}”预订的过夜会随该地点一起删除,同时删除预订“{booking}”及其关联的费用。', 'trip.confirm.deletePlaceBooked': '在“{name}”预订的住宿、预订“{booking}”及其关联的费用也会一并删除。',
'trip.confirm.deletePlaceBookedSame': '在“{name}”预订的住宿及其预订和关联的费用也会一并删除。',
}; };
export default trip; export default trip;