Compare commits

..

No commits in common. "306ed2ae0e2ab46f32eadcc9d38c441c219cf428" and "63eae15191ca4bfc82f3ddce1d19d40dd39cbc0f" have entirely different histories.

19 changed files with 265 additions and 304 deletions

View File

@ -19,24 +19,6 @@ const attributesWithNamespace = {
width: 'gpx_style:width',
};
const floatPatterns = [
/[-+]?\d*\.\d+$/, // decimal
/[-+]?\d+$/, // integer
];
function safeParseFloat(value: string): number {
const parsed = parseFloat(value);
if (!isNaN(parsed)) {
return parsed;
}
for (const pattern of floatPatterns) {
const match = value.match(pattern);
if (match) {
return parseFloat(match[0]);
}
}
return 0.0;
}
export function parseGPX(gpxData: string): GPXFile {
const parser = new XMLParser({
ignoreAttributes: false,
@ -56,7 +38,7 @@ export function parseGPX(gpxData: string): GPXFile {
},
attributeValueProcessor(attrName, attrValue, jPath) {
if (attrName === 'lat' || attrName === 'lon') {
return safeParseFloat(attrValue);
return parseFloat(attrValue);
}
return attrValue;
},
@ -70,7 +52,7 @@ export function parseGPX(gpxData: string): GPXFile {
tagValueProcessor(tagName, tagValue, jPath, hasAttributes, isLeafNode) {
if (isLeafNode) {
if (tagName === 'ele') {
return safeParseFloat(tagValue);
return parseFloat(tagValue);
}
if (tagName === 'time') {
@ -85,14 +67,14 @@ export function parseGPX(gpxData: string): GPXFile {
tagName === 'gpx_style:opacity' ||
tagName === 'gpx_style:width'
) {
return safeParseFloat(tagValue);
return parseFloat(tagValue);
}
if (tagName === 'gpxpx:PowerExtension') {
// Finish the transformation of the simple <power> tag to the more complex <gpxpx:PowerExtension> tag
// Note that this only targets the transformed <power> tag, since it must be a leaf node
return {
'gpxpx:PowerInWatts': safeParseFloat(tagValue),
'gpxpx:PowerInWatts': parseFloat(tagValue),
};
}
}

View File

@ -1,23 +0,0 @@
<script lang="ts">
import { Button } from '$lib/components/ui/button';
import { ClipboardCopy } from 'lucide-svelte';
import { _ } from 'svelte-i18n';
import type { Coordinates } from 'gpx';
export let coordinates: Coordinates;
export let onCopy: () => void = () => {};
</script>
<Button
class="w-full px-2 py-1 h-8 justify-start {$$props.class}"
variant="outline"
on:click={() => {
navigator.clipboard.writeText(
`${coordinates.lat.toFixed(6)}, ${coordinates.lon.toFixed(6)}`
);
onCopy();
}}
>
<ClipboardCopy size="16" class="mr-1" />
{$_('menu.copy_coordinates')}
</Button>

View File

@ -1,10 +1,10 @@
<script lang="ts">
import type { TrackPoint } from 'gpx';
import type { PopupItem } from '$lib/components/MapPopup';
import CopyCoordinates from '$lib/components/gpx-layer/CopyCoordinates.svelte';
import * as Card from '$lib/components/ui/card';
import { Button } from '$lib/components/ui/button';
import WithUnits from '$lib/components/WithUnits.svelte';
import { Compass, Mountain, Timer } from 'lucide-svelte';
import { Compass, Mountain, Timer, ClipboardCopy } from 'lucide-svelte';
import { df } from '$lib/utils';
import { _ } from 'svelte-i18n';
@ -34,10 +34,18 @@
{df.format(trackpoint.item.time)}
</div>
{/if}
<CopyCoordinates
coordinates={trackpoint.item.attributes}
onCopy={() => trackpoint.hide?.()}
class="mt-0.5"
/>
<Button
class="w-full px-2 py-1 h-6 justify-start mt-0.5"
variant="secondary"
on:click={() => {
navigator.clipboard.writeText(
`${trackpoint.item.getLatitude().toFixed(6)}, ${trackpoint.item.getLongitude().toFixed(6)}`
);
trackpoint.hide?.();
}}
>
<ClipboardCopy size="16" class="mr-1" />
{$_('menu.copy_coordinates')}
</Button>
</Card.Content>
</Card.Root>

View File

@ -2,7 +2,6 @@
import * as Card from '$lib/components/ui/card';
import { Button } from '$lib/components/ui/button';
import Shortcut from '$lib/components/Shortcut.svelte';
import CopyCoordinates from '$lib/components/gpx-layer/CopyCoordinates.svelte';
import { deleteWaypoint } from './GPXLayerPopup';
import WithUnits from '$lib/components/WithUnits.svelte';
import { Dot, ExternalLink, Trash2 } from 'lucide-svelte';
@ -78,20 +77,17 @@
<span class="whitespace-pre-wrap">{@html sanitize(waypoint.item.cmt)}</span>
{/if}
</ScrollArea>
<div class="mt-2 flex flex-col gap-1">
<CopyCoordinates coordinates={waypoint.item.attributes} />
{#if $currentTool === Tool.WAYPOINT}
<Button
class="w-full px-2 py-1 h-8 justify-start"
variant="outline"
on:click={() => deleteWaypoint(waypoint.fileId, waypoint.item._data.index)}
>
<Trash2 size="16" class="mr-1" />
{$_('menu.delete')}
<Shortcut shift={true} click={true} />
</Button>
{/if}
</div>
{#if $currentTool === Tool.WAYPOINT}
<Button
class="mt-2 w-full px-2 py-1 h-8 justify-start"
variant="outline"
on:click={() => deleteWaypoint(waypoint.fileId, waypoint.item._data.index)}
>
<Trash2 size="16" class="mr-1" />
{$_('menu.delete')}
<Shortcut shift={true} click={true} />
</Button>
{/if}
</Card.Content>
</Card.Root>

View File

@ -220,7 +220,6 @@ export class OverpassLayer {
query: query,
icon: `overpass-${query}`,
tags: element.tags,
type: element.type,
},
},
});

View File

@ -35,8 +35,7 @@
<Button
class="ml-auto p-1.5 h-8"
variant="outline"
href="https://www.openstreetmap.org/edit?editor=id&{poi.item.type ??
'node'}={poi.item.id}"
href="https://www.openstreetmap.org/edit?editor=id&node={poi.item.id}"
target="_blank"
>
<PencilLine size="16" />

View File

@ -69,14 +69,14 @@
endDate = undefined;
endTime = undefined;
}
if ($gpxStatistics.global.time.moving && $gpxStatistics.global.speed.moving) {
if ($gpxStatistics.global.time.moving) {
movingTime = $gpxStatistics.global.time.moving;
setSpeed($gpxStatistics.global.speed.moving);
} else if ($gpxStatistics.global.time.total && $gpxStatistics.global.speed.total) {
movingTime = $gpxStatistics.global.time.total;
setSpeed($gpxStatistics.global.speed.total);
} else {
movingTime = undefined;
}
if ($gpxStatistics.global.speed.moving) {
setSpeed($gpxStatistics.global.speed.moving);
} else {
speed = undefined;
}
}
@ -329,7 +329,7 @@
let fileId = item.getFileId();
dbUtils.applyToFile(fileId, (file) => {
if (item instanceof ListFileItem) {
if (artificial || !$gpxStatistics.global.time.moving) {
if (artificial) {
file.createArtificialTimestamps(
getDate(startDate, startTime),
movingTime
@ -342,7 +342,7 @@
);
}
} else if (item instanceof ListTrackItem) {
if (artificial || !$gpxStatistics.global.time.moving) {
if (artificial) {
file.createArtificialTimestamps(
getDate(startDate, startTime),
movingTime,
@ -357,7 +357,7 @@
);
}
} else if (item instanceof ListTrackSegmentItem) {
if (artificial || !$gpxStatistics.global.time.moving) {
if (artificial) {
file.createArtificialTimestamps(
getDate(startDate, startTime),
movingTime,

View File

@ -59,7 +59,7 @@ async function getRoute(
brouterProfile: string,
privateRoads: boolean
): Promise<TrackPoint[]> {
let url = `https://brouter.gpx.studio?lonlats=${points.map((point) => `${point.lon.toFixed(8)},${point.lat.toFixed(8)}`).join('|')}&profile=${brouterProfile + (privateRoads ? '-private' : '')}&format=geojson&alternativeidx=0`;
let url = `https://routing.gpx.studio?lonlats=${points.map((point) => `${point.lon.toFixed(8)},${point.lat.toFixed(8)}`).join('|')}&profile=${brouterProfile + (privateRoads ? '-private' : '')}&format=geojson&alternativeidx=0`;
let response = await fetch(url);

View File

@ -10,4 +10,4 @@ We also use APIs from <a href="https://mapbox.com" target="_blank">Mapbox</a> to
Unfortunately, this is expensive.
If you enjoy using this tool and find it valuable, please consider making a small donation to help keep the website free and ad-free.
Mange tak for din støtte! ❤️
Thank you very much for your support! ❤️

View File

@ -2,4 +2,4 @@ Mapbox is the company that provides some of the beautiful maps on this website.
They also develop the <a href="https://github.com/mapbox/mapbox-gl-js" target="_blank">map engine</a> which powers **gpx.studio**.
We are incredibly fortunate and grateful to be part of their <a href="https://mapbox.com/community" target="_blank">Community</a> program, which supports nonprofits, educational institutions, and positive impact organizations.
Dette partnerskab tillader **gpx. tudio-** at drage fordel af Mapbox værktøjer til nedsatte priser i høj grad bidrage til projektets finansielle levedygtighed og sætte os i stand til at tilbyde den bedst mulige brugeroplevelse.
This partnership allows **gpx.studio** to benefit from Mapbox tools at discounted prices, greatly contributing to the financial viability of the project and enabling us to offer the best possible user experience.

View File

@ -2,11 +2,11 @@
import { Languages } from 'lucide-svelte';
</script>
## <Languages size="18" class="mr-1 inline-block align-baseline" /> Oversættelse
## <Languages size="18" class="mr-1 inline-block align-baseline" /> Translation
Hjemmesiden er oversat af frivillige ved hjælp af en kollaborativ oversættelsesplatform.
The website is translated by volunteers using a collaborative translation platform.
You can contribute by adding or improving translations on our <a href="https://crowdin.com/project/gpxstudio" target="_blank">Crowdin project</a>.
If you would like to start translating into a new language, please <a href="#contact">get in touch</a>.
Enhver hjælp er værdsat!
Any help is greatly appreciated!

View File

@ -30,7 +30,7 @@ Change the language used in the interface.
You can contribute by adding or improving translations on our <a href="https://crowdin.com/project/gpxstudio" target="_blank">Crowdin project</a>.
If you would like to start translating into a new language, please <a href="#contact">get in touch</a>.
Enhver hjælp er værdsat!
Any help is greatly appreciated!
</DocsNote>

View File

@ -1,5 +1,5 @@
---
title: GPX fájlformátum
title: GPX file format
---
<script>

View File

@ -9,7 +9,7 @@ title: Nevezetes helyek
# <MapPin size="24" class="inline-block" style="margin-bottom: 5px" /> { title }
A [POI](../gpx) hozzáadható a GPX fájlokhoz, hogy megjelölje az érdekes helyeket a térképen, és megjelenítse azokat GPS-eszközén.
A [Points of Interest](../gpx) hozzáadható a GPX-fájlokhoz, hogy megjelölje az érdekes helyeket a térképen, és megjelenítse azokat GPS-eszközén.
### Érdekes pont létrehozása

View File

@ -1,5 +1,5 @@
---
title: Wyczyść
title: Clean
---
<script>

View File

@ -5,12 +5,12 @@
"embed_title": "El editor online de archivos GPX",
"help_title": "ayuda",
"404_title": "página no encontrada",
"description": "Mira, edita y crea archivos GPX online con planificación avanzada de rutas y herramientas de procesamiento de archivos, bonitos mapas y visualizaciones detalladas de datos."
"description": "Ver, editar y crear archivos GPX online con capacidades de planificación avanzada de rutas y herramientas de procesamiento de archivos, hermosos mapas y visualizaciones detalladas de datos."
},
"menu": {
"new": "Nuevo",
"new_file": "Nuevo archivo",
"new_track": "Nuevo recorrido",
"new_track": "Nueva pista",
"new_segment": "Nuevo segmento",
"open": "Abrir...",
"duplicate": "Duplicar track",
@ -22,7 +22,7 @@
"export": "Exportar...",
"export_all": "Exportar todo...",
"export_options": "Opciones de exportación",
"support_message": "El uso de la herramienta es gratuito, pero no así su mantenimiento. Por favor, considere apoyar este sitio web si lo usas a menudo. ¡Gracias!",
"support_message": "El uso de la herramienta es gratuito, pero no así su mantenimiento. Por favor, considere apoyar este sitio web si lo usa a menudo. ¡Gracias!",
"support_button": "Ayude a mantener gratuito este sitio web",
"download_file": "Descargar archivo",
"download_files": "Descargar archivos",
@ -103,11 +103,11 @@
},
"start_loop_here": "Iniciar bucle aquí",
"help_no_file": "Seleccione una traza para utilizar la herramienta de enrutamiento o haga clic en el mapa para empezar a crear una nueva ruta.",
"help": "Haga clic en el mapa para añadir un nuevo punto de anclaje o arrastre los existentes para cambiar la ruta.",
"help": "Haga clic en el mapa para añadir un nuevo punto ancla o arrastre los existentes para cambiar la ruta.",
"activities": {
"bike": "En bicicleta",
"racing_bike": "Bicicleta de carretera",
"gravel_bike": "Bicicleta de grave",
"gravel_bike": "Bicicleta gravel",
"mountain_bike": "Bicicleta de montaña",
"foot": "Correr/Caminar",
"motorcycle": "Motocicleta",
@ -125,7 +125,7 @@
"sett": "Baldosa",
"metal": "Metal",
"wood": "Madera",
"compacted": "Grava compactada",
"compacted": "Grava compacta",
"fine_gravel": "Grava fina",
"gravel": "Grava",
"pebblestone": "Canto rodado",
@ -136,7 +136,7 @@
"mud": "Barro",
"sand": "Arena",
"grass": "Hierba",
"grass_paver": "Camino de hierba",
"grass_paver": "Adoquines de césped",
"clay": "Arcilla",
"stone": "Piedra"
},
@ -156,7 +156,7 @@
"residential": "Vía residencial",
"living_street": "Calle residencial",
"service": "Vía de servicio",
"track": "Camino",
"track": "Pista",
"footway": "Pasarela",
"path": "Sendero",
"pedestrian": "Peatonal",
@ -181,9 +181,9 @@
"hiking": "Senderismo",
"mountain_hiking": "Senderismo de montaña",
"demanding_mountain_hiking": "Senderismo de montaña exigente",
"alpine_hiking": "Alpinismo",
"demanding_alpine_hiking": "Alpinismo exigente",
"difficult_alpine_hiking": "Alpinismo difícil"
"alpine_hiking": "Senderismo alpino",
"demanding_alpine_hiking": "Senderismo alpino exigente",
"difficult_alpine_hiking": "Senderismo alpino difícil"
},
"mtb_scale": "Escala MTB",
"error": {
@ -212,22 +212,22 @@
"help_invalid_selection": "Seleccione un único trazado para gestionar sus datos de tiempo."
},
"merge": {
"merge_traces": "Conectar las trazas",
"merge_contents": "Combinar los contenidos y mantener las trazas desconectadas",
"merge_traces": "Conectar los trazados",
"merge_contents": "Combinar los contenidos y mantener los trazados desconectados",
"merge_selection": "Combinar selección",
"remove_gaps": "Eliminar intervalos de tiempo entre trazas",
"remove_gaps": "Eliminar intervalos vacíos de tiempo entre trazas",
"tooltip": "Combinar elementos",
"help_merge_traces": "Al conectar las trazas seleccionadas se creará una única traza continua.",
"help_cannot_merge_traces": "Su selección debe contener varias trazas para conectarlos.",
"help_merge_traces": "Conectar los trazados seleccionados creará un único trazado continuo.",
"help_cannot_merge_traces": "Su selección debe contener varios trazados para conectarlos.",
"help_merge_contents": "Combinar el contenido de los elementos seleccionados los agrupará dentro del primer elemento.",
"help_cannot_merge_contents": "Su selección debe contener varios elementos para combinar sus contenidos.",
"selection_tip": "Consejo: use {KEYBOARD_SHORTCUT} para añadir elementos a la selección."
},
"extract": {
"tooltip": "Extrae contenidos en elementos separados",
"tooltip": "Extraer contenidos en elementos separados",
"button": "Extraer",
"help": "Al extraer los contenidos de los elementos seleccionados creará un elemento separado para cada uno.",
"help_invalid_selection": "Su selección debe contener elementos con múltiples trazas para extraerlos."
"help": "Extraer los contenidos de los elementos seleccionados creará un elemento separado para cada uno.",
"help_invalid_selection": "Su selección debe contener elementos con múltiples trazados para extraerlos."
},
"elevation": {
"button": "Solicitar datos de desnivel",
@ -251,17 +251,17 @@
"number_of_points": "Cantidad de puntos GPS",
"button": "Minimizar",
"help": "Use la barra deslizante para elegir la cantidad de puntos GPS a conservar.",
"help_no_selection": "Seleccione una traza para reducir su cantidad de puntos GPS."
"help_no_selection": "Seleccione un trazo para reducir su cantidad de puntos GPS."
},
"clean": {
"tooltip": "Limpiar puntos GPS y puntos de interés con una selección rectangular",
"delete_trackpoints": "Eliminar puntos GPS",
"delete_waypoints": "Eliminar puntos de interés",
"delete_inside": "Eliminar en el interior de la selección",
"delete_outside": "Eliminar en el exterior de la selección",
"delete_inside": "Eliminar interior de la selección",
"delete_outside": "Eliminar exterior de la selección",
"button": "Eliminar track",
"help": "Seleccione un área rectangular en el mapa para eliminar puntos GPS y puntos de interés.",
"help_no_selection": "Seleccione una traza para limpiar puntos GPS y puntos de interés."
"help_no_selection": "Seleccione un trazo para limpiar puntos GPS y puntos de interés."
}
},
"layers": {
@ -320,7 +320,7 @@
"ordnanceSurvey": "Encuesta Ordnance",
"norwayTopo": "Topografisk Norgeskart 4",
"swedenTopo": "Lantmäteriet Topo",
"swedenSatellite": "Satélite Lantmäteriet ",
"swedenSatellite": "Satélite Lantmat",
"finlandTopo": "Lantmäteriverket Terrängkarta",
"bgMountains": "BGMountains",
"usgs": "USGS",
@ -333,17 +333,17 @@
"swisstopoCyclingClosures": "swisstopo Rutas Ciclismo",
"swisstopoMountainBike": "swisstopo MTB",
"swisstopoMountainBikeClosures": "swisstopo Rutas MTB",
"swisstopoSkiTouring": "swisstopo Esquí de Travesía ",
"swisstopoSkiTouring": "swisstopo Ski Touring",
"ignFrCadastre": "IGN Cadastre",
"ignSlope": "IGN Pendiente",
"ignSkiTouring": "IGN Esquí de Travesía",
"ignSkiTouring": "IGN Ski Touring",
"waymarked_trails": "Caminos marcados",
"waymarkedTrailsHiking": "Senderismo",
"waymarkedTrailsCycling": "Ciclismo",
"waymarkedTrailsMTB": "MTB",
"waymarkedTrailsSkating": "Patinaje",
"waymarkedTrailsSkating": "Patín",
"waymarkedTrailsHorseRiding": "Equitación",
"waymarkedTrailsWinter": "Invernal",
"waymarkedTrailsWinter": "Invierno",
"points_of_interest": "Puntos de interés",
"food": "Comida",
"bakery": "Panadería",
@ -357,7 +357,7 @@
"motorized": "Coches y motos",
"fuel-station": "Gasolinera",
"parking": "Aparcamiento",
"garage": "Garaje",
"garage": "Taller",
"barrier": "Barrera",
"tourism": "Turismo",
"attraction": "Atracción",
@ -406,14 +406,14 @@
"feet": "ft",
"kilometers": "km",
"miles": "mi",
"nautical_miles": "mn",
"nautical_miles": "nm",
"celsius": "ºC",
"fahrenheit": "ºF",
"kilometers_per_hour": "km/h",
"miles_per_hour": "millas/h",
"minutes_per_kilometer": "min/km",
"minutes_per_mile": "min/mi",
"minutes_per_nautical_mile": "min/mn",
"minutes_per_mile": "min/milla",
"minutes_per_nautical_mile": "min/nm",
"knots": "kn",
"heartrate": "ppm",
"cadence": "rpm",
@ -430,7 +430,7 @@
"waypoints": "Puntos de interés",
"symbol": {
"alert": "Alerta",
"anchor": "Anclaje",
"anchor": "Ancla",
"bank": "Banco",
"beach": "Playa",
"bike_trail": "Sendero de bicicleta",
@ -461,7 +461,7 @@
"restricted_area": "Área Restringida",
"restroom": "Baños",
"road": "Carretera",
"scenic_area": "Zona Panorámica",
"scenic_area": "Zona Pintoresca",
"shelter": "Refugio",
"shopping_center": "Centro Comercial",
"shower": "Ducha",
@ -484,16 +484,16 @@
"email": "Email",
"contribute": "Contribuir",
"supported_by": "con el apoyo de",
"support_button": "Apoyar gpx.studio en Ko-fi",
"support_button": "Apoye gpx.studio en Ko-fi",
"route_planning": "Planificación de ruta",
"route_planning_description": "Una interfaz intuitiva para crear itinerarios adaptados a cada deporte, basada en datos de OpenStreetMap.",
"file_processing": "Procesamiento avanzado de archivo",
"file_processing": "Procesamiento avanzado de archivos",
"file_processing_description": "Un conjunto de herramientas para realizar todas las tareas comunes de procesamiento de archivos y que se pueden aplicar a varios archivos a la vez.",
"maps": "Mapas globales y locales",
"maps_description": "Una gran colección de mapas base, capas y puntos de interés para ayudarle a crear su próxima aventura al aire libre o visualizar su último logro.",
"maps_description": "Una gran colección de mapas base, capas y puntos de interés para ayudarle a fabricar su próxima aventura al aire libre o visualizar su último logro.",
"data_visualization": "Visualización de datos",
"data_visualization_description": "Un perfil de elevación interactivo con estadísticas detalladas para analizar actividades registradas y futuros objetivos.",
"identity": "Gratis, sin anuncios y código abierto",
"identity": "Gratis, libre de anuncios y open source",
"identity_description": "Este sitio web es de uso gratuito, sin anuncios y el código fuente está disponible públicamente en GitHub. Esto solo es posible gracias al increíble apoyo de la comunidad."
},
"docs": {
@ -524,7 +524,7 @@
"drive_ids": "IDs de archivo de Google Drive (separados por comas)",
"basemap": "Mapa base",
"height": "Altura",
"fill_by": "Rellenado por",
"fill_by": "Rellenar por",
"none": "Ninguno",
"show_controls": "Mostrar controles",
"manual_camera": "Cámara manual",

View File

@ -1,7 +1,7 @@
{
"metadata": {
"home_title": "edytor online plików GPX",
"app_title": "Aplikacja",
"app_title": "",
"embed_title": "edytor online plików GPX",
"help_title": "pomoc",
"404_title": "nie odnaleziono strony",
@ -148,44 +148,44 @@
"trunk_link": "Link do głównej drogi",
"primary": "Główna droga",
"primary_link": "Link do głównej drogi",
"secondary": "Droga podporządkowana",
"secondary_link": "Link do drogi podporządkowanej",
"tertiary": "Droga trzeciorzędna",
"tertiary_link": "Link do drogi trzeciorzędnej",
"unclassified": "Mniejsza droga",
"residential": "Droga dojazdowa",
"living_street": "Ulica",
"service": "Droga techniczna",
"track": "Droga szutrowa",
"footway": "Chodnik",
"path": "Ścieżka",
"pedestrian": "Pieszy",
"cycleway": "Droga rowerowa",
"steps": "Schody",
"road": "Jezdnia",
"bridleway": "Droga konna",
"platform": "Peron",
"raceway": "Tor wyścigowy",
"rest_area": "Miejsce odpoczynku",
"abandoned": "Porzucone",
"services": "Usługi",
"corridor": "Korytarz",
"bus_stop": "Przystanek autobusowy",
"busway": "Bus-pas",
"elevator": "Winda",
"via_ferrata": "Szlak wspinaczkowy z asekuracją",
"proposed": "Planowana droga",
"construction": "Droga w budowie"
"secondary": "Secondary road",
"secondary_link": "Secondary road link",
"tertiary": "Tertiary road",
"tertiary_link": "Tertiary road link",
"unclassified": "Minor road",
"residential": "Residential road",
"living_street": "Living street",
"service": "Service road",
"track": "Track",
"footway": "Footway",
"path": "Path",
"pedestrian": "Pedestrian",
"cycleway": "Cycleway",
"steps": "Steps",
"road": "Road",
"bridleway": "Horseriding path",
"platform": "Platform",
"raceway": "Racing circuit",
"rest_area": "Rest area",
"abandoned": "Abandoned",
"services": "Services",
"corridor": "Corridor",
"bus_stop": "Bus stop",
"busway": "Busway",
"elevator": "Elevator",
"via_ferrata": "Via ferrata",
"proposed": "Road to be built",
"construction": "Road under construction"
},
"sac_scale": {
"hiking": "Wędrówki",
"mountain_hiking": "Wędrówka górska",
"demanding_mountain_hiking": "Wymagająca górska wędrówka",
"alpine_hiking": "Wspinaczka alpejska",
"demanding_alpine_hiking": "Wymagająca wspinaczka alpejska",
"difficult_alpine_hiking": "Trudna wspinaczka alpejska"
"hiking": "Hiking",
"mountain_hiking": "Mountain hiking",
"demanding_mountain_hiking": "Demanding mountain hiking",
"alpine_hiking": "Alpine hiking",
"demanding_alpine_hiking": "Demanding alpine hiking",
"difficult_alpine_hiking": "Difficult alpine hiking"
},
"mtb_scale": "Skala MTB",
"mtb_scale": "MTB scale",
"error": {
"from": "Punkt początkowy jest zbyt daleko od najbliższej drogi",
"via": "Punkt przelotowy jest zbyt daleko od najbliższej drogi",
@ -198,7 +198,7 @@
"crop": "Przytnij",
"split_as": "Podziel ślad na",
"help_invalid_selection": "Wybierz ślad do przycinania lub rozdzielenia.",
"help": "Użyj suwaka, aby skrócić ślad lub podzielić go klikając na jeden ze znaczników lub na sam ślad."
"help": ".."
},
"time": {
"tooltip": "Zarządzaj danymi czasu",
@ -215,13 +215,13 @@
"merge_traces": "Połącz ślady",
"merge_contents": "Scal zawartość, ale utrzymaj rozłączone ślady",
"merge_selection": "Scal zaznaczenie",
"remove_gaps": "Usuń przerwy czasowe między śladami",
"remove_gaps": "Remove time gaps between traces",
"tooltip": "Scal elementy razem",
"help_merge_traces": "Połączenie zaznaczonych śladów stworzy pojedynczy ciągły ślad.",
"help_cannot_merge_traces": "Wybór musi zawierać kilka śladów, aby je połączyć.",
"help_merge_contents": "Scalanie zawartości zaznaczonych elementów zgrupuje całą zawartość wewnątrz pierwszego elementu.",
"help_cannot_merge_contents": "Twój wybór musi zawierać kilka elementów, aby scalić ich zawartość.",
"selection_tip": "Wskazówka: użyj {KEYBOARD_SHORTCUT} aby dodać elementy do wyboru."
"selection_tip": "Tip: use {KEYBOARD_SHORTCUT} to add items to the selection."
},
"extract": {
"tooltip": "Wyodrębnij zawartość do rozdzielenia elementów",
@ -230,9 +230,9 @@
"help_invalid_selection": "Twój wybór musi zawierać elementy z kilkoma śladami, aby je rozpakować."
},
"elevation": {
"button": "Dodaj dane o wysokości terenu",
"help": "Dodanie tych danych nadpisze wszystkie naniesione informacje o wysokościach danymi pobranymi z Mapbox. ",
"help_no_selection": "Wybierz plik do wczytania danych o wysokości w terenie."
"button": "Request elevation data",
"help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from Mapbox.",
"help_no_selection": "Select a file item to request elevation data."
},
"waypoint": {
"tooltip": "Twórz i edytuj punkty zainteresowania",
@ -260,20 +260,20 @@
"delete_inside": "Usuń wewnątrz zaznaczenia",
"delete_outside": "Usuń na zewnątrz zaznaczenia",
"button": "Usuń",
"help": "Zaznacz prostokątnie obszar na mapie, z którego chcesz usunąć punkty GPS.",
"help_no_selection": "Wybierz ślad, z którego chcesz usunąć punkty GPS."
"help": "Select a rectangle area on the map to remove GPS points and points of interest.",
"help_no_selection": "Select a trace to clean GPS points and points of interest."
}
},
"layers": {
"settings": "Ustawienia warstw",
"settings_help": "Wybierz warstwy mapy, które chcesz pokazać w interfejsie, dodaj niestandardowe i dostosuj ich ustawienia.",
"selection": "Wybór warstw",
"settings_help": "Select the map layers you want to show in the interface, add custom ones, and adjust their settings.",
"selection": "Layer selection",
"custom_layers": {
"title": "Niestandardowe warstwy",
"new": "Nowa warstwa niestandardowa",
"edit": "Edytuj niestandardową warstwę",
"title": "Custom layers",
"new": "New custom layer",
"edit": "Edit custom layer",
"urls": "URL(e)",
"url_placeholder": "JSON w stylu WMTS, WMS lub Mapbox",
"url_placeholder": "WMTS, WMS or Mapbox style JSON",
"max_zoom": "Maksymalne powiększenie",
"layer_type": "Rodzaj warstwy",
"basemap": "Mapa bazowa",
@ -281,7 +281,7 @@
"create": "Utwórz warstwę",
"update": "Zaktualizuj warstwę"
},
"opacity": "Przezroczystość nakładki",
"opacity": "Overlay opacity",
"label": {
"basemaps": "Mapy bazowe",
"overlays": "Nakładki",
@ -299,8 +299,8 @@
"switzerland": "Szwajcaria",
"united_kingdom": "Wielka Brytania",
"united_states": "Stany Zjednoczone",
"mapboxOutdoors": "Teren (Mapbox)",
"mapboxSatellite": "Satelita (Mapbox)",
"mapboxOutdoors": "Mapbox Outdoors",
"mapboxSatellite": "Mapbox Satellite",
"openStreetMap": "OpenStreetMap",
"openTopoMap": "OpenTopoMap",
"openHikingMap": "OpenHikingMap",
@ -314,9 +314,9 @@
"ignFrPlan": "IGN Plan",
"ignFrTopo": "IGN Topo",
"ignFrScan25": "IGN SCAN25",
"ignFrSatellite": "Satelita (IGN)",
"ignFrSatellite": "IGN Satellite",
"ignEs": "IGN Topo",
"ignEsSatellite": "Satelita (IGN)",
"ignEsSatellite": "IGN Satellite",
"ordnanceSurvey": "Ordnance Survey",
"norwayTopo": "Topografisk Norgeskart 4",
"swedenTopo": "Lantmäteriet Topo",
@ -337,15 +337,15 @@
"ignFrCadastre": "IGN Cadastre",
"ignSlope": "IGN Slope",
"ignSkiTouring": "IGN Ski Touring",
"waymarked_trails": "Oznakowane szlaki",
"waymarkedTrailsHiking": "Turystyczne",
"waymarked_trails": "Waymarked Trails",
"waymarkedTrailsHiking": "Hiking",
"waymarkedTrailsCycling": "Kolarstwo",
"waymarkedTrailsMTB": "Rower górski",
"waymarkedTrailsSkating": "Rolki",
"waymarkedTrailsHorseRiding": "Jazda konna",
"waymarkedTrailsWinter": "Zima",
"points_of_interest": "Punkty zainteresowania",
"food": "Żywność",
"food": "Odżywianie",
"bakery": "Piekarnia",
"food-store": "Sklep z żywnością",
"eat-and-drink": "Jedzenie i picie",
@ -381,12 +381,12 @@
}
},
"chart": {
"settings": "Ustawienia profilu wysokościowego"
"settings": "Elevation profile settings"
},
"quantities": {
"distance": "Dystans",
"elevation": "Przewyższenie",
"elevation_gain_loss": "Przewyższenia",
"elevation_gain_loss": "Elevation gain and loss",
"temperature": "Temperatura",
"speed": "Prędkość",
"pace": "Tempo",
@ -395,28 +395,28 @@
"power": "Moc",
"slope": "Nachylenie",
"surface": "Powierzchnia",
"highway": "Kategorie",
"highway": "Category",
"time": "Czas",
"moving": "W ruchu",
"total": "Łącznie",
"osm_extensions": "Dane OpenStreetMap"
"osm_extensions": "OpenStreetMap data"
},
"units": {
"meters": "m",
"feet": "ft",
"kilometers": "km",
"miles": "mi",
"nautical_miles": "mile morskie",
"nautical_miles": "nm",
"celsius": "°C",
"fahrenheit": "°F",
"kilometers_per_hour": "km/h",
"miles_per_hour": "mil/h",
"miles_per_hour": "mph",
"minutes_per_kilometer": "min/km",
"minutes_per_mile": "min/mi",
"minutes_per_nautical_mile": "min/mil morskie",
"knots": "węzły morskie",
"heartrate": "uderz./min",
"cadence": "obrot./min",
"minutes_per_nautical_mile": "min/nm",
"knots": "kn",
"heartrate": "bpm",
"cadence": "rpm",
"power": "W"
},
"gpx": {
@ -432,98 +432,98 @@
"alert": "Ostrzeżenie",
"anchor": "Punkt stały",
"bank": "Bank",
"beach": "Plaża",
"bike_trail": "Ścieżka rowerowa",
"binoculars": "Lornetki",
"bridge": "Most",
"building": "Budynek",
"beach": "Beach",
"bike_trail": "Bike Trail",
"binoculars": "Binoculars",
"bridge": "Bridge",
"building": "Building",
"campground": "Kemping",
"car": "Samochód",
"car_repair": "Warsztat",
"car": "Car",
"car_repair": "Garage",
"convenience_store": "Sklep spożywczy",
"crossing": "Przejście",
"department_store": "Dom Towarowy",
"crossing": "Crossing",
"department_store": "Department Store",
"drinking_water": "Woda",
"exit": "Wyjście",
"lodge": "Chatka",
"lodging": "Pokoje",
"forest": "Las",
"exit": "Exit",
"lodge": "Hut",
"lodging": "Accommodation",
"forest": "Forest",
"gas_station": "Stacja paliw",
"ground_transportation": "Transport lądowy",
"ground_transportation": "Ground Transportation",
"hotel": "Hotel",
"house": "Dom",
"information": "Informacja",
"house": "House",
"information": "Information",
"park": "Park",
"parking_area": "Parking",
"pharmacy": "Apteka",
"picnic_area": "Strefa piknikowa",
"pharmacy": "Pharmacy",
"picnic_area": "Picnic Area",
"restaurant": "Restauracja",
"restricted_area": "Obszar zastrzeżony",
"restricted_area": "Restricted Area",
"restroom": "Toalety",
"road": "Droga",
"scenic_area": "Strefa piknikowa",
"shelter": "Schronisko",
"shopping_center": "Centrum handlowe",
"road": "Road",
"scenic_area": "Scenic Area",
"shelter": "Shelter",
"shopping_center": "Shopping Center",
"shower": "Prysznic",
"summit": "Szczyt",
"telephone": "Telefon",
"tunnel": "Tunel",
"water_source": "Źródło wody"
"summit": "Summit",
"telephone": "Telephone",
"tunnel": "Tunnel",
"water_source": "Water Source"
}
},
"homepage": {
"website": "Strona",
"home": "Start",
"app": "Aplikacja",
"contact": "Kontakt",
"website": "Website",
"home": "Home",
"app": "App",
"contact": "Contact",
"reddit": "Reddit",
"x": "X",
"facebook": "Facebook",
"github": "GitHub",
"crowdin": "Crowdin",
"email": "Email",
"contribute": "Wesprzyj",
"supported_by": "wspierane przez",
"support_button": "Wesprzyj gpx.studio na Ko-fi",
"route_planning": "Planowanie trasy",
"route_planning_description": "Intuicyjny interfejs do tworzenia tras dostosowanych do każdego sportu, na bazie danych OpenStreetMap.",
"file_processing": "Rozbudowanie przetwarzanie plików",
"file_processing_description": "Zestaw narzędzi do wykonywania akcji i innych operacji na wielu plikach jednocześnie.",
"maps": "Globalne i lokalne mapy",
"maps_description": "Duża kolekcja podstawowych map, nakładek i ulubionych punktów, które pomogą Ci stworzyć następną przygodę lub zwizualizować swoje ostatnie osiągnięcie.",
"data_visualization": "Prezentacja danych",
"data_visualization_description": "Interaktywny profil ukształtowania terenu wraz ze szczegółowymi danymi statystycznymi, służącymi do analizy odbytych wycieczek i przyszłych aktywności.",
"identity": "Darmowa, wolna od reklam i w duchu open-source",
"identity_description": "Ta strona jest darmowa w użyciu, bez reklam, a kod źródłowy jest publicznie dostępny na platformie GitHub. Jest to możliwe tylko dzięki niesamowitemu wsparciu społeczności."
"contribute": "Contribute",
"supported_by": "supported by",
"support_button": "Support gpx.studio on Ko-fi",
"route_planning": "Route planning",
"route_planning_description": "An intuitive interface to create itineraries tailored to each sport, based on OpenStreetMap data.",
"file_processing": "Advanced file processing",
"file_processing_description": "A suite of tools for performing all common file processing tasks, and which can be applied to multiple files at once.",
"maps": "Global and local maps",
"maps_description": "A large collection of basemaps, overlays and points of interest to help you craft your next outdoor adventure, or visualize your latest achievement.",
"data_visualization": "Data visualization",
"data_visualization_description": "An interactive elevation profile with detailed statistics to analyze recorded activities and future objectives.",
"identity": "Free, ad-free and open source",
"identity_description": "The website is free to use, without ads, and the source code is publicly available on GitHub. This is only possible thanks to the incredible support of the community."
},
"docs": {
"translate": "Ulepsz tłumaczenie na Crowdin",
"answer_not_found": "Nie znalazłeś tego, czego szukałeś?",
"ask_on_reddit": "Zapytaj społeczność na Reddit",
"translate": "Improve the translation on Crowdin",
"answer_not_found": "Did not find what you were looking for?",
"ask_on_reddit": "Ask the community on Reddit",
"search": {
"search": "Szukaj",
"clear": "Wyczyść",
"search": "Search",
"clear": "Clear",
"cancel": "Anuluj",
"recent": "Ostatnie wyszukiwania",
"no_recent": "Brak ostatnich wyszukiwań",
"save": "Zapisz w historii wyszukiwań",
"remove": "Usuń to z historii wyszukiwań",
"favorites": "Ulubione",
"remove_favorite": "Usuń to wyszukiwanie z ulubionych",
"to_select": "",
"recent": "Recent searches",
"no_recent": "No recent searches",
"save": "Save this search",
"remove": "Remove this search from history",
"favorites": "Favorites",
"remove_favorite": "Remove this search from favorites",
"to_select": "to select",
"to_navigate": "to navigate",
"to_close": "to close",
"no_results": "Brak wyników dla",
"no_results_suggestion": "Spróbuj wyszukać"
"no_results": "No results for",
"no_results_suggestion": "Try searching for"
}
},
"embedding": {
"title": "Utwórz własną mapę",
"mapbox_token": "Token dostępu do Mapbox",
"title": "Create your own map",
"mapbox_token": "Mapbox access token",
"file_urls": "Adres URL do pliku (rozdzielonego przecinkami)",
"drive_ids": "ID pliku na Google Drive (rozdzielonego przecinkami)",
"basemap": "Mapa bazowa",
"height": "Wysokość",
"height": "Height",
"fill_by": "Wypełnij przez",
"none": "Brak",
"show_controls": "Pokazuj przyciski",

View File

@ -35,7 +35,7 @@
"elevation_profile": "Yükseklik profili",
"tree_file_view": "Dosyalar",
"switch_basemap": "Switch to previous basemap",
"toggle_overlays": "Katmanları Aç/Kapa",
"toggle_overlays": "Toggle overlays",
"toggle_3d": "3B'yi aç/kapat",
"settings": "Ayarlar",
"distance_units": "Mesafe birimleri",
@ -45,7 +45,7 @@
"velocity_units": "Velocity units",
"temperature_units": "Sıcaklık birimleri",
"celsius": "Santigrat",
"fahrenheit": "Fahrenayt",
"fahrenheit": "Fahrenheit",
"language": "Dil",
"mode": "Tema",
"system": "Sistem",
@ -80,7 +80,7 @@
"unhide": "Göster",
"center": "Orta",
"open_in": "Uygulamada Aç",
"copy_coordinates": "Koordinatları kopyala"
"copy_coordinates": "Copy coordinates"
},
"toolbar": {
"routing": {
@ -106,22 +106,22 @@
"help": "Yeni bir istasyon noktası eklemek için haritaya tıklayın veya mevcut olanları sürükleyerek güzergahı değiştirin.",
"activities": {
"bike": "Bisiklet",
"racing_bike": "Yol Bisikleti",
"racing_bike": "Road bike",
"gravel_bike": "Gravel bike",
"mountain_bike": "Dağ bisikleti",
"foot": "Koşu/yürüyüş",
"motorcycle": "Motosiklet",
"mountain_bike": "Mountain bike",
"foot": "Run/hike",
"motorcycle": "Motorcycle",
"water": "Su",
"railway": "Tren yolu"
},
"surface": {
"unknown": "Bilinmiyor",
"paved": "Asfaltlı",
"unpaved": "Asfaltsız",
"paved": "Paved",
"unpaved": "Unpaved",
"asphalt": "Asfalt",
"concrete": "Beton",
"cobblestone": "Mıcır",
"paving_stones": "Döşeli Taş",
"concrete": "Concrete",
"cobblestone": "Cobblestone",
"paving_stones": "Paving stones",
"sett": "Sett",
"metal": "Metal",
"wood": "Odun",
@ -130,22 +130,22 @@
"gravel": "Çakıl",
"pebblestone": "Çakıl taşı",
"rock": "Kaya",
"dirt": "Toprak",
"dirt": "Dirt",
"ground": "Toprak zemin",
"earth": "Kara",
"mud": "Çamur",
"sand": "Kum",
"mud": "Mud",
"sand": "Sand",
"grass": "Çimen",
"grass_paver": "Grass paver",
"clay": "Kil",
"clay": "Clay",
"stone": "Taş"
},
"highway": {
"unknown": "Bilinmiyor",
"motorway": "Otoyol",
"motorway_link": "Anayol bağlantısı",
"trunk": "Ana yol",
"trunk_link": "Ana yol bağlantısı",
"motorway_link": "Highway link",
"trunk": "Primary road",
"trunk_link": "Primary road link",
"primary": "Ana yol",
"primary_link": "Ana yol bağlantısı",
"secondary": "İkincil yol",
@ -156,32 +156,32 @@
"residential": "Residential road",
"living_street": "Living street",
"service": "Service road",
"track": "Pist",
"track": "Track",
"footway": "Footway",
"path": "Path",
"pedestrian": "Yaya",
"cycleway": "Cycleway",
"steps": "Adımlar",
"road": "Yol",
"bridleway": "Manej (At yolu)",
"bridleway": "Horseriding path",
"platform": "Platform",
"raceway": "Yarış pisti",
"raceway": "Racing circuit",
"rest_area": "Dinlenme alanı",
"abandoned": "Terk edilmiş",
"services": "Hizmetler",
"corridor": "Koridor",
"corridor": "Corridor",
"bus_stop": "Otobüs durağı",
"busway": "Busway",
"elevator": "Asansör",
"via_ferrata": "Via Ferrata",
"proposed": "Yol yapılacak",
"construction": "Yol bakımda"
"via_ferrata": "Via ferrata",
"proposed": "Road to be built",
"construction": "Road under construction"
},
"sac_scale": {
"hiking": "Yürüyüş",
"mountain_hiking": "Dağ yürüyüşü",
"demanding_mountain_hiking": "Demanding mountain hiking",
"alpine_hiking": "Alpin yürüyüş",
"alpine_hiking": "Alpine hiking",
"demanding_alpine_hiking": "Demanding alpine hiking",
"difficult_alpine_hiking": "Difficult alpine hiking"
},

View File

@ -1,30 +1,30 @@
import { guides } from '$lib/components/docs/docs.js';
function getModule(language: string | undefined, guide: string) {
language = language ?? 'en';
let subguide = undefined;
if (guide.includes('/')) {
[guide, subguide] = guide.split('/');
}
return subguide
? import(`./../lib/docs/${language}/${guide}/${subguide}.mdx`)
: import(`./../lib/docs/${language}/${guide}.mdx`);
language = language ?? 'en';
let subguide = undefined;
if (guide.includes('/')) {
[guide, subguide] = guide.split('/');
}
return subguide
? import(`./../lib/docs/${language}/${guide}/${subguide}.mdx`)
: import(`./../lib/docs/${language}/${guide}.mdx`);
}
export async function load({ params }) {
const { language } = params;
const { language } = params;
const guideTitles: Record<string, string> = {};
for (let guide of Object.keys(guides)) {
guideTitles[guide] = (await getModule(language, guide)).metadata.title;
for (let subguide of guides[guide]) {
guideTitles[`${guide}/${subguide}`] = (
await getModule(language, `${guide}/${subguide}`)
).metadata.title;
}
}
const guideTitles: Record<string, string> = {};
for (let guide of Object.keys(guides)) {
guideTitles[guide] = (await getModule(language, guide)).metadata.title;
for (let subguide of guides[guide]) {
guideTitles[`${guide}/${subguide}`] = (
await getModule(language, `${guide}/${subguide}`)
).metadata.title;
}
}
return {
guideTitles,
};
return {
guideTitles
};
}