fix(tours): a city walk's walking time, stays and total read apart and alike everywhere, and a stay plans no route again (CW-02)

A stay, a name, an importance or a protection set in a stop's dialog no
longer plans a city walk's route again: the walk stays ready to save, its
time overview follows at once, and one undo takes the change back without
routing either. A stop moved or added plans the route again as before. A
walk saves no breaks, so a cafe never counts as a stay and as a break at
once, and a break left from another type neither counts nor holds its save
up.

The planner and the tour detail show a walk's walking time, its stays and
their total apart and in the same words: 45 minutes of walking, a museum of
90 minutes and a cafe of 30 minutes make 2 h 45 min. A stay not entered yet
makes the stays and the total at least what is known, stays nobody entered
read not known yet, and stays entered as 0 read 0 min. A total entered by
hand keeps its own label, and the computed total shows beside it. The head
of the tour detail, the day row on the desktop and the phone, the tour
summary and the library of other trips show that same total, with a ≥ where
a stay is missing. Their time on the move is called walking, and the summary
says a walk is planned with its stays rather than breaks.

The tour list and the library carry the minutes a walk's stops are entered
with and how many have no stay yet, counted from the walk's points, so the
way back of a loop is no stop and its start's stay counts once. A loop run
the other way keeps its start as the stop there, with its key, name and
stay.

