mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-21 14:36:31 +00:00
feat(tours): plan a trail run on forest tracks and natural paths
RUN-02. Trail running joins Running as a run profile, chosen on purpose in the planner and in the GPX import. It asks Valhalla's pedestrian costing for tracks wherever they serve (use_tracks 1) and admits mountain paths up to T2 (max_hiking_difficulty 2), never T3 and above, with ferries only where no way on land exists. Checked with trace_attributes against the public instance: above Freiburg Guenterstal up to the Schauinsland the route went from 82 % roads and 83 % paved (running) to 78 % forest tracks and 81 % compacted, gravel and dirt; Rathen to the Bastei took 28 % of T2 path that running leaves out; Heidelberg's old town stayed as it was. Leaning on footways (walkway_factor) was tried and left out, it moved runs onto paved footways. While a run is planned, a card says what it runs on: its surfaces, the hiking grades of its paths (sac_scale, T1 to T6, as mappers gave them) and its kinds of way, each as shares with lengths that point at their stretches on the map. A way without a grade or a surface is its own row, unknown and never easy, and an info dot says the grades say nothing about whether a way can be run. The head carries the unpaved share and the hardest graded path as badges. The line is matched on foot for this, so steps and mountain paths stay on it; a bike tour's is matched as before. Reading fails, goes offline or is retried as for a bike tour, and nothing of it changes the run. Pace and time are RUN-01's: the running time stays the distance at the runner's pace, with climbs, descents and difficulty left out, whatever the profile. A profile change plans the route again and keeps the pace; a failed trail route keeps the last route and holds Save back. The card's building blocks moved out of the bike card into RouteWaySections, so both cards share one set of rows, bars and status lines. The run_profile column already allowed trail (RUN-01), so no migration. GPX export names a trail run trail_running, list_tours describes the profile as a routing preference, never a statement that a way can be run.
This commit is contained in:
@@ -435,6 +435,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'المسافة × وتيرتك ولا شيء غير ذلك: لا تُحتسب الصعودات والنزولات ولا الصعوبة. إنه تخطيط، وليس وقتًا مسجّلًا.',
|
||||
'tours.run.timeSum': '{distance} بوتيرة {pace} دقيقة/كم تساوي {time}',
|
||||
'tours.run.profile.trail': 'الجري على المسارات الطبيعية',
|
||||
'tours.run.profileHint.trail': 'يفضّل طرق الغابات والممرات الطبيعية، حتى الممرات الجبلية (T2).',
|
||||
'tours.run.ways.grade': 'صعوبة المسار (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'حول صعوبة المسار',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'درجات المشي كما حددها مساهمو OpenStreetMap. الطريق بلا درجة مجهول، وليس سهلًا. لا تقول شيئًا عن إمكانية الجري عليه أو مدى ملاءمته لك.',
|
||||
'tours.run.ways.gradeTop': 'أصعب مسار مصنّف: {grade}',
|
||||
'tours.bike.profile': 'الملف',
|
||||
'tours.bike.profile.touring': 'تجوال',
|
||||
'tours.bike.profile.road': 'طريق',
|
||||
|
||||
@@ -425,6 +425,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Məsafə × sizin temp, başqa heç nə: yoxuşlar, enişlər və çətinlik nəzərə alınmır. Bu plandır, qeydə alınmış vaxt deyil.',
|
||||
'tours.run.timeSum': '{distance}, {pace} dəq/km tempdə: {time}',
|
||||
'tours.run.profile.trail': 'Trail qaçışı',
|
||||
'tours.run.profileHint.trail': 'Meşə yollarına və təbii cığırlara üstünlük verir, dağ cığırlarına (T2) qədər.',
|
||||
'tours.run.ways.grade': 'Yolun çətinliyi (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Yolun çətinliyi haqqında',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'OpenStreetMap xəritəçilərinin verdiyi yürüş dərəcələri. Dərəcəsi olmayan yol asan deyil, naməlumdur. Onlar yolun qaçmağa yararlı olub-olmadığı və ya sizə uyğun olub-olmadığı barədə heç nə demir.',
|
||||
'tours.run.ways.gradeTop': 'Ən çətin qiymətləndirilmiş cığır: {grade}',
|
||||
'tours.bike.profile': 'Profil',
|
||||
'tours.bike.profile.touring': 'Turinq',
|
||||
'tours.bike.profile.road': 'Yol',
|
||||
|
||||
@@ -431,6 +431,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Distância × seu ritmo e nada mais: subidas, descidas e dificuldade não entram. Um plano, não um tempo registrado.',
|
||||
'tours.run.timeSum': '{distance} a {pace} min/km dão {time}',
|
||||
'tours.run.profile.trail': 'Corrida em trilha',
|
||||
'tours.run.profileHint.trail': 'Prefere estradas florestais e trilhas naturais, até trilhas de montanha (T2).',
|
||||
'tours.run.ways.grade': 'Dificuldade da trilha (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Sobre a dificuldade da trilha',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Graus de caminhada como os mapeadores do OpenStreetMap os informaram. Um caminho sem grau é desconhecido, não fácil. Eles não dizem se dá para correr no caminho nem se ele combina com você.',
|
||||
'tours.run.ways.gradeTop': 'Trilha classificada mais difícil: {grade}',
|
||||
'tours.bike.profile': 'Perfil',
|
||||
'tours.bike.profile.touring': 'Cicloturismo',
|
||||
'tours.bike.profile.road': 'Estrada',
|
||||
|
||||
@@ -432,6 +432,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Distància × el teu ritme i res més: el desnivell i la dificultat no hi compten. Una planificació, no un temps enregistrat.',
|
||||
'tours.run.timeSum': '{distance} a {pace} min/km són {time}',
|
||||
'tours.run.profile.trail': 'Curses de muntanya',
|
||||
'tours.run.profileHint.trail': 'Prefereix pistes forestals i corriols naturals, fins a camins de muntanya (T2).',
|
||||
'tours.run.ways.grade': 'Dificultat del camí (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Sobre la dificultat del camí',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Graus d’excursionisme tal com els han posat els mapejadors d’OpenStreetMap. Un camí sense grau és desconegut, no fàcil. No diuen si un camí es pot córrer ni si et convé.',
|
||||
'tours.run.ways.gradeTop': 'Camí classificat més difícil: {grade}',
|
||||
'tours.bike.profile': 'Perfil',
|
||||
'tours.bike.profile.touring': 'Cicloturisme',
|
||||
'tours.bike.profile.road': 'Carretera',
|
||||
|
||||
@@ -424,6 +424,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Vzdálenost × vaše tempo a nic dalšího: převýšení a obtížnost se nezapočítávají. Plán, ne zaznamenaný čas.',
|
||||
'tours.run.timeSum': '{distance} při {pace} min/km dává {time}',
|
||||
'tours.run.profile.trail': 'Trailový běh',
|
||||
'tours.run.profileHint.trail': 'Upřednostňuje lesní cesty a přírodní stezky, až po horské stezky (T2).',
|
||||
'tours.run.ways.grade': 'Obtížnost cesty (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'O obtížnosti cesty',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Turistické stupně, jak je zadali mapovači OpenStreetMap. Cesta bez stupně je neznámá, ne snadná. Neříkají nic o tom, zda se po cestě dá běžet nebo zda se pro tebe hodí.',
|
||||
'tours.run.ways.gradeTop': 'Nejtěžší hodnocená cesta: {grade}',
|
||||
'tours.bike.profile': 'Profil',
|
||||
'tours.bike.profile.touring': 'Treking',
|
||||
'tours.bike.profile.road': 'Silnice',
|
||||
|
||||
@@ -434,6 +434,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Distanz × deine Pace und sonst nichts: Höhenmeter und Schwierigkeit gehen nicht ein. Eine Planung, keine aufgezeichnete Zeit.',
|
||||
'tours.run.timeSum': '{distance} bei {pace} min/km ergibt {time}',
|
||||
'tours.run.profile.trail': 'Trailrunning',
|
||||
'tours.run.profileHint.trail': 'Bevorzugt Forstwege und naturbelassene Pfade, bis zu Bergwegen (T2).',
|
||||
'tours.run.ways.grade': 'Wegschwierigkeit (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Zur Wegschwierigkeit',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Wanderskala, wie OpenStreetMap-Mapper sie vergeben haben. Ein Weg ohne Angabe ist unbekannt, nicht leicht. Sie sagt nichts darüber, ob ein Weg laufbar ist oder zu dir passt.',
|
||||
'tours.run.ways.gradeTop': 'Schwierigster bewerteter Weg: {grade}',
|
||||
'tours.bike.profile': 'Profil',
|
||||
'tours.bike.profile.touring': 'Touring', // same-as-en
|
||||
'tours.bike.profile.road': 'Rennrad',
|
||||
|
||||
@@ -423,6 +423,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Distance × your pace and nothing else: climbs, descents and difficulty are not included. A plan, not a recorded time.',
|
||||
'tours.run.timeSum': '{distance} at {pace} min/km is {time}',
|
||||
'tours.run.profile.trail': 'Trail running',
|
||||
'tours.run.profileHint.trail': 'Prefers forest tracks and natural paths, up to mountain paths (T2).',
|
||||
'tours.run.ways.grade': 'Path difficulty (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'About the path difficulty',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Hiking grades as OpenStreetMap mappers gave them. A way without one is unknown, not easy. They say nothing about whether a way can be run or suits you.',
|
||||
'tours.run.ways.gradeTop': 'Hardest graded path: {grade}',
|
||||
'tours.bike.profile': 'Profile',
|
||||
'tours.bike.profile.touring': 'Touring',
|
||||
'tours.bike.profile.road': 'Road',
|
||||
|
||||
@@ -431,6 +431,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Distancia × tu ritmo y nada más: el desnivel y la dificultad no se tienen en cuenta. Una planificación, no un tiempo registrado.',
|
||||
'tours.run.timeSum': '{distance} a {pace} min/km son {time}',
|
||||
'tours.run.profile.trail': 'Carrera de montaña',
|
||||
'tours.run.profileHint.trail': 'Prefiere pistas forestales y senderos naturales, hasta senderos de montaña (T2).',
|
||||
'tours.run.ways.grade': 'Dificultad del camino (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Sobre la dificultad del camino',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Grados de senderismo tal como los asignaron los mapeadores de OpenStreetMap. Un camino sin grado es desconocido, no fácil. No dicen si un camino se puede correr ni si te conviene.',
|
||||
'tours.run.ways.gradeTop': 'Camino graduado más difícil: {grade}',
|
||||
'tours.bike.profile': 'Perfil',
|
||||
'tours.bike.profile.touring': 'Cicloturismo',
|
||||
'tours.bike.profile.road': 'Carretera',
|
||||
|
||||
@@ -426,6 +426,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Vahemaa × sinu tempo ja ei midagi muud: tõusud, langused ja raskus ei lähe arvesse. Plaan, mitte salvestatud aeg.',
|
||||
'tours.run.timeSum': '{distance} tempos {pace} min/km teeb {time}',
|
||||
'tours.run.profile.trail': 'Rajajooks',
|
||||
'tours.run.profileHint.trail': 'Eelistab metsateid ja looduslikke radu, kuni mägiradadeni (T2).',
|
||||
'tours.run.ways.grade': 'Raja raskus (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Raja raskusest',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Matkaraskused, nagu OpenStreetMapi kaardistajad need andsid. Ilma raskuseta tee on teadmata, mitte lihtne. Need ei ütle midagi selle kohta, kas teel saab joosta või kas see sulle sobib.',
|
||||
'tours.run.ways.gradeTop': 'Raskeim hinnatud rada: {grade}',
|
||||
'tours.bike.profile': 'Profiil',
|
||||
'tours.bike.profile.touring': 'Matk',
|
||||
'tours.bike.profile.road': 'Maantee',
|
||||
|
||||
@@ -437,6 +437,14 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Distance × ton allure, rien d’autre : dénivelé et difficulté ne sont pas pris en compte. Une prévision, pas un temps enregistré.',
|
||||
'tours.run.timeSum': '{distance} à {pace} min/km font {time}',
|
||||
'tours.run.profile.trail': 'Trail',
|
||||
'tours.run.profileHint.trail':
|
||||
'Privilégie les chemins forestiers et les sentiers naturels, jusqu’aux sentiers de montagne (T2).',
|
||||
'tours.run.ways.grade': 'Difficulté du chemin (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'À propos de la difficulté du chemin',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Cotations de randonnée telles que les contributeurs OpenStreetMap les ont saisies. Un chemin sans cotation est inconnu, pas facile. Elles ne disent pas si un chemin se court ni s’il vous convient.',
|
||||
'tours.run.ways.gradeTop': 'Chemin coté le plus difficile : {grade}',
|
||||
'tours.bike.profile': 'Profil',
|
||||
'tours.bike.profile.touring': 'Voyage',
|
||||
'tours.bike.profile.road': 'Route',
|
||||
|
||||
@@ -440,6 +440,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Απόσταση × ο ρυθμός σου και τίποτα άλλο: ανηφόρες, κατηφόρες και δυσκολία δεν λαμβάνονται υπόψη. Πρόγραμμα, όχι καταγεγραμμένος χρόνος.',
|
||||
'tours.run.timeSum': '{distance} με {pace} λεπ/km κάνει {time}',
|
||||
'tours.run.profile.trail': 'Ορεινό τρέξιμο',
|
||||
'tours.run.profileHint.trail': 'Προτιμά δασικούς δρόμους και φυσικά μονοπάτια, έως ορεινά μονοπάτια (T2).',
|
||||
'tours.run.ways.grade': 'Δυσκολία μονοπατιού (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Σχετικά με τη δυσκολία μονοπατιού',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Βαθμοί πεζοπορίας όπως τους έδωσαν οι χαρτογράφοι του OpenStreetMap. Ένας δρόμος χωρίς βαθμό είναι άγνωστος, όχι εύκολος. Δεν λένε τίποτα για το αν ένας δρόμος τρέχεται ή αν σου ταιριάζει.',
|
||||
'tours.run.ways.gradeTop': 'Δυσκολότερο βαθμολογημένο μονοπάτι: {grade}',
|
||||
'tours.bike.profile': 'Προφίλ',
|
||||
'tours.bike.profile.touring': 'Περιήγηση',
|
||||
'tours.bike.profile.road': 'Δρόμου',
|
||||
|
||||
@@ -431,6 +431,14 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Távolság × a tempód, semmi más: a szintemelkedés és a nehézség nem számít bele. Terv, nem rögzített idő.',
|
||||
'tours.run.timeSum': '{distance} {pace} perc/km tempóval: {time}',
|
||||
'tours.run.profile.trail': 'Terepfutás',
|
||||
'tours.run.profileHint.trail':
|
||||
'Előnyben részesíti az erdei utakat és a természetes ösvényeket, a hegyi ösvényekig (T2).',
|
||||
'tours.run.ways.grade': 'Útnehézség (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Az útnehézségről',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Túranehézségi fokozatok, ahogy az OpenStreetMap térképezői megadták. A fokozat nélküli út ismeretlen, nem könnyű. Semmit sem mondanak arról, hogy egy út futható-e, vagy illik-e hozzád.',
|
||||
'tours.run.ways.gradeTop': 'Legnehezebb besorolt ösvény: {grade}',
|
||||
'tours.bike.profile': 'Profil',
|
||||
'tours.bike.profile.touring': 'Túra',
|
||||
'tours.bike.profile.road': 'Országúti',
|
||||
|
||||
@@ -426,6 +426,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Jarak × pace-mu, tidak ada yang lain: tanjakan, turunan, dan kesulitan tidak dihitung. Sebuah rencana, bukan waktu yang direkam.',
|
||||
'tours.run.timeSum': '{distance} dengan pace {pace} mnt/km menjadi {time}',
|
||||
'tours.run.profile.trail': 'Lari trail',
|
||||
'tours.run.profileHint.trail': 'Mengutamakan jalan hutan dan jalur alami, hingga jalur gunung (T2).',
|
||||
'tours.run.ways.grade': 'Kesulitan jalur (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Tentang kesulitan jalur',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Tingkat pendakian seperti yang diberikan pemeta OpenStreetMap. Jalan tanpa tingkat tidak diketahui, bukan mudah. Tingkat ini tidak menyatakan apakah jalan bisa dilari atau cocok untukmu.',
|
||||
'tours.run.ways.gradeTop': 'Jalur bertingkat tersulit: {grade}',
|
||||
'tours.bike.profile': 'Profil',
|
||||
'tours.bike.profile.touring': 'Touring', // same-as-en
|
||||
'tours.bike.profile.road': 'Road', // same-as-en
|
||||
|
||||
@@ -434,6 +434,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Distanza × il tuo passo e nient’altro: dislivello e difficoltà non sono considerati. Una pianificazione, non un tempo registrato.',
|
||||
'tours.run.timeSum': '{distance} a {pace} min/km fanno {time}',
|
||||
'tours.run.profile.trail': 'Corsa su sentiero',
|
||||
'tours.run.profileHint.trail': 'Preferisce strade forestali e sentieri naturali, fino ai sentieri di montagna (T2).',
|
||||
'tours.run.ways.grade': 'Difficoltà del sentiero (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Sulla difficoltà del sentiero',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Gradi escursionistici come li hanno assegnati i mappatori di OpenStreetMap. Un sentiero senza grado è sconosciuto, non facile. Non dicono se un sentiero si può correre né se fa per te.',
|
||||
'tours.run.ways.gradeTop': 'Sentiero classificato più difficile: {grade}',
|
||||
'tours.bike.profile': 'Profilo',
|
||||
'tours.bike.profile.touring': 'Turismo',
|
||||
'tours.bike.profile.road': 'Strada',
|
||||
|
||||
@@ -413,6 +413,12 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfoLabel': '走行時間の計画方法',
|
||||
'tours.run.timeEstimatedInfo': '距離 × あなたのペースのみで、登り、下り、難しさは含みません。記録された時間ではなく計画です。',
|
||||
'tours.run.timeSum': '{distance} を {pace} 分/km で {time}',
|
||||
'tours.run.profile.trail': 'トレイルランニング',
|
||||
'tours.run.profileHint.trail': '林道や自然の小道を優先し、山道 (T2) まで含みます。',
|
||||
'tours.run.ways.grade': '道の難易度 (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': '道の難易度について',
|
||||
'tours.run.ways.gradeInfo': 'OpenStreetMap のマッパーが付けたハイキングの難易度です。難易度のない道は簡単という意味ではなく、不明です。道を走れるかどうか、あなたに合うかどうかは示しません。',
|
||||
'tours.run.ways.gradeTop': '最も難しい格付けの道: {grade}',
|
||||
'tours.bike.profile': 'プロファイル',
|
||||
'tours.bike.profile.touring': 'ツーリング',
|
||||
'tours.bike.profile.road': 'ロード',
|
||||
|
||||
@@ -411,6 +411,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfoLabel': '달리기 시간 계획 방법',
|
||||
'tours.run.timeEstimatedInfo': '거리 × 나의 페이스뿐이며, 오르막, 내리막, 난이도는 포함되지 않습니다. 기록된 시간이 아니라 계획입니다.',
|
||||
'tours.run.timeSum': '{distance}, {pace}분/km 페이스로 {time}',
|
||||
'tours.run.profile.trail': '트레일 러닝',
|
||||
'tours.run.profileHint.trail': '임도와 자연 오솔길을 우선하며, 산길(T2)까지 포함합니다.',
|
||||
'tours.run.ways.grade': '길 난이도 (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': '길 난이도 안내',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'OpenStreetMap 매퍼가 매긴 하이킹 등급입니다. 등급이 없는 길은 쉬운 것이 아니라 알 수 없는 것입니다. 길을 달릴 수 있는지, 나에게 맞는지는 알려 주지 않습니다.',
|
||||
'tours.run.ways.gradeTop': '가장 어려운 등급의 길: {grade}',
|
||||
'tours.bike.profile': '프로필',
|
||||
'tours.bike.profile.touring': '투어링',
|
||||
'tours.bike.profile.road': '로드',
|
||||
|
||||
@@ -433,6 +433,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Afstand × je tempo en verder niets: hoogtemeters en moeilijkheid tellen niet mee. Een planning, geen opgenomen tijd.',
|
||||
'tours.run.timeSum': '{distance} bij {pace} min/km is {time}',
|
||||
'tours.run.profile.trail': 'Trailrunning',
|
||||
'tours.run.profileHint.trail': 'Geeft de voorkeur aan bospaden en onverharde paden, tot bergpaden (T2).',
|
||||
'tours.run.ways.grade': 'Moeilijkheid van het pad (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Over de moeilijkheid van het pad',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Wandelgraden zoals OpenStreetMap-mappers ze hebben ingevoerd. Een pad zonder graad is onbekend, niet makkelijk. Ze zeggen niets over of een pad te lopen is of bij je past.',
|
||||
'tours.run.ways.gradeTop': 'Moeilijkste gegradeerde pad: {grade}',
|
||||
'tours.bike.profile': 'Profiel',
|
||||
'tours.bike.profile.touring': 'Toer',
|
||||
'tours.bike.profile.road': 'Racefiets',
|
||||
|
||||
@@ -440,6 +440,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Dystans × Twoje tempo i nic więcej: przewyższenia i trudność nie są uwzględniane. Plan, a nie zarejestrowany czas.',
|
||||
'tours.run.timeSum': '{distance} przy {pace} min/km to {time}',
|
||||
'tours.run.profile.trail': 'Bieganie terenowe',
|
||||
'tours.run.profileHint.trail': 'Preferuje drogi leśne i naturalne ścieżki, aż po ścieżki górskie (T2).',
|
||||
'tours.run.ways.grade': 'Trudność ścieżki (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'O trudności ścieżki',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Stopnie trudności szlaków nadane przez maperów OpenStreetMap. Droga bez stopnia jest nieznana, a nie łatwa. Nie mówią, czy da się nią biec ani czy jest dla ciebie.',
|
||||
'tours.run.ways.gradeTop': 'Najtrudniejsza oceniona ścieżka: {grade}',
|
||||
'tours.bike.profile': 'Profil',
|
||||
'tours.bike.profile.touring': 'Turystyka',
|
||||
'tours.bike.profile.road': 'Szosa',
|
||||
|
||||
@@ -444,6 +444,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Расстояние × ваш темп и ничего больше: набор высоты и сложность не учитываются. Это план, а не записанное время.',
|
||||
'tours.run.timeSum': '{distance} в темпе {pace} мин/км: {time}',
|
||||
'tours.run.profile.trail': 'Трейлраннинг',
|
||||
'tours.run.profileHint.trail': 'Предпочитает лесные дороги и природные тропы, вплоть до горных троп (T2).',
|
||||
'tours.run.ways.grade': 'Сложность тропы (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'О сложности тропы',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Категории сложности троп, как их указали участники OpenStreetMap. Путь без категории неизвестен, а не прост. Они ничего не говорят о том, можно ли по пути бежать и подходит ли он вам.',
|
||||
'tours.run.ways.gradeTop': 'Самая сложная оцененная тропа: {grade}',
|
||||
'tours.bike.profile': 'Профиль',
|
||||
'tours.bike.profile.touring': 'Туризм',
|
||||
'tours.bike.profile.road': 'Шоссе',
|
||||
|
||||
@@ -425,6 +425,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Vzdialenosť × vaše tempo a nič iné: prevýšenie a náročnosť sa nezapočítavajú. Plán, nie zaznamenaný čas.',
|
||||
'tours.run.timeSum': '{distance} pri {pace} min/km dáva {time}',
|
||||
'tours.run.profile.trail': 'Trailový beh',
|
||||
'tours.run.profileHint.trail': 'Uprednostňuje lesné cesty a prírodné chodníky, až po horské chodníky (T2).',
|
||||
'tours.run.ways.grade': 'Náročnosť cesty (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'O náročnosti cesty',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Turistické stupne, ako ich zadali mapovači OpenStreetMap. Cesta bez stupňa je neznáma, nie ľahká. Nehovoria nič o tom, či sa po ceste dá bežať alebo či sa pre teba hodí.',
|
||||
'tours.run.ways.gradeTop': 'Najnáročnejšia hodnotená cesta: {grade}',
|
||||
'tours.bike.profile': 'Profil',
|
||||
'tours.bike.profile.touring': 'Trekking',
|
||||
'tours.bike.profile.road': 'Cestný',
|
||||
|
||||
@@ -422,6 +422,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Sträcka × ditt tempo och inget annat: stigningar och svårighet räknas inte in. En planering, ingen inspelad tid.',
|
||||
'tours.run.timeSum': '{distance} i {pace} min/km blir {time}',
|
||||
'tours.run.profile.trail': 'Traillöpning',
|
||||
'tours.run.profileHint.trail': 'Föredrar skogsvägar och naturstigar, upp till fjällstigar (T2).',
|
||||
'tours.run.ways.grade': 'Ledens svårighet (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Om ledens svårighet',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Vandringsgrader som OpenStreetMap-kartläggare har angett dem. En väg utan grad är okänd, inte lätt. De säger inget om huruvida en väg går att springa eller passar dig.',
|
||||
'tours.run.ways.gradeTop': 'Svåraste graderade led: {grade}',
|
||||
'tours.bike.profile': 'Profil',
|
||||
'tours.bike.profile.touring': 'Tur',
|
||||
'tours.bike.profile.road': 'Landsväg',
|
||||
|
||||
@@ -403,6 +403,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'ระยะทาง × เพซของคุณเท่านั้น ไม่รวมทางขึ้น ทางลง และความยาก เป็นแผน ไม่ใช่เวลาที่บันทึกไว้',
|
||||
'tours.run.timeSum': '{distance} ที่เพซ {pace} นาที/km เท่ากับ {time}',
|
||||
'tours.run.profile.trail': 'วิ่งเทรล',
|
||||
'tours.run.profileHint.trail': 'เน้นถนนในป่าและทางเดินธรรมชาติ จนถึงทางเดินบนภูเขา (T2)',
|
||||
'tours.run.ways.grade': 'ความยากของเส้นทาง (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'เกี่ยวกับความยากของเส้นทาง',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'ระดับการเดินป่าตามที่ผู้ทำแผนที่ OpenStreetMap ระบุไว้ ทางที่ไม่มีระดับคือไม่ทราบ ไม่ใช่ง่าย และไม่ได้บอกว่าทางนั้นวิ่งได้หรือเหมาะกับคุณหรือไม่',
|
||||
'tours.run.ways.gradeTop': 'ทางที่มีระดับยากที่สุด: {grade}',
|
||||
'tours.bike.profile': 'โปรไฟล์',
|
||||
'tours.bike.profile.touring': 'ทัวริ่ง',
|
||||
'tours.bike.profile.road': 'เสือหมอบ',
|
||||
|
||||
@@ -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 = 849;
|
||||
const GENERAL_KEY_COUNT = 855;
|
||||
|
||||
function literalKeys(source: string): string[] {
|
||||
const tree = ts.createSourceFile('locale.ts', source, ts.ScriptTarget.Latest, true);
|
||||
|
||||
@@ -425,6 +425,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Mesafe × tempon, başka hiçbir şey değil: tırmanışlar, inişler ve zorluk hesaba katılmaz. Kayıtlı bir süre değil, bir plan.',
|
||||
'tours.run.timeSum': '{distance}, {pace} dk/km tempoyla {time}',
|
||||
'tours.run.profile.trail': 'Patika koşusu',
|
||||
'tours.run.profileHint.trail': 'Orman yollarını ve doğal patikaları tercih eder, dağ patikalarına (T2) kadar.',
|
||||
'tours.run.ways.grade': 'Patika zorluğu (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Patika zorluğu hakkında',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'OpenStreetMap haritacılarının verdiği yürüyüş dereceleri. Derecesi olmayan bir yol kolay değil, bilinmiyor demektir. Bir yolun koşulabilir olup olmadığı ya da sana uyup uymadığı hakkında bir şey söylemezler.',
|
||||
'tours.run.ways.gradeTop': 'En zor derecelendirilmiş patika: {grade}',
|
||||
'tours.bike.profile': 'Profil',
|
||||
'tours.bike.profile.touring': 'Tur',
|
||||
'tours.bike.profile.road': 'Yol',
|
||||
|
||||
@@ -439,6 +439,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Відстань × ваш темп і нічого більше: набір висоти й складність не враховуються. Це план, а не записаний час.',
|
||||
'tours.run.timeSum': '{distance} у темпі {pace} хв/км: {time}',
|
||||
'tours.run.profile.trail': 'Трейлранінг',
|
||||
'tours.run.profileHint.trail': 'Надає перевагу лісовим дорогам і природним стежкам, аж до гірських стежок (T2).',
|
||||
'tours.run.ways.grade': 'Складність стежки (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Про складність стежки',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Категорії складності стежок, як їх вказали учасники OpenStreetMap. Шлях без категорії невідомий, а не легкий. Вони нічого не кажуть про те, чи можна ним бігти і чи підходить він вам.',
|
||||
'tours.run.ways.gradeTop': 'Найскладніша оцінена стежка: {grade}',
|
||||
'tours.bike.profile': 'Профіль',
|
||||
'tours.bike.profile.touring': 'Туризм',
|
||||
'tours.bike.profile.road': 'Шосе',
|
||||
|
||||
@@ -423,6 +423,13 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfo':
|
||||
'Quãng đường × nhịp chạy của bạn, không gì khác: độ dốc lên xuống và độ khó không được tính. Đây là kế hoạch, không phải thời gian đã ghi.',
|
||||
'tours.run.timeSum': '{distance} với nhịp {pace} phút/km là {time}',
|
||||
'tours.run.profile.trail': 'Chạy địa hình',
|
||||
'tours.run.profileHint.trail': 'Ưu tiên đường rừng và lối mòn tự nhiên, đến cả đường núi (T2).',
|
||||
'tours.run.ways.grade': 'Độ khó của đường (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': 'Về độ khó của đường',
|
||||
'tours.run.ways.gradeInfo':
|
||||
'Cấp độ đi bộ đường dài do người vẽ bản đồ OpenStreetMap gán. Đường không có cấp là chưa rõ, không phải dễ. Chúng không cho biết đường có chạy được hay có hợp với bạn không.',
|
||||
'tours.run.ways.gradeTop': 'Đường được xếp cấp khó nhất: {grade}',
|
||||
'tours.bike.profile': 'Hồ sơ',
|
||||
'tours.bike.profile.touring': 'Du lịch',
|
||||
'tours.bike.profile.road': 'Đường trường',
|
||||
|
||||
@@ -384,6 +384,12 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfoLabel': '跑步時間如何規劃',
|
||||
'tours.run.timeEstimatedInfo': '僅為距離 × 你的配速:爬升、下降與難度皆不計入。這是計畫,不是記錄的時間。',
|
||||
'tours.run.timeSum': '{distance},配速 {pace} 分/公里,用時 {time}',
|
||||
'tours.run.profile.trail': '越野跑',
|
||||
'tours.run.profileHint.trail': '優先選擇林道與自然小徑,最高到山地步道 (T2)。',
|
||||
'tours.run.ways.grade': '路徑難度 (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': '關於路徑難度',
|
||||
'tours.run.ways.gradeInfo': 'OpenStreetMap 繪圖者標註的健行難度。沒有難度的路是未知,而不是容易。它們不說明一條路能否跑,也不說明是否適合你。',
|
||||
'tours.run.ways.gradeTop': '最難的已評級路徑:{grade}',
|
||||
'tours.bike.profile': '類型',
|
||||
'tours.bike.profile.touring': '旅行',
|
||||
'tours.bike.profile.road': '公路',
|
||||
|
||||
@@ -385,6 +385,12 @@ const tours: TranslationStrings = {
|
||||
'tours.run.timeEstimatedInfoLabel': '跑步时间如何计划',
|
||||
'tours.run.timeEstimatedInfo': '仅为距离 × 你的配速:爬升、下降和难度均不计入。这是计划,不是记录的时间。',
|
||||
'tours.run.timeSum': '{distance},配速 {pace} 分/公里,用时 {time}',
|
||||
'tours.run.profile.trail': '越野跑',
|
||||
'tours.run.profileHint.trail': '优先选择林道和自然小径,最高到山地步道 (T2)。',
|
||||
'tours.run.ways.grade': '路径难度 (sac_scale)',
|
||||
'tours.run.ways.gradeInfoLabel': '关于路径难度',
|
||||
'tours.run.ways.gradeInfo': 'OpenStreetMap 绘图者标注的徒步难度。没有难度的路是未知,而不是容易。它们不说明一条路能否跑,也不说明是否适合你。',
|
||||
'tours.run.ways.gradeTop': '最难的已评级路径:{grade}',
|
||||
'tours.bike.profile': '类型',
|
||||
'tours.bike.profile.touring': '旅行',
|
||||
'tours.bike.profile.road': '公路',
|
||||
|
||||
@@ -605,7 +605,7 @@ describe('runs (RUN-01)', () => {
|
||||
};
|
||||
|
||||
it('saves a run with its profile and pace, and nothing of a hike, a bike tour or a paddle tour', () => {
|
||||
expect(RUN_PROFILES).toEqual(['running']);
|
||||
expect(RUN_PROFILES).toEqual(['running', 'trail']);
|
||||
expect(tourCreateRequestSchema.parse({ ...run, run_pace_seconds_per_km: 360 })).toMatchObject({
|
||||
tour_type: 'run',
|
||||
run_profile: 'running',
|
||||
@@ -617,6 +617,16 @@ describe('runs (RUN-01)', () => {
|
||||
expect(tourCreateRequestSchema.parse({ ...run, run_pace_seconds_per_km: null }).run_pace_seconds_per_km).toBeNull();
|
||||
});
|
||||
|
||||
it('saves a trail run like any run, with its own profile and the same pace (RUN-02)', () => {
|
||||
expect(tourCreateRequestSchema.parse({ ...run, run_profile: 'trail', run_pace_seconds_per_km: 450 })).toMatchObject({
|
||||
tour_type: 'run',
|
||||
run_profile: 'trail',
|
||||
run_pace_seconds_per_km: 450,
|
||||
});
|
||||
expect(tourGpxImportFieldsSchema.parse({ tour_type: 'run', run_profile: 'trail' }).run_profile).toBe('trail');
|
||||
expect(() => tourCreateRequestSchema.parse({ ...baseRequest, run_profile: 'trail' })).toThrow(/belongs to a run/);
|
||||
});
|
||||
|
||||
it('refuses a pace that is no whole number of seconds, not positive or out of bounds', () => {
|
||||
for (const pace of [0, -300, 119, 1201, 360.5, Number.NaN]) {
|
||||
expect(tourCreateRequestSchema.safeParse({ ...run, run_pace_seconds_per_km: pace }).success).toBe(false);
|
||||
|
||||
@@ -49,12 +49,13 @@ export const bikeProfileSchema = z.enum(BIKE_PROFILES);
|
||||
export type BikeProfile = z.infer<typeof bikeProfileSchema>;
|
||||
|
||||
/**
|
||||
* RUN-01: what a run is planned as, the one profile it is routed for. Running
|
||||
* keeps to runnable, mostly paved ways in towns, parks and along rivers;
|
||||
* trail running follows with RUN-02. A profile asks the router for ways, it
|
||||
* says nothing about whether one can be run.
|
||||
* RUN-01, RUN-02: what a run is planned as, the one profile it is routed for.
|
||||
* Running keeps to runnable, mostly paved ways in towns, parks and along
|
||||
* rivers; trail running to forest tracks and natural paths, up to mountain
|
||||
* paths (T2). A profile asks the router for ways, it says nothing about
|
||||
* whether one can be run, and it changes nothing of the running time.
|
||||
*/
|
||||
export const RUN_PROFILES = ['running'] as const;
|
||||
export const RUN_PROFILES = ['running', 'trail'] as const;
|
||||
export const runProfileSchema = z.enum(RUN_PROFILES);
|
||||
export type RunProfile = z.infer<typeof runProfileSchema>;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user