From c97105ce61d230eea8ebce2dd35d327563a78fd0 Mon Sep 17 00:00:00 2001 From: Maurice Date: Mon, 19 Oct 2026 22:44:54 +0200 Subject: [PATCH] feat(tours): fill a city walk from a theme: culture, parks, food or a bit of everything (CW-05) The search along the route offers a walk's own categories (sights, museums, parks, views, coffee shops, places to eat, markets) and four themes that set them at once. A found place says which theme brought it, its source and how far it lies from the line, straight across; taken in as a stop, it keeps its name and opening hours. Nothing is taken in without the existing confirm. --- .../Tours/poi/TourPoiSearchCard.tsx | 23 +++++++++++++++++-- .../components/Tours/poi/usePoiInsertion.ts | 10 +++++++- .../components/Tours/poi/useTourPoiSearch.ts | 18 +++++++++++++++ shared/src/i18n/ar/tours.ts | 11 +++++++++ shared/src/i18n/az/tours.ts | 12 ++++++++++ shared/src/i18n/br/tours.ts | 11 +++++++++ shared/src/i18n/ca/tours.ts | 11 +++++++++ shared/src/i18n/cs/tours.ts | 11 +++++++++ shared/src/i18n/de/tours.ts | 11 +++++++++ shared/src/i18n/en/tours.ts | 11 +++++++++ shared/src/i18n/es/tours.ts | 11 +++++++++ shared/src/i18n/et/tours.ts | 11 +++++++++ shared/src/i18n/fr/tours.ts | 11 +++++++++ shared/src/i18n/gr/tours.ts | 11 +++++++++ shared/src/i18n/hu/tours.ts | 11 +++++++++ shared/src/i18n/id/tours.ts | 12 ++++++++++ shared/src/i18n/it/tours.ts | 11 +++++++++ shared/src/i18n/ja/tours.ts | 11 +++++++++ shared/src/i18n/ko/tours.ts | 11 +++++++++ shared/src/i18n/nl/tours.ts | 11 +++++++++ shared/src/i18n/pl/tours.ts | 11 +++++++++ shared/src/i18n/ru/tours.ts | 11 +++++++++ shared/src/i18n/sk/tours.ts | 11 +++++++++ shared/src/i18n/sv/tours.ts | 11 +++++++++ shared/src/i18n/th/tours.ts | 11 +++++++++ shared/src/i18n/tours-locales.spec.ts | 2 +- shared/src/i18n/tr/tours.ts | 12 ++++++++++ shared/src/i18n/uk/tours.ts | 11 +++++++++ shared/src/i18n/vi/tours.ts | 11 +++++++++ shared/src/i18n/zh-TW/tours.ts | 11 +++++++++ shared/src/i18n/zh/tours.ts | 11 +++++++++ 31 files changed, 349 insertions(+), 4 deletions(-) diff --git a/client/src/components/Tours/poi/TourPoiSearchCard.tsx b/client/src/components/Tours/poi/TourPoiSearchCard.tsx index 9a24781ca..d9707c41e 100644 --- a/client/src/components/Tours/poi/TourPoiSearchCard.tsx +++ b/client/src/components/Tours/poi/TourPoiSearchCard.tsx @@ -1,5 +1,5 @@ -import type { TourPoi, TourPoiCategory } from '@trek/shared'; -import { TOUR_POI_CORRIDORS_M } from '@trek/shared'; +import type { TourPoi, TourPoiCategory, WalkTheme } from '@trek/shared'; +import { TOUR_POI_CORRIDORS_M, WALK_THEMES } from '@trek/shared'; import { AlertTriangle, Clock, @@ -150,12 +150,15 @@ function PoiRow({ planner, insertion, unit, + theme = null, }: { poi: TourPoi; selected: boolean; planner: TourPlannerController; insertion: ReturnType; unit: Unit; + /** CW-05: the theme the place was suggested for, said as its reason. */ + theme?: WalkTheme | null; }) { const { t } = useTranslation(); const select = useTourPoiStore((state) => state.select); @@ -201,6 +204,7 @@ function PoiRow({

{t(look.labelKey)} + {theme && {t('tours.walk.themeReason', { theme: t(`tours.walk.theme.${theme}`) })}} {t(poi.source === 'trek-places' ? 'tours.poi.source.trek' : 'tours.poi.source.osm')}

