diff --git a/client/src/components/Journey/JourneyDetailPageSettingsDialog.tsx b/client/src/components/Journey/JourneyDetailPageSettingsDialog.tsx index db206aac3..990e8e924 100644 --- a/client/src/components/Journey/JourneyDetailPageSettingsDialog.tsx +++ b/client/src/components/Journey/JourneyDetailPageSettingsDialog.tsx @@ -77,6 +77,21 @@ export function JourneySettingsDialog({ journey, onClose, onSaved, onOpenInvite, } } + // Saved on the spot rather than on Save, like the archive switch above it: + // it is a view setting, and the point of it is seeing the map change (#2194). + const [savingTracks, setSavingTracks] = useState(false) + const handleTracksToggle = async () => { + setSavingTracks(true) + try { + await updateJourney(journey.id, { show_trip_tracks: !journey.show_trip_tracks }) + onSaved() + } catch { + toast.error(t('journey.settings.saveFailed')) + } finally { + setSavingTracks(false) + } + } + const handleDelete = async () => { try { await deleteJourney(journey.id) @@ -141,6 +156,30 @@ export function JourneySettingsDialog({ journey, onClose, onSaved, onOpenInvite, /> + {/* Trip GPX tracks on the journey map (#2194) */} +
+ + +
+ {/* Right column */} diff --git a/client/src/components/Journey/JourneyMap.tsx b/client/src/components/Journey/JourneyMap.tsx index be294c9e0..98f2d32bb 100644 --- a/client/src/components/Journey/JourneyMap.tsx +++ b/client/src/components/Journey/JourneyMap.tsx @@ -268,6 +268,18 @@ function JourneyMap( itemsRef.current = items const allCoords: L.LatLngTuple[] = [] + /** + * Track geometry is kept OUT of the fit set (#2194) and used only when there + * is nothing else to frame. + * + * A journey's opening viewport should show the journey — its entries and the + * trail between them. Letting a recorded GPX into the bounds meant one drive + * across a country zoomed the map out until the entries were specks, which + * is what the reporter's screenshot shows. JourneyMapGL already fits on + * entries + trail alone (JourneyMapGL.tsx), so this also ends an asymmetry + * where the same journey framed differently per renderer. + */ + const trackCoords: L.LatLngTuple[] = [] if (stableTrail.length > 1) { const coords = stableTrail.map(p => [p.lat, p.lng] as L.LatLngTuple) @@ -293,7 +305,7 @@ function JourneyMap( // becomes innerHTML, and a track name is a place name off a shared trip. if (track.name) line.bindTooltip(escapeHtml(track.name), { sticky: true, direction: 'top', className: 'map-tooltip' }) line.addTo(map) - coords.forEach(c => allCoords.push(c)) + coords.forEach(c => trackCoords.push(c)) } // route polyline — only in non-fullscreen (sidebar map) mode @@ -341,9 +353,12 @@ function JourneyMap( if (!mapRef.current) return try { map.invalidateSize() - if (allCoords.length > 0) { + // Tracks only get a say when the journey has nothing located of its own — + // a world view would be worse than framing the one thing on the map. + const fitCoords = allCoords.length > 0 ? allCoords : trackCoords + if (fitCoords.length > 0) { const pb = paddingBottom || 50 - map.fitBounds(L.latLngBounds(allCoords), { paddingTopLeft: [50, 50], paddingBottomRight: [50, pb], maxZoom: 16 }) + map.fitBounds(L.latLngBounds(fitCoords), { paddingTopLeft: [50, 50], paddingBottomRight: [50, pb], maxZoom: 16 }) } else { map.setView([30, 0], 2) } diff --git a/client/src/pages/journeyDetail/useJourneyDetail.ts b/client/src/pages/journeyDetail/useJourneyDetail.ts index 0efa6bf48..27174b1d1 100644 --- a/client/src/pages/journeyDetail/useJourneyDetail.ts +++ b/client/src/pages/journeyDetail/useJourneyDetail.ts @@ -13,6 +13,9 @@ import { lockBodyScroll } from '../../utils/bodyScrollLock' import type { JourneyEntry } from '../../store/journeyStore' import { createDraftJourneyEntry } from './JourneyDetailPage.helpers' +/** Stable identity for "this journey draws no trip tracks" (#2194). */ +const NO_TRACKS: JourneyTrack[] = [] + /** * Journey detail page logic — owns the journey load + WebSocket live sync, the * timeline/gallery view state, the entry editor/viewer/delete/lightbox dialogs, @@ -71,18 +74,31 @@ export function useJourneyDetail() { if (id) loadJourney(Number(id)).catch(() => {}) }, [id]) - // GPX tracks of the trips behind this journey (#1260). Loaded separately from the - // journey itself: a journey without tracks is the common case, and a failed lookup - // should cost the map its lines, not the whole page. - const [tracks, setTracks] = useState([]) + // GPX tracks of the trips behind this journey (#1260), drawn only when the + // journey asks for them (#2194). Loaded separately from the journey itself: a + // journey without tracks is the common case, and a failed lookup should cost + // the map its lines, not the whole page. + // + // The switch gates the REQUEST, not just the rendering: the endpoint ships + // full unthinned geometry, which for a trip carrying a season of recorded + // drives is megabytes fetched on every journey open for a map nobody asked + // for. It stays untouched on the server so TREK Studio, which freezes the + // same endpoint's output into a saved book, keeps the set it laid out with. + const [tracks, setTracks] = useState(NO_TRACKS) + const showTripTracks = !!current?.show_trip_tracks useEffect(() => { - if (!id) return + if (!id || !showTripTracks) { + // A stable empty array: a fresh literal here would be a new reference on + // every toggle and re-render the map for nothing. + setTracks(NO_TRACKS) + return + } let cancelled = false journeyApi.listTracks(Number(id)) - .then(res => { if (!cancelled) setTracks(res.tracks ?? []) }) - .catch(() => { if (!cancelled) setTracks([]) }) + .then(res => { if (!cancelled) setTracks(res.tracks ?? NO_TRACKS) }) + .catch(() => { if (!cancelled) setTracks(NO_TRACKS) }) return () => { cancelled = true } - }, [id]) + }, [id, showTripTracks]) useEffect(() => { if (current?.hide_skeletons !== undefined) setHideSkeletons(current.hide_skeletons) diff --git a/client/src/store/journeyStore.ts b/client/src/store/journeyStore.ts index 4f24f65b5..5a81b3023 100644 --- a/client/src/store/journeyStore.ts +++ b/client/src/store/journeyStore.ts @@ -11,6 +11,12 @@ export interface Journey { cover_gradient?: string | null cover_image?: string | null status: 'draft' | 'active' | 'completed' | 'archived' + /** + * Draw the GPX tracks of the journey's linked trips on its map (#2194). + * Off unless the owner asks for it — see the migration for why the default + * flipped. Optional so a cached pre-#2194 journey still parses. + */ + show_trip_tracks?: boolean created_at: number updated_at: number } diff --git a/server/src/db/migrations.ts b/server/src/db/migrations.ts index abaa917e8..62c58881c 100644 --- a/server/src/db/migrations.ts +++ b/server/src/db/migrations.ts @@ -4191,6 +4191,29 @@ function runMigrations(db: Database.Database): void { () => { db.prepare("UPDATE addons SET type = 'integration' WHERE id = 'naver_list_import'").run(); }, + /** + * Whether a journey's map draws the GPX tracks of the trips behind it (#2194). + * + * #1260 added those tracks unconditionally and with nothing to switch off, + * on the reasoning that a route imported into a linked trip is part of the + * journey's story. For a trip carrying a season of recorded drives it is + * instead a map nobody asked for, drawn from places that never became an + * entry — so it becomes a journey-level setting. + * + * DEFAULT 0, i.e. off: the tracks are opt-in from here on. That is a + * deliberate behaviour change rather than a preserved default — a journal + * should show what its author put in it, and #1260's set is everything the + * linked trips happen to contain. Owners who want them back have one + * switch in Journey Settings. + * + * Appended LAST: the array is index-addressed against schema_version. + */ + () => { + const cols = db.prepare("SELECT name FROM pragma_table_info('journeys')").all() as Array<{ name: string }>; + if (!cols.some(c => c.name === 'show_trip_tracks')) { + db.exec('ALTER TABLE journeys ADD COLUMN show_trip_tracks INTEGER NOT NULL DEFAULT 0'); + } + }, ]; if (currentVersion < migrations.length) { diff --git a/server/src/nest/journey/journey-domain.service.ts b/server/src/nest/journey/journey-domain.service.ts index 0a498500d..d5dfe7a5e 100644 --- a/server/src/nest/journey/journey-domain.service.ts +++ b/server/src/nest/journey/journey-domain.service.ts @@ -329,6 +329,7 @@ export class JourneyDomainService { cover_gradient: string; cover_image: string; status: string; + show_trip_tracks: boolean | number; }>, ): Journey | null { // Journey-level settings (title, cover, status) are owner-only — editors @@ -336,14 +337,17 @@ export class JourneyDomainService { if (!this.isOwner(journeyId, userId)) return null; const ALLOWED_STATUSES = ['draft', 'active', 'completed', 'archived']; - const allowed = ['title', 'subtitle', 'cover_gradient', 'cover_image', 'status']; + const allowed = ['title', 'subtitle', 'cover_gradient', 'cover_image', 'status', 'show_trip_tracks']; + // Stored as INTEGER, and better-sqlite3 refuses to bind a JS boolean, so the + // one flag on this table is coerced rather than passed through. + const BOOLEAN_FIELDS = new Set(['show_trip_tracks']); const fields: string[] = []; const values: unknown[] = []; for (const [key, val] of Object.entries(data)) { if (val !== undefined && allowed.includes(key)) { if (key === 'status' && !ALLOWED_STATUSES.includes(val as string)) continue; fields.push(`${key} = ?`); - values.push(val); + values.push(BOOLEAN_FIELDS.has(key) ? (val ? 1 : 0) : val); } } if (fields.length === 0) return this.db.prepare('SELECT * FROM journeys WHERE id = ?').get(journeyId) as Journey; diff --git a/server/src/types.ts b/server/src/types.ts index 7990c3717..d0b383291 100644 --- a/server/src/types.ts +++ b/server/src/types.ts @@ -356,6 +356,8 @@ export interface Journey { cover_gradient?: string | null; cover_image?: string | null; status: 'draft' | 'active' | 'completed' | 'archived'; + /** Draw the linked trips' GPX tracks on this journey's map (#2194). 0 by default. */ + show_trip_tracks?: number; created_at: number; updated_at: number; } diff --git a/server/tests/unit/nest/journey-domain.service.test.ts b/server/tests/unit/nest/journey-domain.service.test.ts index 63f6fa3a7..abb73df04 100644 --- a/server/tests/unit/nest/journey-domain.service.test.ts +++ b/server/tests/unit/nest/journey-domain.service.test.ts @@ -356,6 +356,30 @@ describe('updateJourney', () => { expect(result).not.toBeNull(); expect(result!.status).toBe('active'); }); + + it('JOURNEY-SVC-021d: trip GPX tracks are off until the owner switches them on (#2194)', () => { + const { user } = createUser(testDb); + const journey = createJourney(testDb, user.id, { title: 'Norway' }); + + // #1260 drew the linked trips' tracks unconditionally; they are opt-in now. + expect(svc.updateJourney(journey.id, user.id, {})!.show_trip_tracks).toBe(0); + + // A JS boolean has to survive the trip into an INTEGER column — + // better-sqlite3 refuses to bind one, so this would throw uncoerced. + expect(svc.updateJourney(journey.id, user.id, { show_trip_tracks: true })!.show_trip_tracks).toBe(1); + expect(svc.updateJourney(journey.id, user.id, { show_trip_tracks: false })!.show_trip_tracks).toBe(0); + }); + + it('JOURNEY-SVC-021e: an editor cannot switch the trip tracks on (#2194)', () => { + const { user } = createUser(testDb); + const { user: editor } = createUser(testDb, { username: 'tracks-editor' }); + const journey = createJourney(testDb, user.id, { title: 'Norway' }); + testDb.prepare("INSERT INTO journey_contributors (journey_id, user_id, role, added_at) VALUES (?, ?, 'editor', 0)") + .run(journey.id, editor.id); + + // Journey-level settings stay owner-only, same as title and status. + expect(svc.updateJourney(journey.id, editor.id, { show_trip_tracks: true })).toBeNull(); + }); }); describe('deleteJourney', () => { diff --git a/shared/src/i18n/ar/journey.ts b/shared/src/i18n/ar/journey.ts index d65274d4c..509cbe28b 100644 --- a/shared/src/i18n/ar/journey.ts +++ b/shared/src/i18n/ar/journey.ts @@ -216,6 +216,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Name', // en-fallback 'journey.settings.subtitle': 'Subtitle', // en-fallback 'journey.settings.subtitlePlaceholder': 'e.g. Thailand, Vietnam & Cambodia', // en-fallback + 'journey.settings.tracks': 'مسارات GPX', + 'journey.settings.showTripTracks': 'إظهار جميع مسارات GPX للرحلات', + 'journey.settings.showTripTracksHint': 'يرسم على الخريطة المسارات المسجَّلة من الرحلات المرتبطة.', 'journey.settings.delete': 'Delete', // en-fallback 'journey.settings.deleteJourney': 'Delete Journey', // en-fallback 'journey.settings.deleteMessage': 'Delete "{title}"? All entries and photos will be lost.', // en-fallback diff --git a/shared/src/i18n/br/journey.ts b/shared/src/i18n/br/journey.ts index 997a3151f..8770cbd2d 100644 --- a/shared/src/i18n/br/journey.ts +++ b/shared/src/i18n/br/journey.ts @@ -190,6 +190,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Nome', 'journey.settings.subtitle': 'Subtítulo', 'journey.settings.subtitlePlaceholder': 'ex. Tailândia, Vietnã e Camboja', + 'journey.settings.tracks': 'Trilhas GPX', + 'journey.settings.showTripTracks': 'Mostrar todas as trilhas GPX das viagens', + 'journey.settings.showTripTracksHint': 'Desenha no mapa as rotas gravadas das viagens vinculadas.', 'journey.settings.endJourney': 'Arquivar Jornada', 'journey.settings.reopenJourney': 'Restaurar Jornada', 'journey.settings.archived': 'Jornada arquivada', diff --git a/shared/src/i18n/ca/journey.ts b/shared/src/i18n/ca/journey.ts index b2b589a16..12b589206 100644 --- a/shared/src/i18n/ca/journey.ts +++ b/shared/src/i18n/ca/journey.ts @@ -190,6 +190,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Nom', 'journey.settings.subtitle': 'Subtítol', 'journey.settings.subtitlePlaceholder': 'p. ex. Tailàndia, Vietnam i Cambodja', + 'journey.settings.tracks': 'Traces GPX', + 'journey.settings.showTripTracks': 'Mostra totes les traces GPX dels viatges', + 'journey.settings.showTripTracksHint': 'Dibuixa al mapa les rutes enregistrades dels viatges enllaçats.', 'journey.settings.endJourney': 'Arxiva el viatge', 'journey.settings.reopenJourney': 'Restaura el viatge', 'journey.settings.archived': 'Viatge arxivat', diff --git a/shared/src/i18n/cs/journey.ts b/shared/src/i18n/cs/journey.ts index 5e68d1f85..6908698f3 100644 --- a/shared/src/i18n/cs/journey.ts +++ b/shared/src/i18n/cs/journey.ts @@ -190,6 +190,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Název', 'journey.settings.subtitle': 'Podtitul', 'journey.settings.subtitlePlaceholder': 'např. Thajsko, Vietnam a Kambodža', + 'journey.settings.tracks': 'Stopy GPX', + 'journey.settings.showTripTracks': 'Zobrazit všechny GPX stopy z cest', + 'journey.settings.showTripTracksHint': 'Vykreslí na mapě zaznamenané trasy z propojených cest.', 'journey.settings.endJourney': 'Archivovat cestu', 'journey.settings.reopenJourney': 'Obnovit cestu', 'journey.settings.archived': 'Cesta archivována', diff --git a/shared/src/i18n/de/journey.ts b/shared/src/i18n/de/journey.ts index 4f773f0c2..707670fcd 100644 --- a/shared/src/i18n/de/journey.ts +++ b/shared/src/i18n/de/journey.ts @@ -194,6 +194,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Name', 'journey.settings.subtitle': 'Untertitel', 'journey.settings.subtitlePlaceholder': 'z.B. Thailand, Vietnam & Kambodscha', + 'journey.settings.tracks': 'GPX-Tracks', + 'journey.settings.showTripTracks': 'Alle GPX-Tracks der Reisen anzeigen', + 'journey.settings.showTripTracksHint': 'Zeichnet die aufgezeichneten Routen der verknüpften Reisen auf die Karte.', 'journey.settings.endJourney': 'Reise archivieren', 'journey.settings.reopenJourney': 'Reise wiederherstellen', 'journey.settings.archived': 'Reise archiviert', diff --git a/shared/src/i18n/en/journey.ts b/shared/src/i18n/en/journey.ts index 6579a40bb..8b4d1e02d 100644 --- a/shared/src/i18n/en/journey.ts +++ b/shared/src/i18n/en/journey.ts @@ -202,6 +202,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Name', 'journey.settings.subtitle': 'Subtitle', 'journey.settings.subtitlePlaceholder': 'e.g. Thailand, Vietnam & Cambodia', + 'journey.settings.tracks': 'GPX Tracks', + 'journey.settings.showTripTracks': 'Show all trip GPX tracks', + 'journey.settings.showTripTracksHint': 'Draws the recorded routes from the linked trips on the map.', 'journey.settings.endJourney': 'Archive Journey', 'journey.settings.reopenJourney': 'Restore Journey', 'journey.settings.archived': 'Journey archived', diff --git a/shared/src/i18n/es/journey.ts b/shared/src/i18n/es/journey.ts index 1974ba226..f6e4735fc 100644 --- a/shared/src/i18n/es/journey.ts +++ b/shared/src/i18n/es/journey.ts @@ -190,6 +190,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Nombre', 'journey.settings.subtitle': 'Subtítulo', 'journey.settings.subtitlePlaceholder': 'p. ej. Tailandia, Vietnam y Camboya', + 'journey.settings.tracks': 'Rutas GPX', + 'journey.settings.showTripTracks': 'Mostrar todas las rutas GPX de los viajes', + 'journey.settings.showTripTracksHint': 'Dibuja en el mapa las rutas grabadas de los viajes vinculados.', 'journey.settings.endJourney': 'Archivar viaje', 'journey.settings.reopenJourney': 'Restaurar viaje', 'journey.settings.archived': 'Viaje archivado', diff --git a/shared/src/i18n/fr/journey.ts b/shared/src/i18n/fr/journey.ts index 4ce7c74de..dc677b5f9 100644 --- a/shared/src/i18n/fr/journey.ts +++ b/shared/src/i18n/fr/journey.ts @@ -191,6 +191,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Nom', 'journey.settings.subtitle': 'Sous-titre', 'journey.settings.subtitlePlaceholder': 'ex. Thaïlande, Vietnam et Cambodge', + 'journey.settings.tracks': 'Traces GPX', + 'journey.settings.showTripTracks': 'Afficher toutes les traces GPX des voyages', + 'journey.settings.showTripTracksHint': 'Trace sur la carte les itinéraires enregistrés des voyages liés.', 'journey.settings.endJourney': 'Archiver le journal', 'journey.settings.reopenJourney': 'Restaurer le journal', 'journey.settings.archived': 'Journal archivé', diff --git a/shared/src/i18n/gr/journey.ts b/shared/src/i18n/gr/journey.ts index 8a429b2d0..5fb69eca6 100644 --- a/shared/src/i18n/gr/journey.ts +++ b/shared/src/i18n/gr/journey.ts @@ -197,6 +197,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Όνομα', 'journey.settings.subtitle': 'Υπότιτλος', 'journey.settings.subtitlePlaceholder': 'π.χ. Ταϊλάνδη, Βιετνάμ & Καμπότζη', + 'journey.settings.tracks': 'Διαδρομές GPX', + 'journey.settings.showTripTracks': 'Εμφάνιση όλων των διαδρομών GPX των ταξιδιών', + 'journey.settings.showTripTracksHint': 'Σχεδιάζει στον χάρτη τις καταγεγραμμένες διαδρομές από τα συνδεδεμένα ταξίδια.', 'journey.settings.endJourney': 'Αρχειοθέτηση Ταξιδιού', 'journey.settings.reopenJourney': 'Επαναφορά Ταξιδιού', 'journey.settings.archived': 'Το ταξίδι αρχειοθετήθηκε', diff --git a/shared/src/i18n/hu/journey.ts b/shared/src/i18n/hu/journey.ts index 4331a3df5..cac0082d0 100644 --- a/shared/src/i18n/hu/journey.ts +++ b/shared/src/i18n/hu/journey.ts @@ -190,6 +190,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Név', 'journey.settings.subtitle': 'Alcím', 'journey.settings.subtitlePlaceholder': 'pl. Thaiföld, Vietnam és Kambodzsa', + 'journey.settings.tracks': 'GPX-nyomvonalak', + 'journey.settings.showTripTracks': 'Az utazások összes GPX-nyomvonalának megjelenítése', + 'journey.settings.showTripTracksHint': 'A kapcsolt utazások rögzített útvonalait rajzolja a térképre.', 'journey.settings.endJourney': 'Út archiválása', 'journey.settings.reopenJourney': 'Út visszaállítása', 'journey.settings.archived': 'Út archiválva', diff --git a/shared/src/i18n/id/journey.ts b/shared/src/i18n/id/journey.ts index 63a5e3aa6..e75bb909b 100644 --- a/shared/src/i18n/id/journey.ts +++ b/shared/src/i18n/id/journey.ts @@ -189,6 +189,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Nama', 'journey.settings.subtitle': 'Subjudul', 'journey.settings.subtitlePlaceholder': 'mis. Thailand, Vietnam & Kamboja', + 'journey.settings.tracks': 'Jalur GPX', + 'journey.settings.showTripTracks': 'Tampilkan semua jalur GPX perjalanan', + 'journey.settings.showTripTracksHint': 'Menggambar rute terekam dari perjalanan yang tertaut pada peta.', 'journey.settings.endJourney': 'Arsipkan Perjalanan', 'journey.settings.reopenJourney': 'Pulihkan Perjalanan', 'journey.settings.archived': 'Perjalanan diarsipkan', diff --git a/shared/src/i18n/it/journey.ts b/shared/src/i18n/it/journey.ts index e86a0e899..50ad25e35 100644 --- a/shared/src/i18n/it/journey.ts +++ b/shared/src/i18n/it/journey.ts @@ -190,6 +190,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Nome', 'journey.settings.subtitle': 'Sottotitolo', 'journey.settings.subtitlePlaceholder': 'es. Thailandia, Vietnam e Cambogia', + 'journey.settings.tracks': 'Tracce GPX', + 'journey.settings.showTripTracks': 'Mostra tutte le tracce GPX dei viaggi', + 'journey.settings.showTripTracksHint': 'Disegna sulla mappa i percorsi registrati dei viaggi collegati.', 'journey.settings.endJourney': 'Archivia il viaggio', 'journey.settings.reopenJourney': 'Ripristina il viaggio', 'journey.settings.archived': 'Viaggio archiviato', diff --git a/shared/src/i18n/ja/journey.ts b/shared/src/i18n/ja/journey.ts index bdc53da0d..17a0252ab 100644 --- a/shared/src/i18n/ja/journey.ts +++ b/shared/src/i18n/ja/journey.ts @@ -192,6 +192,9 @@ const journey: TranslationStrings = { 'journey.settings.name': '名前', 'journey.settings.subtitle': 'サブタイトル', 'journey.settings.subtitlePlaceholder': '例:タイ・ベトナム・カンボジア', + 'journey.settings.tracks': 'GPXトラック', + 'journey.settings.showTripTracks': '旅行のGPXトラックをすべて表示', + 'journey.settings.showTripTracksHint': 'リンクされた旅行の記録済みルートを地図に描画します。', 'journey.settings.endJourney': '日記をアーカイブ', 'journey.settings.reopenJourney': '日記を復元', 'journey.settings.archived': '日記をアーカイブしました', diff --git a/shared/src/i18n/ko/journey.ts b/shared/src/i18n/ko/journey.ts index bd915f1d3..a5e8296c6 100644 --- a/shared/src/i18n/ko/journey.ts +++ b/shared/src/i18n/ko/journey.ts @@ -191,6 +191,9 @@ const journey: TranslationStrings = { 'journey.settings.name': '이름', 'journey.settings.subtitle': '부제목', 'journey.settings.subtitlePlaceholder': '예: 태국, 베트남 & 캄보디아', + 'journey.settings.tracks': 'GPX 트랙', + 'journey.settings.showTripTracks': '여행의 모든 GPX 트랙 표시', + 'journey.settings.showTripTracksHint': '연결된 여행의 기록된 경로를 지도에 그립니다.', 'journey.settings.endJourney': 'Journey 보관', 'journey.settings.reopenJourney': 'Journey 복원', 'journey.settings.archived': 'Journey가 보관되었습니다', diff --git a/shared/src/i18n/nl/journey.ts b/shared/src/i18n/nl/journey.ts index a45c975ed..4d19a21d9 100644 --- a/shared/src/i18n/nl/journey.ts +++ b/shared/src/i18n/nl/journey.ts @@ -191,6 +191,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Naam', 'journey.settings.subtitle': 'Ondertitel', 'journey.settings.subtitlePlaceholder': 'bijv. Thailand, Vietnam & Cambodja', + 'journey.settings.tracks': 'GPX-tracks', + 'journey.settings.showTripTracks': 'Alle GPX-tracks van reizen tonen', + 'journey.settings.showTripTracksHint': 'Tekent de opgenomen routes van de gekoppelde reizen op de kaart.', 'journey.settings.endJourney': 'Reis archiveren', 'journey.settings.reopenJourney': 'Reis herstellen', 'journey.settings.archived': 'Reis gearchiveerd', diff --git a/shared/src/i18n/pl/journey.ts b/shared/src/i18n/pl/journey.ts index 5f8ac4540..1eb198e51 100644 --- a/shared/src/i18n/pl/journey.ts +++ b/shared/src/i18n/pl/journey.ts @@ -190,6 +190,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Nazwa', 'journey.settings.subtitle': 'Podtytuł', 'journey.settings.subtitlePlaceholder': 'np. Tajlandia, Wietnam i Kambodża', + 'journey.settings.tracks': 'Ślady GPX', + 'journey.settings.showTripTracks': 'Pokaż wszystkie ślady GPX z podróży', + 'journey.settings.showTripTracksHint': 'Rysuje na mapie zapisane trasy z powiązanych podróży.', 'journey.settings.endJourney': 'Archiwizuj podróż', 'journey.settings.reopenJourney': 'Przywróć podróż', 'journey.settings.archived': 'Podróż zarchiwizowana', diff --git a/shared/src/i18n/ru/journey.ts b/shared/src/i18n/ru/journey.ts index 3bd4dfe2f..6233c812c 100644 --- a/shared/src/i18n/ru/journey.ts +++ b/shared/src/i18n/ru/journey.ts @@ -190,6 +190,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Название', 'journey.settings.subtitle': 'Подзаголовок', 'journey.settings.subtitlePlaceholder': 'напр. Таиланд, Вьетнам и Камбоджа', + 'journey.settings.tracks': 'GPX-треки', + 'journey.settings.showTripTracks': 'Показывать все GPX-треки поездок', + 'journey.settings.showTripTracksHint': 'Рисует на карте записанные маршруты из связанных поездок.', 'journey.settings.endJourney': 'Архивировать путешествие', 'journey.settings.reopenJourney': 'Восстановить путешествие', 'journey.settings.archived': 'Путешествие архивировано', diff --git a/shared/src/i18n/sv/journey.ts b/shared/src/i18n/sv/journey.ts index 393b3c79e..928892095 100644 --- a/shared/src/i18n/sv/journey.ts +++ b/shared/src/i18n/sv/journey.ts @@ -195,6 +195,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Namn', 'journey.settings.subtitle': 'Undertext', 'journey.settings.subtitlePlaceholder': 't.ex. Thailand, Vietnam och Kambodja', + 'journey.settings.tracks': 'GPX-spår', + 'journey.settings.showTripTracks': 'Visa alla GPX-spår från resor', + 'journey.settings.showTripTracksHint': 'Ritar de inspelade rutterna från de länkade resorna på kartan.', 'journey.settings.endJourney': 'Arkivera Journey', 'journey.settings.reopenJourney': 'Återställ Journey', 'journey.settings.archived': 'Journey arkiverad', diff --git a/shared/src/i18n/tr/journey.ts b/shared/src/i18n/tr/journey.ts index fb655752c..36b10be6b 100644 --- a/shared/src/i18n/tr/journey.ts +++ b/shared/src/i18n/tr/journey.ts @@ -192,6 +192,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'İsim', 'journey.settings.subtitle': 'Alt başlık', 'journey.settings.subtitlePlaceholder': 'örn. Tayland, Vietnam ve Kamboçya', + 'journey.settings.tracks': 'GPX İzleri', + 'journey.settings.showTripTracks': 'Tüm gezi GPX izlerini göster', + 'journey.settings.showTripTracksHint': 'Bağlı gezilerdeki kayıtlı rotaları haritaya çizer.', 'journey.settings.endJourney': "Journey'i Arşivle", 'journey.settings.reopenJourney': "Journey'i geri aç", 'journey.settings.archived': 'Journey arşivlendi', diff --git a/shared/src/i18n/uk/journey.ts b/shared/src/i18n/uk/journey.ts index 7a6f4feb5..3d17643ce 100644 --- a/shared/src/i18n/uk/journey.ts +++ b/shared/src/i18n/uk/journey.ts @@ -192,6 +192,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Назва', 'journey.settings.subtitle': 'Підзаголовок', 'journey.settings.subtitlePlaceholder': 'наприклад Таїланд, В’єтнам і Камбоджа', + 'journey.settings.tracks': 'GPX-треки', + 'journey.settings.showTripTracks': 'Показувати всі GPX-треки подорожей', + 'journey.settings.showTripTracksHint': 'Малює на карті записані маршрути зі зв’язаних подорожей.', 'journey.settings.endJourney': 'Архівувати подорож', 'journey.settings.reopenJourney': 'Відновити подорож', 'journey.settings.archived': 'Подорож архівовано', diff --git a/shared/src/i18n/vi/journey.ts b/shared/src/i18n/vi/journey.ts index 42207ccbe..e50a6eb28 100644 --- a/shared/src/i18n/vi/journey.ts +++ b/shared/src/i18n/vi/journey.ts @@ -195,6 +195,9 @@ const journey: TranslationStrings = { 'journey.settings.name': 'Tên', 'journey.settings.subtitle': 'Phụ đề', 'journey.settings.subtitlePlaceholder': 'ví dụ. Thái Lan, Việt Nam và Campuchia', + 'journey.settings.tracks': 'Tuyến GPX', + 'journey.settings.showTripTracks': 'Hiện tất cả tuyến GPX của chuyến đi', + 'journey.settings.showTripTracksHint': 'Vẽ lên bản đồ các tuyến đường đã ghi từ những chuyến đi được liên kết.', 'journey.settings.endJourney': 'Hành trình lưu trữ', 'journey.settings.reopenJourney': 'Khôi phục hành trình', 'journey.settings.archived': 'Đã lưu trữ hành trình', diff --git a/shared/src/i18n/zh-TW/journey.ts b/shared/src/i18n/zh-TW/journey.ts index a9c8eb77b..98226cd1b 100644 --- a/shared/src/i18n/zh-TW/journey.ts +++ b/shared/src/i18n/zh-TW/journey.ts @@ -188,6 +188,9 @@ const journey: TranslationStrings = { 'journey.settings.name': '名稱', 'journey.settings.subtitle': '副標題', 'journey.settings.subtitlePlaceholder': '例如 泰國、越南和柬埔寨', + 'journey.settings.tracks': 'GPX 軌跡', + 'journey.settings.showTripTracks': '顯示所有行程的 GPX 軌跡', + 'journey.settings.showTripTracksHint': '在地圖上繪製關聯行程中的已記錄路線。', 'journey.settings.endJourney': '封存旅程', 'journey.settings.reopenJourney': '還原旅程', 'journey.settings.archived': '旅程已封存', diff --git a/shared/src/i18n/zh/journey.ts b/shared/src/i18n/zh/journey.ts index 0dd986391..0116330e5 100644 --- a/shared/src/i18n/zh/journey.ts +++ b/shared/src/i18n/zh/journey.ts @@ -188,6 +188,9 @@ const journey: TranslationStrings = { 'journey.settings.name': '名称', 'journey.settings.subtitle': '副标题', 'journey.settings.subtitlePlaceholder': '例如 泰国、越南和柬埔寨', + 'journey.settings.tracks': 'GPX 轨迹', + 'journey.settings.showTripTracks': '显示所有行程的 GPX 轨迹', + 'journey.settings.showTripTracksHint': '在地图上绘制关联行程中的已记录路线。', 'journey.settings.endJourney': '归档旅程', 'journey.settings.reopenJourney': '恢复旅程', 'journey.settings.archived': '旅程已归档',