The planner's waypoint list keeps the rows of a leg in a file of their own,
and the tour detail its name heading in a part of its own, so both stay
within their size limits.
This commit is contained in:
Maurice
2026-10-20 01:28:50 +00:00
parent a2b6378245
commit fe78831bd9
68 changed files with 1539 additions and 438 deletions
+2
View File
@@ -294,6 +294,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'وقت المسار المحسوب',
'tours.scope.imported': 'الوقت من الاستيراد',
'tours.scope.planned': 'المخطط مع الاستراحات',
'tours.scope.plannedWithStays': 'المخطط مع مدد البقاء',
'tours.scope.noMeasures': 'لا مسافة أو ارتفاعات أو أوقات معروفة بعد.',
'tours.library.open': 'نقل جولة من رحلة أخرى',
'tours.library.eyebrow': 'نقل جولة',
@@ -501,6 +502,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'وقت المسار سيرًا بين المحطات، دون مدد البقاء.',
'tours.walk.stays': 'مدد البقاء',
'tours.walk.totalAtLeast': '{time} على الأقل',
'tours.walk.totalComputed': 'محسوب',
'tours.walk.stations': 'محطات الجولة',
'tours.walk.stationNumbered': 'المحطة {number}',
'tours.walk.progress': 'تمت زيارة {visited} من {total}',
+2
View File
@@ -283,6 +283,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Marşrut vaxtı',
'tours.scope.imported': 'İdxaldan vaxt',
'tours.scope.planned': 'Fasilələrlə planlaşdırılan',
'tours.scope.plannedWithStays': 'Qalmalarla planlaşdırılan',
'tours.scope.noMeasures': 'Hələ məsafə, hündürlük və ya vaxt məlum deyil.',
'tours.library.open': 'Başqa səfərdən tur götür',
'tours.library.eyebrow': 'Turu götür',
@@ -496,6 +497,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Dayanacaqlar arasında marşrutlaşdırıcının piyada vaxtı, qalma müddətləri olmadan.',
'tours.walk.stays': 'Qalmalar',
'tours.walk.totalAtLeast': 'ən azı {time}',
'tours.walk.totalComputed': 'Hesablanmış',
'tours.walk.stations': 'Gəzintinin dayanacaqları',
'tours.walk.stationNumbered': 'Dayanacaq {number}',
'tours.walk.progress': '{total} dayanacaqdan {visited} ziyarət edildi',
+2
View File
@@ -288,6 +288,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Tempo calculado',
'tours.scope.imported': 'Tempo das importações',
'tours.scope.planned': 'Planejado com pausas',
'tours.scope.plannedWithStays': 'Planejado com permanências',
'tours.scope.noMeasures': 'Ainda sem distância, altitudes ou tempos conhecidos.',
'tours.library.open': 'Trazer um passeio de outra viagem',
'tours.library.eyebrow': 'Trazer passeio',
@@ -502,6 +503,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'O tempo a pé do roteador entre as paradas, sem as permanências.',
'tours.walk.stays': 'Permanências',
'tours.walk.totalAtLeast': 'pelo menos {time}',
'tours.walk.totalComputed': 'Calculado',
'tours.walk.stations': 'Paradas do passeio',
'tours.walk.stationNumbered': 'Parada {number}',
'tours.walk.progress': '{visited} de {total} visitadas',
+2
View File
@@ -289,6 +289,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Temps calculat',
'tours.scope.imported': 'Temps de les importacions',
'tours.scope.planned': 'Planificat amb pauses',
'tours.scope.plannedWithStays': 'Planificat amb estades',
'tours.scope.noMeasures': 'Encara no hi ha distància, alçades ni temps coneguts.',
'tours.library.open': "Agafar una ruta d'un altre viatge",
'tours.library.eyebrow': 'Agafar una ruta',
@@ -503,6 +504,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'El temps a peu del càlcul de ruta entre parades, sense les estades.',
'tours.walk.stays': 'Estades',
'tours.walk.totalAtLeast': 'com a mínim {time}',
'tours.walk.totalComputed': 'Calculat',
'tours.walk.stations': 'Parades de la ruta',
'tours.walk.stationNumbered': 'Parada {number}',
'tours.walk.progress': '{visited} de {total} visitades',
+2
View File
@@ -283,6 +283,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Vypočtený čas',
'tours.scope.imported': 'Čas z importů',
'tours.scope.planned': 'Plán s přestávkami',
'tours.scope.plannedWithStays': 'Plán s pobyty',
'tours.scope.noMeasures': 'Zatím není známa vzdálenost, výšky ani časy.',
'tours.library.open': 'Převzít túru z jiné cesty',
'tours.library.eyebrow': 'Převzít túru',
@@ -493,6 +494,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Doba chůze mezi zastávkami podle plánovače trasy, bez pobytů.',
'tours.walk.stays': 'Pobyty',
'tours.walk.totalAtLeast': 'nejméně {time}',
'tours.walk.totalComputed': 'Vypočteno',
'tours.walk.stations': 'Zastávky procházky',
'tours.walk.stationNumbered': 'Zastávka {number}',
'tours.walk.progress': 'Navštíveno {visited} z {total}',
+2
View File
@@ -292,6 +292,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Routingzeit',
'tours.scope.imported': 'Zeit laut Import',
'tours.scope.planned': 'Geplant mit Pausen',
'tours.scope.plannedWithStays': 'Geplant mit Aufenthalten',
'tours.scope.noMeasures': 'Noch keine Distanz, Höhen oder Zeiten bekannt.',
'tours.library.open': 'Tour aus anderer Reise übernehmen',
'tours.library.eyebrow': 'Tour übernehmen',
@@ -507,6 +508,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Die Zeit des Routers zu Fuß zwischen den Stationen, ohne die Aufenthalte.',
'tours.walk.stays': 'Aufenthalte',
'tours.walk.totalAtLeast': 'mindestens {time}',
'tours.walk.totalComputed': 'Berechnet',
'tours.walk.stations': 'Stationen',
'tours.walk.stationNumbered': 'Station {number}',
'tours.walk.progress': '{visited} von {total} besucht',
+2
View File
@@ -282,6 +282,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Routed time',
'tours.scope.imported': 'Time from imports',
'tours.scope.planned': 'Planned with breaks',
'tours.scope.plannedWithStays': 'Planned with stays',
'tours.scope.noMeasures': 'No distance, heights or times known yet.',
'tours.library.open': 'Take over a tour from another trip',
'tours.library.eyebrow': 'Take over a tour',
@@ -494,6 +495,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': "The router's time on foot between the stops, without the stays.",
'tours.walk.stays': 'Stays',
'tours.walk.totalAtLeast': 'at least {time}',
'tours.walk.totalComputed': 'Computed',
'tours.walk.stations': 'Stops of the walk',
'tours.walk.stationNumbered': 'Stop {number}',
'tours.walk.progress': '{visited} of {total} visited',
+2
View File
@@ -288,6 +288,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Tiempo calculado',
'tours.scope.imported': 'Tiempo de las importaciones',
'tours.scope.planned': 'Planificado con pausas',
'tours.scope.plannedWithStays': 'Planificado con estancias',
'tours.scope.noMeasures': 'Aún no se conocen distancia, alturas ni tiempos.',
'tours.library.open': 'Traer una ruta de otro viaje',
'tours.library.eyebrow': 'Traer una ruta',
@@ -501,6 +502,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'El tiempo a pie del planificador entre paradas, sin las estancias.',
'tours.walk.stays': 'Estancias',
'tours.walk.totalAtLeast': 'al menos {time}',
'tours.walk.totalComputed': 'Calculado',
'tours.walk.stations': 'Paradas del paseo',
'tours.walk.stationNumbered': 'Parada {number}',
'tours.walk.progress': '{visited} de {total} visitadas',
+2
View File
@@ -285,6 +285,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Arvutatud aeg',
'tours.scope.imported': 'Aeg importidest',
'tours.scope.planned': 'Planeeritud koos pausidega',
'tours.scope.plannedWithStays': 'Planeeritud koos peatumistega',
'tours.scope.noMeasures': 'Vahemaa, kõrgused ja ajad pole veel teada.',
'tours.library.open': 'Võta matk üle teiselt reisilt',
'tours.library.eyebrow': 'Matka ülevõtmine',
@@ -496,6 +497,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Marsruutija kõndimisaeg peatuste vahel, ilma peatumisteta.',
'tours.walk.stays': 'Peatumised',
'tours.walk.totalAtLeast': 'vähemalt {time}',
'tours.walk.totalComputed': 'Arvutatud',
'tours.walk.stations': 'Jalutuse peatused',
'tours.walk.stationNumbered': 'Peatus {number}',
'tours.walk.progress': '{visited} / {total} külastatud',
+2
View File
@@ -295,6 +295,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Temps calculé',
'tours.scope.imported': 'Temps des imports',
'tours.scope.planned': 'Prévu avec pauses',
'tours.scope.plannedWithStays': 'Prévu avec arrêts',
'tours.scope.noMeasures': "Aucune distance, altitude ni durée connue pour l'instant.",
'tours.library.open': "Reprendre un itinéraire d'un autre voyage",
'tours.library.eyebrow': 'Reprendre un itinéraire',
@@ -511,6 +512,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': "Le temps à pied du calcul d'itinéraire entre les étapes, sans les arrêts.",
'tours.walk.stays': 'Arrêts',
'tours.walk.totalAtLeast': 'au moins {time}',
'tours.walk.totalComputed': 'Calculé',
'tours.walk.stations': 'Étapes de la balade',
'tours.walk.stationNumbered': 'Étape {number}',
'tours.walk.progress': '{visited} sur {total} visitées',
+2
View File
@@ -295,6 +295,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Υπολογισμένος χρόνος',
'tours.scope.imported': 'Χρόνος από εισαγωγές',
'tours.scope.planned': 'Με διαλείμματα',
'tours.scope.plannedWithStays': 'Με παραμονές',
'tours.scope.noMeasures': 'Δεν είναι ακόμη γνωστά απόσταση, υψόμετρα ή χρόνοι.',
'tours.library.open': 'Μεταφορά διαδρομής από άλλο ταξίδι',
'tours.library.eyebrow': 'Μεταφορά διαδρομής',
@@ -511,6 +512,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Ο χρόνος με τα πόδια του δρομολογητή ανάμεσα στις στάσεις, χωρίς τις παραμονές.',
'tours.walk.stays': 'Παραμονές',
'tours.walk.totalAtLeast': 'τουλάχιστον {time}',
'tours.walk.totalComputed': 'Υπολογισμένο',
'tours.walk.stations': 'Στάσεις της βόλτας',
'tours.walk.stationNumbered': 'Στάση {number}',
'tours.walk.progress': '{visited} από {total} επισκέψεις',
+2
View File
@@ -290,6 +290,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Számított idő',
'tours.scope.imported': 'Idő az importokból',
'tours.scope.planned': 'Tervezett, szünetekkel',
'tours.scope.plannedWithStays': 'Tervezett, tartózkodásokkal',
'tours.scope.noMeasures': 'Még nem ismert távolság, magasság vagy idő.',
'tours.library.open': 'Túra átvétele másik útból',
'tours.library.eyebrow': 'Túra átvétele',
@@ -503,6 +504,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Az útvonaltervező gyalogos ideje a megállók között, a tartózkodások nélkül.',
'tours.walk.stays': 'Tartózkodások',
'tours.walk.totalAtLeast': 'legalább {time}',
'tours.walk.totalComputed': 'Számított',
'tours.walk.stations': 'A séta megállói',
'tours.walk.stationNumbered': '{number}. megálló',
'tours.walk.progress': '{total} megállóból {visited} meglátogatva',
+2
View File
@@ -282,6 +282,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Waktu perutean',
'tours.scope.imported': 'Waktu dari impor',
'tours.scope.planned': 'Rencana dengan istirahat',
'tours.scope.plannedWithStays': 'Rencana dengan lama singgah',
'tours.scope.noMeasures': 'Belum ada jarak, ketinggian, atau waktu yang diketahui.',
'tours.library.open': 'Ambil tur dari perjalanan lain',
'tours.library.eyebrow': 'Ambil tur',
@@ -495,6 +496,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Waktu jalan kaki dari perute di antara titik singgah, tanpa lama singgah.',
'tours.walk.stays': 'Lama singgah',
'tours.walk.totalAtLeast': 'setidaknya {time}',
'tours.walk.totalComputed': 'Dihitung',
'tours.walk.stations': 'Titik singgah rute',
'tours.walk.stationNumbered': 'Titik {number}',
'tours.walk.progress': '{visited} dari {total} dikunjungi',
+2
View File
@@ -290,6 +290,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Tempo calcolato',
'tours.scope.imported': 'Tempo dalle importazioni',
'tours.scope.planned': 'Pianificato con pause',
'tours.scope.plannedWithStays': 'Pianificato con soste',
'tours.scope.noMeasures': 'Nessuna distanza, quota o tempo ancora noto.',
'tours.library.open': 'Riprendi un percorso da un altro viaggio',
'tours.library.eyebrow': 'Riprendi un percorso',
@@ -502,6 +503,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Il tempo a piedi del calcolo percorso tra le tappe, senza le soste.',
'tours.walk.stays': 'Soste',
'tours.walk.totalAtLeast': 'almeno {time}',
'tours.walk.totalComputed': 'Calcolato',
'tours.walk.stations': 'Tappe del percorso',
'tours.walk.stationNumbered': 'Tappa {number}',
'tours.walk.progress': '{visited} su {total} visitate',
+2
View File
@@ -276,6 +276,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'ルート計算の時間',
'tours.scope.imported': 'インポートの時間',
'tours.scope.planned': '休憩込みの計画',
'tours.scope.plannedWithStays': '滞在込みの計画',
'tours.scope.noMeasures': '距離、高度、時間はまだわかりません。',
'tours.library.open': '別の旅からツアーを取り込む',
'tours.library.eyebrow': 'ツアーを取り込む',
@@ -487,6 +488,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'ルート計算による立ち寄り先間の徒歩時間。滞在時間は含みません。',
'tours.walk.stays': '滞在',
'tours.walk.totalAtLeast': '{time} 以上',
'tours.walk.totalComputed': '計算値',
'tours.walk.stations': '立ち寄り先',
'tours.walk.stationNumbered': '立ち寄り先 {number}',
'tours.walk.progress': '{total} 件中 {visited} 件訪問済み',
+2
View File
@@ -274,6 +274,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': '경로 계산 시간',
'tours.scope.imported': '가져오기 시간',
'tours.scope.planned': '휴식 포함 계획',
'tours.scope.plannedWithStays': '머무는 시간 포함 계획',
'tours.scope.noMeasures': '아직 알려진 거리, 고도, 시간이 없습니다.',
'tours.library.open': '다른 여행에서 투어 가져오기',
'tours.library.eyebrow': '투어 가져오기',
@@ -483,6 +484,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': '경로 계산기가 낸 정류지 사이 도보 시간이며, 머무는 시간은 빠져 있습니다.',
'tours.walk.stays': '머무는 시간',
'tours.walk.totalAtLeast': '최소 {time}',
'tours.walk.totalComputed': '계산값',
'tours.walk.stations': '산책 정류지',
'tours.walk.stationNumbered': '정류지 {number}',
'tours.walk.progress': '{total}곳 중 {visited}곳 방문',
+2
View File
@@ -291,6 +291,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Berekende tijd',
'tours.scope.imported': 'Tijd uit imports',
'tours.scope.planned': 'Gepland met pauzes',
'tours.scope.plannedWithStays': 'Gepland met verblijven',
'tours.scope.noMeasures': 'Nog geen afstand, hoogtes of tijden bekend.',
'tours.library.open': 'Tocht overnemen uit een andere reis',
'tours.library.eyebrow': 'Tocht overnemen',
@@ -505,6 +506,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'De looptijd van de routeplanner tussen de haltes, zonder het verblijf.',
'tours.walk.stays': 'Verblijven',
'tours.walk.totalAtLeast': 'minstens {time}',
'tours.walk.totalComputed': 'Berekend',
'tours.walk.stations': 'Haltes van de wandeling',
'tours.walk.stationNumbered': 'Halte {number}',
'tours.walk.progress': '{visited} van {total} bezocht',
+2
View File
@@ -297,6 +297,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Czas wyliczony',
'tours.scope.imported': 'Czas z importów',
'tours.scope.planned': 'Plan z przerwami',
'tours.scope.plannedWithStays': 'Plan z postojami',
'tours.scope.noMeasures': 'Brak jeszcze znanego dystansu, wysokości i czasów.',
'tours.library.open': 'Przejmij trasę z innej podróży',
'tours.library.eyebrow': 'Przejmij trasę',
@@ -510,6 +511,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Czas marszu między przystankami według planera trasy, bez postojów.',
'tours.walk.stays': 'Postoje',
'tours.walk.totalAtLeast': 'co najmniej {time}',
'tours.walk.totalComputed': 'Obliczono',
'tours.walk.stations': 'Przystanki trasy',
'tours.walk.stationNumbered': 'Przystanek {number}',
'tours.walk.progress': 'Odwiedzono {visited} z {total}',
+2
View File
@@ -300,6 +300,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Расчётное время',
'tours.scope.imported': 'Время из импорта',
'tours.scope.planned': 'План с перерывами',
'tours.scope.plannedWithStays': 'План с остановками',
'tours.scope.noMeasures': 'Расстояние, высоты и время пока неизвестны.',
'tours.library.open': 'Взять маршрут из другой поездки',
'tours.library.eyebrow': 'Взять маршрут',
@@ -513,6 +514,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Время пешком между остановками по расчёту маршрута, без остановок на месте.',
'tours.walk.stays': 'Остановки',
'tours.walk.totalAtLeast': 'не меньше {time}',
'tours.walk.totalComputed': 'Расчёт',
'tours.walk.stations': 'Остановки прогулки',
'tours.walk.stationNumbered': 'Остановка {number}',
'tours.walk.progress': 'Посещено {visited} из {total}',
+2
View File
@@ -284,6 +284,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Vypočítaný čas',
'tours.scope.imported': 'Čas z importov',
'tours.scope.planned': 'Plán s prestávkami',
'tours.scope.plannedWithStays': 'Plán s pobytmi',
'tours.scope.noMeasures': 'Zatiaľ nie je známa vzdialenosť, výšky ani časy.',
'tours.library.open': 'Prevziať túru z inej cesty',
'tours.library.eyebrow': 'Prevziať túru',
@@ -495,6 +496,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Čas chôdze medzi zastávkami podľa plánovača trasy, bez pobytov.',
'tours.walk.stays': 'Pobyty',
'tours.walk.totalAtLeast': 'najmenej {time}',
'tours.walk.totalComputed': 'Vypočítané',
'tours.walk.stations': 'Zastávky prechádzky',
'tours.walk.stationNumbered': 'Zastávka {number}',
'tours.walk.progress': 'Navštívené {visited} z {total}',
+2
View File
@@ -281,6 +281,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Beräknad tid',
'tours.scope.imported': 'Tid från importer',
'tours.scope.planned': 'Planerat med pauser',
'tours.scope.plannedWithStays': 'Planerat med vistelser',
'tours.scope.noMeasures': 'Ingen sträcka, höjd eller tid känd ännu.',
'tours.library.open': 'Hämta en tur från en annan resa',
'tours.library.eyebrow': 'Hämta en tur',
@@ -494,6 +495,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Ruttplanerarens gångtid mellan stoppen, utan vistelserna.',
'tours.walk.stays': 'Vistelser',
'tours.walk.totalAtLeast': 'minst {time}',
'tours.walk.totalComputed': 'Beräknad',
'tours.walk.stations': 'Promenadens stopp',
'tours.walk.stationNumbered': 'Stopp {number}',
'tours.walk.progress': '{visited} av {total} besökta',
+2
View File
@@ -270,6 +270,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'เวลาจากการคำนวณเส้นทาง',
'tours.scope.imported': 'เวลาจากการนำเข้า',
'tours.scope.planned': 'วางแผนรวมพัก',
'tours.scope.plannedWithStays': 'วางแผนรวมเวลาแวะพัก',
'tours.scope.noMeasures': 'ยังไม่ทราบระยะทาง ความสูง หรือเวลา',
'tours.library.open': 'นำทัวร์จากทริปอื่นมาใช้',
'tours.library.eyebrow': 'นำทัวร์มาใช้',
@@ -477,6 +478,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'เวลาเดินระหว่างจุดแวะจากตัวคำนวณเส้นทาง ไม่รวมเวลาแวะพัก',
'tours.walk.stays': 'เวลาแวะพัก',
'tours.walk.totalAtLeast': 'อย่างน้อย {time}',
'tours.walk.totalComputed': 'ค่าคำนวณ',
'tours.walk.stations': 'จุดแวะของทริป',
'tours.walk.stationNumbered': 'จุดแวะที่ {number}',
'tours.walk.progress': 'แวะแล้ว {visited} จาก {total}',
+1 -1
View File
@@ -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 = 767;
const GENERAL_KEY_COUNT = 769;
function literalKeys(source: string): string[] {
const tree = ts.createSourceFile('locale.ts', source, ts.ScriptTarget.Latest, true);
+2
View File
@@ -283,6 +283,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Hesaplanan süre',
'tours.scope.imported': 'İçe aktarmalardan süre',
'tours.scope.planned': 'Molalarla planlanan',
'tours.scope.plannedWithStays': 'Kalışlarla planlanan',
'tours.scope.noMeasures': 'Henüz bilinen mesafe, yükseklik veya süre yok.',
'tours.library.open': 'Başka bir geziden tur al',
'tours.library.eyebrow': 'Tur al',
@@ -497,6 +498,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Rota hesaplayıcının duraklar arasındaki yürüme süresi, kalışlar hariç.',
'tours.walk.stays': 'Kalışlar',
'tours.walk.totalAtLeast': 'en az {time}',
'tours.walk.totalComputed': 'Hesaplanan',
'tours.walk.stations': 'Yürüyüşün durakları',
'tours.walk.stationNumbered': 'Durak {number}',
'tours.walk.progress': '{total} duraktan {visited} ziyaret edildi',
+2
View File
@@ -296,6 +296,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Розрахований час',
'tours.scope.imported': 'Час з імпорту',
'tours.scope.planned': 'План з перервами',
'tours.scope.plannedWithStays': 'План з перебуваннями',
'tours.scope.noMeasures': 'Відстань, висоти й час поки невідомі.',
'tours.library.open': 'Взяти маршрут з іншої подорожі',
'tours.library.eyebrow': 'Взяти маршрут',
@@ -509,6 +510,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Час пішки між зупинками за розрахунком маршруту, без перебування.',
'tours.walk.stays': 'Перебування',
'tours.walk.totalAtLeast': 'щонайменше {time}',
'tours.walk.totalComputed': 'Розрахунок',
'tours.walk.stations': 'Зупинки прогулянки',
'tours.walk.stationNumbered': 'Зупинка {number}',
'tours.walk.progress': 'Відвідано {visited} з {total}',
+2
View File
@@ -283,6 +283,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': 'Thời gian định tuyến',
'tours.scope.imported': 'Thời gian từ bản nhập',
'tours.scope.planned': 'Kế hoạch gồm nghỉ',
'tours.scope.plannedWithStays': 'Kế hoạch gồm thời gian dừng',
'tours.scope.noMeasures': 'Chưa biết quãng đường, độ cao hay thời gian.',
'tours.library.open': 'Lấy chuyến từ chuyến đi khác',
'tours.library.eyebrow': 'Lấy chuyến',
@@ -494,6 +495,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': 'Thời gian đi bộ giữa các điểm dừng do bộ định tuyến tính, không gồm thời gian dừng.',
'tours.walk.stays': 'Thời gian dừng',
'tours.walk.totalAtLeast': 'ít nhất {time}',
'tours.walk.totalComputed': 'Đã tính',
'tours.walk.stations': 'Các điểm dừng',
'tours.walk.stationNumbered': 'Điểm dừng {number}',
'tours.walk.progress': 'Đã ghé {visited}/{total}',
+2
View File
@@ -260,6 +260,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': '規劃時間',
'tours.scope.imported': '匯入時間',
'tours.scope.planned': '含休息的計畫',
'tours.scope.plannedWithStays': '含停留的計畫',
'tours.scope.noMeasures': '尚無已知的距離、高度或時間。',
'tours.library.open': '從其他行程引入路線',
'tours.library.eyebrow': '引入路線',
@@ -462,6 +463,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': '路線規劃給出的站點間步行時間,不含停留時間。',
'tours.walk.stays': '停留',
'tours.walk.totalAtLeast': '至少 {time}',
'tours.walk.totalComputed': '計算值',
'tours.walk.stations': '漫步站點',
'tours.walk.stationNumbered': '第 {number} 站',
'tours.walk.progress': '已到訪 {visited}/{total}',
+2
View File
@@ -261,6 +261,7 @@ const tours: TranslationStrings = {
'tours.scope.routed': '规划时间',
'tours.scope.imported': '导入时间',
'tours.scope.planned': '含休息的计划',
'tours.scope.plannedWithStays': '含停留的计划',
'tours.scope.noMeasures': '尚无已知的距离、高度或时间。',
'tours.library.open': '从其他行程引入路线',
'tours.library.eyebrow': '引入路线',
@@ -463,6 +464,7 @@ const tours: TranslationStrings = {
'tours.walk.timeEstimatedInfo': '路线规划给出的站点间步行时间,不含停留时间。',
'tours.walk.stays': '停留',
'tours.walk.totalAtLeast': '至少 {time}',
'tours.walk.totalComputed': '计算值',
'tours.walk.stations': '漫步站点',
'tours.walk.stationNumbered': '第 {number} 站',
'tours.walk.progress': '已到访 {visited}/{total}',
+3
View File
@@ -42,6 +42,9 @@ export const tourLibraryItemSchema = tourListItemSchema
max_hiking_difficulty: true,
has_waypoints: true,
origin: true,
station_count: true,
station_stay_minutes: true,
station_stays_unknown: true,
})
.extend({ trip: tourLibraryTripSchema });
export type TourLibraryItem = z.infer<typeof tourLibraryItemSchema>;
+4
View File
@@ -237,6 +237,10 @@ export const tourListItemSchema = tourSchema.extend({
revision: tourRevisionSchema.optional(),
/** CW-03: a city walk's stations, its points that are no shaping points; null for any other type. */
station_count: z.number().int().nonnegative().nullable().optional(),
/** CW-02: the stays entered at a city walk's stations, summed; null for any other type. */
station_stay_minutes: z.number().int().nonnegative().nullable().optional(),
/** CW-02: how many of a city walk's stations have no stay entered yet; null for any other type. */
station_stays_unknown: z.number().int().nonnegative().nullable().optional(),
});
export type TourListItem = z.infer<typeof tourListItemSchema>;