{poi.address && ( @@ -307,6 +311,20 @@ export function TourPoiSearchCard({ planner }: { planner: TourPlannerController

{t('tours.poi.intro')}

+ {search.themes.length > 0 && ( +
+ + fill + value={search.theme ?? ''} + onChange={(key) => search.chooseTheme(key as WalkTheme)} + label={t('tours.walk.themes')} + options={search.themes.map((key) => ({ value: key, label: t(`tours.walk.theme.${key}`) }))} + /> + + {search.theme ? t(`tours.walk.themeHint.${search.theme}`) : t('tours.walk.themeHint.own')} + +
+ )}
{search.offered.map((category) => ( ))} diff --git a/client/src/components/Tours/poi/usePoiInsertion.ts b/client/src/components/Tours/poi/usePoiInsertion.ts index e8837c4f9..327e559e7 100644 --- a/client/src/components/Tours/poi/usePoiInsertion.ts +++ b/client/src/components/Tours/poi/usePoiInsertion.ts @@ -74,7 +74,15 @@ export function usePoiInsertion(planner: PoiInsertionPlanner) { (poi: TourPoi) => { const afterId = afterIdFor(poi); if (!afterId || !planner.canEdit || planner.isSaving) return false; - const point: TourPlannerWaypoint = { id: randomId(), lat: poi.lat, lng: poi.lng, role: 'via' }; + // The place keeps its name, and on a city walk its opening hours to check the arrival against (CW-04). + const point: TourPlannerWaypoint = { + id: randomId(), + lat: poi.lat, + lng: poi.lng, + role: 'via', + ...(poi.name ? { name: poi.name } : {}), + ...(poi.opening_hours ? { openingHours: poi.opening_hours } : {}), + }; const next = withPointAfter(planner.waypoints, afterId, point); if (!next) return false; const before = measuresOf(planner); diff --git a/client/src/components/Tours/poi/useTourPoiSearch.ts b/client/src/components/Tours/poi/useTourPoiSearch.ts index 3cf6c3dc6..44db95ef9 100644 --- a/client/src/components/Tours/poi/useTourPoiSearch.ts +++ b/client/src/components/Tours/poi/useTourPoiSearch.ts @@ -2,10 +2,13 @@ import { TOUR_POI_CATEGORIES_BY_TYPE, TOUR_POI_MAX_CATEGORIES, TOUR_POI_MAX_LINE_POINTS, + WALK_THEME_KEYS, + WALK_THEMES, type PlannableTourType, type TourPoi, type TourPoiCategory, type TourPoiSearchResponse, + type WalkTheme, } from '@trek/shared'; import { useCallback, useEffect, useRef, useState } from 'react'; import { useTranslation } from '../../../i18n'; @@ -29,6 +32,10 @@ function thinned(line: Array<[number, number]>, most: number): Array<[number, nu ); } +function sameSet(a: readonly string[], b: readonly string[]): boolean { + return a.length === b.length && a.every((item) => b.includes(item)); +} + /** What a search was asked with, so a later change of the route or the choices shows it is out of date. */ function keyOf(route: Array<[number, number]> | null, type: string, categories: readonly string[], corridor: number) { const ends = route && route.length > 1 ? [route[0], route[route.length - 1], route.length] : []; @@ -64,6 +71,13 @@ export function useTourPoiSearch(planner: TourPoiPlanner) { const currentKey = keyOf(route, type, categories, corridorM); const canSearch = !!route && route.length > 1 && categories.length > 0 && loadingKey === null; + // CW-05: a city walk's theme is a set of its categories; the one the categories match exactly is the theme on. + const theme = type === 'walk' ? (WALK_THEME_KEYS.find((key) => sameSet(WALK_THEMES[key], categories)) ?? null) : null; + const chooseTheme = useCallback( + (key: WalkTheme) => setChosen((current) => ({ ...current, walk: [...WALK_THEMES[key]] })), + [] + ); + const toggleCategory = useCallback( (category: TourPoiCategory) => setChosen((current) => { @@ -125,6 +139,10 @@ export function useTourPoiSearch(planner: TourPoiPlanner) { offered: TOUR_POI_CATEGORIES_BY_TYPE[type], categories, toggleCategory, + /** CW-05: a city walk's themes; none for any other type. */ + themes: type === 'walk' ? WALK_THEME_KEYS : [], + theme, + chooseTheme, corridorM, setCorridorM, canSearch, diff --git a/shared/src/i18n/ar/tours.ts b/shared/src/i18n/ar/tours.ts index 28ad8910b..12465b44a 100644 --- a/shared/src/i18n/ar/tours.ts +++ b/shared/src/i18n/ar/tours.ts @@ -509,6 +509,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'تم تخطيها في هذا اليوم', 'tours.walk.visit.fromDay': 'افتح الجولة من يوم في الخطة لتأشير محطاتها لذلك اليوم.', 'tours.walk.visit.failed': 'تعذر تأشير المحطة. يتطلب ذلك اتصالًا؛ حاول مجددًا بعد قليل.', + 'tours.walk.themes': 'موضوع الجولة', + 'tours.walk.theme.culture': 'ثقافة وتاريخ', + 'tours.walk.theme.parks': 'حدائق وإطلالات', + 'tours.walk.theme.food': 'طعام وحياة محلية', + 'tours.walk.theme.mixed': 'مزيج من كل شيء', + 'tours.walk.themeHint.culture': 'متاحف ومعارض ومعالم وأماكن تاريخية على طول المسار.', + 'tours.walk.themeHint.parks': 'حدائق ومتنزهات ونقاط مشاهدة على طول المسار.', + 'tours.walk.themeHint.food': 'مقاهٍ ومطاعم وأسواق على طول المسار.', + 'tours.walk.themeHint.mixed': 'قليل من كل شيء: معالم ومتاحف وحدائق وإطلالات ومقاهٍ وأسواق.', + 'tours.walk.themeHint.own': 'اختيارك الخاص من الفئات أدناه؛ يضبطها الموضوع لك.', + 'tours.walk.themeReason': 'مقترح لموضوع {theme}', 'tours.planner.tourType': 'نوع الجولة', 'tours.paddle.boat': 'القارب', 'tours.paddle.boat.kayak': 'كاياك', diff --git a/shared/src/i18n/az/tours.ts b/shared/src/i18n/az/tours.ts index 17986d22f..a3bf4be65 100644 --- a/shared/src/i18n/az/tours.ts +++ b/shared/src/i18n/az/tours.ts @@ -504,6 +504,18 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Bu gün keçildi', 'tours.walk.visit.fromDay': 'Dayanacaqları o gün üçün qeyd etmək üçün gəzintini plandakı bir gündən aç.', 'tours.walk.visit.failed': 'Dayanacaq qeyd edilə bilmədi. Bunun üçün bağlantı lazımdır; bir azdan yenidən cəhd et.', + 'tours.walk.themes': 'Gəzinti mövzusu', + 'tours.walk.theme.culture': 'Mədəniyyət və tarix', + 'tours.walk.theme.parks': 'Parklar və mənzərələr', + 'tours.walk.theme.food': 'Yemək və yerli həyat', + 'tours.walk.theme.mixed': 'Hər şeydən bir az', + 'tours.walk.themeHint.culture': 'Marşrut boyunca muzeylər, qalereyalar, abidələr və tarixi yerlər.', + 'tours.walk.themeHint.parks': 'Marşrut boyunca parklar, bağlar və seyr nöqtələri.', + 'tours.walk.themeHint.food': 'Marşrut boyunca kafelər, yemək yerləri və bazarlar.', + 'tours.walk.themeHint.mixed': + 'Hər şeydən bir az: görməli yerlər, muzeylər, parklar, mənzərələr, kafelər və bazarlar.', + 'tours.walk.themeHint.own': 'Aşağıda öz kateqoriya seçimin; mövzu onları sənin üçün qurur.', + 'tours.walk.themeReason': '{theme} üçün təklif olunur', 'tours.planner.tourType': 'Tur növü', 'tours.paddle.boat': 'Qayıq', 'tours.paddle.boat.kayak': 'Kayak', // same-as-en diff --git a/shared/src/i18n/br/tours.ts b/shared/src/i18n/br/tours.ts index 8d0b32ab6..2146724eb 100644 --- a/shared/src/i18n/br/tours.ts +++ b/shared/src/i18n/br/tours.ts @@ -510,6 +510,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Pulada neste dia', 'tours.walk.visit.fromDay': 'Abra o passeio a partir de um dia do plano para marcar as paradas daquele dia.', 'tours.walk.visit.failed': 'Não foi possível marcar a parada. É preciso conexão; tente de novo em instantes.', + 'tours.walk.themes': 'Tema do passeio', + 'tours.walk.theme.culture': 'Cultura e história', + 'tours.walk.theme.parks': 'Parques e vistas', + 'tours.walk.theme.food': 'Comida e vida local', + 'tours.walk.theme.mixed': 'Um pouco de tudo', + 'tours.walk.themeHint.culture': 'Museus, galerias, monumentos e lugares históricos ao longo da rota.', + 'tours.walk.themeHint.parks': 'Parques, jardins e mirantes ao longo da rota.', + 'tours.walk.themeHint.food': 'Cafeterias, lugares para comer e feiras ao longo da rota.', + 'tours.walk.themeHint.mixed': 'Um pouco de cada: pontos turísticos, museus, parques, vistas, cafeterias e feiras.', + 'tours.walk.themeHint.own': 'Sua própria seleção de categorias abaixo; um tema as define para você.', + 'tours.walk.themeReason': 'Sugerido para {theme}', 'tours.planner.tourType': 'Tipo de passeio', 'tours.paddle.boat': 'Embarcação', 'tours.paddle.boat.kayak': 'Caiaque', diff --git a/shared/src/i18n/ca/tours.ts b/shared/src/i18n/ca/tours.ts index c39b15e5a..ec3a59565 100644 --- a/shared/src/i18n/ca/tours.ts +++ b/shared/src/i18n/ca/tours.ts @@ -511,6 +511,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Omesa aquest dia', 'tours.walk.visit.fromDay': "Obre la ruta des d'un dia del pla per marcar-ne les parades d'aquell dia.", 'tours.walk.visit.failed': "No s'ha pogut marcar la parada. Cal connexió; torna-ho a provar d'aquí a una estona.", + 'tours.walk.themes': 'Tema de la ruta', + 'tours.walk.theme.culture': 'Cultura i història', + 'tours.walk.theme.parks': 'Parcs i vistes', + 'tours.walk.theme.food': 'Menjar i vida local', + 'tours.walk.theme.mixed': 'Una mica de tot', + 'tours.walk.themeHint.culture': 'Museus, galeries, monuments i llocs històrics al llarg de la ruta.', + 'tours.walk.themeHint.parks': 'Parcs, jardins i miradors al llarg de la ruta.', + 'tours.walk.themeHint.food': 'Cafeteries, llocs per menjar i mercats al llarg de la ruta.', + 'tours.walk.themeHint.mixed': "Una mica de cada: llocs d'interès, museus, parcs, vistes, cafeteries i mercats.", + 'tours.walk.themeHint.own': 'La teva pròpia tria de categories a sota; un tema te les defineix.', + 'tours.walk.themeReason': 'Suggerit per a {theme}', 'tours.planner.tourType': 'Tipus de ruta', 'tours.paddle.boat': 'Embarcació', 'tours.paddle.boat.kayak': 'Caiac', diff --git a/shared/src/i18n/cs/tours.ts b/shared/src/i18n/cs/tours.ts index d0272812a..202120300 100644 --- a/shared/src/i18n/cs/tours.ts +++ b/shared/src/i18n/cs/tours.ts @@ -501,6 +501,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Přeskočeno v tento den', 'tours.walk.visit.fromDay': 'Otevři procházku ze dne v plánu, abys mohl odškrtat zastávky pro ten den.', 'tours.walk.visit.failed': 'Zastávku se nepodařilo označit. Je potřeba připojení; zkus to za chvíli znovu.', + 'tours.walk.themes': 'Téma procházky', + 'tours.walk.theme.culture': 'Kultura a historie', + 'tours.walk.theme.parks': 'Parky a výhledy', + 'tours.walk.theme.food': 'Jídlo a místní život', + 'tours.walk.theme.mixed': 'Od všeho trochu', + 'tours.walk.themeHint.culture': 'Muzea, galerie, památky a historická místa podél trasy.', + 'tours.walk.themeHint.parks': 'Parky, zahrady a vyhlídky podél trasy.', + 'tours.walk.themeHint.food': 'Kavárny, místa k jídlu a trhy podél trasy.', + 'tours.walk.themeHint.mixed': 'Od všeho trochu: památky, muzea, parky, výhledy, kavárny a trhy.', + 'tours.walk.themeHint.own': 'Tvůj vlastní výběr kategorií níže; téma je nastaví za tebe.', + 'tours.walk.themeReason': 'Navrženo pro {theme}', 'tours.planner.tourType': 'Typ túry', 'tours.paddle.boat': 'Loď', 'tours.paddle.boat.kayak': 'Kajak', diff --git a/shared/src/i18n/de/tours.ts b/shared/src/i18n/de/tours.ts index 8feab6c8b..d3e788ff5 100644 --- a/shared/src/i18n/de/tours.ts +++ b/shared/src/i18n/de/tours.ts @@ -516,6 +516,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.fromDay': 'Öffne den Walk über einen Tag im Plan, um seine Stationen für diesen Tag abzuhaken.', 'tours.walk.visit.failed': 'Die Station konnte nicht markiert werden. Dafür braucht es eine Verbindung; versuch es gleich noch einmal.', + 'tours.walk.themes': 'Thema des Walks', + 'tours.walk.theme.culture': 'Kultur und Geschichte', + 'tours.walk.theme.parks': 'Parks und Aussicht', + 'tours.walk.theme.food': 'Essen und lokales Leben', + 'tours.walk.theme.mixed': 'Gemischt', + 'tours.walk.themeHint.culture': 'Museen, Galerien, Denkmäler und historische Orte entlang der Route.', + 'tours.walk.themeHint.parks': 'Parks, Gärten und Aussichtspunkte entlang der Route.', + 'tours.walk.themeHint.food': 'Cafés, Gaststätten und Märkte entlang der Route.', + 'tours.walk.themeHint.mixed': 'Von allem etwas: Sehenswürdigkeiten, Museen, Parks, Aussicht, Cafés und Märkte.', + 'tours.walk.themeHint.own': 'Deine eigene Auswahl darunter; ein Thema stellt sie für dich zusammen.', + 'tours.walk.themeReason': 'Vorgeschlagen für {theme}', 'tours.planner.tourType': 'Tourtyp', 'tours.paddle.boat': 'Boot', 'tours.paddle.boat.kayak': 'Kajak', diff --git a/shared/src/i18n/en/tours.ts b/shared/src/i18n/en/tours.ts index cd202eaff..ccb4af1ac 100644 --- a/shared/src/i18n/en/tours.ts +++ b/shared/src/i18n/en/tours.ts @@ -502,6 +502,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Skipped on this day', 'tours.walk.visit.fromDay': 'Open the walk from a day of the plan to check its stops off for that day.', 'tours.walk.visit.failed': 'The stop could not be marked. It needs a connection; try again in a moment.', + 'tours.walk.themes': 'Walk theme', + 'tours.walk.theme.culture': 'Culture and history', + 'tours.walk.theme.parks': 'Parks and views', + 'tours.walk.theme.food': 'Food and local life', + 'tours.walk.theme.mixed': 'A bit of everything', + 'tours.walk.themeHint.culture': 'Museums, galleries, monuments and historic places along the route.', + 'tours.walk.themeHint.parks': 'Parks, gardens and viewpoints along the route.', + 'tours.walk.themeHint.food': 'Coffee shops, places to eat and markets along the route.', + 'tours.walk.themeHint.mixed': 'Some of each: sights, museums, parks, views, coffee shops and markets.', + 'tours.walk.themeHint.own': 'Your own pick of categories below; a theme sets them for you.', + 'tours.walk.themeReason': 'Suggested for {theme}', 'tours.planner.tourType': 'Tour type', 'tours.paddle.boat': 'Boat', 'tours.paddle.boat.kayak': 'Kayak', diff --git a/shared/src/i18n/es/tours.ts b/shared/src/i18n/es/tours.ts index 90971ffde..103c7df54 100644 --- a/shared/src/i18n/es/tours.ts +++ b/shared/src/i18n/es/tours.ts @@ -509,6 +509,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Omitida este día', 'tours.walk.visit.fromDay': 'Abre el paseo desde un día del plan para marcar sus paradas de ese día.', 'tours.walk.visit.failed': 'No se pudo marcar la parada. Hace falta conexión; inténtalo de nuevo en un momento.', + 'tours.walk.themes': 'Tema del paseo', + 'tours.walk.theme.culture': 'Cultura e historia', + 'tours.walk.theme.parks': 'Parques y vistas', + 'tours.walk.theme.food': 'Comida y vida local', + 'tours.walk.theme.mixed': 'Un poco de todo', + 'tours.walk.themeHint.culture': 'Museos, galerías, monumentos y lugares históricos a lo largo de la ruta.', + 'tours.walk.themeHint.parks': 'Parques, jardines y miradores a lo largo de la ruta.', + 'tours.walk.themeHint.food': 'Cafeterías, sitios para comer y mercados a lo largo de la ruta.', + 'tours.walk.themeHint.mixed': 'Un poco de cada: lugares de interés, museos, parques, vistas, cafeterías y mercados.', + 'tours.walk.themeHint.own': 'Tu propia selección de categorías abajo; un tema las elige por ti.', + 'tours.walk.themeReason': 'Sugerido para {theme}', 'tours.planner.tourType': 'Tipo de ruta', 'tours.paddle.boat': 'Embarcación', 'tours.paddle.boat.kayak': 'Kayak', // same-as-en diff --git a/shared/src/i18n/et/tours.ts b/shared/src/i18n/et/tours.ts index 16d61ad36..97a12e18d 100644 --- a/shared/src/i18n/et/tours.ts +++ b/shared/src/i18n/et/tours.ts @@ -504,6 +504,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Sel päeval vahele jäetud', 'tours.walk.visit.fromDay': 'Ava jalutus plaani päevast, et selle päeva peatused ära märkida.', 'tours.walk.visit.failed': 'Peatust ei õnnestunud märkida. Selleks on vaja ühendust; proovi kohe uuesti.', + 'tours.walk.themes': 'Jalutuse teema', + 'tours.walk.theme.culture': 'Kultuur ja ajalugu', + 'tours.walk.theme.parks': 'Pargid ja vaated', + 'tours.walk.theme.food': 'Toit ja kohalik elu', + 'tours.walk.theme.mixed': 'Igaühest natuke', + 'tours.walk.themeHint.culture': 'Muuseumid, galeriid, mälestusmärgid ja ajaloolised paigad marsruudi ääres.', + 'tours.walk.themeHint.parks': 'Pargid, aiad ja vaatekohad marsruudi ääres.', + 'tours.walk.themeHint.food': 'Kohvikud, söögikohad ja turud marsruudi ääres.', + 'tours.walk.themeHint.mixed': 'Igaühest natuke: vaatamisväärsused, muuseumid, pargid, vaated, kohvikud ja turud.', + 'tours.walk.themeHint.own': 'Sinu enda kategooriate valik allpool; teema seab need sinu eest.', + 'tours.walk.themeReason': 'Soovitatud teemale {theme}', 'tours.planner.tourType': 'Matka tüüp', 'tours.paddle.boat': 'Paat', 'tours.paddle.boat.kayak': 'Süst', diff --git a/shared/src/i18n/fr/tours.ts b/shared/src/i18n/fr/tours.ts index d0faf1df3..cca0bb7b6 100644 --- a/shared/src/i18n/fr/tours.ts +++ b/shared/src/i18n/fr/tours.ts @@ -519,6 +519,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Passée ce jour-là', 'tours.walk.visit.fromDay': 'Ouvre la balade depuis un jour du plan pour cocher ses étapes ce jour-là.', 'tours.walk.visit.failed': "L'étape n'a pas pu être cochée. Il faut une connexion ; réessaie dans un instant.", + 'tours.walk.themes': 'Thème de la balade', + 'tours.walk.theme.culture': 'Culture et histoire', + 'tours.walk.theme.parks': 'Parcs et points de vue', + 'tours.walk.theme.food': 'Cuisine et vie locale', + 'tours.walk.theme.mixed': 'Un peu de tout', + 'tours.walk.themeHint.culture': 'Musées, galeries, monuments et lieux historiques le long du parcours.', + 'tours.walk.themeHint.parks': 'Parcs, jardins et points de vue le long du parcours.', + 'tours.walk.themeHint.food': 'Cafés, restaurants et marchés le long du parcours.', + 'tours.walk.themeHint.mixed': 'Un peu de chaque : sites, musées, parcs, points de vue, cafés et marchés.', + 'tours.walk.themeHint.own': 'Ta propre sélection de catégories ci-dessous ; un thème les choisit pour toi.', + 'tours.walk.themeReason': 'Suggéré pour {theme}', 'tours.planner.tourType': 'Type de sortie', 'tours.paddle.boat': 'Embarcation', 'tours.paddle.boat.kayak': 'Kayak', // same-as-en diff --git a/shared/src/i18n/gr/tours.ts b/shared/src/i18n/gr/tours.ts index 98acbf794..ba06abcf2 100644 --- a/shared/src/i18n/gr/tours.ts +++ b/shared/src/i18n/gr/tours.ts @@ -519,6 +519,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Παραλείφθηκε αυτή τη μέρα', 'tours.walk.visit.fromDay': 'Άνοιξε τη βόλτα από μια μέρα του πλάνου για να τσεκάρεις τις στάσεις εκείνης της μέρας.', 'tours.walk.visit.failed': 'Η στάση δεν σημειώθηκε. Χρειάζεται σύνδεση· δοκίμασε ξανά σε λίγο.', + 'tours.walk.themes': 'Θέμα βόλτας', + 'tours.walk.theme.culture': 'Πολιτισμός και ιστορία', + 'tours.walk.theme.parks': 'Πάρκα και θέα', + 'tours.walk.theme.food': 'Φαγητό και τοπική ζωή', + 'tours.walk.theme.mixed': "Λίγο απ' όλα", + 'tours.walk.themeHint.culture': 'Μουσεία, γκαλερί, μνημεία και ιστορικά σημεία κατά μήκος της διαδρομής.', + 'tours.walk.themeHint.parks': 'Πάρκα, κήποι και σημεία θέας κατά μήκος της διαδρομής.', + 'tours.walk.themeHint.food': 'Καφετέριες, μέρη για φαγητό και αγορές κατά μήκος της διαδρομής.', + 'tours.walk.themeHint.mixed': "Λίγο απ' όλα: αξιοθέατα, μουσεία, πάρκα, θέα, καφετέριες και αγορές.", + 'tours.walk.themeHint.own': 'Η δική σου επιλογή κατηγοριών παρακάτω· ένα θέμα τις ορίζει για σένα.', + 'tours.walk.themeReason': 'Προτείνεται για {theme}', 'tours.planner.tourType': 'Τύπος διαδρομής', 'tours.paddle.boat': 'Σκάφος', 'tours.paddle.boat.kayak': 'Καγιάκ', diff --git a/shared/src/i18n/hu/tours.ts b/shared/src/i18n/hu/tours.ts index b44f36000..b6c32925b 100644 --- a/shared/src/i18n/hu/tours.ts +++ b/shared/src/i18n/hu/tours.ts @@ -511,6 +511,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Ezen a napon kihagyva', 'tours.walk.visit.fromDay': 'Nyisd meg a sétát a terv egyik napjáról, hogy arra a napra kipipáld a megállókat.', 'tours.walk.visit.failed': 'A megállót nem sikerült megjelölni. Ehhez kapcsolat kell; próbáld újra kicsit később.', + 'tours.walk.themes': 'A séta témája', + 'tours.walk.theme.culture': 'Kultúra és történelem', + 'tours.walk.theme.parks': 'Parkok és kilátás', + 'tours.walk.theme.food': 'Étel és helyi élet', + 'tours.walk.theme.mixed': 'Mindenből egy kicsit', + 'tours.walk.themeHint.culture': 'Múzeumok, galériák, emlékművek és történelmi helyek az útvonal mentén.', + 'tours.walk.themeHint.parks': 'Parkok, kertek és kilátópontok az útvonal mentén.', + 'tours.walk.themeHint.food': 'Kávézók, étkezőhelyek és piacok az útvonal mentén.', + 'tours.walk.themeHint.mixed': 'Mindenből egy kicsit: látnivalók, múzeumok, parkok, kilátás, kávézók és piacok.', + 'tours.walk.themeHint.own': 'Saját kategóriaválasztásod lent; egy téma beállítja helyetted.', + 'tours.walk.themeReason': 'Javasolva: {theme}', 'tours.planner.tourType': 'Túratípus', 'tours.paddle.boat': 'Hajó', 'tours.paddle.boat.kayak': 'Kajak', diff --git a/shared/src/i18n/id/tours.ts b/shared/src/i18n/id/tours.ts index bf00cffce..9703c47c1 100644 --- a/shared/src/i18n/id/tours.ts +++ b/shared/src/i18n/id/tours.ts @@ -503,6 +503,18 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Dilewati pada hari ini', 'tours.walk.visit.fromDay': 'Buka rute dari salah satu hari di rencana untuk mencentang titiknya pada hari itu.', 'tours.walk.visit.failed': 'Titik tidak dapat ditandai. Perlu koneksi; coba lagi sebentar lagi.', + 'tours.walk.themes': 'Tema rute', + 'tours.walk.theme.culture': 'Budaya dan sejarah', + 'tours.walk.theme.parks': 'Taman dan pemandangan', + 'tours.walk.theme.food': 'Kuliner dan kehidupan lokal', + 'tours.walk.theme.mixed': 'Sedikit dari semuanya', + 'tours.walk.themeHint.culture': 'Museum, galeri, monumen, dan tempat bersejarah di sepanjang rute.', + 'tours.walk.themeHint.parks': 'Taman, kebun, dan titik pandang di sepanjang rute.', + 'tours.walk.themeHint.food': 'Kedai kopi, tempat makan, dan pasar di sepanjang rute.', + 'tours.walk.themeHint.mixed': + 'Sedikit dari semuanya: tempat wisata, museum, taman, pemandangan, kedai kopi, dan pasar.', + 'tours.walk.themeHint.own': 'Pilihan kategorimu sendiri di bawah; tema mengaturnya untukmu.', + 'tours.walk.themeReason': 'Disarankan untuk {theme}', 'tours.planner.tourType': 'Jenis tur', 'tours.paddle.boat': 'Perahu', 'tours.paddle.boat.kayak': 'Kayak', // same-as-en diff --git a/shared/src/i18n/it/tours.ts b/shared/src/i18n/it/tours.ts index 1e3aea9cf..5613ec331 100644 --- a/shared/src/i18n/it/tours.ts +++ b/shared/src/i18n/it/tours.ts @@ -510,6 +510,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Saltata in questo giorno', 'tours.walk.visit.fromDay': 'Apri il percorso da un giorno del piano per spuntare le tappe di quel giorno.', 'tours.walk.visit.failed': 'Non è stato possibile segnare la tappa. Serve una connessione; riprova tra poco.', + 'tours.walk.themes': 'Tema del percorso', + 'tours.walk.theme.culture': 'Cultura e storia', + 'tours.walk.theme.parks': 'Parchi e panorami', + 'tours.walk.theme.food': 'Cibo e vita locale', + 'tours.walk.theme.mixed': "Un po' di tutto", + 'tours.walk.themeHint.culture': 'Musei, gallerie, monumenti e luoghi storici lungo il percorso.', + 'tours.walk.themeHint.parks': 'Parchi, giardini e punti panoramici lungo il percorso.', + 'tours.walk.themeHint.food': 'Caffetterie, posti dove mangiare e mercati lungo il percorso.', + 'tours.walk.themeHint.mixed': "Un po' di tutto: attrazioni, musei, parchi, panorami, caffetterie e mercati.", + 'tours.walk.themeHint.own': 'La tua scelta di categorie qui sotto; un tema le imposta per te.', + 'tours.walk.themeReason': 'Suggerito per {theme}', 'tours.planner.tourType': 'Tipo di tour', 'tours.paddle.boat': 'Imbarcazione', 'tours.paddle.boat.kayak': 'Kayak', // same-as-en diff --git a/shared/src/i18n/ja/tours.ts b/shared/src/i18n/ja/tours.ts index d551fba26..621c483fe 100644 --- a/shared/src/i18n/ja/tours.ts +++ b/shared/src/i18n/ja/tours.ts @@ -496,6 +496,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.fromDay': '計画の日から開くと、その日の立ち寄り先をチェックできます。', 'tours.walk.visit.failed': '立ち寄り先をチェックできませんでした。接続が必要です。少ししてからもう一度お試しください。', + 'tours.walk.themes': '散策のテーマ', + 'tours.walk.theme.culture': '文化と歴史', + 'tours.walk.theme.parks': '公園と眺望', + 'tours.walk.theme.food': '食と地元の暮らし', + 'tours.walk.theme.mixed': 'いろいろ', + 'tours.walk.themeHint.culture': 'ルート沿いの美術館・博物館、ギャラリー、記念碑、史跡。', + 'tours.walk.themeHint.parks': 'ルート沿いの公園、庭園、展望スポット。', + 'tours.walk.themeHint.food': 'ルート沿いのカフェ、食事処、市場。', + 'tours.walk.themeHint.mixed': '観光名所、美術館・博物館、公園、眺望、カフェ、市場を少しずつ。', + 'tours.walk.themeHint.own': '下のカテゴリーは自分で選択中。テーマを選ぶと自動で設定されます。', + 'tours.walk.themeReason': '{theme} のおすすめ', 'tours.planner.tourType': 'ツアーの種類', 'tours.paddle.boat': 'ボート', 'tours.paddle.boat.kayak': 'カヤック', diff --git a/shared/src/i18n/ko/tours.ts b/shared/src/i18n/ko/tours.ts index 0b8b12da6..9b09af9cb 100644 --- a/shared/src/i18n/ko/tours.ts +++ b/shared/src/i18n/ko/tours.ts @@ -491,6 +491,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': '이날 건너뜀', 'tours.walk.visit.fromDay': '계획의 날짜에서 열면 그날의 정류지를 체크할 수 있습니다.', 'tours.walk.visit.failed': '정류지를 표시하지 못했습니다. 연결이 필요하니 잠시 후 다시 시도하세요.', + 'tours.walk.themes': '산책 테마', + 'tours.walk.theme.culture': '문화와 역사', + 'tours.walk.theme.parks': '공원과 전망', + 'tours.walk.theme.food': '음식과 현지 생활', + 'tours.walk.theme.mixed': '골고루', + 'tours.walk.themeHint.culture': '경로를 따라 있는 박물관, 갤러리, 기념물, 역사적 장소.', + 'tours.walk.themeHint.parks': '경로를 따라 있는 공원, 정원, 전망 명소.', + 'tours.walk.themeHint.food': '경로를 따라 있는 카페, 식당, 시장.', + 'tours.walk.themeHint.mixed': '명소, 박물관, 공원, 전망, 카페, 시장을 골고루.', + 'tours.walk.themeHint.own': '아래 카테고리는 직접 고른 것입니다. 테마를 고르면 자동으로 설정됩니다.', + 'tours.walk.themeReason': '{theme} 추천', 'tours.planner.tourType': '투어 유형', 'tours.paddle.boat': '보트', 'tours.paddle.boat.kayak': '카약', diff --git a/shared/src/i18n/nl/tours.ts b/shared/src/i18n/nl/tours.ts index be19fa7fa..2fc7cd096 100644 --- a/shared/src/i18n/nl/tours.ts +++ b/shared/src/i18n/nl/tours.ts @@ -514,6 +514,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.fromDay': 'Open de wandeling vanuit een dag in het plan om de haltes voor die dag af te vinken.', 'tours.walk.visit.failed': 'De halte kon niet worden gemarkeerd. Daar is verbinding voor nodig; probeer het zo opnieuw.', + 'tours.walk.themes': 'Thema van de wandeling', + 'tours.walk.theme.culture': 'Cultuur en geschiedenis', + 'tours.walk.theme.parks': 'Parken en uitzicht', + 'tours.walk.theme.food': 'Eten en het lokale leven', + 'tours.walk.theme.mixed': 'Van alles wat', + 'tours.walk.themeHint.culture': 'Musea, galerieën, monumenten en historische plekken langs de route.', + 'tours.walk.themeHint.parks': 'Parken, tuinen en uitkijkpunten langs de route.', + 'tours.walk.themeHint.food': 'Koffiezaken, eetgelegenheden en markten langs de route.', + 'tours.walk.themeHint.mixed': 'Van alles wat: bezienswaardigheden, musea, parken, uitzicht, koffiezaken en markten.', + 'tours.walk.themeHint.own': 'Je eigen keuze van categorieën hieronder; een thema stelt ze voor je in.', + 'tours.walk.themeReason': 'Voorgesteld voor {theme}', 'tours.planner.tourType': 'Soort tocht', 'tours.paddle.boat': 'Boot', 'tours.paddle.boat.kayak': 'Kajak', diff --git a/shared/src/i18n/pl/tours.ts b/shared/src/i18n/pl/tours.ts index 6911afa09..76e2b88e7 100644 --- a/shared/src/i18n/pl/tours.ts +++ b/shared/src/i18n/pl/tours.ts @@ -518,6 +518,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Pominięty tego dnia', 'tours.walk.visit.fromDay': 'Otwórz trasę z dnia w planie, aby odhaczyć przystanki na ten dzień.', 'tours.walk.visit.failed': 'Nie udało się oznaczyć przystanku. Potrzebne jest połączenie; spróbuj za chwilę.', + 'tours.walk.themes': 'Motyw trasy', + 'tours.walk.theme.culture': 'Kultura i historia', + 'tours.walk.theme.parks': 'Parki i widoki', + 'tours.walk.theme.food': 'Jedzenie i lokalne życie', + 'tours.walk.theme.mixed': 'Po trochu wszystkiego', + 'tours.walk.themeHint.culture': 'Muzea, galerie, pomniki i miejsca historyczne wzdłuż trasy.', + 'tours.walk.themeHint.parks': 'Parki, ogrody i punkty widokowe wzdłuż trasy.', + 'tours.walk.themeHint.food': 'Kawiarnie, miejsca do jedzenia i targi wzdłuż trasy.', + 'tours.walk.themeHint.mixed': 'Po trochu wszystkiego: atrakcje, muzea, parki, widoki, kawiarnie i targi.', + 'tours.walk.themeHint.own': 'Twój własny wybór kategorii poniżej; motyw ustawi je za ciebie.', + 'tours.walk.themeReason': 'Proponowane dla: {theme}', 'tours.planner.tourType': 'Rodzaj wycieczki', 'tours.paddle.boat': 'Łódź', 'tours.paddle.boat.kayak': 'Kajak', diff --git a/shared/src/i18n/ru/tours.ts b/shared/src/i18n/ru/tours.ts index 30dad0018..970580999 100644 --- a/shared/src/i18n/ru/tours.ts +++ b/shared/src/i18n/ru/tours.ts @@ -521,6 +521,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Пропущена в этот день', 'tours.walk.visit.fromDay': 'Открой прогулку из дня в плане, чтобы отмечать остановки за этот день.', 'tours.walk.visit.failed': 'Не удалось отметить остановку. Нужна связь; попробуй чуть позже.', + 'tours.walk.themes': 'Тема прогулки', + 'tours.walk.theme.culture': 'Культура и история', + 'tours.walk.theme.parks': 'Парки и виды', + 'tours.walk.theme.food': 'Еда и местная жизнь', + 'tours.walk.theme.mixed': 'Всего понемногу', + 'tours.walk.themeHint.culture': 'Музеи, галереи, памятники и исторические места вдоль маршрута.', + 'tours.walk.themeHint.parks': 'Парки, сады и смотровые площадки вдоль маршрута.', + 'tours.walk.themeHint.food': 'Кафе, места, где поесть, и рынки вдоль маршрута.', + 'tours.walk.themeHint.mixed': 'Всего понемногу: достопримечательности, музеи, парки, виды, кафе и рынки.', + 'tours.walk.themeHint.own': 'Твой собственный выбор категорий ниже; тема задаст их за тебя.', + 'tours.walk.themeReason': 'Предложено для темы {theme}', 'tours.planner.tourType': 'Тип тура', 'tours.paddle.boat': 'Лодка', 'tours.paddle.boat.kayak': 'Каяк', diff --git a/shared/src/i18n/sk/tours.ts b/shared/src/i18n/sk/tours.ts index 89d1223ec..736c457d8 100644 --- a/shared/src/i18n/sk/tours.ts +++ b/shared/src/i18n/sk/tours.ts @@ -503,6 +503,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Preskočené v tento deň', 'tours.walk.visit.fromDay': 'Otvor prechádzku z dňa v pláne, aby si odškrtol zastávky na ten deň.', 'tours.walk.visit.failed': 'Zastávku sa nepodarilo označiť. Je potrebné pripojenie; skús to o chvíľu znova.', + 'tours.walk.themes': 'Téma prechádzky', + 'tours.walk.theme.culture': 'Kultúra a história', + 'tours.walk.theme.parks': 'Parky a výhľady', + 'tours.walk.theme.food': 'Jedlo a miestny život', + 'tours.walk.theme.mixed': 'Od všetkého trochu', + 'tours.walk.themeHint.culture': 'Múzeá, galérie, pamätníky a historické miesta pozdĺž trasy.', + 'tours.walk.themeHint.parks': 'Parky, záhrady a vyhliadky pozdĺž trasy.', + 'tours.walk.themeHint.food': 'Kaviarne, miesta na jedlo a trhy pozdĺž trasy.', + 'tours.walk.themeHint.mixed': 'Od všetkého trochu: pamiatky, múzeá, parky, výhľady, kaviarne a trhy.', + 'tours.walk.themeHint.own': 'Tvoj vlastný výber kategórií nižšie; téma ich nastaví za teba.', + 'tours.walk.themeReason': 'Navrhnuté pre {theme}', 'tours.planner.tourType': 'Typ túry', 'tours.paddle.boat': 'Loď', 'tours.paddle.boat.kayak': 'Kajak', diff --git a/shared/src/i18n/sv/tours.ts b/shared/src/i18n/sv/tours.ts index 635ea6009..09ca72793 100644 --- a/shared/src/i18n/sv/tours.ts +++ b/shared/src/i18n/sv/tours.ts @@ -502,6 +502,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Överhoppad den här dagen', 'tours.walk.visit.fromDay': 'Öppna promenaden från en dag i planen för att bocka av stoppen den dagen.', 'tours.walk.visit.failed': 'Stoppet kunde inte markeras. Det kräver en anslutning; försök igen om en stund.', + 'tours.walk.themes': 'Promenadens tema', + 'tours.walk.theme.culture': 'Kultur och historia', + 'tours.walk.theme.parks': 'Parker och utsikter', + 'tours.walk.theme.food': 'Mat och lokalt liv', + 'tours.walk.theme.mixed': 'Lite av allt', + 'tours.walk.themeHint.culture': 'Museer, gallerier, monument och historiska platser längs rutten.', + 'tours.walk.themeHint.parks': 'Parker, trädgårdar och utsiktspunkter längs rutten.', + 'tours.walk.themeHint.food': 'Kaféer, matställen och torghandel längs rutten.', + 'tours.walk.themeHint.mixed': 'Lite av allt: sevärdheter, museer, parker, utsikter, kaféer och torghandel.', + 'tours.walk.themeHint.own': 'Ditt eget urval av kategorier nedan; ett tema väljer dem åt dig.', + 'tours.walk.themeReason': 'Föreslaget för {theme}', 'tours.planner.tourType': 'Turtyp', 'tours.paddle.boat': 'Båt', 'tours.paddle.boat.kayak': 'Kajak', diff --git a/shared/src/i18n/th/tours.ts b/shared/src/i18n/th/tours.ts index 1f935c3ac..04f1659e0 100644 --- a/shared/src/i18n/th/tours.ts +++ b/shared/src/i18n/th/tours.ts @@ -485,6 +485,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'ข้ามไปในวันนี้', 'tours.walk.visit.fromDay': 'เปิดทริปจากวันในแผนเพื่อติ๊กจุดแวะของวันนั้น', 'tours.walk.visit.failed': 'ทำเครื่องหมายจุดแวะไม่ได้ ต้องมีการเชื่อมต่อ ลองใหม่อีกครั้งในอีกสักครู่', + 'tours.walk.themes': 'ธีมของทริป', + 'tours.walk.theme.culture': 'วัฒนธรรมและประวัติศาสตร์', + 'tours.walk.theme.parks': 'สวนและจุดชมวิว', + 'tours.walk.theme.food': 'อาหารและวิถีท้องถิ่น', + 'tours.walk.theme.mixed': 'หลากหลาย', + 'tours.walk.themeHint.culture': 'พิพิธภัณฑ์ แกลเลอรี อนุสาวรีย์ และสถานที่ทางประวัติศาสตร์ตามเส้นทาง', + 'tours.walk.themeHint.parks': 'สวนสาธารณะ สวน และจุดชมวิวตามเส้นทาง', + 'tours.walk.themeHint.food': 'ร้านกาแฟ ร้านอาหาร และตลาดตามเส้นทาง', + 'tours.walk.themeHint.mixed': 'มีทุกอย่าง: สถานที่น่าสนใจ พิพิธภัณฑ์ สวน จุดชมวิว ร้านกาแฟ และตลาด', + 'tours.walk.themeHint.own': 'หมวดหมู่ด้านล่างเลือกเอง ธีมจะตั้งค่าให้อัตโนมัติ', + 'tours.walk.themeReason': 'แนะนำสำหรับ {theme}', 'tours.planner.tourType': 'ประเภททริป', 'tours.paddle.boat': 'เรือ', 'tours.paddle.boat.kayak': 'เรือคายัก', diff --git a/shared/src/i18n/tours-locales.spec.ts b/shared/src/i18n/tours-locales.spec.ts index 04d1249b3..d7494d8f1 100644 --- a/shared/src/i18n/tours-locales.spec.ts +++ b/shared/src/i18n/tours-locales.spec.ts @@ -20,7 +20,7 @@ const tokens = (value: string) => [...value.matchAll(/\{[^{}]+\}/g)].map((match) // placeholder spec; here only the general keys are. const groups = pluralGroups(Object.keys(english)); const generalKeys = (keys: string[]) => keys.filter((key) => !pluralFormOf(key, groups)); -const GENERAL_KEY_COUNT = 745; +const GENERAL_KEY_COUNT = 756; function literalKeys(source: string): string[] { const tree = ts.createSourceFile('locale.ts', source, ts.ScriptTarget.Latest, true); diff --git a/shared/src/i18n/tr/tours.ts b/shared/src/i18n/tr/tours.ts index 74c453236..f14ab3610 100644 --- a/shared/src/i18n/tr/tours.ts +++ b/shared/src/i18n/tr/tours.ts @@ -505,6 +505,18 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Bu gün atlandı', 'tours.walk.visit.fromDay': 'Duraklarını o gün için işaretlemek için yürüyüşü plandaki bir günden aç.', 'tours.walk.visit.failed': 'Durak işaretlenemedi. Bunun için bağlantı gerekir; birazdan yeniden dene.', + 'tours.walk.themes': 'Yürüyüş teması', + 'tours.walk.theme.culture': 'Kültür ve tarih', + 'tours.walk.theme.parks': 'Parklar ve manzaralar', + 'tours.walk.theme.food': 'Yemek ve yerel yaşam', + 'tours.walk.theme.mixed': 'Her şeyden biraz', + 'tours.walk.themeHint.culture': 'Rota boyunca müzeler, galeriler, anıtlar ve tarihi yerler.', + 'tours.walk.themeHint.parks': 'Rota boyunca parklar, bahçeler ve seyir noktaları.', + 'tours.walk.themeHint.food': 'Rota boyunca kafeler, yemek yerleri ve pazarlar.', + 'tours.walk.themeHint.mixed': + 'Her şeyden biraz: görülecek yerler, müzeler, parklar, manzaralar, kafeler ve pazarlar.', + 'tours.walk.themeHint.own': 'Aşağıdaki kategorileri kendin seçtin; bir tema onları senin için ayarlar.', + 'tours.walk.themeReason': '{theme} için önerildi', 'tours.planner.tourType': 'Tur türü', 'tours.paddle.boat': 'Tekne', 'tours.paddle.boat.kayak': 'Kano (kayak)', diff --git a/shared/src/i18n/uk/tours.ts b/shared/src/i18n/uk/tours.ts index 3d6aa86a3..e2a49feac 100644 --- a/shared/src/i18n/uk/tours.ts +++ b/shared/src/i18n/uk/tours.ts @@ -517,6 +517,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Пропущено цього дня', 'tours.walk.visit.fromDay': 'Відкрий прогулянку з дня в плані, щоб відмічати зупинки на цей день.', 'tours.walk.visit.failed': "Не вдалося позначити зупинку. Потрібне з'єднання; спробуй трохи згодом.", + 'tours.walk.themes': 'Тема прогулянки', + 'tours.walk.theme.culture': 'Культура та історія', + 'tours.walk.theme.parks': 'Парки та краєвиди', + 'tours.walk.theme.food': 'Їжа та місцеве життя', + 'tours.walk.theme.mixed': 'Усього потроху', + 'tours.walk.themeHint.culture': "Музеї, галереї, пам'ятники та історичні місця вздовж маршруту.", + 'tours.walk.themeHint.parks': 'Парки, сади та оглядові майданчики вздовж маршруту.', + 'tours.walk.themeHint.food': "Кав'ярні, місця, де поїсти, та ринки вздовж маршруту.", + 'tours.walk.themeHint.mixed': "Усього потроху: пам'ятки, музеї, парки, краєвиди, кав'ярні та ринки.", + 'tours.walk.themeHint.own': 'Твій власний вибір категорій нижче; тема задасть їх за тебе.', + 'tours.walk.themeReason': 'Запропоновано для теми {theme}', 'tours.planner.tourType': 'Тип туру', 'tours.paddle.boat': 'Човен', 'tours.paddle.boat.kayak': 'Каяк', diff --git a/shared/src/i18n/vi/tours.ts b/shared/src/i18n/vi/tours.ts index 2d8c1aa9d..8fa3f3504 100644 --- a/shared/src/i18n/vi/tours.ts +++ b/shared/src/i18n/vi/tours.ts @@ -502,6 +502,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': 'Đã bỏ qua trong ngày này', 'tours.walk.visit.fromDay': 'Mở lộ trình từ một ngày trong kế hoạch để đánh dấu các điểm dừng của ngày đó.', 'tours.walk.visit.failed': 'Không thể đánh dấu điểm dừng. Cần có kết nối; hãy thử lại sau giây lát.', + 'tours.walk.themes': 'Chủ đề lộ trình', + 'tours.walk.theme.culture': 'Văn hóa và lịch sử', + 'tours.walk.theme.parks': 'Công viên và cảnh đẹp', + 'tours.walk.theme.food': 'Ẩm thực và đời sống địa phương', + 'tours.walk.theme.mixed': 'Mỗi thứ một chút', + 'tours.walk.themeHint.culture': 'Bảo tàng, phòng tranh, tượng đài và di tích dọc tuyến đường.', + 'tours.walk.themeHint.parks': 'Công viên, khu vườn và điểm ngắm cảnh dọc tuyến đường.', + 'tours.walk.themeHint.food': 'Quán cà phê, chỗ ăn uống và chợ dọc tuyến đường.', + 'tours.walk.themeHint.mixed': 'Mỗi thứ một chút: điểm tham quan, bảo tàng, công viên, cảnh đẹp, quán cà phê và chợ.', + 'tours.walk.themeHint.own': 'Bạn đang tự chọn danh mục bên dưới; chủ đề sẽ chọn giúp bạn.', + 'tours.walk.themeReason': 'Gợi ý cho {theme}', 'tours.planner.tourType': 'Loại chuyến', 'tours.paddle.boat': 'Thuyền', 'tours.paddle.boat.kayak': 'Thuyền kayak', diff --git a/shared/src/i18n/zh-TW/tours.ts b/shared/src/i18n/zh-TW/tours.ts index 2af3184e3..3aa1f26e3 100644 --- a/shared/src/i18n/zh-TW/tours.ts +++ b/shared/src/i18n/zh-TW/tours.ts @@ -470,6 +470,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': '當天已略過', 'tours.walk.visit.fromDay': '從計畫中的某一天打開漫步,即可勾選當天的站點。', 'tours.walk.visit.failed': '無法標記該站點。需要網路連線,請稍後再試。', + 'tours.walk.themes': '漫步主題', + 'tours.walk.theme.culture': '文化與歷史', + 'tours.walk.theme.parks': '公園與景觀', + 'tours.walk.theme.food': '美食與在地生活', + 'tours.walk.theme.mixed': '綜合', + 'tours.walk.themeHint.culture': '沿途的博物館、畫廊、紀念碑和歷史遺跡。', + 'tours.walk.themeHint.parks': '沿途的公園、花園和觀景點。', + 'tours.walk.themeHint.food': '沿途的咖啡館、餐館和市集。', + 'tours.walk.themeHint.mixed': '各類都有一些:景點、博物館、公園、景觀、咖啡館和市集。', + 'tours.walk.themeHint.own': '下方類別為你自選;選擇主題會自動設定。', + 'tours.walk.themeReason': '推薦用於{theme}', 'tours.planner.tourType': '路線類型', 'tours.paddle.boat': '船隻', 'tours.paddle.boat.kayak': '獨木舟(Kayak)', diff --git a/shared/src/i18n/zh/tours.ts b/shared/src/i18n/zh/tours.ts index 2c1f2705c..e12db79fd 100644 --- a/shared/src/i18n/zh/tours.ts +++ b/shared/src/i18n/zh/tours.ts @@ -471,6 +471,17 @@ const tours: TranslationStrings = { 'tours.walk.visit.isSkipped': '当天已跳过', 'tours.walk.visit.fromDay': '从计划中的某一天打开漫步,即可勾选当天的站点。', 'tours.walk.visit.failed': '无法标记该站点。需要网络连接,请稍后再试。', + 'tours.walk.themes': '漫步主题', + 'tours.walk.theme.culture': '文化与历史', + 'tours.walk.theme.parks': '公园与景观', + 'tours.walk.theme.food': '美食与本地生活', + 'tours.walk.theme.mixed': '综合', + 'tours.walk.themeHint.culture': '沿途的博物馆、画廊、纪念碑和历史遗迹。', + 'tours.walk.themeHint.parks': '沿途的公园、花园和观景点。', + 'tours.walk.themeHint.food': '沿途的咖啡馆、餐馆和集市。', + 'tours.walk.themeHint.mixed': '各类都有一些:景点、博物馆、公园、景观、咖啡馆和集市。', + 'tours.walk.themeHint.own': '下方类别为你自选;选择主题会自动设置。', + 'tours.walk.themeReason': '推荐用于{theme}', 'tours.planner.tourType': '路线类型', 'tours.paddle.boat': '船只', 'tours.paddle.boat.kayak': '皮划艇',