From 6bf2e0708d83013a907aa91c9187e8fb0e9fd81a Mon Sep 17 00:00:00 2001 From: Maurice Date: Sat, 8 Aug 2026 21:03:57 +0200 Subject: [PATCH] feat(client): add the Startup section to General settings Desktop and mobile both get it, in the style of the file they live in - the On/Off button pairs on desktop, segments and a picker sheet on mobile. The tab picker only appears once "Active trip" is chosen, since there is nothing for it to mean otherwise. Labels come from the same keys the planner's tab bar uses, so the picker can never name a tab differently from the tab itself. --- .../Settings/DisplaySettingsTab.test.tsx | 51 ++++++++++++++++- .../Settings/DisplaySettingsTab.tsx | 56 ++++++++++++++++++- .../screens/settings/MSettingsGeneral.tsx | 40 ++++++++++++- .../mobile/settings/MSettingsGeneral.test.tsx | 34 +++++++++++ shared/src/i18n/ar/settings.ts | 9 +++ shared/src/i18n/br/settings.ts | 9 +++ shared/src/i18n/ca/settings.ts | 9 +++ shared/src/i18n/cs/settings.ts | 9 +++ shared/src/i18n/de/settings.ts | 9 +++ shared/src/i18n/en/settings.ts | 9 +++ shared/src/i18n/es/settings.ts | 9 +++ shared/src/i18n/fr/settings.ts | 9 +++ shared/src/i18n/gr/settings.ts | 9 +++ shared/src/i18n/hu/settings.ts | 9 +++ shared/src/i18n/id/settings.ts | 9 +++ shared/src/i18n/it/settings.ts | 9 +++ shared/src/i18n/ja/settings.ts | 8 +++ shared/src/i18n/ko/settings.ts | 8 +++ shared/src/i18n/nl/settings.ts | 9 +++ shared/src/i18n/pl/settings.ts | 9 +++ shared/src/i18n/ru/settings.ts | 9 +++ shared/src/i18n/sv/settings.ts | 9 +++ shared/src/i18n/tr/settings.ts | 9 +++ shared/src/i18n/uk/settings.ts | 9 +++ shared/src/i18n/vi/settings.ts | 9 +++ shared/src/i18n/zh-TW/settings.ts | 7 +++ shared/src/i18n/zh/settings.ts | 8 +++ 27 files changed, 379 insertions(+), 4 deletions(-) diff --git a/client/src/components/Settings/DisplaySettingsTab.test.tsx b/client/src/components/Settings/DisplaySettingsTab.test.tsx index 64e7342fe..66d565e87 100644 --- a/client/src/components/Settings/DisplaySettingsTab.test.tsx +++ b/client/src/components/Settings/DisplaySettingsTab.test.tsx @@ -1,4 +1,4 @@ -// FE-COMP-DISPLAY-001 to FE-COMP-DISPLAY-048 +// FE-COMP-DISPLAY-001 to FE-COMP-DISPLAY-052 import { render, screen, within, fireEvent } from '../../../tests/helpers/render'; import userEvent from '@testing-library/user-event'; import { http, HttpResponse } from 'msw'; @@ -395,3 +395,52 @@ describe('DisplaySettingsTab – Map and privacy toggles', () => { expect(screen.getAllByText('Nope').length).toBeGreaterThan(0); }); }); + +describe('DisplaySettingsTab – startup destination', () => { + it('FE-COMP-DISPLAY-049: defaults to the dashboard and hides the tab picker', () => { + seedStore(useSettingsStore, { settings: buildSettings() }); + render(); + const block = optionBlock(/^Start page$/); + + expect(within(block).getByText('Dashboard').closest('button')!.style.border).toContain('var(--text-primary)'); + // Nothing to pick a tab for while TREK opens on the dashboard. + expect(screen.queryByText('Start tab')).not.toBeInTheDocument(); + }); + + it('FE-COMP-DISPLAY-050: choosing the active trip saves it and reveals the tab picker', async () => { + const user = userEvent.setup(); + const updateSetting = vi.fn().mockResolvedValue(undefined); + seedStore(useSettingsStore, { settings: buildSettings(), updateSetting }); + render(); + + await user.click(within(optionBlock(/^Start page$/)).getByText('Active trip')); + + expect(updateSetting).toHaveBeenCalledWith('start_page', 'active_trip'); + }); + + it('FE-COMP-DISPLAY-051: with the active trip chosen, the tab picker stores the planner tab id', async () => { + const user = userEvent.setup(); + const updateSetting = vi.fn().mockResolvedValue(undefined); + seedStore(useSettingsStore, { + settings: buildSettings({ start_page: 'active_trip', start_trip_tab: 'plan' }), + updateSetting, + }); + render(); + + await user.click(screen.getByRole('button', { name: 'Plan' })); + await user.click(await screen.findByText('Costs')); + + // The German legacy id, not the English label the user sees. + expect(updateSetting).toHaveBeenCalledWith('start_trip_tab', 'finanzplan'); + }); + + it('FE-COMP-DISPLAY-052: a rejected start-page change surfaces the error', async () => { + const user = userEvent.setup(); + seedFailing('Start locked'); + render(<>); + + await user.click(within(optionBlock(/^Start page$/)).getByText('Active trip')); + + await screen.findByText('Start locked'); + }); +}); diff --git a/client/src/components/Settings/DisplaySettingsTab.tsx b/client/src/components/Settings/DisplaySettingsTab.tsx index 5cb02a8f5..76bc6b91b 100644 --- a/client/src/components/Settings/DisplaySettingsTab.tsx +++ b/client/src/components/Settings/DisplaySettingsTab.tsx @@ -1,11 +1,13 @@ import React, { useState, useEffect, useRef } from 'react' -import { Languages, Map, ChevronDown, Check } from 'lucide-react' +import { Languages, Map, ChevronDown, Check, Rocket } from 'lucide-react' import { SUPPORTED_LANGUAGES, useTranslation } from '../../i18n' import { useSettingsStore, DEFAULT_SETTINGS } from '../../store/settingsStore' import { useToast } from '../shared/Toast' import CustomSelect from '../shared/CustomSelect' import { SYMBOLS, currenciesWith } from '../Budget/BudgetPanel.constants' import Section from './Section' +import { TRIP_TAB_IDS, TRIP_TAB_LABEL_KEYS } from '../../constants/tripTabs' +import { DEFAULT_START_PAGE, DEFAULT_START_TRIP_TAB } from '../../utils/startDestination' import type { DistanceUnit } from '../../types' export default function DisplaySettingsTab(): React.ReactElement { @@ -34,8 +36,60 @@ export default function DisplaySettingsTab(): React.ReactElement { setDistanceUnit(settings.distance_unit || DEFAULT_SETTINGS.distance_unit) }, [settings.distance_unit]) + const startPage = settings.start_page === 'active_trip' ? 'active_trip' : DEFAULT_START_PAGE + const startTripTab = settings.start_trip_tab || DEFAULT_START_TRIP_TAB + return ( <> +
+ {/* Where opening TREK lands */} +
+ +
+ {([ + { value: 'dashboard', label: t('settings.startPageDashboard') }, + { value: 'active_trip', label: t('settings.startPageActiveTrip') }, + ] as const).map(opt => ( + + ))} +
+

