mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
feat(settings): optional preferred map app for the navigate button (#2423)
This commit is contained in:
@@ -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')
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -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<Place | AssignmentPlace, 'name' | 'address' | 'lat' | 'lng' | 'google_place_id' | 'google_ftid'>
|
||||
|
||||
@@ -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[] = []
|
||||
|
||||
@@ -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 {
|
||||
</Section>
|
||||
|
||||
<Section title={t('settings.general.travelMap')} icon={Map}>
|
||||
{/* Preferred map app (#2423): opt-in, the picker stays the default */}
|
||||
<div>
|
||||
<label className="block text-sm font-medium mb-2 text-content-secondary">{t('settings.preferredNavApp')}</label>
|
||||
<CustomSelect
|
||||
value={settings.preferred_nav_app || ''}
|
||||
onChange={async v => {
|
||||
try { await updateSetting('preferred_nav_app', String(v)) }
|
||||
catch (e: unknown) { toast.error(e instanceof Error ? e.message : t('common.error')) }
|
||||
}}
|
||||
options={preferredNavAppOptions(t)}
|
||||
/>
|
||||
<p className="text-xs text-content-faint mt-2">{t('settings.preferredNavAppHint')}</p>
|
||||
</div>
|
||||
|
||||
{/* Date first in day headings (#1953) */}
|
||||
<OnOffSetting label={t('settings.dayDateFirst')} hint={t('settings.dayDateFirstHint')} on={settings.day_date_first === true} onChange={value => saveOnOff('day_date_first', value)} />
|
||||
|
||||
|
||||
@@ -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() {
|
||||
</MSetCard>
|
||||
|
||||
<MSetCard title={t('settings.general.travelMap')} icon={Map} className="mt-3">
|
||||
<MSetEyebrow className="mb-[5px]">{t('settings.preferredNavApp')}</MSetEyebrow>
|
||||
<MSetSelectRow
|
||||
label={navAppOptions.find(o => o.value === navAppValue)?.label ?? navAppOptions[0].label}
|
||||
trailing={chevron}
|
||||
onClick={() => setNavAppOpen(true)}
|
||||
/>
|
||||
<MSetHint className="mb-[10px]">{t('settings.preferredNavAppHint')}</MSetHint>
|
||||
<div className="-mt-[6px]">
|
||||
{travelRows.map((row) => (
|
||||
<MSetRow
|
||||
@@ -208,6 +219,15 @@ export default function MSettingsGeneral() {
|
||||
options={SUPPORTED_LANGUAGES.map((l) => ({ value: l.value, label: l.label }))}
|
||||
/>
|
||||
|
||||
<MSetPickerSheet
|
||||
open={navAppOpen}
|
||||
onClose={() => setNavAppOpen(false)}
|
||||
title={t('settings.preferredNavApp')}
|
||||
value={navAppValue}
|
||||
onSelect={(v) => save('preferred_nav_app', v)}
|
||||
options={navAppOptions}
|
||||
/>
|
||||
|
||||
<MSetPickerSheet
|
||||
open={startTabOpen}
|
||||
onClose={() => setStartTabOpen(false)}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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': 'إخفاء رموز الحجز',
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -84,6 +84,9 @@ const settings: TranslationStrings = {
|
||||
'settings.timeFormat': 'Μορφή Ώρας',
|
||||
'settings.weekStart': 'Η εβδομάδα ξεκινά την',
|
||||
'settings.weekStartHint': 'Πρώτη ημέρα της εβδομάδας σε κάθε επιλογέα ημερομηνίας. Το Vacay έχει δική του ρύθμιση.',
|
||||
'settings.preferredNavApp': 'Άνοιγμα τοποθεσιών σε',
|
||||
'settings.preferredNavAppAsk': 'Ερώτηση κάθε φορά',
|
||||
'settings.preferredNavAppHint': 'Με επιλεγμένη εφαρμογή, το κουμπί πλοήγησης την ανοίγει αμέσως αντί να προτείνει όλες τις εφαρμογές χαρτών.',
|
||||
'settings.bookingLabels': 'Ετικέτες διαδρομής κρατήσεων',
|
||||
'settings.bookingLabelsHint':
|
||||
'Εμφάνιση ονομάτων σταθμών / αεροδρομίων στον χάρτη. Όταν είναι απενεργοποιημένο, εμφανίζεται μόνο το εικονίδιο.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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': '予約コードをぼかす',
|
||||
|
||||
@@ -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': '예약 코드 흐리게',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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': "สำรวจสถานที่บนแผนที่",
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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 đồ',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
@@ -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 重试。',
|
||||
|
||||
Reference in New Issue
Block a user