feat(roadtrip): let a day drive along an imported track

An imported GPX track was a line drawn beside the day: the map showed the
scenic route while the day kept driving the motorway, so the distance, the
drive time and every warning belonged to a road nobody was taking. Norway
publishes its scenic routes that way, and so does every touring club worth
importing from.

A track becomes a route the day takes by refinement, not by conversion. Route
through what we have, find the point of the track the road misses by the most,
make that point a via, go again. Each round roughly halves the worst miss,
because the new via lands in the middle of what the last one left unfollowed,
so a scenic route usually fits inside ten vias — and the loop stops when the
road is close enough rather than after a fixed count. Every point of the track
would route exactly and take a hundred requests; two would route in seconds
and follow nothing.

The day is routed whole per round, not leg by leg: it is a single request
already, and per-leg would multiply every round by the number of legs against
a host that answers one request a second. The track is oriented to the day
first, because half of Norway's routes are published southbound, and the legs
it covers are cleared before the new chain lands, so applying a track twice
does not stack.

Offered from the day's own badges, and only once something has been imported.
Tinted while the day carries vias: the rail draws none of them, so that badge
is the only place a drive shaped by hand differs from one the router picked.
This commit is contained in:
Maurice
2026-09-05 00:22:44 +02:00
committed by Maurice
parent 620f4c6ecd
commit 761ec4e66f
35 changed files with 1807 additions and 3 deletions
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'مجاني',
'roadtrip.poi.wholeDay': 'اليوم كله',
'roadtrip.poi.midLeg': 'في المنتصف، {from} إلى {to}',
'roadtrip.track.title': 'اليوم {number} يتبع مسارًا',
'roadtrip.track.hint': 'اجعل هذا اليوم يتبع مسارًا مستوردًا',
'roadtrip.track.badge': 'مسار',
'roadtrip.track.untitled': 'مسار بلا اسم',
'roadtrip.track.empty': 'لا توجد مسارات في هذه الرحلة',
'roadtrip.track.emptyHint': 'استورد ملف GPX أو KML وستظهر مساراته هنا.',
'roadtrip.track.length': 'بطول {distance}',
'roadtrip.track.gap': 'على بعد {distance} من هذا اليوم',
'roadtrip.track.onDay': 'على امتداد هذا اليوم',
'roadtrip.track.explain': 'يُسحب المسار إلى التتبع بواسطة بضع نقاط عبور. تُستبدل نقاط العبور الموجودة على تلك المراحل.',
'roadtrip.track.action': 'اتبع هذا المسار',
'roadtrip.track.working': 'يجري ملاءمة المسار مع التتبع، الجولة {round}',
'roadtrip.track.done': 'تم وضع {count} نقطة عبور. يبقى المسار ضمن {distance} من التتبع.',
'roadtrip.track.capped': 'تم وضع {count} نقطة عبور. في أوسع نقطة يبتعد المسار {distance} عن التتبع.',
'roadtrip.track.already': 'كان المسار يتبع هذا التتبع بالفعل.',
'roadtrip.track.errorRoute': 'لم تستجب خدمة تحديد المسارات.',
'roadtrip.track.errorSave': 'تعذّر حفظ نقاط العبور.',
'roadtrip.track.clear': 'إزالة {count} نقطة عبور',
'roadtrip.poi.rest': 'استراحة',
'roadtrip.poi.campsite': 'مخيم',
'roadtrip.poi.food': 'طعام',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Gratuito',
'roadtrip.poi.wholeDay': 'O dia todo',
'roadtrip.poi.midLeg': 'Na metade, {from} ate {to}',
'roadtrip.track.title': 'O dia {number} segue uma trilha',
'roadtrip.track.hint': 'Fazer este dia seguir uma trilha importada',
'roadtrip.track.badge': 'Trilha',
'roadtrip.track.untitled': 'Trilha sem nome',
'roadtrip.track.empty': 'Sem trilhas nesta viagem',
'roadtrip.track.emptyHint': 'Importe um arquivo GPX ou KML e suas trilhas aparecem aqui.',
'roadtrip.track.length': '{distance} de comprimento',
'roadtrip.track.gap': 'a {distance} deste dia',
'roadtrip.track.onDay': 'ao longo deste dia',
'roadtrip.track.explain': 'O percurso é puxado para a trilha com alguns pontos de passagem. Os pontos existentes nessas etapas são substituídos.',
'roadtrip.track.action': 'Seguir esta trilha',
'roadtrip.track.working': 'Ajustando o percurso à trilha, rodada {round}',
'roadtrip.track.done': '{count} pontos de passagem colocados. O percurso fica a menos de {distance} da trilha.',
'roadtrip.track.capped': '{count} pontos de passagem colocados. No ponto mais largo, o percurso fica a {distance} da trilha.',
'roadtrip.track.already': 'O percurso já seguia esta trilha.',
'roadtrip.track.errorRoute': 'O serviço de rotas não respondeu.',
'roadtrip.track.errorSave': 'Não foi possível salvar os pontos de passagem.',
'roadtrip.track.clear': 'Remover {count} pontos de passagem',
'roadtrip.poi.rest': 'Área de descanso',
'roadtrip.poi.campsite': 'Camping',
'roadtrip.poi.food': 'Comida',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Gratuït',
'roadtrip.poi.wholeDay': 'Tot el dia',
'roadtrip.poi.midLeg': 'A mig cami, {from} a {to}',
'roadtrip.track.title': 'El dia {number} segueix una traça',
'roadtrip.track.hint': 'Fes que aquest dia segueixi una traça importada',
'roadtrip.track.badge': 'Traça',
'roadtrip.track.untitled': 'Traça sense nom',
'roadtrip.track.empty': 'No hi ha traces en aquest viatge',
'roadtrip.track.emptyHint': 'Importa un fitxer GPX o KML i les seves traces apareixeran aquí.',
'roadtrip.track.length': '{distance} de llarg',
'roadtrip.track.gap': 'a {distance} d’aquest dia',
'roadtrip.track.onDay': 'al llarg d’aquest dia',
'roadtrip.track.explain': 'El trajecte s’ajusta a la traça amb uns quants punts de pas. Els punts existents en aquests trams se substitueixen.',
'roadtrip.track.action': 'Segueix aquesta traça',
'roadtrip.track.working': 'Ajustant el trajecte a la traça, ronda {round}',
'roadtrip.track.done': 'S’han col·locat {count} punts de pas. El trajecte es manté a menys de {distance} de la traça.',
'roadtrip.track.capped': 'S’han col·locat {count} punts de pas. En el punt més ample, el trajecte queda a {distance} de la traça.',
'roadtrip.track.already': 'El trajecte ja seguia aquesta traça.',
'roadtrip.track.errorRoute': 'El servei de rutes no ha respost.',
'roadtrip.track.errorSave': 'No s’han pogut desar els punts de pas.',
'roadtrip.track.clear': 'Elimina {count} punts de pas',
'roadtrip.poi.rest': 'Àrea de descans',
'roadtrip.poi.campsite': 'Càmping',
'roadtrip.poi.food': 'Menjar',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Zdarma',
'roadtrip.poi.wholeDay': 'Cely den',
'roadtrip.poi.midLeg': 'V polovine, {from} do {to}',
'roadtrip.track.title': 'Den {number} sleduje stopu',
'roadtrip.track.hint': 'Nechat tento den sledovat importovanou stopu',
'roadtrip.track.badge': 'Stopa',
'roadtrip.track.untitled': 'Stopa bez názvu',
'roadtrip.track.empty': 'V této cestě nejsou žádné stopy',
'roadtrip.track.emptyHint': 'Importujte soubor GPX nebo KML a jeho stopy se objeví zde.',
'roadtrip.track.length': 'délka {distance}',
'roadtrip.track.gap': '{distance} od tohoto dne',
'roadtrip.track.onDay': 'podél tohoto dne',
'roadtrip.track.explain': 'Jízda se pomocí několika průjezdních bodů přitáhne ke stopě. Stávající body na těchto úsecích budou nahrazeny.',
'roadtrip.track.action': 'Sledovat tuto stopu',
'roadtrip.track.working': 'Přizpůsobuji jízdu stopě, kolo {round}',
'roadtrip.track.done': 'Umístěno {count} průjezdních bodů. Jízda se drží do {distance} od stopy.',
'roadtrip.track.capped': 'Umístěno {count} průjezdních bodů. V nejširším místě je jízda {distance} od stopy.',
'roadtrip.track.already': 'Jízda už tuto stopu sledovala.',
'roadtrip.track.errorRoute': 'Služba plánování trasy neodpověděla.',
'roadtrip.track.errorSave': 'Průjezdní body se nepodařilo uložit.',
'roadtrip.track.clear': 'Odebrat {count} průjezdních bodů',
'roadtrip.poi.rest': 'Odpočívadlo',
'roadtrip.poi.campsite': 'Kemp',
'roadtrip.poi.food': 'Jídlo',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Kostenlos',
'roadtrip.poi.wholeDay': 'Ganzer Tag',
'roadtrip.poi.midLeg': 'Auf halber Strecke, {from} bis {to}',
'roadtrip.track.title': 'Tag {number} folgt einer Spur',
'roadtrip.track.hint': 'Diesen Tag einer importierten Spur folgen lassen',
'roadtrip.track.badge': 'Spur',
'roadtrip.track.untitled': 'Namenlose Spur',
'roadtrip.track.empty': 'Keine Spuren in dieser Reise',
'roadtrip.track.emptyHint': 'Importiere eine GPX- oder KML-Datei, dann stehen ihre Spuren hier.',
'roadtrip.track.length': '{distance} lang',
'roadtrip.track.gap': '{distance} von diesem Tag entfernt',
'roadtrip.track.onDay': 'entlang dieses Tages',
'roadtrip.track.explain': 'Die Fahrt wird mit einigen Zwischenpunkten auf die Spur gezogen. Vorhandene Zwischenpunkte dieser Etappen werden ersetzt.',
'roadtrip.track.action': 'Dieser Spur folgen',
'roadtrip.track.working': 'Fahrt wird an die Spur angepasst, Runde {round}',
'roadtrip.track.done': '{count} Zwischenpunkte gesetzt. Die Fahrt bleibt bis auf {distance} an der Spur.',
'roadtrip.track.capped': '{count} Zwischenpunkte gesetzt. An der weitesten Stelle bleibt die Fahrt {distance} von der Spur entfernt.',
'roadtrip.track.already': 'Die Fahrt folgte dieser Spur bereits.',
'roadtrip.track.errorRoute': 'Der Routendienst hat nicht geantwortet.',
'roadtrip.track.errorSave': 'Die Zwischenpunkte konnten nicht gespeichert werden.',
'roadtrip.track.clear': '{count} Zwischenpunkte entfernen',
'roadtrip.poi.rest': 'Rastplatz',
'roadtrip.poi.campsite': 'Campingplatz',
'roadtrip.poi.food': 'Essen',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Free',
'roadtrip.poi.wholeDay': 'The whole day',
'roadtrip.poi.midLeg': 'Halfway, {from} to {to}',
'roadtrip.track.title': 'Day {number} follows a track',
'roadtrip.track.hint': 'Make this day follow an imported track',
'roadtrip.track.badge': 'Track',
'roadtrip.track.untitled': 'Unnamed track',
'roadtrip.track.empty': 'No tracks in this trip',
'roadtrip.track.emptyHint': 'Import a GPX or KML file and its tracks land here.',
'roadtrip.track.length': '{distance} long',
'roadtrip.track.gap': '{distance} off this day',
'roadtrip.track.onDay': 'along this day',
'roadtrip.track.explain': 'The drive is pulled onto the track with a handful of via points. Existing via points on those legs are replaced.',
'roadtrip.track.action': 'Follow this track',
'roadtrip.track.working': 'Fitting the drive to the track, round {round}',
'roadtrip.track.done': '{count} via points placed. The drive stays within {distance} of the track.',
'roadtrip.track.capped': '{count} via points placed. The drive gets no closer than {distance} at its widest.',
'roadtrip.track.already': 'The drive already followed this track.',
'roadtrip.track.errorRoute': 'The routing service did not answer.',
'roadtrip.track.errorSave': 'The via points could not be saved.',
'roadtrip.track.clear': 'Drop {count} via points',
'roadtrip.poi.rest': 'Rest area',
'roadtrip.poi.campsite': 'Campsite',
'roadtrip.poi.food': 'Food',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Gratis',
'roadtrip.poi.wholeDay': 'Todo el dia',
'roadtrip.poi.midLeg': 'A mitad, {from} a {to}',
'roadtrip.track.title': 'El día {number} sigue una traza',
'roadtrip.track.hint': 'Hacer que este día siga una traza importada',
'roadtrip.track.badge': 'Traza',
'roadtrip.track.untitled': 'Traza sin nombre',
'roadtrip.track.empty': 'No hay trazas en este viaje',
'roadtrip.track.emptyHint': 'Importa un archivo GPX o KML y sus trazas aparecerán aquí.',
'roadtrip.track.length': '{distance} de largo',
'roadtrip.track.gap': 'a {distance} de este día',
'roadtrip.track.onDay': 'a lo largo de este día',
'roadtrip.track.explain': 'El trayecto se ajusta a la traza con unos pocos puntos de paso. Los puntos existentes en esos tramos se reemplazan.',
'roadtrip.track.action': 'Seguir esta traza',
'roadtrip.track.working': 'Ajustando el trayecto a la traza, ronda {round}',
'roadtrip.track.done': '{count} puntos de paso colocados. El trayecto se mantiene a menos de {distance} de la traza.',
'roadtrip.track.capped': '{count} puntos de paso colocados. En su punto más ancho, el trayecto queda a {distance} de la traza.',
'roadtrip.track.already': 'El trayecto ya seguía esta traza.',
'roadtrip.track.errorRoute': 'El servicio de rutas no respondió.',
'roadtrip.track.errorSave': 'No se pudieron guardar los puntos de paso.',
'roadtrip.track.clear': 'Quitar {count} puntos de paso',
'roadtrip.poi.rest': 'Área de descanso',
'roadtrip.poi.campsite': 'Camping',
'roadtrip.poi.food': 'Comida',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Gratuit',
'roadtrip.poi.wholeDay': 'Toute la journee',
'roadtrip.poi.midLeg': 'A mi-chemin, {from} vers {to}',
'roadtrip.track.title': 'Le jour {number} suit une trace',
'roadtrip.track.hint': 'Faire suivre à ce jour une trace importée',
'roadtrip.track.badge': 'Trace',
'roadtrip.track.untitled': 'Trace sans nom',
'roadtrip.track.empty': 'Aucune trace dans ce voyage',
'roadtrip.track.emptyHint': 'Importez un fichier GPX ou KML et ses traces apparaîtront ici.',
'roadtrip.track.length': '{distance} de long',
'roadtrip.track.gap': 'à {distance} de ce jour',
'roadtrip.track.onDay': 'le long de ce jour',
'roadtrip.track.explain': 'Le trajet est ramené sur la trace à l’aide de quelques points de passage. Les points existants sur ces étapes sont remplacés.',
'roadtrip.track.action': 'Suivre cette trace',
'roadtrip.track.working': 'Ajustement du trajet à la trace, tour {round}',
'roadtrip.track.done': '{count} points de passage placés. Le trajet reste à moins de {distance} de la trace.',
'roadtrip.track.capped': '{count} points de passage placés. Au plus large, le trajet reste à {distance} de la trace.',
'roadtrip.track.already': 'Le trajet suivait déjà cette trace.',
'roadtrip.track.errorRoute': 'Le service de calcul d’itinéraire n’a pas répondu.',
'roadtrip.track.errorSave': 'Les points de passage n’ont pas pu être enregistrés.',
'roadtrip.track.clear': 'Supprimer {count} points de passage',
'roadtrip.poi.rest': 'Aire de repos',
'roadtrip.poi.campsite': 'Camping',
'roadtrip.poi.food': 'Restauration',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Δωρεάν',
'roadtrip.poi.wholeDay': 'Ολη η ημερα',
'roadtrip.poi.midLeg': 'Στα μισα, {from} προς {to}',
'roadtrip.track.title': 'Η ημέρα {number} ακολουθεί ένα ίχνος',
'roadtrip.track.hint': 'Κάντε αυτή την ημέρα να ακολουθεί ένα εισαγόμενο ίχνος',
'roadtrip.track.badge': 'Ίχνος',
'roadtrip.track.untitled': 'Ίχνος χωρίς όνομα',
'roadtrip.track.empty': 'Δεν υπάρχουν ίχνη σε αυτό το ταξίδι',
'roadtrip.track.emptyHint': 'Εισαγάγετε ένα αρχείο GPX ή KML και τα ίχνη του θα εμφανιστούν εδώ.',
'roadtrip.track.length': 'μήκος {distance}',
'roadtrip.track.gap': '{distance} από αυτή την ημέρα',
'roadtrip.track.onDay': 'κατά μήκος αυτής της ημέρας',
'roadtrip.track.explain': 'Η διαδρομή τραβιέται πάνω στο ίχνος με μερικά ενδιάμεσα σημεία. Τα υπάρχοντα σημεία σε αυτά τα σκέλη αντικαθίστανται.',
'roadtrip.track.action': 'Ακολούθησε αυτό το ίχνος',
'roadtrip.track.working': 'Προσαρμογή διαδρομής στο ίχνος, γύρος {round}',
'roadtrip.track.done': 'Τοποθετήθηκαν {count} ενδιάμεσα σημεία. Η διαδρομή μένει εντός {distance} από το ίχνος.',
'roadtrip.track.capped': 'Τοποθετήθηκαν {count} ενδιάμεσα σημεία. Στο πιο πλατύ σημείο η διαδρομή απέχει {distance} από το ίχνος.',
'roadtrip.track.already': 'Η διαδρομή ακολουθούσε ήδη αυτό το ίχνος.',
'roadtrip.track.errorRoute': 'Η υπηρεσία δρομολόγησης δεν απάντησε.',
'roadtrip.track.errorSave': 'Δεν ήταν δυνατή η αποθήκευση των ενδιάμεσων σημείων.',
'roadtrip.track.clear': 'Αφαίρεση {count} ενδιάμεσων σημείων',
'roadtrip.poi.rest': 'Χώρος ανάπαυσης',
'roadtrip.poi.campsite': 'Κάμπινγκ',
'roadtrip.poi.food': 'Φαγητό',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Ingyenes',
'roadtrip.poi.wholeDay': 'A teljes nap',
'roadtrip.poi.midLeg': 'Felúton, {from} és {to} kozott',
'roadtrip.track.title': 'A(z) {number}. nap egy nyomvonalat követ',
'roadtrip.track.hint': 'Kövesse ez a nap egy importált nyomvonalat',
'roadtrip.track.badge': 'Nyomvonal',
'roadtrip.track.untitled': 'Névtelen nyomvonal',
'roadtrip.track.empty': 'Nincs nyomvonal ebben az utazásban',
'roadtrip.track.emptyHint': 'Importálj egy GPX- vagy KML-fájlt, és a nyomvonalai itt jelennek meg.',
'roadtrip.track.length': '{distance} hosszú',
'roadtrip.track.gap': '{distance} távolságra ettől a naptól',
'roadtrip.track.onDay': 'e nap mentén',
'roadtrip.track.explain': 'Az útvonalat néhány köztes pont húzza rá a nyomvonalra. Az érintett szakaszok meglévő köztes pontjai lecserélődnek.',
'roadtrip.track.action': 'Kövesse ezt a nyomvonalat',
'roadtrip.track.working': 'Az útvonal igazítása a nyomvonalhoz, {round}. kör',
'roadtrip.track.done': '{count} köztes pont elhelyezve. Az útvonal {distance} távolságon belül marad a nyomvonaltól.',
'roadtrip.track.capped': '{count} köztes pont elhelyezve. A legtávolabbi ponton az útvonal {distance} távolságra van a nyomvonaltól.',
'roadtrip.track.already': 'Az útvonal már ezt a nyomvonalat követte.',
'roadtrip.track.errorRoute': 'Az útvonaltervező szolgáltatás nem válaszolt.',
'roadtrip.track.errorSave': 'A köztes pontokat nem sikerült menteni.',
'roadtrip.track.clear': '{count} köztes pont eltávolítása',
'roadtrip.poi.rest': 'Pihenőhely',
'roadtrip.poi.campsite': 'Kemping',
'roadtrip.poi.food': 'Étkezés',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Gratis',
'roadtrip.poi.wholeDay': 'Sepanjang hari',
'roadtrip.poi.midLeg': 'Di tengah, {from} ke {to}',
'roadtrip.track.title': 'Hari {number} mengikuti jalur',
'roadtrip.track.hint': 'Buat hari ini mengikuti jalur yang diimpor',
'roadtrip.track.badge': 'Jalur',
'roadtrip.track.untitled': 'Jalur tanpa nama',
'roadtrip.track.empty': 'Tidak ada jalur di perjalanan ini',
'roadtrip.track.emptyHint': 'Impor berkas GPX atau KML dan jalurnya akan muncul di sini.',
'roadtrip.track.length': 'panjang {distance}',
'roadtrip.track.gap': '{distance} dari hari ini',
'roadtrip.track.onDay': 'sepanjang hari ini',
'roadtrip.track.explain': 'Perjalanan ditarik ke jalur dengan beberapa titik lintas. Titik lintas yang ada di etape tersebut akan diganti.',
'roadtrip.track.action': 'Ikuti jalur ini',
'roadtrip.track.working': 'Menyesuaikan perjalanan dengan jalur, putaran {round}',
'roadtrip.track.done': '{count} titik lintas ditempatkan. Perjalanan tetap dalam {distance} dari jalur.',
'roadtrip.track.capped': '{count} titik lintas ditempatkan. Di titik terlebar, perjalanan berjarak {distance} dari jalur.',
'roadtrip.track.already': 'Perjalanan sudah mengikuti jalur ini.',
'roadtrip.track.errorRoute': 'Layanan rute tidak menjawab.',
'roadtrip.track.errorSave': 'Titik lintas tidak dapat disimpan.',
'roadtrip.track.clear': 'Hapus {count} titik lintas',
'roadtrip.poi.rest': 'Tempat istirahat',
'roadtrip.poi.campsite': 'Perkemahan',
'roadtrip.poi.food': 'Makanan',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Gratuito',
'roadtrip.poi.wholeDay': 'Tutta la giornata',
'roadtrip.poi.midLeg': 'A meta strada, {from} verso {to}',
'roadtrip.track.title': 'Il giorno {number} segue una traccia',
'roadtrip.track.hint': 'Fai seguire a questo giorno una traccia importata',
'roadtrip.track.badge': 'Traccia',
'roadtrip.track.untitled': 'Traccia senza nome',
'roadtrip.track.empty': 'Nessuna traccia in questo viaggio',
'roadtrip.track.emptyHint': 'Importa un file GPX o KML e le sue tracce compaiono qui.',
'roadtrip.track.length': '{distance} di lunghezza',
'roadtrip.track.gap': 'a {distance} da questo giorno',
'roadtrip.track.onDay': 'lungo questo giorno',
'roadtrip.track.explain': 'Il percorso viene portato sulla traccia con alcuni punti di passaggio. Quelli già presenti su quelle tratte vengono sostituiti.',
'roadtrip.track.action': 'Segui questa traccia',
'roadtrip.track.working': 'Adatto il percorso alla traccia, giro {round}',
'roadtrip.track.done': '{count} punti di passaggio posati. Il percorso resta entro {distance} dalla traccia.',
'roadtrip.track.capped': '{count} punti di passaggio posati. Nel punto peggiore il percorso resta a {distance} dalla traccia.',
'roadtrip.track.already': 'Il percorso seguiva già questa traccia.',
'roadtrip.track.errorRoute': 'Il servizio di calcolo percorso non ha risposto.',
'roadtrip.track.errorSave': 'Non è stato possibile salvare i punti di passaggio.',
'roadtrip.track.clear': 'Rimuovi {count} punti di passaggio',
'roadtrip.poi.rest': 'Area di sosta',
'roadtrip.poi.campsite': 'Campeggio',
'roadtrip.poi.food': 'Ristoro',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': '無料',
'roadtrip.poi.wholeDay': '一日全体',
'roadtrip.poi.midLeg': '中間地点、{from}から{to}',
'roadtrip.track.title': '{number}日目はトラックをたどる',
'roadtrip.track.hint': 'この日を読み込んだトラックに沿わせる',
'roadtrip.track.badge': 'トラック',
'roadtrip.track.untitled': '名前のないトラック',
'roadtrip.track.empty': 'この旅行にトラックはありません',
'roadtrip.track.emptyHint': 'GPX または KML ファイルを読み込むと、そのトラックがここに並びます。',
'roadtrip.track.length': '全長 {distance}',
'roadtrip.track.gap': 'この日から {distance}',
'roadtrip.track.onDay': 'この日に沿って',
'roadtrip.track.explain': 'いくつかの経由地で走行をトラックに引き寄せます。その区間にある既存の経由地は置き換えられます。',
'roadtrip.track.action': 'このトラックをたどる',
'roadtrip.track.working': '走行をトラックに合わせています({round} 回目)',
'roadtrip.track.done': '経由地を {count} か所置きました。走行はトラックから {distance} 以内に収まります。',
'roadtrip.track.capped': '経由地を {count} か所置きました。最も離れる地点でトラックから {distance} です。',
'roadtrip.track.already': '走行はすでにこのトラックに沿っていました。',
'roadtrip.track.errorRoute': 'ルート検索サービスが応答しませんでした。',
'roadtrip.track.errorSave': '経由地を保存できませんでした。',
'roadtrip.track.clear': '経由地 {count} か所を削除',
'roadtrip.poi.rest': 'サービスエリア',
'roadtrip.poi.campsite': 'キャンプ場',
'roadtrip.poi.food': '食事',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': '무료',
'roadtrip.poi.wholeDay': '하루 전체',
'roadtrip.poi.midLeg': '중간 지점, {from}에서 {to}',
'roadtrip.track.title': '{number}일차가 트랙을 따라갑니다',
'roadtrip.track.hint': '이 날의 이동을 가져온 트랙에 맞춥니다',
'roadtrip.track.badge': '트랙',
'roadtrip.track.untitled': '이름 없는 트랙',
'roadtrip.track.empty': '이 여행에는 트랙이 없습니다',
'roadtrip.track.emptyHint': 'GPX 또는 KML 파일을 가져오면 그 트랙이 여기에 표시됩니다.',
'roadtrip.track.length': '길이 {distance}',
'roadtrip.track.gap': '이 날에서 {distance}',
'roadtrip.track.onDay': '이 날을 따라',
'roadtrip.track.explain': '몇 개의 경유지로 주행을 트랙에 맞춥니다. 해당 구간의 기존 경유지는 대체됩니다.',
'roadtrip.track.action': '이 트랙 따라가기',
'roadtrip.track.working': '주행을 트랙에 맞추는 중, {round}회차',
'roadtrip.track.done': '경유지 {count}개를 배치했습니다. 주행은 트랙에서 {distance} 이내를 유지합니다.',
'roadtrip.track.capped': '경유지 {count}개를 배치했습니다. 가장 벌어지는 지점에서 트랙과 {distance} 떨어져 있습니다.',
'roadtrip.track.already': '주행이 이미 이 트랙을 따르고 있었습니다.',
'roadtrip.track.errorRoute': '경로 서비스가 응답하지 않았습니다.',
'roadtrip.track.errorSave': '경유지를 저장하지 못했습니다.',
'roadtrip.track.clear': '경유지 {count}개 삭제',
'roadtrip.poi.rest': '휴게소',
'roadtrip.poi.campsite': '캠핑장',
'roadtrip.poi.food': '식사',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Gratis',
'roadtrip.poi.wholeDay': 'De hele dag',
'roadtrip.poi.midLeg': 'Halverwege, {from} naar {to}',
'roadtrip.track.title': 'Dag {number} volgt een track',
'roadtrip.track.hint': 'Deze dag een geïmporteerde track laten volgen',
'roadtrip.track.badge': 'Track',
'roadtrip.track.untitled': 'Naamloze track',
'roadtrip.track.empty': 'Geen tracks in deze reis',
'roadtrip.track.emptyHint': 'Importeer een GPX- of KML-bestand en de tracks verschijnen hier.',
'roadtrip.track.length': '{distance} lang',
'roadtrip.track.gap': '{distance} van deze dag',
'roadtrip.track.onDay': 'langs deze dag',
'roadtrip.track.explain': 'De rit wordt met een handvol tussenpunten op de track getrokken. Bestaande tussenpunten op die etappes worden vervangen.',
'roadtrip.track.action': 'Deze track volgen',
'roadtrip.track.working': 'Rit wordt op de track gepast, ronde {round}',
'roadtrip.track.done': '{count} tussenpunten geplaatst. De rit blijft binnen {distance} van de track.',
'roadtrip.track.capped': '{count} tussenpunten geplaatst. Op het verste punt blijft de rit {distance} van de track.',
'roadtrip.track.already': 'De rit volgde deze track al.',
'roadtrip.track.errorRoute': 'De routeservice antwoordde niet.',
'roadtrip.track.errorSave': 'De tussenpunten konden niet worden opgeslagen.',
'roadtrip.track.clear': '{count} tussenpunten verwijderen',
'roadtrip.poi.rest': 'Rustplaats',
'roadtrip.poi.campsite': 'Camping',
'roadtrip.poi.food': 'Eten',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Bezpłatnie',
'roadtrip.poi.wholeDay': 'Caly dzien',
'roadtrip.poi.midLeg': 'W polowie, {from} do {to}',
'roadtrip.track.title': 'Dzień {number} podąża za śladem',
'roadtrip.track.hint': 'Niech ten dzień podąża za zaimportowanym śladem',
'roadtrip.track.badge': 'Ślad',
'roadtrip.track.untitled': 'Ślad bez nazwy',
'roadtrip.track.empty': 'Brak śladów w tej podróży',
'roadtrip.track.emptyHint': 'Zaimportuj plik GPX lub KML, a jego ślady pojawią się tutaj.',
'roadtrip.track.length': '{distance} długości',
'roadtrip.track.gap': '{distance} od tego dnia',
'roadtrip.track.onDay': 'wzdłuż tego dnia',
'roadtrip.track.explain': 'Trasa zostaje naciągnięta na ślad kilkoma punktami pośrednimi. Istniejące punkty na tych odcinkach zostaną zastąpione.',
'roadtrip.track.action': 'Podążaj za tym śladem',
'roadtrip.track.working': 'Dopasowywanie trasy do śladu, runda {round}',
'roadtrip.track.done': 'Ustawiono {count} punktów pośrednich. Trasa trzyma się śladu w promieniu {distance}.',
'roadtrip.track.capped': 'Ustawiono {count} punktów pośrednich. W najszerszym miejscu trasa mija ślad o {distance}.',
'roadtrip.track.already': 'Trasa już podążała za tym śladem.',
'roadtrip.track.errorRoute': 'Usługa wyznaczania trasy nie odpowiedziała.',
'roadtrip.track.errorSave': 'Nie udało się zapisać punktów pośrednich.',
'roadtrip.track.clear': 'Usuń {count} punktów pośrednich',
'roadtrip.poi.rest': 'Miejsce odpoczynku',
'roadtrip.poi.campsite': 'Kemping',
'roadtrip.poi.food': 'Jedzenie',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Бесплатно',
'roadtrip.poi.wholeDay': 'Весь день',
'roadtrip.poi.midLeg': 'На полпути, {from} до {to}',
'roadtrip.track.title': 'День {number} идёт по треку',
'roadtrip.track.hint': 'Провести этот день по импортированному треку',
'roadtrip.track.badge': 'Трек',
'roadtrip.track.untitled': 'Трек без названия',
'roadtrip.track.empty': 'В этой поездке нет треков',
'roadtrip.track.emptyHint': 'Импортируйте файл GPX или KML, и его треки появятся здесь.',
'roadtrip.track.length': 'длина {distance}',
'roadtrip.track.gap': 'в {distance} от этого дня',
'roadtrip.track.onDay': 'вдоль этого дня',
'roadtrip.track.explain': 'Маршрут притягивается к треку несколькими промежуточными точками. Существующие точки на этих участках заменяются.',
'roadtrip.track.action': 'Идти по этому треку',
'roadtrip.track.working': 'Подгоняем маршрут к треку, круг {round}',
'roadtrip.track.done': 'Поставлено промежуточных точек: {count}. Маршрут держится в пределах {distance} от трека.',
'roadtrip.track.capped': 'Поставлено промежуточных точек: {count}. В худшем месте маршрут отходит от трека на {distance}.',
'roadtrip.track.already': 'Маршрут уже шёл по этому треку.',
'roadtrip.track.errorRoute': 'Сервис маршрутов не ответил.',
'roadtrip.track.errorSave': 'Не удалось сохранить промежуточные точки.',
'roadtrip.track.clear': 'Убрать промежуточные точки: {count}',
'roadtrip.poi.rest': 'Зона отдыха',
'roadtrip.poi.campsite': 'Кемпинг',
'roadtrip.poi.food': 'Еда',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Gratis',
'roadtrip.poi.wholeDay': 'Hela dagen',
'roadtrip.poi.midLeg': 'Halvvags, {from} till {to}',
'roadtrip.track.title': 'Dag {number} följer ett spår',
'roadtrip.track.hint': 'Låt den här dagen följa ett importerat spår',
'roadtrip.track.badge': 'Spår',
'roadtrip.track.untitled': 'Namnlöst spår',
'roadtrip.track.empty': 'Inga spår i den här resan',
'roadtrip.track.emptyHint': 'Importera en GPX- eller KML-fil så dyker spåren upp här.',
'roadtrip.track.length': '{distance} lång',
'roadtrip.track.gap': '{distance} från den här dagen',
'roadtrip.track.onDay': 'längs den här dagen',
'roadtrip.track.explain': 'Körningen dras in på spåret med ett fåtal mellanpunkter. Befintliga mellanpunkter på de sträckorna ersätts.',
'roadtrip.track.action': 'Följ det här spåret',
'roadtrip.track.working': 'Anpassar körningen till spåret, runda {round}',
'roadtrip.track.done': '{count} mellanpunkter satta. Körningen håller sig inom {distance} från spåret.',
'roadtrip.track.capped': '{count} mellanpunkter satta. Som mest ligger körningen {distance} från spåret.',
'roadtrip.track.already': 'Körningen följde redan det här spåret.',
'roadtrip.track.errorRoute': 'Ruttjänsten svarade inte.',
'roadtrip.track.errorSave': 'Mellanpunkterna kunde inte sparas.',
'roadtrip.track.clear': 'Ta bort {count} mellanpunkter',
'roadtrip.poi.rest': 'Rastplats',
'roadtrip.poi.campsite': 'Campingplats',
'roadtrip.poi.food': 'Mat',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Ucretsiz',
'roadtrip.poi.wholeDay': 'Tum gun',
'roadtrip.poi.midLeg': 'Yolun yarisi, {from} - {to}',
'roadtrip.track.title': '{number}. gün bir izi takip eder',
'roadtrip.track.hint': 'Bu günü içe aktarılmış bir izi takip ettir',
'roadtrip.track.badge': 'İz',
'roadtrip.track.untitled': 'Adsız iz',
'roadtrip.track.empty': 'Bu gezide iz yok',
'roadtrip.track.emptyHint': 'Bir GPX veya KML dosyası içe aktarın, izleri burada görünür.',
'roadtrip.track.length': '{distance} uzunluğunda',
'roadtrip.track.gap': 'bu günden {distance} uzakta',
'roadtrip.track.onDay': 'bu gün boyunca',
'roadtrip.track.explain': 'Sürüş, birkaç ara noktayla izin üzerine çekilir. Bu etaplardaki mevcut ara noktalar değiştirilir.',
'roadtrip.track.action': 'Bu izi takip et',
'roadtrip.track.working': 'Sürüş ize uyarlanıyor, tur {round}',
'roadtrip.track.done': '{count} ara nokta yerleştirildi. Sürüş, izin {distance} yakınında kalıyor.',
'roadtrip.track.capped': '{count} ara nokta yerleştirildi. En geniş yerde sürüş, izden {distance} uzakta kalıyor.',
'roadtrip.track.already': 'Sürüş bu izi zaten takip ediyordu.',
'roadtrip.track.errorRoute': 'Rota servisi yanıt vermedi.',
'roadtrip.track.errorSave': 'Ara noktalar kaydedilemedi.',
'roadtrip.track.clear': '{count} ara noktayı kaldır',
'roadtrip.poi.rest': 'Dinlenme alanı',
'roadtrip.poi.campsite': 'Kamp alanı',
'roadtrip.poi.food': 'Yemek',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Безкоштовно',
'roadtrip.poi.wholeDay': 'Весь день',
'roadtrip.poi.midLeg': 'На пiвдорозi, {from} до {to}',
'roadtrip.track.title': 'День {number} іде за треком',
'roadtrip.track.hint': 'Провести цей день за імпортованим треком',
'roadtrip.track.badge': 'Трек',
'roadtrip.track.untitled': 'Трек без назви',
'roadtrip.track.empty': 'У цій подорожі немає треків',
'roadtrip.track.emptyHint': 'Імпортуйте файл GPX або KML, і його треки з’являться тут.',
'roadtrip.track.length': 'довжина {distance}',
'roadtrip.track.gap': 'за {distance} від цього дня',
'roadtrip.track.onDay': 'уздовж цього дня',
'roadtrip.track.explain': 'Маршрут притягується до треку кількома проміжними точками. Наявні точки на цих ділянках буде замінено.',
'roadtrip.track.action': 'Іти за цим треком',
'roadtrip.track.working': 'Підганяємо маршрут до треку, коло {round}',
'roadtrip.track.done': 'Поставлено проміжних точок: {count}. Маршрут тримається в межах {distance} від треку.',
'roadtrip.track.capped': 'Поставлено проміжних точок: {count}. У найширшому місці маршрут відходить від треку на {distance}.',
'roadtrip.track.already': 'Маршрут уже йшов за цим треком.',
'roadtrip.track.errorRoute': 'Сервіс маршрутів не відповів.',
'roadtrip.track.errorSave': 'Не вдалося зберегти проміжні точки.',
'roadtrip.track.clear': 'Прибрати проміжні точки: {count}',
'roadtrip.poi.rest': 'Зона відпочинку',
'roadtrip.poi.campsite': 'Кемпінг',
'roadtrip.poi.food': 'Їжа',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': 'Miễn phí',
'roadtrip.poi.wholeDay': 'Cả ngày',
'roadtrip.poi.midLeg': 'Giữa đường, {from} đến {to}',
'roadtrip.track.title': 'Ngày {number} đi theo một tuyến',
'roadtrip.track.hint': 'Cho ngày này đi theo tuyến đã nhập',
'roadtrip.track.badge': 'Tuyến',
'roadtrip.track.untitled': 'Tuyến chưa đặt tên',
'roadtrip.track.empty': 'Chuyến đi này chưa có tuyến nào',
'roadtrip.track.emptyHint': 'Nhập tệp GPX hoặc KML và các tuyến của nó sẽ xuất hiện ở đây.',
'roadtrip.track.length': 'dài {distance}',
'roadtrip.track.gap': 'cách ngày này {distance}',
'roadtrip.track.onDay': 'dọc theo ngày này',
'roadtrip.track.explain': 'Hành trình được kéo về tuyến bằng một vài điểm trung gian. Các điểm hiện có trên những chặng đó sẽ bị thay thế.',
'roadtrip.track.action': 'Đi theo tuyến này',
'roadtrip.track.working': 'Đang khớp hành trình với tuyến, vòng {round}',
'roadtrip.track.done': 'Đã đặt {count} điểm trung gian. Hành trình bám tuyến trong phạm vi {distance}.',
'roadtrip.track.capped': 'Đã đặt {count} điểm trung gian. Ở chỗ lệch nhất, hành trình cách tuyến {distance}.',
'roadtrip.track.already': 'Hành trình vốn đã đi theo tuyến này.',
'roadtrip.track.errorRoute': 'Dịch vụ chỉ đường không phản hồi.',
'roadtrip.track.errorSave': 'Không thể lưu các điểm trung gian.',
'roadtrip.track.clear': 'Bỏ {count} điểm trung gian',
'roadtrip.poi.rest': 'Trạm dừng nghỉ',
'roadtrip.poi.campsite': 'Khu cắm trại',
'roadtrip.poi.food': 'Đồ ăn',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': '免費',
'roadtrip.poi.wholeDay': '全天',
'roadtrip.poi.midLeg': '中途,{from} 至 {to}',
'roadtrip.track.title': '第 {number} 天沿軌跡行駛',
'roadtrip.track.hint': '讓這一天沿匯入的軌跡行駛',
'roadtrip.track.badge': '軌跡',
'roadtrip.track.untitled': '未命名軌跡',
'roadtrip.track.empty': '此行程沒有軌跡',
'roadtrip.track.emptyHint': '匯入 GPX 或 KML 檔案,其軌跡會出現在這裡。',
'roadtrip.track.length': '全長 {distance}',
'roadtrip.track.gap': '距這一天 {distance}',
'roadtrip.track.onDay': '沿著這一天',
'roadtrip.track.explain': '行程會透過幾個途經點被拉到軌跡上。這些路段上既有的途經點會被取代。',
'roadtrip.track.action': '沿此軌跡行駛',
'roadtrip.track.working': '正在將行程貼合軌跡,第 {round} 輪',
'roadtrip.track.done': '已放置 {count} 個途經點。行程與軌跡的偏差不超過 {distance}。',
'roadtrip.track.capped': '已放置 {count} 個途經點。最寬處行程仍偏離軌跡 {distance}。',
'roadtrip.track.already': '行程本來就沿著這條軌跡。',
'roadtrip.track.errorRoute': '路線服務沒有回應。',
'roadtrip.track.errorSave': '無法儲存途經點。',
'roadtrip.track.clear': '移除 {count} 個途經點',
'roadtrip.poi.rest': '休息站',
'roadtrip.poi.campsite': '露營地',
'roadtrip.poi.food': '餐飲',
+18
View File
@@ -46,6 +46,24 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.free': '免费',
'roadtrip.poi.wholeDay': '全天',
'roadtrip.poi.midLeg': '中途,{from} 至 {to}',
'roadtrip.track.title': '第 {number} 天沿轨迹行驶',
'roadtrip.track.hint': '让这一天沿导入的轨迹行驶',
'roadtrip.track.badge': '轨迹',
'roadtrip.track.untitled': '未命名轨迹',
'roadtrip.track.empty': '此行程没有轨迹',
'roadtrip.track.emptyHint': '导入 GPX 或 KML 文件,其轨迹会出现在这里。',
'roadtrip.track.length': '全长 {distance}',
'roadtrip.track.gap': '距这一天 {distance}',
'roadtrip.track.onDay': '沿着这一天',
'roadtrip.track.explain': '行程会通过几个途经点被拉到轨迹上。这些路段上已有的途经点会被替换。',
'roadtrip.track.action': '沿此轨迹行驶',
'roadtrip.track.working': '正在将行程贴合轨迹,第 {round} 轮',
'roadtrip.track.done': '已放置 {count} 个途经点。行程与轨迹的偏差不超过 {distance}。',
'roadtrip.track.capped': '已放置 {count} 个途经点。最宽处行程仍偏离轨迹 {distance}。',
'roadtrip.track.already': '行程本来就沿着这条轨迹。',
'roadtrip.track.errorRoute': '路线服务没有响应。',
'roadtrip.track.errorSave': '无法保存途经点。',
'roadtrip.track.clear': '移除 {count} 个途经点',
'roadtrip.poi.rest': '服务区',
'roadtrip.poi.campsite': '露营地',
'roadtrip.poi.food': '餐饮',