{t('settings.startPageHint')}

+
+ + {/* Which planner tab the trip opens on — only meaningful for 'active_trip' */} + {startPage === 'active_trip' && ( +
+ + { + try { await updateSetting('start_trip_tab', String(v)) } + catch (e: unknown) { toast.error(e instanceof Error ? e.message : t('common.error')) } + }} + options={TRIP_TAB_IDS.map(id => ({ value: id, label: t(TRIP_TAB_LABEL_KEYS[id]) }))} + /> +

{t('settings.startTripTabHint')}

+
+ )} +
+
{/* Display currency */}
diff --git a/client/src/mobile/screens/settings/MSettingsGeneral.tsx b/client/src/mobile/screens/settings/MSettingsGeneral.tsx index 2279e0b07..e3475679c 100644 --- a/client/src/mobile/screens/settings/MSettingsGeneral.tsx +++ b/client/src/mobile/screens/settings/MSettingsGeneral.tsx @@ -1,9 +1,11 @@ import { useState } from 'react' -import { ChevronDown, Languages, Map } from 'lucide-react' +import { ChevronDown, Languages, Map, Rocket } from 'lucide-react' import { useTranslation, SUPPORTED_LANGUAGES } from '../../../i18n' import { useSettingsStore } from '../../../store/settingsStore' import { useToast } from '../../../components/shared/Toast' import { SYMBOLS, currenciesWith } from '../../../components/Budget/BudgetPanel.constants' +import { TRIP_TAB_IDS, TRIP_TAB_LABEL_KEYS, isTripTabId } from '../../../constants/tripTabs' +import { DEFAULT_START_PAGE, DEFAULT_START_TRIP_TAB, type StartPage } from '../../../utils/startDestination' import type { Settings, DistanceUnit } from '../../../types' import { MSetCard, MSetEyebrow, MSetSelectRow, MSetSegments, MSetRow } from './MSettingsUi' import MToggle from '../../components/MToggle' @@ -19,6 +21,7 @@ export default function MSettingsGeneral() { const { settings, updateSetting } = useSettingsStore() const [currencyOpen, setCurrencyOpen] = useState(false) const [langOpen, setLangOpen] = useState(false) + const [startTabOpen, setStartTabOpen] = useState(false) const save = async (key: keyof Settings, value: Settings[keyof Settings]) => { try { @@ -28,6 +31,8 @@ export default function MSettingsGeneral() { } } + const startPage: StartPage = settings.start_page === 'active_trip' ? 'active_trip' : DEFAULT_START_PAGE + const startTripTab = isTripTabId(settings.start_trip_tab) ? settings.start_trip_tab : DEFAULT_START_TRIP_TAB const currency = settings.default_currency || '' const currencyLabel = currency ? `${currency} — ${SYMBOLS[currency] || currency}` : t('settings.currencyTrip') const language = SUPPORTED_LANGUAGES.find((l) => l.value === settings.language) || SUPPORTED_LANGUAGES[0] @@ -73,7 +78,29 @@ export default function MSettingsGeneral() { return ( <> - + + {t('settings.startPage')} + + value={startPage} + onChange={(v) => save('start_page', v)} + options={[ + { value: 'dashboard', label: t('settings.startPageDashboard') }, + { value: 'active_trip', label: t('settings.startPageActiveTrip') }, + ]} + /> + {startPage === 'active_trip' && ( + <> + {t('settings.startTripTab')} + setStartTabOpen(true)} + /> + + )} + + + {t('settings.currency')} setCurrencyOpen(true)} /> @@ -150,6 +177,15 @@ export default function MSettingsGeneral() { onSelect={(v) => save('language', v)} options={SUPPORTED_LANGUAGES.map((l) => ({ value: l.value, label: l.label }))} /> + + setStartTabOpen(false)} + title={t('settings.startTripTab')} + value={startTripTab} + onSelect={(v) => save('start_trip_tab', v)} + options={TRIP_TAB_IDS.map((id) => ({ value: id, label: t(TRIP_TAB_LABEL_KEYS[id]) }))} + /> ) } diff --git a/client/tests/unit/mobile/settings/MSettingsGeneral.test.tsx b/client/tests/unit/mobile/settings/MSettingsGeneral.test.tsx index 6b6090c39..d7fed651b 100644 --- a/client/tests/unit/mobile/settings/MSettingsGeneral.test.tsx +++ b/client/tests/unit/mobile/settings/MSettingsGeneral.test.tsx @@ -156,4 +156,38 @@ describe('MSettingsGeneral', () => { await user.click(screen.getByRole('button', { name: '°F Fahrenheit' })); await screen.findByText('Error'); }); + + it('FE-MOB-SET-012: the startup card defaults to the dashboard and hides the tab row', () => { + render(); + + expect(screen.getByText('Startup')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Dashboard' })).toHaveAttribute('aria-pressed', 'true'); + expect(screen.queryByText('Start tab')).not.toBeInTheDocument(); + }); + + it('FE-MOB-SET-013: picking the active trip persists it and reveals the tab row', async () => { + const user = userEvent.setup(); + const updateSetting = vi.fn().mockResolvedValue(undefined); + seedStore(useSettingsStore, { settings: buildSettings({ language: 'en' }), updateSetting }); + render(); + + await user.click(screen.getByRole('button', { name: 'Active trip' })); + expect(updateSetting).toHaveBeenCalledWith('start_page', 'active_trip'); + }); + + it('FE-MOB-SET-014: the start-tab sheet saves the planner tab id behind the label', async () => { + const user = userEvent.setup(); + const updateSetting = vi.fn().mockResolvedValue(undefined); + seedStore(useSettingsStore, { + settings: buildSettings({ language: 'en', start_page: 'active_trip', start_trip_tab: 'plan' }), + updateSetting, + }); + render(); + + expect(screen.getByText('Start tab')).toBeInTheDocument(); + await user.click(screen.getByRole('button', { name: 'Plan' })); + await user.click(await screen.findByText('Costs')); + + expect(updateSetting).toHaveBeenCalledWith('start_trip_tab', 'finanzplan'); + }); }); diff --git a/shared/src/i18n/ar/settings.ts b/shared/src/i18n/ar/settings.ts index 37f79e9d0..ef5f5f864 100644 --- a/shared/src/i18n/ar/settings.ts +++ b/shared/src/i18n/ar/settings.ts @@ -431,6 +431,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'مخفي', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'البدء', + 'settings.startPage': 'صفحة البدء', + 'settings.startPageDashboard': 'لوحة التحكم', + 'settings.startPageActiveTrip': 'الرحلة النشطة', + 'settings.startPageHint': + 'يفتح TREK مباشرةً على الرحلة الجارية، وإن لم توجد فعلى الرحلة القادمة التالية. وهي نفس الرحلة التي تبرزها لوحة التحكم.', + 'settings.startTripTab': 'علامة تبويب البدء', + 'settings.startTripTabHint': + 'علامة التبويب التي تفتح بها الرحلة. إذا كانت تابعة لإضافة أوقفت تشغيلها، تُفتح الخطة بدلاً منها.', // ── Offline (#1135) 'settings.offline.cache.title': 'ذاكرة التخزين المؤقت دون اتصال', diff --git a/shared/src/i18n/br/settings.ts b/shared/src/i18n/br/settings.ts index 996d8303b..decbc4103 100644 --- a/shared/src/i18n/br/settings.ts +++ b/shared/src/i18n/br/settings.ts @@ -446,6 +446,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Oculto', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Inicialização', + 'settings.startPage': 'Página inicial', + 'settings.startPageDashboard': 'Painel', + 'settings.startPageActiveTrip': 'Viagem ativa', + 'settings.startPageHint': + 'O TREK abre direto na viagem que está acontecendo, ou na próxima que começa. É a mesma viagem que o painel destaca.', + 'settings.startTripTab': 'Aba inicial', + 'settings.startTripTabHint': + 'A aba com que a viagem abre. Se ela pertencer a um complemento desativado, abre a visão de plano.', // ── Offline (#1135) 'settings.offline.cache.title': 'Cache offline', diff --git a/shared/src/i18n/ca/settings.ts b/shared/src/i18n/ca/settings.ts index e1908d486..ccc929e9c 100644 --- a/shared/src/i18n/ca/settings.ts +++ b/shared/src/i18n/ca/settings.ts @@ -429,6 +429,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Ocult', 'settings.general.languageRegion': 'Idioma i regió', 'settings.general.travelMap': 'Viatge i mapa', + 'settings.general.startup': 'Inici', + 'settings.startPage': "Pàgina d'inici", + 'settings.startPageDashboard': 'Tauler', + 'settings.startPageActiveTrip': 'Viatge actiu', + 'settings.startPageHint': + 'TREK obre directament el viatge que està en curs, o el següent que comença. És el mateix viatge que destaca el tauler.', + 'settings.startTripTab': "Pestanya d'inici", + 'settings.startTripTabHint': + "La pestanya amb què s'obre el viatge. Si pertany a un complement desactivat, s'obre la vista de planificació.", 'settings.offline.cache.title': 'Memòria cau fora de línia', 'settings.offline.mode.title': 'Mode fora de línia', 'settings.offline.mode.force': 'Forçar mode fora de línia', diff --git a/shared/src/i18n/cs/settings.ts b/shared/src/i18n/cs/settings.ts index c38587c1d..0ddc6c86a 100644 --- a/shared/src/i18n/cs/settings.ts +++ b/shared/src/i18n/cs/settings.ts @@ -439,6 +439,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Skryto', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Spuštění', + 'settings.startPage': 'Úvodní stránka', + 'settings.startPageDashboard': 'Přehled', + 'settings.startPageActiveTrip': 'Aktivní cesta', + 'settings.startPageHint': + 'TREK se otevře rovnou na cestě, která právě probíhá, jinak na nejbližší nadcházející. Je to táž cesta, kterou zvýrazňuje přehled.', + 'settings.startTripTab': 'Úvodní karta', + 'settings.startTripTabHint': + 'Karta, kterou se cesta otevře. Pokud patří k vypnutému doplňku, otevře se místo ní plán.', // ── Offline (#1135) 'settings.offline.cache.title': 'Offline mezipaměť', diff --git a/shared/src/i18n/de/settings.ts b/shared/src/i18n/de/settings.ts index 5096c734c..ca20865ba 100644 --- a/shared/src/i18n/de/settings.ts +++ b/shared/src/i18n/de/settings.ts @@ -448,6 +448,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Ausgeblendet', 'settings.general.languageRegion': 'Sprache & Region', 'settings.general.travelMap': 'Reise & Karte', + 'settings.general.startup': 'Start', + 'settings.startPage': 'Startseite', + 'settings.startPageDashboard': 'Dashboard', + 'settings.startPageActiveTrip': 'Aktive Reise', + 'settings.startPageHint': + 'TREK öffnet direkt die Reise, die gerade läuft, sonst die nächste anstehende. Also genau die Reise, die auch das Dashboard hervorhebt.', + 'settings.startTripTab': 'Start-Tab', + 'settings.startTripTabHint': + 'Der Tab, mit dem die Reise öffnet. Gehört er zu einem ausgeschalteten Addon, öffnet stattdessen die Planung.', // ── Offline (#1135) ──────────────────────────────────────────────────────── 'settings.offline.cache.title': 'Offline-Cache', diff --git a/shared/src/i18n/en/settings.ts b/shared/src/i18n/en/settings.ts index 6d934d5a2..e73f34750 100644 --- a/shared/src/i18n/en/settings.ts +++ b/shared/src/i18n/en/settings.ts @@ -447,6 +447,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Hidden', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Startup', + 'settings.startPage': 'Start page', + 'settings.startPageDashboard': 'Dashboard', + 'settings.startPageActiveTrip': 'Active trip', + 'settings.startPageHint': + 'TREK opens straight in the trip running today, or the next one coming up. That is the same trip the dashboard features.', + 'settings.startTripTab': 'Start tab', + 'settings.startTripTabHint': + 'The tab the trip opens on. If it belongs to an addon you switched off, the plan view opens instead.', // ── Offline (#1135) ──────────────────────────────────────────────────────── 'settings.offline.cache.title': 'Offline cache', diff --git a/shared/src/i18n/es/settings.ts b/shared/src/i18n/es/settings.ts index f4551fd43..5d1c4509c 100644 --- a/shared/src/i18n/es/settings.ts +++ b/shared/src/i18n/es/settings.ts @@ -447,6 +447,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Oculto', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Inicio', + 'settings.startPage': 'Página de inicio', + 'settings.startPageDashboard': 'Panel', + 'settings.startPageActiveTrip': 'Viaje activo', + 'settings.startPageHint': + 'TREK abre directamente el viaje que está en curso o el siguiente que empieza. Es el mismo viaje que destaca el panel.', + 'settings.startTripTab': 'Pestaña de inicio', + 'settings.startTripTabHint': + 'La pestaña con la que se abre el viaje. Si pertenece a un complemento desactivado, se abre la vista de plan.', // ── Offline (#1135) 'settings.offline.cache.title': 'Caché offline', diff --git a/shared/src/i18n/fr/settings.ts b/shared/src/i18n/fr/settings.ts index caa718961..7e2ddfc32 100644 --- a/shared/src/i18n/fr/settings.ts +++ b/shared/src/i18n/fr/settings.ts @@ -453,6 +453,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Masqué', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Démarrage', + 'settings.startPage': 'Page de démarrage', + 'settings.startPageDashboard': 'Tableau de bord', + 'settings.startPageActiveTrip': 'Voyage en cours', + 'settings.startPageHint': + "TREK s'ouvre directement sur le voyage en cours, ou sur le prochain à venir. C'est le même voyage que celui mis en avant sur le tableau de bord.", + 'settings.startTripTab': 'Onglet de démarrage', + 'settings.startTripTabHint': + "L'onglet sur lequel le voyage s'ouvre. S'il appartient à un module désactivé, la vue Plan s'ouvre à la place.", // ── Offline (#1135) 'settings.offline.cache.title': 'Cache hors ligne', diff --git a/shared/src/i18n/gr/settings.ts b/shared/src/i18n/gr/settings.ts index 77f66ae0c..8bb358248 100644 --- a/shared/src/i18n/gr/settings.ts +++ b/shared/src/i18n/gr/settings.ts @@ -456,6 +456,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Κρυφό', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Εκκίνηση', + 'settings.startPage': 'Αρχική σελίδα', + 'settings.startPageDashboard': 'Πίνακας ελέγχου', + 'settings.startPageActiveTrip': 'Ενεργό ταξίδι', + 'settings.startPageHint': + 'Το TREK ανοίγει απευθείας στο ταξίδι που είναι σε εξέλιξη ή στο επόμενο που ξεκινά. Είναι το ίδιο ταξίδι που προβάλλει ο πίνακας ελέγχου.', + 'settings.startTripTab': 'Αρχική καρτέλα', + 'settings.startTripTabHint': + 'Η καρτέλα με την οποία ανοίγει το ταξίδι. Αν ανήκει σε απενεργοποιημένο πρόσθετο, ανοίγει το πλάνο.', // ── Offline (#1135) 'settings.offline.cache.title': 'Προσωρινή μνήμη εκτός σύνδεσης', diff --git a/shared/src/i18n/hu/settings.ts b/shared/src/i18n/hu/settings.ts index 93713691e..63f615c04 100644 --- a/shared/src/i18n/hu/settings.ts +++ b/shared/src/i18n/hu/settings.ts @@ -446,6 +446,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Rejtett', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Indítás', + 'settings.startPage': 'Kezdőoldal', + 'settings.startPageDashboard': 'Irányítópult', + 'settings.startPageActiveTrip': 'Aktív utazás', + 'settings.startPageHint': + 'A TREK egyből a most zajló utazást nyitja meg, vagy a következőt, amelyik indul. Ugyanaz az utazás, amelyet az irányítópult is kiemel.', + 'settings.startTripTab': 'Kezdő fül', + 'settings.startTripTabHint': + 'Az a fül, amellyel az utazás megnyílik. Ha kikapcsolt bővítményhez tartozik, helyette a terv nézet nyílik meg.', // ── Offline (#1135) 'settings.offline.cache.title': 'Offline gyorsítótár', diff --git a/shared/src/i18n/id/settings.ts b/shared/src/i18n/id/settings.ts index 46993524e..b7e291a5d 100644 --- a/shared/src/i18n/id/settings.ts +++ b/shared/src/i18n/id/settings.ts @@ -444,6 +444,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Tersembunyi', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Mulai', + 'settings.startPage': 'Halaman awal', + 'settings.startPageDashboard': 'Dasbor', + 'settings.startPageActiveTrip': 'Perjalanan aktif', + 'settings.startPageHint': + 'TREK langsung membuka perjalanan yang sedang berlangsung, atau yang paling dekat akan dimulai. Perjalanan yang sama yang disorot dasbor.', + 'settings.startTripTab': 'Tab awal', + 'settings.startTripTabHint': + 'Tab yang dibuka bersama perjalanan. Jika tab itu milik addon yang dimatikan, tampilan rencana yang dibuka.', // ── Offline (#1135) 'settings.offline.cache.title': 'Cache offline', diff --git a/shared/src/i18n/it/settings.ts b/shared/src/i18n/it/settings.ts index c65f9168c..28c5508e8 100644 --- a/shared/src/i18n/it/settings.ts +++ b/shared/src/i18n/it/settings.ts @@ -446,6 +446,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Nascosto', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Avvio', + 'settings.startPage': 'Pagina iniziale', + 'settings.startPageDashboard': 'Dashboard', + 'settings.startPageActiveTrip': 'Viaggio attivo', + 'settings.startPageHint': + 'TREK si apre direttamente sul viaggio in corso, o sul prossimo in arrivo. È lo stesso viaggio che la dashboard mette in evidenza.', + 'settings.startTripTab': 'Scheda iniziale', + 'settings.startTripTabHint': + 'La scheda con cui si apre il viaggio. Se appartiene a un componente aggiuntivo disattivato, si apre la vista Programma.', // ── Offline (#1135) 'settings.offline.cache.title': 'Cache offline', diff --git a/shared/src/i18n/ja/settings.ts b/shared/src/i18n/ja/settings.ts index cdc62d0ec..f859a8119 100644 --- a/shared/src/i18n/ja/settings.ts +++ b/shared/src/i18n/ja/settings.ts @@ -419,6 +419,14 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': '非表示', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': '起動', + 'settings.startPage': '起動時の画面', + 'settings.startPageDashboard': 'ダッシュボード', + 'settings.startPageActiveTrip': '進行中の旅行', + 'settings.startPageHint': + 'TREK を開くと、進行中の旅行、なければ次に始まる旅行が直接開きます。ダッシュボードで大きく表示される旅行と同じです。', + 'settings.startTripTab': '起動時のタブ', + 'settings.startTripTabHint': '旅行を開くタブです。無効にしたアドオンのタブの場合は、代わりに計画が開きます。', // ── Offline (#1135) 'settings.offline.cache.title': 'オフラインキャッシュ', diff --git a/shared/src/i18n/ko/settings.ts b/shared/src/i18n/ko/settings.ts index 8bdbdad59..f88c7f5c3 100644 --- a/shared/src/i18n/ko/settings.ts +++ b/shared/src/i18n/ko/settings.ts @@ -433,6 +433,14 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': '숨김', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': '시작', + 'settings.startPage': '시작 화면', + 'settings.startPageDashboard': '대시보드', + 'settings.startPageActiveTrip': '진행 중인 여행', + 'settings.startPageHint': + 'TREK을 열면 지금 진행 중인 여행, 없으면 다음에 시작하는 여행으로 바로 이동합니다. 대시보드가 강조하는 여행과 같습니다.', + 'settings.startTripTab': '시작 탭', + 'settings.startTripTabHint': '여행이 열릴 탭입니다. 꺼 둔 애드온의 탭이면 대신 계획이 열립니다.', // ── Offline (#1135) 'settings.offline.cache.title': '오프라인 캐시', diff --git a/shared/src/i18n/nl/settings.ts b/shared/src/i18n/nl/settings.ts index 8ffcaf0d3..6a19c2b84 100644 --- a/shared/src/i18n/nl/settings.ts +++ b/shared/src/i18n/nl/settings.ts @@ -447,6 +447,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Verborgen', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Opstarten', + 'settings.startPage': 'Startpagina', + 'settings.startPageDashboard': 'Dashboard', + 'settings.startPageActiveTrip': 'Actieve reis', + 'settings.startPageHint': + 'TREK opent direct de reis die nu loopt, of anders de eerstvolgende. Dat is dezelfde reis die het dashboard uitlicht.', + 'settings.startTripTab': 'Starttabblad', + 'settings.startTripTabHint': + 'Het tabblad waarmee de reis opent. Hoort het bij een uitgeschakelde add-on, dan opent het plan in plaats daarvan.', // ── Offline (#1135) 'settings.offline.cache.title': 'Offline cache', diff --git a/shared/src/i18n/pl/settings.ts b/shared/src/i18n/pl/settings.ts index faac8096c..65639316d 100644 --- a/shared/src/i18n/pl/settings.ts +++ b/shared/src/i18n/pl/settings.ts @@ -446,6 +446,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Ukryte', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Uruchamianie', + 'settings.startPage': 'Strona startowa', + 'settings.startPageDashboard': 'Panel', + 'settings.startPageActiveTrip': 'Aktywna podróż', + 'settings.startPageHint': + 'TREK otwiera się od razu na podróży, która właśnie trwa, albo na najbliższej nadchodzącej. To ta sama podróż, którą wyróżnia panel.', + 'settings.startTripTab': 'Karta startowa', + 'settings.startTripTabHint': + 'Karta, na której otwiera się podróż. Jeśli należy do wyłączonego dodatku, otworzy się widok planu.', // ── Offline (#1135) 'settings.offline.cache.title': 'Pamięć podręczna offline', diff --git a/shared/src/i18n/ru/settings.ts b/shared/src/i18n/ru/settings.ts index 8568ffb59..2ff60209d 100644 --- a/shared/src/i18n/ru/settings.ts +++ b/shared/src/i18n/ru/settings.ts @@ -447,6 +447,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Скрыто', 'settings.general.languageRegion': 'Язык и регион', 'settings.general.travelMap': 'Карта и путешествия', + 'settings.general.startup': 'Запуск', + 'settings.startPage': 'Стартовая страница', + 'settings.startPageDashboard': 'Панель управления', + 'settings.startPageActiveTrip': 'Активная поездка', + 'settings.startPageHint': + 'TREK сразу открывает поездку, которая идёт сейчас, иначе ближайшую предстоящую. Это та же поездка, которую выделяет панель управления.', + 'settings.startTripTab': 'Стартовая вкладка', + 'settings.startTripTabHint': + 'Вкладка, с которой открывается поездка. Если она относится к отключённому дополнению, откроется план.', // ── Offline (#1135) 'settings.offline.cache.title': 'Офлайн-кэш', diff --git a/shared/src/i18n/sv/settings.ts b/shared/src/i18n/sv/settings.ts index df25e7bde..d7c24bc84 100644 --- a/shared/src/i18n/sv/settings.ts +++ b/shared/src/i18n/sv/settings.ts @@ -445,6 +445,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Dold', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Start', + 'settings.startPage': 'Startsida', + 'settings.startPageDashboard': 'Översikt', + 'settings.startPageActiveTrip': 'Aktiv resa', + 'settings.startPageHint': + 'TREK öppnar direkt i resan som pågår, annars i nästa som börjar. Det är samma resa som översikten lyfter fram.', + 'settings.startTripTab': 'Startflik', + 'settings.startTripTabHint': + 'Fliken som resan öppnas med. Hör den till ett avstängt tillägg öppnas planvyn i stället.', // ── Offline (#1135) 'settings.offline.cache.title': 'Offline-cache', diff --git a/shared/src/i18n/tr/settings.ts b/shared/src/i18n/tr/settings.ts index 67eb7b8e4..45674097b 100644 --- a/shared/src/i18n/tr/settings.ts +++ b/shared/src/i18n/tr/settings.ts @@ -443,6 +443,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Gizli', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Başlangıç', + 'settings.startPage': 'Başlangıç sayfası', + 'settings.startPageDashboard': 'Pano', + 'settings.startPageActiveTrip': 'Aktif seyahat', + 'settings.startPageHint': + 'TREK doğrudan devam eden seyahati, yoksa sıradaki seyahati açar. Panonun öne çıkardığı seyahatin aynısı.', + 'settings.startTripTab': 'Başlangıç sekmesi', + 'settings.startTripTabHint': + 'Seyahatin açılacağı sekme. Kapalı bir eklentiye aitse onun yerine plan görünümü açılır.', // ── Offline (#1135) 'settings.offline.cache.title': 'Çevrimdışı önbellek', diff --git a/shared/src/i18n/uk/settings.ts b/shared/src/i18n/uk/settings.ts index d30701a0a..7356e02fe 100644 --- a/shared/src/i18n/uk/settings.ts +++ b/shared/src/i18n/uk/settings.ts @@ -446,6 +446,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Приховано', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': 'Запуск', + 'settings.startPage': 'Стартова сторінка', + 'settings.startPageDashboard': 'Панель', + 'settings.startPageActiveTrip': 'Активна поїздка', + 'settings.startPageHint': + 'TREK одразу відкриває поїздку, яка триває зараз, інакше найближчу майбутню. Це та сама поїздка, яку виділяє панель.', + 'settings.startTripTab': 'Стартова вкладка', + 'settings.startTripTabHint': + 'Вкладка, з якою відкривається поїздка. Якщо вона належить до вимкненого доповнення, натомість відкриється план.', // ── Offline (#1135) 'settings.offline.cache.title': 'Офлайн-кеш', diff --git a/shared/src/i18n/vi/settings.ts b/shared/src/i18n/vi/settings.ts index 4271e7119..8c3bf61bd 100644 --- a/shared/src/i18n/vi/settings.ts +++ b/shared/src/i18n/vi/settings.ts @@ -448,6 +448,15 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': 'Đã ẩn', 'settings.general.languageRegion': 'Ngôn ngữ & khu vực', 'settings.general.travelMap': 'Du lịch & bản đồ', + 'settings.general.startup': 'Khởi động', + 'settings.startPage': 'Trang khởi động', + 'settings.startPageDashboard': 'Bảng điều khiển', + 'settings.startPageActiveTrip': 'Chuyến đi đang diễn ra', + 'settings.startPageHint': + 'TREK mở thẳng chuyến đi đang diễn ra, nếu không thì chuyến gần nhất sắp tới. Đó cũng là chuyến mà bảng điều khiển làm nổi bật.', + 'settings.startTripTab': 'Tab khởi động', + 'settings.startTripTabHint': + 'Tab mà chuyến đi mở ra. Nếu tab đó thuộc tiện ích đã tắt, chế độ xem kế hoạch sẽ mở thay thế.', // ── Offline (#1135) 'settings.offline.cache.title': 'Bộ nhớ đệm ngoại tuyến', diff --git a/shared/src/i18n/zh-TW/settings.ts b/shared/src/i18n/zh-TW/settings.ts index 1bd2d35db..3001c2055 100644 --- a/shared/src/i18n/zh-TW/settings.ts +++ b/shared/src/i18n/zh-TW/settings.ts @@ -420,6 +420,13 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': '已隱藏', 'settings.general.languageRegion': 'Language & region', 'settings.general.travelMap': 'Travel & map', + 'settings.general.startup': '啟動', + 'settings.startPage': '啟動頁面', + 'settings.startPageDashboard': '儀表板', + 'settings.startPageActiveTrip': '進行中的旅行', + 'settings.startPageHint': 'TREK 會直接開啟正在進行的旅行,沒有則開啟最近要開始的那次。與儀表板突顯的是同一次旅行。', + 'settings.startTripTab': '啟動分頁', + 'settings.startTripTabHint': '旅行開啟時所在的分頁。如果該分頁屬於已關閉的附加元件,則改為開啟計劃檢視。', // ── Offline (#1135) 'settings.offline.cache.title': '離線快取', diff --git a/shared/src/i18n/zh/settings.ts b/shared/src/i18n/zh/settings.ts index b45479e36..860d76e62 100644 --- a/shared/src/i18n/zh/settings.ts +++ b/shared/src/i18n/zh/settings.ts @@ -416,6 +416,14 @@ const settings: TranslationStrings = { 'settings.appearance.dashOrder.hidden': '已隐藏', 'settings.general.languageRegion': '语言与地区', 'settings.general.travelMap': '旅行与地图', + 'settings.general.startup': '启动', + 'settings.startPage': '启动页面', + 'settings.startPageDashboard': '仪表盘', + 'settings.startPageActiveTrip': '进行中的旅行', + 'settings.startPageHint': + 'TREK 会直接打开正在进行的旅行,没有则打开最近要开始的那次。与仪表盘突出显示的是同一次旅行。', + 'settings.startTripTab': '启动标签页', + 'settings.startTripTabHint': '旅行打开时所在的标签页。如果该标签页属于已关闭的插件,则改为打开计划视图。', // ── Offline (#1135) 'settings.offline.cache.title': '离线缓存',