mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-20 14:06:27 +00:00
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.
This commit is contained in:
@@ -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<typeof usePoiInsertion>;
|
||||
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({
|
||||
<div className="flex flex-col gap-2 px-2 pb-2.5">
|
||||
<p className="m-0 flex flex-wrap gap-x-3 text-content-faint" style={fs(10.5, 'body')}>
|
||||
<span>{t(look.labelKey)}</span>
|
||||
{theme && <span>{t('tours.walk.themeReason', { theme: t(`tours.walk.theme.${theme}`) })}</span>}
|
||||
<span>{t(poi.source === 'trek-places' ? 'tours.poi.source.trek' : 'tours.poi.source.osm')}</span>
|
||||
</p>
|
||||
{poi.address && (
|
||||
@@ -307,6 +311,20 @@ export function TourPoiSearchCard({ planner }: { planner: TourPlannerController
|
||||
<p className="m-0 text-content-faint" style={fs(11, 'body')}>
|
||||
{t('tours.poi.intro')}
|
||||
</p>
|
||||
{search.themes.length > 0 && (
|
||||
<div className="flex flex-col gap-1.5" data-testid="tour-poi-themes">
|
||||
<Segmented<string>
|
||||
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}`) }))}
|
||||
/>
|
||||
<span className="text-content-faint" style={fs(11, 'body')}>
|
||||
{search.theme ? t(`tours.walk.themeHint.${search.theme}`) : t('tours.walk.themeHint.own')}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
<div className="flex flex-wrap gap-1.5" role="group" aria-label={t('tours.poi.categories')}>
|
||||
{search.offered.map((category) => (
|
||||
<CategoryChip
|
||||
@@ -363,6 +381,7 @@ export function TourPoiSearchCard({ planner }: { planner: TourPlannerController
|
||||
planner={planner}
|
||||
insertion={insertion}
|
||||
unit={unit}
|
||||
theme={search.theme && (WALK_THEMES[search.theme] as readonly string[]).includes(poi.category) ? search.theme : null}
|
||||
/>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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': 'كاياك',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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': 'Καγιάκ',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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': 'カヤック',
|
||||
|
||||
@@ -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': '카약',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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': 'Каяк',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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': 'เรือคายัก',
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)',
|
||||
|
||||
@@ -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': 'Каяк',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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)',
|
||||
|
||||
@@ -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': '皮划艇',
|
||||
|
||||
Reference in New Issue
Block a user