From 855c0a4b244cd9cdecaf79ef5f01b1e229b28a88 Mon Sep 17 00:00:00 2001 From: Maurice Date: Thu, 1 Oct 2026 12:52:58 +0200 Subject: [PATCH] feat(settings): optional preferred map app for the navigate button (#2423) --- .../Planner/placeNavigation.test.ts | 34 +++++++++++++- .../src/components/Planner/placeNavigation.ts | 44 +++++++++++++++++++ .../Settings/DisplaySettingsTab.tsx | 15 +++++++ .../screens/settings/MSettingsGeneral.tsx | 22 +++++++++- client/src/types.ts | 5 +++ shared/src/i18n/ar/settings.ts | 3 ++ shared/src/i18n/az/settings.ts | 3 ++ shared/src/i18n/br/settings.ts | 3 ++ shared/src/i18n/ca/settings.ts | 3 ++ shared/src/i18n/cs/settings.ts | 3 ++ shared/src/i18n/de/settings.ts | 3 ++ shared/src/i18n/en/settings.ts | 3 ++ shared/src/i18n/es/settings.ts | 3 ++ shared/src/i18n/et/settings.ts | 3 ++ shared/src/i18n/fr/settings.ts | 3 ++ shared/src/i18n/gr/settings.ts | 3 ++ shared/src/i18n/hu/settings.ts | 3 ++ shared/src/i18n/id/settings.ts | 3 ++ shared/src/i18n/it/settings.ts | 3 ++ shared/src/i18n/ja/settings.ts | 3 ++ shared/src/i18n/ko/settings.ts | 3 ++ shared/src/i18n/nl/settings.ts | 3 ++ shared/src/i18n/pl/settings.ts | 3 ++ shared/src/i18n/ru/settings.ts | 3 ++ shared/src/i18n/sk/settings.ts | 3 ++ shared/src/i18n/sv/settings.ts | 3 ++ shared/src/i18n/th/settings.ts | 3 ++ shared/src/i18n/tr/settings.ts | 3 ++ shared/src/i18n/uk/settings.ts | 3 ++ shared/src/i18n/vi/settings.ts | 3 ++ shared/src/i18n/zh-TW/settings.ts | 3 ++ shared/src/i18n/zh/settings.ts | 3 ++ 32 files changed, 199 insertions(+), 2 deletions(-) diff --git a/client/src/components/Planner/placeNavigation.test.ts b/client/src/components/Planner/placeNavigation.test.ts index 45bb6e5f3..2b49f7708 100644 --- a/client/src/components/Planner/placeNavigation.test.ts +++ b/client/src/components/Planner/placeNavigation.test.ts @@ -1,5 +1,6 @@ import { afterEach, describe, expect, it, vi } from 'vitest' -import { getNavigationTargets, navigationTargetLabel, openNavigationTarget, showsAppleMaps, showsGeoUri } from './placeNavigation' +import { getNavigationTargets, navigationAppChoices, navigationTargetLabel, openNavigationTarget, preferredNavAppOptions, showsAppleMaps, showsGeoUri, withPreferredApp } from './placeNavigation' +import { useSettingsStore } from '../../store/settingsStore' import type { Place } from '../../types' // FE-PLANNER-NAV-001 to FE-PLANNER-NAV-008 @@ -163,3 +164,34 @@ describe('openNavigationTarget', () => { expect(assigned).toEqual([target.url]) }) }) + +describe('preferred map app (#2423)', () => { + afterEach(() => { + useSettingsStore.setState(s => ({ settings: { ...s.settings, preferred_nav_app: '' } })) + }) + + it('FE-PLANNER-NAV-2423-1: unset keeps every app on offer', () => { + expect(getNavigationTargets(place()).length).toBeGreaterThan(1) + }) + + it('FE-PLANNER-NAV-2423-2: a picked app is the only target, so the button opens it straight away', () => { + useSettingsStore.setState(s => ({ settings: { ...s.settings, preferred_nav_app: 'waze' } })) + const targets = getNavigationTargets(place()) + expect(targets.map(t => t.id)).toEqual(['waze']) + }) + + it('FE-PLANNER-NAV-2423-3: an app this place cannot be opened in falls back to the full list', () => { + const targets = [{ id: 'google' as const, label: 'Google Maps', url: 'g' }, { id: 'osm' as const, label: 'OpenStreetMap', url: 'o' }] + expect(withPreferredApp(targets, 'amap')).toEqual(targets) + expect(withPreferredApp(targets, null)).toEqual(targets) + expect(withPreferredApp(targets, 'osm')).toEqual([targets[1]]) + }) + + it('FE-PLANNER-NAV-2423-4: the settings options start with asking and name every app', () => { + const options = preferredNavAppOptions(k => k) + expect(options[0]).toEqual({ value: '', label: 'settings.preferredNavAppAsk' }) + expect(options.slice(1).map(o => o.value)).toEqual(navigationAppChoices().map(a => a.id)) + expect(options.map(o => o.value)).toContain('google') + }) +}) + diff --git a/client/src/components/Planner/placeNavigation.ts b/client/src/components/Planner/placeNavigation.ts index 056ef3f44..20fa78b8a 100644 --- a/client/src/components/Planner/placeNavigation.ts +++ b/client/src/components/Planner/placeNavigation.ts @@ -4,6 +4,7 @@ import { getAmapUrlForPlace } from './placeAmap' import { getCoMapsUrlForPlace } from './placeCoMaps' import { getGoogleMapsUrlForPlace } from './placeGoogleMaps' import { getOpenStreetMapUrlForPlace } from './placeOpenStreetMap' +import { useSettingsStore } from '../../store/settingsStore' type PlaceLike = Pick @@ -80,6 +81,49 @@ export function showsAppleMaps(): boolean { export function getNavigationTargets( place: PlaceLike | null | undefined, detailsUrl?: string | null, +): NavigationTarget[] { + return withPreferredApp(allNavigationTargets(place, detailsUrl), useSettingsStore.getState().settings.preferred_nav_app) +} + +/** + * The traveller's preferred map app (#2423), when they picked one in settings: + * just that target, so every navigate button opens it straight away. Unset, or + * an app this place cannot be opened in (Amap outside China, Waze without + * coordinates), keeps the full list. + */ +export function withPreferredApp(targets: NavigationTarget[], preferred: string | null | undefined): NavigationTarget[] { + if (!preferred) return targets + const match = targets.find(target => target.id === preferred) + return match ? [match] : targets +} + +/** + * The apps the settings picker offers (#2423), narrowed by platform the same + * way the list on a place is: Apple Maps not on Android, the generic geo: entry + * only there. Amap stays in, it is simply skipped for places outside China. + */ +export function navigationAppChoices(): { id: NavigationAppId; label: string; labelKey?: string }[] { + const choices: { id: NavigationAppId; label: string; labelKey?: string }[] = [ + { id: 'google', label: 'Google Maps' }, + { id: 'waze', label: 'Waze' }, + ] + if (showsAppleMaps()) choices.push({ id: 'apple', label: 'Apple Maps' }) + choices.push({ id: 'osm', label: 'OpenStreetMap' }, { id: 'comaps', label: 'CoMaps' }, { id: 'amap', label: '高德地图' }) + if (showsGeoUri()) choices.push({ id: 'geo', label: 'geo:', labelKey: 'inspector.otherMapApp' }) + return choices +} + +/** The settings options (#2423): "ask every time" first, then each app from navigationAppChoices. */ +export function preferredNavAppOptions(t: Translate): { value: string; label: string }[] { + return [ + { value: '', label: t('settings.preferredNavAppAsk') }, + ...navigationAppChoices().map(app => ({ value: app.id, label: app.labelKey ? t(app.labelKey) : app.label })), + ] +} + +function allNavigationTargets( + place: PlaceLike | null | undefined, + detailsUrl?: string | null, ): NavigationTarget[] { if (!place) return [] const targets: NavigationTarget[] = [] diff --git a/client/src/components/Settings/DisplaySettingsTab.tsx b/client/src/components/Settings/DisplaySettingsTab.tsx index 7b27f07e4..388fb650d 100644 --- a/client/src/components/Settings/DisplaySettingsTab.tsx +++ b/client/src/components/Settings/DisplaySettingsTab.tsx @@ -4,6 +4,7 @@ import { SUPPORTED_LANGUAGES, useTranslation } from '../../i18n' import { useSettingsStore, DEFAULT_SETTINGS } from '../../store/settingsStore' import { useToast } from '../shared/Toast' import CustomSelect from '../shared/CustomSelect' +import { preferredNavAppOptions } from '../Planner/placeNavigation' import { SYMBOLS, currenciesWith } from '../Budget/BudgetPanel.constants' import Section from './Section' import { TRIP_TAB_IDS, TRIP_TAB_LABEL_KEYS } from '../../constants/tripTabs' @@ -327,6 +328,20 @@ export default function DisplaySettingsTab(): React.ReactElement {
+ {/* Preferred map app (#2423): opt-in, the picker stays the default */} +
+ + { + try { await updateSetting('preferred_nav_app', String(v)) } + catch (e: unknown) { toast.error(e instanceof Error ? e.message : t('common.error')) } + }} + options={preferredNavAppOptions(t)} + /> +

