- {transitMeta.legs.map((leg: { mode?: string; line?: string | null; line_color?: string | null; line_text_color?: string | null }, li: number) => (
-
) : subtitle && (
diff --git a/client/src/components/Planner/ReservationsPanel.tsx b/client/src/components/Planner/ReservationsPanel.tsx
index 2bc6e103d..6265505aa 100644
--- a/client/src/components/Planner/ReservationsPanel.tsx
+++ b/client/src/components/Planner/ReservationsPanel.tsx
@@ -12,6 +12,7 @@ import {
TramFront, Footprints,
} from 'lucide-react'
import { openFile } from '../../utils/fileDownload'
+import { TransitTitle, TransitLegChips } from './transitDisplay'
import Markdown from 'react-markdown'
import remarkGfm from 'remark-gfm'
import remarkBreaks from 'remark-breaks'
@@ -307,38 +308,6 @@ function ReservationCard({ r, tripId, onEdit, onDelete, files = [], onNavigateTo
)
})()}
- {/* Transit itinerary chips (#1065) — the journey at a glance */}
- {(() => {
- if (r.type !== 'transit') return null
- const meta = typeof r.metadata === 'string' ? (() => { try { return JSON.parse(r.metadata || '{}') } catch { return {} } })() : (r.metadata || {})
- const transit = meta.transit
- if (!transit || !Array.isArray(transit.legs) || transit.legs.length === 0) return null
- return (
-
- {transit.legs.map((leg: { mode?: string; line?: string | null; line_color?: string | null; line_text_color?: string | null }, li: number) => (
-
- {li > 0 && ›}
- {leg.mode === 'WALK'
- ?
- : (
-
- {leg.line || leg.mode}
-
- )}
-
- ))}
-
- {transit.transfers > 0 ? t('transit.transfers', { count: transit.transfers }) : t('transit.direct')}
-
-
- )
- })()}
-
{/* Type-specific metadata */}
{(() => {
const meta = typeof r.metadata === 'string' ? JSON.parse(r.metadata || '{}') : (r.metadata || {})
@@ -525,6 +494,87 @@ function Section({ title, count, children, defaultOpen = true, accent, storageKe
)
}
+/**
+ * A transit journey's own card (#1065) — leg chips + journey stats instead of
+ * the generic booking layout. Clicking anywhere opens the journey view.
+ */
+function TransitJourneyCard({ r, days, onOpen, onDelete, canEdit }: {
+ r: Reservation
+ days: Day[]
+ onOpen: (r: Reservation) => void
+ onDelete: (id: number) => void
+ canEdit: boolean
+}) {
+ const { t, locale } = useTranslation()
+ const timeFormat = useSettingsStore(st => st.settings.time_format) || '24h'
+ const [confirmOpen, setConfirmOpen] = useState(false)
+ const meta = typeof r.metadata === 'string' ? (() => { try { return JSON.parse(r.metadata || '{}') } catch { return {} } })() : (r.metadata || {})
+ const transit = meta.transit && Array.isArray(meta.transit.legs) ? meta.transit : null
+ const { date, time } = splitReservationDateTime(r.reservation_time)
+ const { time: endTime } = splitReservationDateTime(r.reservation_end_time)
+ const day = r.day_id ? days.find(d => d.id === r.day_id) : undefined
+ const dateStr = date ? new Date(date + 'T00:00:00Z').toLocaleDateString(locale, { weekday: 'short', day: 'numeric', month: 'short', timeZone: 'UTC' }) : null
+ const mins = transit?.duration ? Math.round(transit.duration / 60) : null
+ return (
+
onOpen(r)}
+ style={{ borderRadius: 12, border: '1px solid rgba(124,58,237,0.22)', padding: '12px 14px', display: 'flex', flexDirection: 'column', gap: 9, cursor: 'pointer', transition: 'box-shadow 0.15s ease' }}
+ onMouseEnter={e => e.currentTarget.style.boxShadow = '0 2px 12px rgba(0,0,0,0.06)'}
+ onMouseLeave={e => e.currentTarget.style.boxShadow = 'none'}
+ >
+
+
+
+
+
+
+
+
+
+ {[
+ day ? (day.title || t('dayplan.dayN', { n: day.day_number })) : null,
+ dateStr,
+ time ? `${formatTime(time, locale, timeFormat)}${endTime ? ` – ${formatTime(endTime, locale, timeFormat)}` : ''}` : null,
+ mins ? t('transit.min', { count: mins }) : null,
+ ].filter(Boolean).join(' · ')}
+
+
+ {canEdit && (
+
+ )}
+
+ {transit && (
+
+
+
+ )}
+ {confirmOpen && ReactDOM.createPortal(
+
{ e.stopPropagation(); setConfirmOpen(false) }}>
+
e.stopPropagation()}>
+
{t('reservations.confirm.deleteTitle')}
+
{t('reservations.confirm.deleteBody', { name: r.title })}
+
+
+
+
+
+
,
+ document.body
+ )}
+
+ )
+}
+
interface ReservationsPanelProps {
tripId: number
reservations: Reservation[]
@@ -718,7 +768,7 @@ export default function ReservationsPanel({ tripId, reservations, days, assignme
<>
{transitEntries.length > 0 && (
- {transitEntries.map(r => )}
+ {transitEntries.map(r => )}
)}
{allPending.length > 0 && (
diff --git a/client/src/components/Planner/TransitJourneyModal.test.tsx b/client/src/components/Planner/TransitJourneyModal.test.tsx
index 182002807..b94ee94fb 100644
--- a/client/src/components/Planner/TransitJourneyModal.test.tsx
+++ b/client/src/components/Planner/TransitJourneyModal.test.tsx
@@ -49,22 +49,39 @@ describe('TransitJourneyModal', () => {
it('FE-PLANNER-TRANSITJOURNEY-001: shows summary, line badge, platform and legs', () => {
render(
)
expect(screen.getByText('U2')).toBeInTheDocument()
- expect(screen.getByText('1 transfers')).toBeInTheDocument()
+ // stat tiles: value + caption
+ expect(screen.getByText('Transfers')).toBeInTheDocument()
+ expect(screen.getByText('Walking')).toBeInTheDocument()
expect(screen.getByText(/Platform 2/)).toBeInTheDocument()
expect(screen.getByText(/Ruhleben/)).toBeInTheDocument()
expect(screen.getByText(/BVG/)).toBeInTheDocument()
})
- it('FE-PLANNER-TRANSITJOURNEY-002: saving edited fields calls onSave with the field payload only', async () => {
+ it('FE-PLANNER-TRANSITJOURNEY-002: inline title rename + notes save as a minimal field payload', async () => {
const user = userEvent.setup()
const onSave = vi.fn().mockResolvedValue({})
render(
)
+ // The title renames inline in the header via its pencil.
+ await user.click(screen.getByLabelText('Edit'))
const titleInput = screen.getByDisplayValue('Fernsehturm → Zoo')
await user.clear(titleInput)
await user.type(titleInput, 'Zum Zoo')
+ await user.keyboard('{Enter}')
+ await user.type(screen.getByPlaceholderText(/notes/i), 'Take **coffee**')
await user.click(screen.getByRole('button', { name: /^Save$/ }))
await waitFor(() => expect(onSave).toHaveBeenCalled())
- expect(onSave).toHaveBeenCalledWith({ title: 'Zum Zoo', status: 'confirmed', confirmation_number: null, notes: null })
+ expect(onSave).toHaveBeenCalledWith({ title: 'Zum Zoo', notes: 'Take **coffee**' })
+ })
+
+ it('FE-PLANNER-TRANSITJOURNEY-006: no status or booking-code fields; notes support a markdown preview', async () => {
+ const user = userEvent.setup()
+ render(
)
+ expect(screen.queryByText('Status')).not.toBeInTheDocument()
+ expect(screen.queryByText(/Booking code|Confirmation/i)).not.toBeInTheDocument()
+ await user.type(screen.getByPlaceholderText(/notes/i), '**bold** note')
+ await user.click(screen.getByRole('button', { name: 'Preview' }))
+ const bold = document.querySelector('.collab-note-md strong')
+ expect(bold?.textContent).toBe('bold')
})
it('FE-PLANNER-TRANSITJOURNEY-003: change route triggers onChangeRoute', async () => {
diff --git a/client/src/components/Planner/TransitJourneyModal.tsx b/client/src/components/Planner/TransitJourneyModal.tsx
index cd6e0c4fd..589de151b 100644
--- a/client/src/components/Planner/TransitJourneyModal.tsx
+++ b/client/src/components/Planner/TransitJourneyModal.tsx
@@ -1,18 +1,21 @@
-import { useEffect, useState } from 'react'
-import { ArrowRight, Footprints, Pencil, RefreshCw, TramFront, Trash2 } from 'lucide-react'
+import { useEffect, useRef, useState } from 'react'
+import Markdown from 'react-markdown'
+import remarkGfm from 'remark-gfm'
+import remarkBreaks from 'remark-breaks'
+import { ArrowRight, ArrowRightLeft, Clock, Footprints, Pencil, RefreshCw, TramFront, Trash2 } from 'lucide-react'
import Modal from '../shared/Modal'
import ConfirmDialog from '../shared/ConfirmDialog'
import { useTranslation } from '../../i18n'
import { useSettingsStore } from '../../store/settingsStore'
import { splitReservationDateTime, formatTime } from '../../utils/formatters'
+import { TransitTitle } from './transitDisplay'
import type { Reservation } from '../../types'
/**
* The journey view for an automated public-transit entry (#1065): a roomy modal
- * that shows the full itinerary (summary + stop-by-stop legs) together with the
- * editable booking fields — the generic transport form never opens for transit.
- * "Change route" re-enters the transit search pre-seeded with this journey's
- * origin/destination and replaces the itinerary on save.
+ * around the stop-by-stop itinerary. The title renames inline right in the
+ * header, notes get the full width with markdown support, and "Change route"
+ * re-enters the transit search pre-seeded with this journey's route.
*/
interface TransitLegMeta {
@@ -31,8 +34,8 @@ interface TransitLegMeta {
interface TransitJourneyModalProps {
reservation: Reservation
onClose: () => void
- /** Partial field update (title/status/confirmation/notes) — endpoints + itinerary stay untouched. */
- onSave: (fields: { title: string; status: string; confirmation_number: string | null; notes: string | null }) => Promise
+ /** Partial field update — endpoints + itinerary stay untouched. */
+ onSave: (fields: { title: string; notes: string | null }) => Promise
onDelete: () => Promise
onChangeRoute: () => void
canEdit: boolean
@@ -46,27 +49,28 @@ export default function TransitJourneyModal({ reservation, onClose, onSave, onDe
const transit = meta.transit && Array.isArray(meta.transit.legs) ? meta.transit : null
const [title, setTitle] = useState(res.title || '')
- const [status, setStatus] = useState(res.status || 'confirmed')
- const [confirmation, setConfirmation] = useState(res.confirmation_number || '')
+ const [editingTitle, setEditingTitle] = useState(false)
const [notes, setNotes] = useState(res.notes || '')
+ const [notesTab, setNotesTab] = useState<'write' | 'preview'>('write')
const [saving, setSaving] = useState(false)
const [confirmDelete, setConfirmDelete] = useState(false)
+ const titleInputRef = useRef(null)
useEffect(() => {
setTitle(res.title || '')
- setStatus(res.status || 'confirmed')
- setConfirmation(res.confirmation_number || '')
setNotes(res.notes || '')
+ setEditingTitle(false)
}, [res.id])
- const dirty = title !== (res.title || '') || status !== (res.status || 'confirmed')
- || confirmation !== (res.confirmation_number || '') || notes !== (res.notes || '')
+ useEffect(() => { if (editingTitle) titleInputRef.current?.focus() }, [editingTitle])
+
+ const dirty = title !== (res.title || '') || notes !== (res.notes || '')
const save = async () => {
if (!title.trim()) return
setSaving(true)
try {
- await onSave({ title: title.trim(), status, confirmation_number: confirmation.trim() || null, notes: notes.trim() || null })
+ await onSave({ title: title.trim(), notes: notes.trim() || null })
onClose()
} finally { setSaving(false) }
}
@@ -75,8 +79,19 @@ export default function TransitJourneyModal({ reservation, onClose, onSave, onDe
const { time: endTime } = splitReservationDateTime(res.reservation_end_time)
const dateStr = date ? new Date(date + 'T00:00:00Z').toLocaleDateString(locale, { weekday: 'long', day: 'numeric', month: 'long', timeZone: 'UTC' }) : ''
- const inputClass = 'w-full border border-edge rounded-[10px] px-[12px] py-[9px] text-[13px] font-[inherit] outline-none box-border text-content bg-surface-input'
- const labelClass = 'block text-[11px] font-semibold text-content-faint mb-[5px] uppercase tracking-[0.03em]'
+ const fmtDuration = (seconds: number) => {
+ const mins = Math.round(seconds / 60)
+ if (mins < 60) return t('transit.min', { count: mins })
+ const h = Math.floor(mins / 60)
+ const m = mins % 60
+ return m > 0 ? `${h} h ${m} min` : `${h} h`
+ }
+
+ const statTiles = transit ? [
+ { Icon: Clock, value: transit.duration > 0 ? fmtDuration(transit.duration) : '—', label: t('transit.durationLabel') },
+ { Icon: ArrowRightLeft, value: String(transit.transfers ?? 0), label: t('transit.transfersLabel') },
+ { Icon: Footprints, value: transit.walk_seconds > 59 ? t('transit.min', { count: Math.round(transit.walk_seconds / 60) }) : '—', label: t('transit.walkLabel') },
+ ] : []
return (
- {/* header: route + date/time + status badge */}
+ {/* header: icon + inline-renamable title + date/time */}
-
-
+
+
-
{res.title}
-
+ {editingTitle ? (
+
setTitle(e.target.value)}
+ onBlur={() => setEditingTitle(false)}
+ onKeyDown={e => { if (e.key === 'Enter') setEditingTitle(false); if (e.key === 'Escape') { setTitle(res.title || ''); setEditingTitle(false) } }}
+ className="text-content"
+ aria-label={t('reservations.titleLabel')}
+ style={{ width: '100%', border: 'none', outline: 'none', background: 'transparent', padding: 0, fontFamily: 'inherit', fontSize: 'calc(17px * var(--fs-scale-subtitle, 1))', fontWeight: 700, letterSpacing: '-0.015em', borderBottom: '1.5px solid var(--text-primary)' }}
+ />
+ ) : (
+
+
+ {canEdit && (
+
+ )}
+
+ )}
+
{[dateStr, time ? `${formatTime(time, locale, timeFormat)}${endTime ? ` – ${formatTime(endTime, locale, timeFormat)}` : ''}` : ''].filter(Boolean).join(' · ')}
-
- {(status === 'confirmed' ? t('planner.resConfirmed') : t('planner.resPending')).replace(/\s*·\s*$/, '')}
-
{transit && (
<>
- {/* journey summary */}
-
- {transit.duration > 0 && (
-
{Math.floor(transit.duration / 3600) > 0 ? `${Math.floor(transit.duration / 3600)} h ${Math.round((transit.duration % 3600) / 60)} min` : t('transit.min', { count: Math.round(transit.duration / 60) })}
- )}
-
·
-
{transit.transfers > 0 ? t('transit.transfers', { count: transit.transfers }) : t('transit.direct')}
- {transit.walk_seconds > 59 && (
- <>
-
·
-
{t('transit.min', { count: Math.round(transit.walk_seconds / 60) })}
- >
- )}
+ {/* journey stats — three full-width tiles */}
+
+ {statTiles.map(({ Icon, value, label }, i) => (
+
+ ))}
- {/* stop-by-stop itinerary — roomy */}
+ {/* stop-by-stop itinerary */}
{t('transit.itinerary')}
@@ -207,41 +239,38 @@ export default function TransitJourneyModal({ reservation, onClose, onSave, onDe
>
)}
- {/* editable booking fields */}
-
-
-
-
setTitle(e.target.value)} disabled={!canEdit} className={inputClass} />
+ {/* notes — full width, markdown */}
+
+
+
+ {canEdit && (
+
+ {([['write', t('common.edit')], ['preview', t('common.preview')]] as const).map(([tab, label]) => (
+
+ ))}
+
+ )}
-
-
-
- {(['pending', 'confirmed'] as const).map(sv => (
-
- ))}
+ {canEdit && notesTab === 'write' ? (
+
+ )}
-
-
- {canEdit && !transit && (
-
-
{t('transit.noItinerary')}
-
- )}
-
-
-
set('start_day_id', v)} placeholder={t('dayplan.dayN', { n: '?' })} options={dayOptions} size="sm" />
+
+ {/* search header: what this is + the day it plans for */}
+
+
+
+
+
+
{t('transit.title')}
+
{t('transit.searchHint')}
+
+
+ set('start_day_id', v)} placeholder={t('dayplan.dayN', { n: '?' })} options={dayOptions} size="sm" />
+
{(() => {
const transitDay = days.find(d => d.id === Number(form.start_day_id))
- if (!transitDay) return
{t('transit.pickDay')}
+ if (!transitDay) return
{t('transit.pickDay')}
return (
{title}>
+ return (
+
+ {parts.map((p, i) => (
+
+ {i > 0 && }
+ {p}
+
+ ))}
+
+ )
+}
+
+/**
+ * The leg sequence as chips. Walk legs show their minutes right at the foot
+ * icon (sub-minute walks are dropped); transit legs are line badges in their
+ * colors. Optionally appends "· N transfers" — never a redundant "direct".
+ */
+export function TransitLegChips({ legs, transfers, size = 'sm', t }: {
+ legs: TransitLegDisplay[]
+ transfers?: number
+ size?: 'sm' | 'md'
+ t: (k: string, p?: Record) => string
+}) {
+ const badgeFont = size === 'sm' ? 'calc(9.5px * var(--fs-scale-caption, 1))' : 'calc(10.5px * var(--fs-scale-caption, 1))'
+ const walkIcon = size === 'sm' ? 10 : 12
+ const shown = legs.filter(l => l.mode !== 'WALK' || (l.duration || 0) >= 60)
+ return (
+
+ {shown.map((leg, i) => (
+
+ {i > 0 && ›}
+ {leg.mode === 'WALK' ? (
+
+
+ {Math.round((leg.duration || 0) / 60)}
+
+ ) : (
+
+ {leg.line || leg.mode}
+
+ )}
+
+ ))}
+ {typeof transfers === 'number' && transfers > 0 && (
+
+ · {t('transit.transfers', { count: transfers })}
+
+ )}
+
+ )
+}
diff --git a/client/src/pages/tripPlanner/useTripPlanner.ts b/client/src/pages/tripPlanner/useTripPlanner.ts
index 04af00256..69fd70815 100644
--- a/client/src/pages/tripPlanner/useTripPlanner.ts
+++ b/client/src/pages/tripPlanner/useTripPlanner.ts
@@ -92,7 +92,7 @@ export function useTripPlanner() {
}).catch(() => {})
}, [])
- const TRANSPORT_TYPES = new Set(['flight', 'train', 'bus', 'car', 'taxi', 'bicycle', 'cruise', 'ferry', 'transport_other'])
+ const TRANSPORT_TYPES = new Set(['flight', 'train', 'bus', 'car', 'taxi', 'bicycle', 'cruise', 'ferry', 'transit', 'transport_other'])
const TRIP_TABS = [
{ id: 'plan', label: t('trip.tabs.plan'), icon: Map },
diff --git a/shared/src/i18n/ar/common.ts b/shared/src/i18n/ar/common.ts
index e475fbaab..db4f711f5 100644
--- a/shared/src/i18n/ar/common.ts
+++ b/shared/src/i18n/ar/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'إلغاء',
'common.clear': 'مسح',
'common.delete': 'حذف',
+ 'common.preview': 'معاينة',
'common.edit': 'تعديل',
'common.add': 'إضافة',
'common.loading': 'جارٍ التحميل...',
diff --git a/shared/src/i18n/ar/transport.ts b/shared/src/i18n/ar/transport.ts
index 5a81819b7..76ef2388e 100644
--- a/shared/src/i18n/ar/transport.ts
+++ b/shared/src/i18n/ar/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'إضافة وسيلة نقل',
'transport.modalTitle.edit': 'تعديل وسيلة النقل',
'transport.title': 'المواصلات',
- 'transport.addManual': 'نقل يدوي',
+ 'transport.addManual': 'وسيلة نقل',
};
export default transport;
diff --git a/shared/src/i18n/ar/trip.ts b/shared/src/i18n/ar/trip.ts
index a937ff784..2c7529c1c 100644
--- a/shared/src/i18n/ar/trip.ts
+++ b/shared/src/i18n/ar/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'رحلة بالنقل العام',
'transit.pickDay': 'اختر يومًا للبحث عن الرحلات المتاحة.',
'transit.noItinerary': 'لا يحتوي هذا الإدخال على خط سير محفوظ — استخدم "تغيير المسار" للبحث عن أحدها.',
+ 'transit.durationLabel': 'المدة',
+ 'transit.transfersLabel': 'التحويلات',
+ 'transit.walkLabel': 'المشي',
+ 'transit.searchHint': 'ابحث عن رحلات فعلية وأضفها مباشرة إلى اليوم — البيانات عبر Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/br/common.ts b/shared/src/i18n/br/common.ts
index ea2ac064c..494c915e4 100644
--- a/shared/src/i18n/br/common.ts
+++ b/shared/src/i18n/br/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Cancelar',
'common.clear': 'Limpar',
'common.delete': 'Excluir',
+ 'common.preview': 'Prévia',
'common.edit': 'Editar',
'common.add': 'Adicionar',
'common.loading': 'Carregando...',
diff --git a/shared/src/i18n/br/transport.ts b/shared/src/i18n/br/transport.ts
index 3a78d3614..9a36f3134 100644
--- a/shared/src/i18n/br/transport.ts
+++ b/shared/src/i18n/br/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Adicionar transporte',
'transport.modalTitle.edit': 'Editar transporte',
'transport.title': 'Transportes',
- 'transport.addManual': 'Transporte Manual',
+ 'transport.addManual': 'Transporte',
};
export default transport;
diff --git a/shared/src/i18n/br/trip.ts b/shared/src/i18n/br/trip.ts
index db26e5822..d809e84f5 100644
--- a/shared/src/i18n/br/trip.ts
+++ b/shared/src/i18n/br/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Viagem de transporte público',
'transit.pickDay': 'Escolha um dia para buscar conexões.',
'transit.noItinerary': 'Esta entrada não tem itinerário salvo — use "Alterar trajeto" para buscar um.',
+ 'transit.durationLabel': 'Duração',
+ 'transit.transfersLabel': 'Baldeações',
+ 'transit.walkLabel': 'A pé',
+ 'transit.searchHint': 'Busque conexões reais e adicione direto ao dia — dados via Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/cs/common.ts b/shared/src/i18n/cs/common.ts
index e3b6a1221..87bb1c387 100644
--- a/shared/src/i18n/cs/common.ts
+++ b/shared/src/i18n/cs/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Zrušit',
'common.clear': 'Vymazat',
'common.delete': 'Smazat',
+ 'common.preview': 'Náhled',
'common.edit': 'Upravit',
'common.add': 'Přidat',
'common.loading': 'Načítání...',
diff --git a/shared/src/i18n/cs/transport.ts b/shared/src/i18n/cs/transport.ts
index 38b69d7a7..7b62ac095 100644
--- a/shared/src/i18n/cs/transport.ts
+++ b/shared/src/i18n/cs/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Přidat dopravu',
'transport.modalTitle.edit': 'Upravit dopravu',
'transport.title': 'Doprava',
- 'transport.addManual': 'Ruční doprava',
+ 'transport.addManual': 'Doprava',
};
export default transport;
diff --git a/shared/src/i18n/cs/trip.ts b/shared/src/i18n/cs/trip.ts
index f51a23ea0..8e1876643 100644
--- a/shared/src/i18n/cs/trip.ts
+++ b/shared/src/i18n/cs/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Cesta veřejnou dopravou',
'transit.pickDay': 'Vyberte den, pro který chcete vyhledat spojení.',
'transit.noItinerary': 'Tato položka nemá uložené spojení – vyhledejte ho pomocí tlačítka „Změnit trasu“.',
+ 'transit.durationLabel': 'Doba trvání',
+ 'transit.transfersLabel': 'Přestupy',
+ 'transit.walkLabel': 'Chůze',
+ 'transit.searchHint': 'Vyhledejte reálná spojení a přidejte je rovnou do dne — data přes Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/de/common.ts b/shared/src/i18n/de/common.ts
index 9789532bd..4b2495857 100644
--- a/shared/src/i18n/de/common.ts
+++ b/shared/src/i18n/de/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Abbrechen',
'common.clear': 'Löschen',
'common.delete': 'Löschen',
+ 'common.preview': 'Vorschau',
'common.edit': 'Bearbeiten',
'common.add': 'Hinzufügen',
'common.loading': 'Laden...',
diff --git a/shared/src/i18n/de/transport.ts b/shared/src/i18n/de/transport.ts
index 51d0ade3d..ad383802a 100644
--- a/shared/src/i18n/de/transport.ts
+++ b/shared/src/i18n/de/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Transport hinzufügen',
'transport.modalTitle.edit': 'Transport bearbeiten',
'transport.title': 'Transporte',
- 'transport.addManual': 'Manuelles Transportmittel',
+ 'transport.addManual': 'Transport',
};
export default transport;
diff --git a/shared/src/i18n/de/trip.ts b/shared/src/i18n/de/trip.ts
index 0f8d63b43..bb0dd26a4 100644
--- a/shared/src/i18n/de/trip.ts
+++ b/shared/src/i18n/de/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'ÖPNV-Verbindung',
'transit.pickDay': 'Wähle einen Tag, für den Verbindungen gesucht werden sollen.',
'transit.noItinerary': 'Dieser Eintrag hat keine gespeicherte Verbindung — über „Route ändern" eine suchen.',
+ 'transit.durationLabel': 'Dauer',
+ 'transit.transfersLabel': 'Umstiege',
+ 'transit.walkLabel': 'Fußweg',
+ 'transit.searchHint': 'Echte Verbindungen suchen und direkt zum Tag hinzufügen — Daten via Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/en/common.ts b/shared/src/i18n/en/common.ts
index 3ea75de00..0fbc50077 100644
--- a/shared/src/i18n/en/common.ts
+++ b/shared/src/i18n/en/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Cancel',
'common.clear': 'Clear',
'common.delete': 'Delete',
+ 'common.preview': 'Preview',
'common.edit': 'Edit',
'common.add': 'Add',
'common.loading': 'Loading...',
diff --git a/shared/src/i18n/en/transport.ts b/shared/src/i18n/en/transport.ts
index 7038b558a..55271584d 100644
--- a/shared/src/i18n/en/transport.ts
+++ b/shared/src/i18n/en/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Add transport',
'transport.modalTitle.edit': 'Edit transport',
'transport.title': 'Transports',
- 'transport.addManual': 'Manual Transport',
+ 'transport.addManual': 'Transport',
};
export default transport;
diff --git a/shared/src/i18n/en/trip.ts b/shared/src/i18n/en/trip.ts
index eb7eb0ea5..eb17e54ca 100644
--- a/shared/src/i18n/en/trip.ts
+++ b/shared/src/i18n/en/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Public transit journey',
'transit.pickDay': 'Pick a day to search connections for.',
'transit.noItinerary': 'This entry has no stored itinerary — use "Change route" to search one.',
+ 'transit.durationLabel': 'Duration',
+ 'transit.transfersLabel': 'Transfers',
+ 'transit.walkLabel': 'Walking',
+ 'transit.searchHint': 'Search real connections and add them straight to the day — data via Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/es/common.ts b/shared/src/i18n/es/common.ts
index 3f36e6cdf..c9054afca 100644
--- a/shared/src/i18n/es/common.ts
+++ b/shared/src/i18n/es/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Cancelar',
'common.clear': 'Borrar',
'common.delete': 'Eliminar',
+ 'common.preview': 'Vista previa',
'common.edit': 'Editar',
'common.add': 'Añadir',
'common.loading': 'Cargando...',
diff --git a/shared/src/i18n/es/transport.ts b/shared/src/i18n/es/transport.ts
index 5a9a0369b..2adbcc276 100644
--- a/shared/src/i18n/es/transport.ts
+++ b/shared/src/i18n/es/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Añadir transporte',
'transport.modalTitle.edit': 'Editar transporte',
'transport.title': 'Transportes',
- 'transport.addManual': 'Transporte manual',
+ 'transport.addManual': 'Transporte',
};
export default transport;
diff --git a/shared/src/i18n/es/trip.ts b/shared/src/i18n/es/trip.ts
index 5de230585..2aafcca96 100644
--- a/shared/src/i18n/es/trip.ts
+++ b/shared/src/i18n/es/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Trayecto en transporte público',
'transit.pickDay': 'Elige un día para buscar conexiones.',
'transit.noItinerary': 'Esta entrada no tiene ningún itinerario guardado: usa «Cambiar ruta» para buscar uno.',
+ 'transit.durationLabel': 'Duración',
+ 'transit.transfersLabel': 'Transbordos',
+ 'transit.walkLabel': 'A pie',
+ 'transit.searchHint': 'Busca conexiones reales y añádelas directamente al día — datos vía Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/fr/common.ts b/shared/src/i18n/fr/common.ts
index 1cd07af5c..dd4cc5160 100644
--- a/shared/src/i18n/fr/common.ts
+++ b/shared/src/i18n/fr/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Annuler',
'common.clear': 'Effacer',
'common.delete': 'Supprimer',
+ 'common.preview': 'Aperçu',
'common.edit': 'Modifier',
'common.add': 'Ajouter',
'common.loading': 'Chargement…',
diff --git a/shared/src/i18n/fr/transport.ts b/shared/src/i18n/fr/transport.ts
index ab8591df9..9d1b95b21 100644
--- a/shared/src/i18n/fr/transport.ts
+++ b/shared/src/i18n/fr/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Ajouter un transport',
'transport.modalTitle.edit': 'Modifier le transport',
'transport.title': 'Transports',
- 'transport.addManual': 'Transport manuel',
+ 'transport.addManual': 'Transport',
};
export default transport;
diff --git a/shared/src/i18n/fr/trip.ts b/shared/src/i18n/fr/trip.ts
index 816375d05..5b1f9a2df 100644
--- a/shared/src/i18n/fr/trip.ts
+++ b/shared/src/i18n/fr/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Trajet en transports en commun',
'transit.pickDay': 'Choisissez un jour pour rechercher des connexions.',
'transit.noItinerary': 'Cette entrée n\'a aucun itinéraire enregistré — utilisez « Modifier l\'itinéraire » pour en rechercher un.',
+ 'transit.durationLabel': 'Durée',
+ 'transit.transfersLabel': 'Correspondances',
+ 'transit.walkLabel': 'Marche',
+ 'transit.searchHint': 'Recherchez de vraies liaisons et ajoutez-les directement au jour — données via Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/gr/common.ts b/shared/src/i18n/gr/common.ts
index 828f17f6d..549446ec7 100644
--- a/shared/src/i18n/gr/common.ts
+++ b/shared/src/i18n/gr/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Ακύρωση',
'common.clear': 'Εκκαθάριση',
'common.delete': 'Διαγραφή',
+ 'common.preview': 'Προεπισκόπηση',
'common.edit': 'Επεξεργασία',
'common.add': 'Προσθήκη',
'common.loading': 'Φόρτωση...',
diff --git a/shared/src/i18n/gr/transport.ts b/shared/src/i18n/gr/transport.ts
index c6106a647..5f21e2081 100644
--- a/shared/src/i18n/gr/transport.ts
+++ b/shared/src/i18n/gr/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Προσθήκη μεταφοράς',
'transport.modalTitle.edit': 'Επεξεργασία μεταφοράς',
'transport.title': 'Μεταφορές',
- 'transport.addManual': 'Χειροκίνητη Μεταφορά',
+ 'transport.addManual': 'Μεταφορά',
};
export default transport;
diff --git a/shared/src/i18n/gr/trip.ts b/shared/src/i18n/gr/trip.ts
index 3c84a2123..f61ecd600 100644
--- a/shared/src/i18n/gr/trip.ts
+++ b/shared/src/i18n/gr/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Διαδρομή με δημόσιες συγκοινωνίες',
'transit.pickDay': 'Επιλέξτε μια ημέρα για αναζήτηση συνδέσεων.',
'transit.noItinerary': 'Αυτή η καταχώριση δεν έχει αποθηκευμένο δρομολόγιο — χρησιμοποιήστε την «Αλλαγή διαδρομής» για να αναζητήσετε ένα.',
+ 'transit.durationLabel': 'Διάρκεια',
+ 'transit.transfersLabel': 'Μετεπιβιβάσεις',
+ 'transit.walkLabel': 'Περπάτημα',
+ 'transit.searchHint': 'Αναζητήστε πραγματικές συνδέσεις και προσθέστε τις απευθείας στην ημέρα — δεδομένα μέσω Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/hu/common.ts b/shared/src/i18n/hu/common.ts
index d19190602..4796e1a45 100644
--- a/shared/src/i18n/hu/common.ts
+++ b/shared/src/i18n/hu/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Mégse',
'common.clear': 'Törlés',
'common.delete': 'Törlés',
+ 'common.preview': 'Előnézet',
'common.edit': 'Szerkesztés',
'common.add': 'Hozzáadás',
'common.loading': 'Betöltés...',
diff --git a/shared/src/i18n/hu/transport.ts b/shared/src/i18n/hu/transport.ts
index caa50cf51..5bb4c8ceb 100644
--- a/shared/src/i18n/hu/transport.ts
+++ b/shared/src/i18n/hu/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Közlekedés hozzáadása',
'transport.modalTitle.edit': 'Közlekedés szerkesztése',
'transport.title': 'Közlekedés',
- 'transport.addManual': 'Kézi közlekedés',
+ 'transport.addManual': 'Közlekedés',
};
export default transport;
diff --git a/shared/src/i18n/hu/trip.ts b/shared/src/i18n/hu/trip.ts
index 7d16fd513..5511d9f79 100644
--- a/shared/src/i18n/hu/trip.ts
+++ b/shared/src/i18n/hu/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Tömegközlekedési útvonal',
'transit.pickDay': 'Válassz egy napot a kapcsolatok kereséséhez.',
'transit.noItinerary': 'Ehhez a bejegyzéshez nincs mentett útiterv – az „Útvonal módosítása” gombbal kereshetsz egyet.',
+ 'transit.durationLabel': 'Időtartam',
+ 'transit.transfersLabel': 'Átszállások',
+ 'transit.walkLabel': 'Gyaloglás',
+ 'transit.searchHint': 'Keress valós összeköttetéseket, és add hozzá őket közvetlenül a naphoz – adatok a Transitous révén.',
};
export default trip;
diff --git a/shared/src/i18n/id/common.ts b/shared/src/i18n/id/common.ts
index 9640bed1e..042e5d59c 100644
--- a/shared/src/i18n/id/common.ts
+++ b/shared/src/i18n/id/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Batal',
'common.clear': 'Hapus',
'common.delete': 'Hapus',
+ 'common.preview': 'Pratinjau',
'common.edit': 'Sunting',
'common.add': 'Tambah',
'common.loading': 'Memuat...',
diff --git a/shared/src/i18n/id/transport.ts b/shared/src/i18n/id/transport.ts
index 55eb314d6..1d0b94fd8 100644
--- a/shared/src/i18n/id/transport.ts
+++ b/shared/src/i18n/id/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Tambah transportasi',
'transport.modalTitle.edit': 'Edit transportasi',
'transport.title': 'Transportasi',
- 'transport.addManual': 'Transportasi Manual',
+ 'transport.addManual': 'Transportasi',
};
export default transport;
diff --git a/shared/src/i18n/id/trip.ts b/shared/src/i18n/id/trip.ts
index 18522070f..eee274577 100644
--- a/shared/src/i18n/id/trip.ts
+++ b/shared/src/i18n/id/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Perjalanan transportasi umum',
'transit.pickDay': 'Pilih hari untuk mencari koneksi.',
'transit.noItinerary': 'Entri ini tidak memiliki rencana perjalanan tersimpan — gunakan "Ubah rute" untuk mencarinya.',
+ 'transit.durationLabel': 'Durasi',
+ 'transit.transfersLabel': 'Transit',
+ 'transit.walkLabel': 'Jalan kaki',
+ 'transit.searchHint': 'Cari koneksi nyata dan tambahkan langsung ke hari itu — data melalui Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/it/common.ts b/shared/src/i18n/it/common.ts
index b4c4e80a2..575547eb1 100644
--- a/shared/src/i18n/it/common.ts
+++ b/shared/src/i18n/it/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Annulla',
'common.clear': 'Cancella',
'common.delete': 'Elimina',
+ 'common.preview': 'Anteprima',
'common.edit': 'Modifica',
'common.add': 'Aggiungi',
'common.loading': 'Caricamento...',
diff --git a/shared/src/i18n/it/transport.ts b/shared/src/i18n/it/transport.ts
index 8fbb56442..fecb7df19 100644
--- a/shared/src/i18n/it/transport.ts
+++ b/shared/src/i18n/it/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Aggiungi trasporto',
'transport.modalTitle.edit': 'Modifica trasporto',
'transport.title': 'Trasporti',
- 'transport.addManual': 'Trasporto manuale',
+ 'transport.addManual': 'Trasporto',
};
export default transport;
diff --git a/shared/src/i18n/it/trip.ts b/shared/src/i18n/it/trip.ts
index 1a91986ae..0e6597c71 100644
--- a/shared/src/i18n/it/trip.ts
+++ b/shared/src/i18n/it/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Viaggio in trasporto pubblico',
'transit.pickDay': 'Scegli un giorno per cui cercare i collegamenti.',
'transit.noItinerary': 'Questa voce non ha un itinerario salvato: usa "Cambia percorso" per cercarne uno.',
+ 'transit.durationLabel': 'Durata',
+ 'transit.transfersLabel': 'Cambi',
+ 'transit.walkLabel': 'A piedi',
+ 'transit.searchHint': 'Cerca collegamenti reali e aggiungili direttamente alla giornata — dati via Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/ja/common.ts b/shared/src/i18n/ja/common.ts
index b43a50a0b..2fc8d231a 100644
--- a/shared/src/i18n/ja/common.ts
+++ b/shared/src/i18n/ja/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'キャンセル',
'common.clear': 'クリア',
'common.delete': '削除',
+ 'common.preview': 'プレビュー',
'common.edit': '編集',
'common.add': '追加',
'common.loading': '読み込み中…',
diff --git a/shared/src/i18n/ja/transport.ts b/shared/src/i18n/ja/transport.ts
index ca58fa243..cf56c0553 100644
--- a/shared/src/i18n/ja/transport.ts
+++ b/shared/src/i18n/ja/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': '移動手段を追加',
'transport.modalTitle.edit': '移動手段を編集',
'transport.title': '移動手段',
- 'transport.addManual': '手動で追加',
+ 'transport.addManual': '交通',
};
export default transport;
diff --git a/shared/src/i18n/ja/trip.ts b/shared/src/i18n/ja/trip.ts
index db63ef65d..5abdcd416 100644
--- a/shared/src/i18n/ja/trip.ts
+++ b/shared/src/i18n/ja/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': '公共交通機関の経路',
'transit.pickDay': '接続を検索する日を選択してください。',
'transit.noItinerary': 'この項目には保存された行程がありません。「経路を変更」から検索してください。',
+ 'transit.durationLabel': '所要時間',
+ 'transit.transfersLabel': '乗り換え',
+ 'transit.walkLabel': '徒歩',
+ 'transit.searchHint': '実際の経路を検索して、そのまま日程に追加できます — データは Transitous 提供。',
};
export default trip;
diff --git a/shared/src/i18n/ko/common.ts b/shared/src/i18n/ko/common.ts
index f1ed95a9f..7fddfcdcc 100644
--- a/shared/src/i18n/ko/common.ts
+++ b/shared/src/i18n/ko/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': '취소',
'common.clear': '지우기',
'common.delete': '삭제',
+ 'common.preview': '미리보기',
'common.edit': '편집',
'common.add': '추가',
'common.loading': '로딩 중...',
diff --git a/shared/src/i18n/ko/transport.ts b/shared/src/i18n/ko/transport.ts
index 62b7c8479..b610c0f19 100644
--- a/shared/src/i18n/ko/transport.ts
+++ b/shared/src/i18n/ko/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': '교통 추가',
'transport.modalTitle.edit': '교통 편집',
'transport.title': '교통',
- 'transport.addManual': '직접 교통 입력',
+ 'transport.addManual': '교통',
};
export default transport;
diff --git a/shared/src/i18n/ko/trip.ts b/shared/src/i18n/ko/trip.ts
index 4a516f521..0899194c8 100644
--- a/shared/src/i18n/ko/trip.ts
+++ b/shared/src/i18n/ko/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': '대중교통 경로',
'transit.pickDay': '연결편을 검색할 날짜를 선택하세요.',
'transit.noItinerary': '이 항목에는 저장된 경로가 없습니다. "경로 변경"을 사용하여 검색하세요.',
+ 'transit.durationLabel': '소요 시간',
+ 'transit.transfersLabel': '환승',
+ 'transit.walkLabel': '도보',
+ 'transit.searchHint': '실제 연결편을 검색하고 바로 일정에 추가하세요 — 데이터 제공: Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/nl/common.ts b/shared/src/i18n/nl/common.ts
index 1242728b0..66cf87fdc 100644
--- a/shared/src/i18n/nl/common.ts
+++ b/shared/src/i18n/nl/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Annuleren',
'common.clear': 'Wissen',
'common.delete': 'Verwijderen',
+ 'common.preview': 'Voorbeeld',
'common.edit': 'Bewerken',
'common.add': 'Toevoegen',
'common.loading': 'Laden...',
diff --git a/shared/src/i18n/nl/transport.ts b/shared/src/i18n/nl/transport.ts
index d7d79b33c..181c939d3 100644
--- a/shared/src/i18n/nl/transport.ts
+++ b/shared/src/i18n/nl/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Vervoer toevoegen',
'transport.modalTitle.edit': 'Vervoer bewerken',
'transport.title': 'Transport',
- 'transport.addManual': 'Handmatig transport',
+ 'transport.addManual': 'Vervoer',
};
export default transport;
diff --git a/shared/src/i18n/nl/trip.ts b/shared/src/i18n/nl/trip.ts
index 86f075e15..80281da92 100644
--- a/shared/src/i18n/nl/trip.ts
+++ b/shared/src/i18n/nl/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Reis met openbaar vervoer',
'transit.pickDay': 'Kies een dag om verbindingen voor te zoeken.',
'transit.noItinerary': 'Deze invoer heeft geen opgeslagen reisplan — gebruik "Route wijzigen" om er een te zoeken.',
+ 'transit.durationLabel': 'Duur',
+ 'transit.transfersLabel': 'Overstappen',
+ 'transit.walkLabel': 'Lopen',
+ 'transit.searchHint': 'Zoek echte verbindingen en voeg ze direct toe aan de dag — gegevens via Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/pl/common.ts b/shared/src/i18n/pl/common.ts
index 7fc91fa70..ec6fc8d1c 100644
--- a/shared/src/i18n/pl/common.ts
+++ b/shared/src/i18n/pl/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Anuluj',
'common.clear': 'Wyczyść',
'common.delete': 'Usuń',
+ 'common.preview': 'Podgląd',
'common.edit': 'Edytuj',
'common.add': 'Dodaj',
'common.loading': 'Ładowanie...',
diff --git a/shared/src/i18n/pl/transport.ts b/shared/src/i18n/pl/transport.ts
index 208702cad..1438944cd 100644
--- a/shared/src/i18n/pl/transport.ts
+++ b/shared/src/i18n/pl/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Dodaj transport',
'transport.modalTitle.edit': 'Edytuj transport',
'transport.title': 'Transport',
- 'transport.addManual': 'Ręczny transport',
+ 'transport.addManual': 'Transport',
};
export default transport;
diff --git a/shared/src/i18n/pl/trip.ts b/shared/src/i18n/pl/trip.ts
index 80d07d3dd..fa713e2b6 100644
--- a/shared/src/i18n/pl/trip.ts
+++ b/shared/src/i18n/pl/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Podróż transportem publicznym',
'transit.pickDay': 'Wybierz dzień, dla którego wyszukać połączenia.',
'transit.noItinerary': 'Ten wpis nie ma zapisanej trasy — użyj opcji „Zmień trasę”, aby ją wyszukać.',
+ 'transit.durationLabel': 'Czas trwania',
+ 'transit.transfersLabel': 'Przesiadki',
+ 'transit.walkLabel': 'Pieszo',
+ 'transit.searchHint': 'Wyszukaj prawdziwe połączenia i dodaj je od razu do dnia — dane z Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/ru/common.ts b/shared/src/i18n/ru/common.ts
index e921cc4a9..ec6ac5510 100644
--- a/shared/src/i18n/ru/common.ts
+++ b/shared/src/i18n/ru/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Отмена',
'common.clear': 'Очистить',
'common.delete': 'Удалить',
+ 'common.preview': 'Предпросмотр',
'common.edit': 'Редактировать',
'common.add': 'Добавить',
'common.loading': 'Загрузка...',
diff --git a/shared/src/i18n/ru/transport.ts b/shared/src/i18n/ru/transport.ts
index 3986a437a..cabaf385f 100644
--- a/shared/src/i18n/ru/transport.ts
+++ b/shared/src/i18n/ru/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Добавить транспорт',
'transport.modalTitle.edit': 'Изменить транспорт',
'transport.title': 'Транспорт',
- 'transport.addManual': 'Ручной транспорт',
+ 'transport.addManual': 'Транспорт',
};
export default transport;
diff --git a/shared/src/i18n/ru/trip.ts b/shared/src/i18n/ru/trip.ts
index 0e63821f4..df443a5fe 100644
--- a/shared/src/i18n/ru/trip.ts
+++ b/shared/src/i18n/ru/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Поездка на общественном транспорте',
'transit.pickDay': 'Выберите день для поиска соединений.',
'transit.noItinerary': 'Для этой записи нет сохранённого маршрута — нажмите «Изменить маршрут», чтобы найти его.',
+ 'transit.durationLabel': 'Длительность',
+ 'transit.transfersLabel': 'Пересадки',
+ 'transit.walkLabel': 'Пешком',
+ 'transit.searchHint': 'Ищите реальные маршруты и добавляйте их прямо в день — данные от Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/sv/common.ts b/shared/src/i18n/sv/common.ts
index 6bd26e70d..ab7c6099f 100644
--- a/shared/src/i18n/sv/common.ts
+++ b/shared/src/i18n/sv/common.ts
@@ -19,6 +19,7 @@ const common: TranslationStrings = {
'common.cancel': 'Avbryt',
'common.clear': 'Rensa',
'common.delete': 'Ta bort',
+ 'common.preview': 'Förhandsvisning',
'common.edit': 'Redigera',
'common.add': 'Lägg till',
'common.loading': 'Laddar...',
diff --git a/shared/src/i18n/sv/transport.ts b/shared/src/i18n/sv/transport.ts
index b568c48a1..0d6e6fd3d 100644
--- a/shared/src/i18n/sv/transport.ts
+++ b/shared/src/i18n/sv/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Lägg till transport',
'transport.modalTitle.edit': 'Redigera transport',
'transport.title': 'Transporter',
- 'transport.addManual': 'Manuell Transport',
+ 'transport.addManual': 'Transport',
};
export default transport;
diff --git a/shared/src/i18n/sv/trip.ts b/shared/src/i18n/sv/trip.ts
index 91d11c98d..3d95bd6bf 100644
--- a/shared/src/i18n/sv/trip.ts
+++ b/shared/src/i18n/sv/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Kollektivtrafikresa',
'transit.pickDay': 'Välj en dag att söka förbindelser för.',
'transit.noItinerary': 'Den här posten har ingen sparad resplan – använd ”Ändra resväg” för att söka en.',
+ 'transit.durationLabel': 'Restid',
+ 'transit.transfersLabel': 'Byten',
+ 'transit.walkLabel': 'Gång',
+ 'transit.searchHint': 'Sök verkliga förbindelser och lägg till dem direkt i dagen – data via Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/tr/common.ts b/shared/src/i18n/tr/common.ts
index bf78024ae..82331b839 100644
--- a/shared/src/i18n/tr/common.ts
+++ b/shared/src/i18n/tr/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'İptal',
'common.clear': 'Temizle',
'common.delete': 'Sil',
+ 'common.preview': 'Önizleme',
'common.edit': 'Düzenle',
'common.add': 'Ekle',
'common.loading': 'Yükleniyor...',
diff --git a/shared/src/i18n/tr/transport.ts b/shared/src/i18n/tr/transport.ts
index 975577315..79b68c9bf 100644
--- a/shared/src/i18n/tr/transport.ts
+++ b/shared/src/i18n/tr/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Ulaşım ekle',
'transport.modalTitle.edit': 'Ulaşımı düzenle',
'transport.title': 'Ulaşım',
- 'transport.addManual': 'Manuel Ulaşım',
+ 'transport.addManual': 'Ulaşım',
};
export default transport;
diff --git a/shared/src/i18n/tr/trip.ts b/shared/src/i18n/tr/trip.ts
index fed6015a1..91db8179a 100644
--- a/shared/src/i18n/tr/trip.ts
+++ b/shared/src/i18n/tr/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Toplu taşıma yolculuğu',
'transit.pickDay': 'Bağlantı aramak için bir gün seçin.',
'transit.noItinerary': 'Bu kaydın kayıtlı bir güzergâhı yok — bir tane aramak için "Rotayı değiştir" seçeneğini kullanın.',
+ 'transit.durationLabel': 'Süre',
+ 'transit.transfersLabel': 'Aktarma',
+ 'transit.walkLabel': 'Yürüyüş',
+ 'transit.searchHint': 'Gerçek bağlantıları ara ve doğrudan güne ekle — veriler Transitous üzerinden.',
};
export default trip;
diff --git a/shared/src/i18n/uk/common.ts b/shared/src/i18n/uk/common.ts
index 61f3cccb3..2e0ded74e 100644
--- a/shared/src/i18n/uk/common.ts
+++ b/shared/src/i18n/uk/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': 'Скасувати',
'common.clear': 'Очистити',
'common.delete': 'Видалити',
+ 'common.preview': 'Перегляд',
'common.edit': 'Редагувати',
'common.add': 'Додати',
'common.loading': 'Завантаження...',
diff --git a/shared/src/i18n/uk/transport.ts b/shared/src/i18n/uk/transport.ts
index 6a3915e1a..066b74f33 100644
--- a/shared/src/i18n/uk/transport.ts
+++ b/shared/src/i18n/uk/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Додати транспорт',
'transport.modalTitle.edit': 'Змінити транспорт',
'transport.title': 'Транспорт',
- 'transport.addManual': 'Ручний транспорт',
+ 'transport.addManual': 'Транспорт',
};
export default transport;
diff --git a/shared/src/i18n/uk/trip.ts b/shared/src/i18n/uk/trip.ts
index 0c3990665..27adf64f1 100644
--- a/shared/src/i18n/uk/trip.ts
+++ b/shared/src/i18n/uk/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Поїздка громадським транспортом',
'transit.pickDay': 'Виберіть день для пошуку сполучень.',
'transit.noItinerary': 'Для цього запису немає збереженого маршруту — натисніть «Змінити маршрут», щоб знайти його.',
+ 'transit.durationLabel': 'Тривалість',
+ 'transit.transfersLabel': 'Пересадки',
+ 'transit.walkLabel': 'Пішки',
+ 'transit.searchHint': 'Шукайте справжні маршрути та додавайте їх одразу до дня — дані від Transitous.',
};
export default trip;
diff --git a/shared/src/i18n/vi/common.ts b/shared/src/i18n/vi/common.ts
index db9fb1188..4eb8dba08 100644
--- a/shared/src/i18n/vi/common.ts
+++ b/shared/src/i18n/vi/common.ts
@@ -19,6 +19,7 @@ const common: TranslationStrings = {
'common.cancel': 'Hủy',
'common.clear': 'Xóa',
'common.delete': 'Xóa bỏ',
+ 'common.preview': 'Xem trước',
'common.edit': 'Chỉnh sửa',
'common.add': 'Thêm',
'common.loading': 'Đang tải...',
diff --git a/shared/src/i18n/vi/transport.ts b/shared/src/i18n/vi/transport.ts
index d5da91dd4..c9be022c3 100644
--- a/shared/src/i18n/vi/transport.ts
+++ b/shared/src/i18n/vi/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': 'Thêm phương tiện di chuyển',
'transport.modalTitle.edit': 'Chỉnh sửa phương tiện đi lại',
'transport.title': 'Di chuyển',
- 'transport.addManual': 'Thêm di chuyển',
+ 'transport.addManual': 'Phương tiện',
};
export default transport;
diff --git a/shared/src/i18n/vi/trip.ts b/shared/src/i18n/vi/trip.ts
index d9cec75e5..0d7fe2b86 100644
--- a/shared/src/i18n/vi/trip.ts
+++ b/shared/src/i18n/vi/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': 'Hành trình giao thông công cộng',
'transit.pickDay': 'Chọn một ngày để tìm chuyến kết nối.',
'transit.noItinerary': 'Mục này chưa có lộ trình được lưu — dùng “Đổi tuyến” để tìm một lộ trình.',
+ 'transit.durationLabel': 'Thời lượng',
+ 'transit.transfersLabel': 'Chuyển tuyến',
+ '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.',
};
export default trip;
diff --git a/shared/src/i18n/zh-TW/common.ts b/shared/src/i18n/zh-TW/common.ts
index 9db57cab0..ffd1bb19a 100644
--- a/shared/src/i18n/zh-TW/common.ts
+++ b/shared/src/i18n/zh-TW/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': '取消',
'common.clear': '清除',
'common.delete': '刪除',
+ 'common.preview': '預覽',
'common.edit': '編輯',
'common.add': '新增',
'common.loading': '載入中...',
diff --git a/shared/src/i18n/zh-TW/transport.ts b/shared/src/i18n/zh-TW/transport.ts
index 607f4d834..824060db0 100644
--- a/shared/src/i18n/zh-TW/transport.ts
+++ b/shared/src/i18n/zh-TW/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': '新增交通',
'transport.modalTitle.edit': '編輯交通',
'transport.title': '交通',
- 'transport.addManual': '手動新增交通',
+ 'transport.addManual': '交通',
};
export default transport;
diff --git a/shared/src/i18n/zh-TW/trip.ts b/shared/src/i18n/zh-TW/trip.ts
index e8c644f85..f191424c2 100644
--- a/shared/src/i18n/zh-TW/trip.ts
+++ b/shared/src/i18n/zh-TW/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': '大眾運輸行程',
'transit.pickDay': '請選擇要查詢班次的日期。',
'transit.noItinerary': '此項目尚未儲存行程——請使用「變更路線」查詢。',
+ 'transit.durationLabel': '行程時間',
+ 'transit.transfersLabel': '轉乘次數',
+ 'transit.walkLabel': '步行',
+ 'transit.searchHint': '搜尋實際交通連線,並直接加入當天行程 — 資料由 Transitous 提供。',
};
export default trip;
diff --git a/shared/src/i18n/zh/common.ts b/shared/src/i18n/zh/common.ts
index 6ad62f4b7..0f11f45ee 100644
--- a/shared/src/i18n/zh/common.ts
+++ b/shared/src/i18n/zh/common.ts
@@ -7,6 +7,7 @@ const common: TranslationStrings = {
'common.cancel': '取消',
'common.clear': '清除',
'common.delete': '删除',
+ 'common.preview': '预览',
'common.edit': '编辑',
'common.add': '添加',
'common.loading': '加载中...',
diff --git a/shared/src/i18n/zh/transport.ts b/shared/src/i18n/zh/transport.ts
index 886b68f5d..97127e60f 100644
--- a/shared/src/i18n/zh/transport.ts
+++ b/shared/src/i18n/zh/transport.ts
@@ -5,6 +5,6 @@ const transport: TranslationStrings = {
'transport.modalTitle.create': '添加交通',
'transport.modalTitle.edit': '编辑交通',
'transport.title': '交通',
- 'transport.addManual': '手动添加交通',
+ 'transport.addManual': '交通',
};
export default transport;
diff --git a/shared/src/i18n/zh/trip.ts b/shared/src/i18n/zh/trip.ts
index 06844330a..26a728a1b 100644
--- a/shared/src/i18n/zh/trip.ts
+++ b/shared/src/i18n/zh/trip.ts
@@ -76,5 +76,9 @@ const trip: TranslationStrings = {
'transit.journey': '公共交通行程',
'transit.pickDay': '请选择要查询班次的日期。',
'transit.noItinerary': '此条目尚未保存行程 — 请使用"更改路线"查询班次。',
+ 'transit.durationLabel': '时长',
+ 'transit.transfersLabel': '换乘',
+ 'transit.walkLabel': '步行',
+ 'transit.searchHint': '搜索真实班次并直接添加到当天行程 — 数据来自 Transitous。',
};
export default trip;