{t('settings.preferredNavAppHint')}

+
+ {/* Date first in day headings (#1953) */} saveOnOff('day_date_first', value)} /> diff --git a/client/src/mobile/screens/settings/MSettingsGeneral.tsx b/client/src/mobile/screens/settings/MSettingsGeneral.tsx index eceec29ae..59a0011b9 100644 --- a/client/src/mobile/screens/settings/MSettingsGeneral.tsx +++ b/client/src/mobile/screens/settings/MSettingsGeneral.tsx @@ -9,9 +9,10 @@ import { DEFAULT_START_PAGE, DEFAULT_START_TRIP_TAB, type StartPage } from '../. import type { Settings, DistanceUnit, WeekStart } from '../../../types' import { DEFAULT_WEEK_START } from '@trek/shared' import { weekStartOptions } from '../../../utils/calendarWeek' -import { MSetCard, MSetEyebrow, MSetSelectRow, MSetSegments, MSetRow } from './MSettingsUi' +import { MSetCard, MSetEyebrow, MSetHint, MSetSelectRow, MSetSegments, MSetRow } from './MSettingsUi' import MToggle from '../../components/MToggle' import MSetPickerSheet from './MSetPickerSheet' +import { preferredNavAppOptions } from '../../../components/Planner/placeNavigation' /** * "General" settings section — the demo's Language & region and Travel & map @@ -24,6 +25,9 @@ export default function MSettingsGeneral() { const [currencyOpen, setCurrencyOpen] = useState(false) const [langOpen, setLangOpen] = useState(false) const [startTabOpen, setStartTabOpen] = useState(false) + const [navAppOpen, setNavAppOpen] = useState(false) + const navAppOptions = preferredNavAppOptions(t) + const navAppValue = settings.preferred_nav_app || '' const save = async (key: keyof Settings, value: Settings[keyof Settings]) => { try { @@ -169,6 +173,13 @@ export default function MSettingsGeneral() { + {t('settings.preferredNavApp')} + o.value === navAppValue)?.label ?? navAppOptions[0].label} + trailing={chevron} + onClick={() => setNavAppOpen(true)} + /> + {t('settings.preferredNavAppHint')}
{travelRows.map((row) => ( ({ value: l.value, label: l.label }))} /> + setNavAppOpen(false)} + title={t('settings.preferredNavApp')} + value={navAppValue} + onSelect={(v) => save('preferred_nav_app', v)} + options={navAppOptions} + /> + setStartTabOpen(false)} diff --git a/client/src/types.ts b/client/src/types.ts index 454866594..bb2355834 100644 --- a/client/src/types.ts +++ b/client/src/types.ts @@ -138,6 +138,11 @@ export interface Settings { blur_booking_codes?: boolean /** Day headings lead with the calendar date and name the trip day second (#1953). */ day_date_first?: boolean + /** + * Map app every navigate button opens straight away (#2423), as a + * NavigationAppId. Empty or absent keeps the picker with every app. + */ + preferred_nav_app?: string /** Places not planned into any day are drawn as small markers without their photo (#2024). */ map_compact_unplanned?: boolean map_booking_labels?: boolean diff --git a/shared/src/i18n/ar/settings.ts b/shared/src/i18n/ar/settings.ts index 962045e3e..0fde1e045 100644 --- a/shared/src/i18n/ar/settings.ts +++ b/shared/src/i18n/ar/settings.ts @@ -76,6 +76,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'تنسيق الوقت', 'settings.weekStart': 'يبدأ الأسبوع في', 'settings.weekStartHint': 'أول أيام الأسبوع في جميع منتقيات التاريخ. لدى Vacay إعداد خاص به.', + 'settings.preferredNavApp': 'فتح الأماكن في', + 'settings.preferredNavAppAsk': 'اسأل في كل مرة', + 'settings.preferredNavAppHint': 'عند اختيار تطبيق، يفتحه زر التنقل مباشرةً بدلاً من عرض جميع تطبيقات الخرائط.', 'settings.bookingLabels': 'تسميات مسارات الحجوزات', 'settings.bookingLabelsHint': 'عرض أسماء المحطات/المطارات على الخريطة. عند الإيقاف، يتم عرض الرمز فقط.', 'settings.blurBookingCodes': 'إخفاء رموز الحجز', diff --git a/shared/src/i18n/az/settings.ts b/shared/src/i18n/az/settings.ts index 0a8d626ff..60aff0a23 100644 --- a/shared/src/i18n/az/settings.ts +++ b/shared/src/i18n/az/settings.ts @@ -113,6 +113,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Vaxt formatı', 'settings.weekStart': 'Həftənin başlanğıcı', 'settings.weekStartHint': 'Bütün tarix seçicilərində həftənin ilk günü. Vacay-ın öz ayarı var.', + 'settings.preferredNavApp': 'Yerləri açmaq üçün', + 'settings.preferredNavAppAsk': 'Hər dəfə soruş', + 'settings.preferredNavAppHint': 'Tətbiq seçiləndə naviqasiya düyməsi bütün xəritə tətbiqlərini təklif etmək əvəzinə onu birbaşa açır.', 'settings.bookingLabels': 'Rezervasiya marşrutu etiketləri', 'settings.bookingLabelsHint': diff --git a/shared/src/i18n/br/settings.ts b/shared/src/i18n/br/settings.ts index 408b09ceb..19164fee2 100644 --- a/shared/src/i18n/br/settings.ts +++ b/shared/src/i18n/br/settings.ts @@ -81,6 +81,9 @@ const settings: TranslationStrings = { 'settings.weekStart': 'Semana começa em', 'settings.weekStartHint': 'Primeiro dia da semana em todos os seletores de data. O Vacay tem sua própria configuração.', + 'settings.preferredNavApp': 'Abrir lugares em', + 'settings.preferredNavAppAsk': 'Perguntar sempre', + 'settings.preferredNavAppHint': 'Com um app escolhido, o botão de navegação o abre direto em vez de oferecer todos os apps de mapa.', 'settings.blurBookingCodes': 'Ocultar códigos de reserva', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/ca/settings.ts b/shared/src/i18n/ca/settings.ts index aeb92ff18..a8647cedb 100644 --- a/shared/src/i18n/ca/settings.ts +++ b/shared/src/i18n/ca/settings.ts @@ -65,6 +65,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': "Format d'hora", 'settings.weekStart': 'La setmana comença el', 'settings.weekStartHint': 'Primer dia de la setmana a tots els selectors de data. Vacay té la seva pròpia opció.', + 'settings.preferredNavApp': 'Obre els llocs a', + 'settings.preferredNavAppAsk': 'Pregunta cada vegada', + 'settings.preferredNavAppHint': "Amb una app triada, el botó de navegació l'obre directament en lloc d'oferir totes les apps de mapes.", 'settings.blurBookingCodes': 'Difumina els codis de reserva', 'settings.optimizeFromAccommodation': "Optimitza la ruta des de l'allotjament", 'settings.optimizeFromAccommodationHint': diff --git a/shared/src/i18n/cs/settings.ts b/shared/src/i18n/cs/settings.ts index 080ad1f7c..8f2f6e0d4 100644 --- a/shared/src/i18n/cs/settings.ts +++ b/shared/src/i18n/cs/settings.ts @@ -77,6 +77,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Formát času', 'settings.weekStart': 'Týden začíná', 'settings.weekStartHint': 'První den týdne ve všech výběrech data. Vacay má vlastní nastavení.', + 'settings.preferredNavApp': 'Otevírat místa v', + 'settings.preferredNavAppAsk': 'Pokaždé se zeptat', + 'settings.preferredNavAppHint': 'Když je vybraná aplikace, tlačítko navigace ji rovnou otevře místo nabídky všech mapových aplikací.', 'settings.blurBookingCodes': 'Skrýt rezervační kódy', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/de/settings.ts b/shared/src/i18n/de/settings.ts index c63e27cbf..ff7d30738 100644 --- a/shared/src/i18n/de/settings.ts +++ b/shared/src/i18n/de/settings.ts @@ -79,6 +79,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Zeitformat', 'settings.weekStart': 'Woche beginnt am', 'settings.weekStartHint': 'Erster Tag der Woche in jedem Datumswähler. Vacay hat eine eigene Einstellung.', + 'settings.preferredNavApp': 'Orte öffnen in', + 'settings.preferredNavAppAsk': 'Jedes Mal fragen', + 'settings.preferredNavAppHint': 'Ist eine App gewählt, öffnet der Navigations-Button sie direkt, statt alle Karten-Apps anzubieten.', 'settings.bookingLabels': 'Orts-Labels auf Buchungsrouten', 'settings.bookingLabelsHint': 'Zeigt Bahnhofs-/Flughafennamen auf der Karte. Wenn aus, wird nur das Icon angezeigt.', 'settings.blurBookingCodes': 'Buchungscodes verbergen', diff --git a/shared/src/i18n/en/settings.ts b/shared/src/i18n/en/settings.ts index 6a92c1db0..ec4ede372 100644 --- a/shared/src/i18n/en/settings.ts +++ b/shared/src/i18n/en/settings.ts @@ -86,6 +86,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Time Format', 'settings.weekStart': 'Week starts on', 'settings.weekStartHint': 'First day of the week in every date picker. Vacay has its own setting.', + 'settings.preferredNavApp': 'Open places in', + 'settings.preferredNavAppAsk': 'Ask every time', + 'settings.preferredNavAppHint': 'With an app picked, the navigate button opens it straight away instead of offering every map app.', 'settings.bookingLabels': 'Booking route labels', 'settings.bookingLabelsHint': 'Show station / airport names on the map. When off, only the icon is shown.', 'settings.mapPoiPill': 'Explore places on the map', diff --git a/shared/src/i18n/es/settings.ts b/shared/src/i18n/es/settings.ts index d860ae08a..24dec908c 100644 --- a/shared/src/i18n/es/settings.ts +++ b/shared/src/i18n/es/settings.ts @@ -80,6 +80,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Formato de hora', 'settings.weekStart': 'La semana comienza el', 'settings.weekStartHint': 'Primer día de la semana en todos los selectores de fecha. Vacay tiene su propio ajuste.', + 'settings.preferredNavApp': 'Abrir lugares en', + 'settings.preferredNavAppAsk': 'Preguntar siempre', + 'settings.preferredNavAppHint': 'Con una app elegida, el botón de navegación la abre directamente en lugar de ofrecer todas las apps de mapas.', 'settings.blurBookingCodes': 'Difuminar códigos de reserva', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/et/settings.ts b/shared/src/i18n/et/settings.ts index 18e77c3a5..f1997f13a 100644 --- a/shared/src/i18n/et/settings.ts +++ b/shared/src/i18n/et/settings.ts @@ -90,6 +90,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Ajavorming', 'settings.weekStart': 'Nädala alguspäev', 'settings.weekStartHint': 'Nädala esimene päev kõigis kuupäevavalijates. Vacayl on oma seade.', + 'settings.preferredNavApp': 'Ava kohad rakenduses', + 'settings.preferredNavAppAsk': 'Küsi iga kord', + 'settings.preferredNavAppHint': 'Kui rakendus on valitud, avab navigeerimisnupp selle kohe, selle asemel et pakkuda kõiki kaardirakendusi.', 'settings.bookingLabels': 'Broneeringute marsruutide sildid', 'settings.bookingLabelsHint': 'Näita kaardil jaamade ja lennujaamade nimesid. Väljalülitatuna näidatakse ainult ikooni.', diff --git a/shared/src/i18n/fr/settings.ts b/shared/src/i18n/fr/settings.ts index 6f137cc8d..2575d05fc 100644 --- a/shared/src/i18n/fr/settings.ts +++ b/shared/src/i18n/fr/settings.ts @@ -82,6 +82,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': "Format de l'heure", 'settings.weekStart': 'La semaine commence le', 'settings.weekStartHint': 'Premier jour de la semaine dans tous les sélecteurs de date. Vacay a son propre réglage.', + 'settings.preferredNavApp': 'Ouvrir les lieux dans', + 'settings.preferredNavAppAsk': 'Demander à chaque fois', + 'settings.preferredNavAppHint': "Avec une app choisie, le bouton de navigation l'ouvre directement au lieu de proposer toutes les apps de cartes.", 'settings.blurBookingCodes': 'Masquer les codes de réservation', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/gr/settings.ts b/shared/src/i18n/gr/settings.ts index c8fc4c187..f8ba8a78d 100644 --- a/shared/src/i18n/gr/settings.ts +++ b/shared/src/i18n/gr/settings.ts @@ -84,6 +84,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Μορφή Ώρας', 'settings.weekStart': 'Η εβδομάδα ξεκινά την', 'settings.weekStartHint': 'Πρώτη ημέρα της εβδομάδας σε κάθε επιλογέα ημερομηνίας. Το Vacay έχει δική του ρύθμιση.', + 'settings.preferredNavApp': 'Άνοιγμα τοποθεσιών σε', + 'settings.preferredNavAppAsk': 'Ερώτηση κάθε φορά', + 'settings.preferredNavAppHint': 'Με επιλεγμένη εφαρμογή, το κουμπί πλοήγησης την ανοίγει αμέσως αντί να προτείνει όλες τις εφαρμογές χαρτών.', 'settings.bookingLabels': 'Ετικέτες διαδρομής κρατήσεων', 'settings.bookingLabelsHint': 'Εμφάνιση ονομάτων σταθμών / αεροδρομίων στον χάρτη. Όταν είναι απενεργοποιημένο, εμφανίζεται μόνο το εικονίδιο.', diff --git a/shared/src/i18n/hu/settings.ts b/shared/src/i18n/hu/settings.ts index 396a03928..be0daee8f 100644 --- a/shared/src/i18n/hu/settings.ts +++ b/shared/src/i18n/hu/settings.ts @@ -80,6 +80,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Időformátum', 'settings.weekStart': 'A hét kezdőnapja', 'settings.weekStartHint': 'A hét első napja minden dátumválasztóban. A Vacay saját beállítást használ.', + 'settings.preferredNavApp': 'Helyek megnyitása itt', + 'settings.preferredNavAppAsk': 'Mindig kérdezzen', + 'settings.preferredNavAppHint': 'Ha van kiválasztott app, a navigáció gomb azonnal azt nyitja meg, és nem kínálja fel az összes térképappot.', 'settings.blurBookingCodes': 'Foglalási kódok elrejtése', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/id/settings.ts b/shared/src/i18n/id/settings.ts index 2e2c4e141..0bb32c73a 100644 --- a/shared/src/i18n/id/settings.ts +++ b/shared/src/i18n/id/settings.ts @@ -78,6 +78,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Format Waktu', 'settings.weekStart': 'Awal minggu', 'settings.weekStartHint': 'Hari pertama dalam seminggu di setiap pemilih tanggal. Vacay punya pengaturannya sendiri.', + 'settings.preferredNavApp': 'Buka tempat di', + 'settings.preferredNavAppAsk': 'Tanya setiap kali', + 'settings.preferredNavAppHint': 'Jika aplikasi dipilih, tombol navigasi langsung membukanya alih-alih menawarkan semua aplikasi peta.', 'settings.blurBookingCodes': 'Sembunyikan Kode Pemesanan', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/it/settings.ts b/shared/src/i18n/it/settings.ts index 7f5e2f43f..305ae4878 100644 --- a/shared/src/i18n/it/settings.ts +++ b/shared/src/i18n/it/settings.ts @@ -81,6 +81,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Formato Ora', 'settings.weekStart': 'La settimana inizia il', 'settings.weekStartHint': 'Primo giorno della settimana in ogni selettore di date. Vacay ha una sua impostazione.', + 'settings.preferredNavApp': 'Apri i luoghi in', + 'settings.preferredNavAppAsk': 'Chiedi ogni volta', + 'settings.preferredNavAppHint': "Con un'app scelta, il pulsante di navigazione la apre subito invece di proporre tutte le app di mappe.", 'settings.blurBookingCodes': 'Nascondi codici di prenotazione', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/ja/settings.ts b/shared/src/i18n/ja/settings.ts index ea96cedad..58e02e479 100644 --- a/shared/src/i18n/ja/settings.ts +++ b/shared/src/i18n/ja/settings.ts @@ -77,6 +77,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': '時刻形式', 'settings.weekStart': '週の開始', 'settings.weekStartHint': 'すべての日付選択で週の最初の曜日になります。Vacay には専用の設定があります。', + 'settings.preferredNavApp': '場所を開くアプリ', + 'settings.preferredNavAppAsk': '毎回確認する', + 'settings.preferredNavAppHint': 'アプリを選ぶと、ナビボタンはすべての地図アプリを表示せず、すぐにそのアプリを開きます。', 'settings.bookingLabels': '予約ルートのラベル', 'settings.bookingLabelsHint': '地図に駅・空港名を表示。オフ時はアイコンのみ。', 'settings.blurBookingCodes': '予約コードをぼかす', diff --git a/shared/src/i18n/ko/settings.ts b/shared/src/i18n/ko/settings.ts index 45639c08b..e18b07733 100644 --- a/shared/src/i18n/ko/settings.ts +++ b/shared/src/i18n/ko/settings.ts @@ -78,6 +78,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': '시간 형식', 'settings.weekStart': '주 시작 요일', 'settings.weekStartHint': '모든 날짜 선택기에서 한 주의 첫 요일입니다. Vacay에는 별도의 설정이 있습니다.', + 'settings.preferredNavApp': '장소 열기 앱', + 'settings.preferredNavAppAsk': '매번 묻기', + 'settings.preferredNavAppHint': '앱을 선택하면 길찾기 버튼이 모든 지도 앱을 보여주는 대신 바로 그 앱을 엽니다.', 'settings.bookingLabels': '예약 경로 레이블', 'settings.bookingLabelsHint': '지도에 역 / 공항 이름을 표시합니다. 끄면 아이콘만 표시됩니다.', 'settings.blurBookingCodes': '예약 코드 흐리게', diff --git a/shared/src/i18n/nl/settings.ts b/shared/src/i18n/nl/settings.ts index 0507e9af8..ca0f4a90b 100644 --- a/shared/src/i18n/nl/settings.ts +++ b/shared/src/i18n/nl/settings.ts @@ -79,6 +79,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Tijdnotatie', 'settings.weekStart': 'Week begint op', 'settings.weekStartHint': 'Eerste dag van de week in elke datumkiezer. Vacay heeft een eigen instelling.', + 'settings.preferredNavApp': 'Plekken openen in', + 'settings.preferredNavAppAsk': 'Elke keer vragen', + 'settings.preferredNavAppHint': 'Met een gekozen app opent de navigatieknop die meteen, in plaats van alle kaart-apps aan te bieden.', 'settings.blurBookingCodes': 'Boekingscodes vervagen', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/pl/settings.ts b/shared/src/i18n/pl/settings.ts index 7d089a825..c591e6506 100644 --- a/shared/src/i18n/pl/settings.ts +++ b/shared/src/i18n/pl/settings.ts @@ -78,6 +78,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Format czasu', 'settings.weekStart': 'Tydzień zaczyna się w', 'settings.weekStartHint': 'Pierwszy dzień tygodnia we wszystkich wyborach daty. Vacay ma własne ustawienie.', + 'settings.preferredNavApp': 'Otwieraj miejsca w', + 'settings.preferredNavAppAsk': 'Pytaj za każdym razem', + 'settings.preferredNavAppHint': 'Gdy wybrano aplikację, przycisk nawigacji od razu ją otwiera zamiast proponować wszystkie aplikacje map.', 'settings.blurBookingCodes': 'Rozmyj kody rezerwacji', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/ru/settings.ts b/shared/src/i18n/ru/settings.ts index 929d97a17..7b4913719 100644 --- a/shared/src/i18n/ru/settings.ts +++ b/shared/src/i18n/ru/settings.ts @@ -78,6 +78,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Формат времени', 'settings.weekStart': 'Неделя начинается с', 'settings.weekStartHint': 'Первый день недели во всех выборах даты. У Vacay своя настройка.', + 'settings.preferredNavApp': 'Открывать места в', + 'settings.preferredNavAppAsk': 'Спрашивать каждый раз', + 'settings.preferredNavAppHint': 'Если приложение выбрано, кнопка навигации сразу открывает его вместо списка всех картографических приложений.', 'settings.blurBookingCodes': 'Скрыть коды бронирования', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/sk/settings.ts b/shared/src/i18n/sk/settings.ts index 9dba3dec7..f6f9ea5ac 100644 --- a/shared/src/i18n/sk/settings.ts +++ b/shared/src/i18n/sk/settings.ts @@ -87,6 +87,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Formát času', 'settings.weekStart': 'Týždeň začína', 'settings.weekStartHint': 'Prvý deň týždňa vo všetkých výberoch dátumu. Vacay má vlastné nastavenie.', + 'settings.preferredNavApp': 'Otvárať miesta v', + 'settings.preferredNavAppAsk': 'Zakaždým sa opýtať', + 'settings.preferredNavAppHint': 'Keď je vybraná aplikácia, tlačidlo navigácie ju rovno otvorí namiesto ponuky všetkých mapových aplikácií.', 'settings.bookingLabels': 'Popisky trás rezervácií', 'settings.bookingLabelsHint': 'Zobrazuje názvy staníc / letísk na mape. Ak je vypnuté, zobrazí sa iba ikona.', 'settings.mapPoiPill': 'Objavovať miesta na mape', diff --git a/shared/src/i18n/sv/settings.ts b/shared/src/i18n/sv/settings.ts index 928051f16..4287b637e 100644 --- a/shared/src/i18n/sv/settings.ts +++ b/shared/src/i18n/sv/settings.ts @@ -79,6 +79,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Tidsformat', 'settings.weekStart': 'Vecka börjar på', 'settings.weekStartHint': 'Veckans första dag i alla datumväljare. Vacay har en egen inställning.', + 'settings.preferredNavApp': 'Öppna platser i', + 'settings.preferredNavAppAsk': 'Fråga varje gång', + 'settings.preferredNavAppHint': 'Med en vald app öppnar navigeringsknappen den direkt i stället för att erbjuda alla kartappar.', 'settings.bookingLabels': 'Etiketter för bokningsrutter', 'settings.bookingLabelsHint': 'Visa stations- och flygplatsnamn på kartan. När funktionen är avstängd visas endast ikonen.', diff --git a/shared/src/i18n/th/settings.ts b/shared/src/i18n/th/settings.ts index a39a5f005..4daaa4308 100644 --- a/shared/src/i18n/th/settings.ts +++ b/shared/src/i18n/th/settings.ts @@ -81,6 +81,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': "รูปแบบเวลา", 'settings.weekStart': "สัปดาห์เริ่มต้นในวัน", 'settings.weekStartHint': 'วันแรกของสัปดาห์ในตัวเลือกวันที่ทั้งหมด Vacay มีการตั้งค่าของตัวเอง', + 'settings.preferredNavApp': 'เปิดสถานที่ด้วย', + 'settings.preferredNavAppAsk': 'ถามทุกครั้ง', + 'settings.preferredNavAppHint': 'เมื่อเลือกแอปไว้ ปุ่มนำทางจะเปิดแอปนั้นทันที แทนการแสดงแอปแผนที่ทั้งหมด', 'settings.bookingLabels': "ป้ายกำกับเส้นทางการจอง", 'settings.bookingLabelsHint': "แสดงชื่อสถานี/สนามบินบนแผนที่ เมื่อปิด จะแสดงเฉพาะไอคอนเท่านั้น", 'settings.mapPoiPill': "สำรวจสถานที่บนแผนที่", diff --git a/shared/src/i18n/tr/settings.ts b/shared/src/i18n/tr/settings.ts index 3de70b606..a6e1a52f5 100644 --- a/shared/src/i18n/tr/settings.ts +++ b/shared/src/i18n/tr/settings.ts @@ -79,6 +79,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Saat Biçimi', 'settings.weekStart': 'Hafta başlangıcı', 'settings.weekStartHint': "Tüm tarih seçicilerde haftanın ilk günü. Vacay'in kendi ayarı vardır.", + 'settings.preferredNavApp': 'Yerleri şurada aç', + 'settings.preferredNavAppAsk': 'Her seferinde sor', + 'settings.preferredNavAppHint': 'Bir uygulama seçiliyse, navigasyon düğmesi tüm harita uygulamalarını sunmak yerine onu doğrudan açar.', 'settings.bookingLabels': 'Rezervasyon rota etiketleri', 'settings.bookingLabelsHint': 'Haritada istasyon / havalimanı adlarını göster. Kapalıyken yalnızca simge görünür.', 'settings.blurBookingCodes': 'Rezervasyon Kodlarını Bulanıklaştır', diff --git a/shared/src/i18n/uk/settings.ts b/shared/src/i18n/uk/settings.ts index d99db45aa..7828a19dc 100644 --- a/shared/src/i18n/uk/settings.ts +++ b/shared/src/i18n/uk/settings.ts @@ -80,6 +80,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Формат часу', 'settings.weekStart': 'Тиждень починається з', 'settings.weekStartHint': 'Перший день тижня в усіх виборах дати. Vacay має власне налаштування.', + 'settings.preferredNavApp': 'Відкривати місця в', + 'settings.preferredNavAppAsk': 'Питати щоразу', + 'settings.preferredNavAppHint': 'Якщо застосунок вибрано, кнопка навігації одразу відкриває його замість списку всіх картографічних застосунків.', 'settings.blurBookingCodes': 'Приховати коди бронювання', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/vi/settings.ts b/shared/src/i18n/vi/settings.ts index 38b29033f..daeec9af8 100644 --- a/shared/src/i18n/vi/settings.ts +++ b/shared/src/i18n/vi/settings.ts @@ -80,6 +80,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': 'Định dạng thời gian', 'settings.weekStart': 'Tuần bắt đầu vào', 'settings.weekStartHint': 'Ngày đầu tuần trong mọi bộ chọn ngày. Vacay có cài đặt riêng.', + 'settings.preferredNavApp': 'Mở địa điểm bằng', + 'settings.preferredNavAppAsk': 'Hỏi mỗi lần', + 'settings.preferredNavAppHint': 'Khi đã chọn ứng dụng, nút chỉ đường sẽ mở ngay ứng dụng đó thay vì đưa ra mọi ứng dụng bản đồ.', 'settings.bookingLabels': 'Nhãn lộ trình đặt chỗ', 'settings.bookingLabelsHint': 'Hiển thị tên ga/sân bay trên bản đồ. Khi tắt, chỉ có biểu tượng được hiển thị.', 'settings.mapPoiPill': 'Khám phá các địa điểm trên bản đồ', diff --git a/shared/src/i18n/zh-TW/settings.ts b/shared/src/i18n/zh-TW/settings.ts index 8bc137cbd..3f084ac8c 100644 --- a/shared/src/i18n/zh-TW/settings.ts +++ b/shared/src/i18n/zh-TW/settings.ts @@ -75,6 +75,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': '時間格式', 'settings.weekStart': '每週開始於', 'settings.weekStartHint': '所有日期選擇器中每週的第一天。Vacay 有獨立的設定。', + 'settings.preferredNavApp': '開啟地點方式', + 'settings.preferredNavAppAsk': '每次詢問', + 'settings.preferredNavAppHint': '選定應用程式後,導航按鈕會直接開啟它,不再列出所有地圖應用程式。', 'settings.blurBookingCodes': '模糊預訂程式碼', 'settings.aiAlwaysRetry': 'Always retry booking imports with AI', 'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.', diff --git a/shared/src/i18n/zh/settings.ts b/shared/src/i18n/zh/settings.ts index 844b00c13..cb27facaf 100644 --- a/shared/src/i18n/zh/settings.ts +++ b/shared/src/i18n/zh/settings.ts @@ -75,6 +75,9 @@ const settings: TranslationStrings = { 'settings.timeFormat': '时间格式', 'settings.weekStart': '每周开始于', 'settings.weekStartHint': '所有日期选择器中每周的第一天。Vacay 有单独的设置。', + 'settings.preferredNavApp': '打开地点方式', + 'settings.preferredNavAppAsk': '每次询问', + 'settings.preferredNavAppHint': '选定应用后,导航按钮会直接打开它,而不再列出所有地图应用。', 'settings.blurBookingCodes': '隐藏预订编号', 'settings.aiAlwaysRetry': '始终用 AI 重试预订导入', 'settings.aiAlwaysRetryHint': '当标准解析器无法读取文件时,自动改用 AI 重试。',