mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2026-01-01 15:54:44 +00:00
Compare commits
17 Commits
467cb2e589
...
graphhoppe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ca46b9d35 | ||
|
|
7c2e24bbc4 | ||
|
|
e92e48ffde | ||
|
|
4ce7777b86 | ||
|
|
bc130ad867 | ||
|
|
867b6a6ac7 | ||
|
|
e585fd084c | ||
|
|
b47bb4a771 | ||
|
|
9cff71fed3 | ||
|
|
e76040e416 | ||
|
|
1facf50621 | ||
|
|
57f3cc8bc0 | ||
|
|
1ab3fe1c4a | ||
|
|
10cff632fd | ||
|
|
4105687c0a | ||
|
|
8fe6565527 | ||
|
|
69b018022d |
@@ -1375,10 +1375,7 @@ export class TrackPoint {
|
|||||||
: undefined;
|
: undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
setExtensions(extensions: Record<string, string>) {
|
setExtension(key: string, value: string) {
|
||||||
if (Object.keys(extensions).length === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!this.extensions) {
|
if (!this.extensions) {
|
||||||
this.extensions = {};
|
this.extensions = {};
|
||||||
}
|
}
|
||||||
@@ -1388,8 +1385,12 @@ export class TrackPoint {
|
|||||||
if (!this.extensions['gpxtpx:TrackPointExtension']['gpxtpx:Extensions']) {
|
if (!this.extensions['gpxtpx:TrackPointExtension']['gpxtpx:Extensions']) {
|
||||||
this.extensions['gpxtpx:TrackPointExtension']['gpxtpx:Extensions'] = {};
|
this.extensions['gpxtpx:TrackPointExtension']['gpxtpx:Extensions'] = {};
|
||||||
}
|
}
|
||||||
Object.entries(extensions).forEach(([key, value]) => {
|
|
||||||
this.extensions['gpxtpx:TrackPointExtension']['gpxtpx:Extensions'][key] = value;
|
this.extensions['gpxtpx:TrackPointExtension']['gpxtpx:Extensions'][key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
setExtensions(extensions: Record<string, string>) {
|
||||||
|
Object.entries(extensions).forEach(([key, value]) => {
|
||||||
|
this.setExtension(key, value);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1495,12 +1496,18 @@ export class Waypoint {
|
|||||||
this.attributes = waypoint.attributes;
|
this.attributes = waypoint.attributes;
|
||||||
this.ele = waypoint.ele;
|
this.ele = waypoint.ele;
|
||||||
this.time = waypoint.time;
|
this.time = waypoint.time;
|
||||||
this.name = waypoint.name;
|
this.name = waypoint.name === '' ? undefined : waypoint.name;
|
||||||
this.cmt = waypoint.cmt;
|
this.cmt = waypoint.cmt === '' ? undefined : waypoint.cmt;
|
||||||
this.desc = waypoint.desc;
|
this.desc = waypoint.desc === '' ? undefined : waypoint.desc;
|
||||||
this.link = waypoint.link;
|
this.link =
|
||||||
this.sym = waypoint.sym;
|
!waypoint.link ||
|
||||||
this.type = waypoint.type;
|
!waypoint.link.attributes ||
|
||||||
|
!waypoint.link.attributes.href ||
|
||||||
|
waypoint.link.attributes.href === ''
|
||||||
|
? undefined
|
||||||
|
: waypoint.link;
|
||||||
|
this.sym = waypoint.sym === '' ? undefined : waypoint.sym;
|
||||||
|
this.type = waypoint.type === '' ? undefined : waypoint.type;
|
||||||
if (waypoint.hasOwnProperty('_data')) {
|
if (waypoint.hasOwnProperty('_data')) {
|
||||||
this._data = waypoint._data;
|
this._data = waypoint._data;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,14 @@ export async function handle({ event, resolve }) {
|
|||||||
|
|
||||||
let headTag = `<head>
|
let headTag = `<head>
|
||||||
<title>gpx.studio — ${title}</title>
|
<title>gpx.studio — ${title}</title>
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebSite",
|
||||||
|
"name": "gpx.studio",
|
||||||
|
"url": "https://gpx.studio"
|
||||||
|
}
|
||||||
|
</script>
|
||||||
<meta name="description" content="${description}" />
|
<meta name="description" content="${description}" />
|
||||||
<meta property="og:title" content="gpx.studio — ${title}" />
|
<meta property="og:title" content="gpx.studio — ${title}" />
|
||||||
<meta property="og:description" content="${description}" />
|
<meta property="og:description" content="${description}" />
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ export const basemaps: { [key: string]: string | StyleSpecification } = {
|
|||||||
swisstopoVector: 'https://vectortiles.geo.admin.ch/styles/ch.swisstopo.basemap.vt/style.json',
|
swisstopoVector: 'https://vectortiles.geo.admin.ch/styles/ch.swisstopo.basemap.vt/style.json',
|
||||||
swisstopoSatellite:
|
swisstopoSatellite:
|
||||||
'https://vectortiles.geo.admin.ch/styles/ch.swisstopo.imagerybasemap.vt/style.json',
|
'https://vectortiles.geo.admin.ch/styles/ch.swisstopo.imagerybasemap.vt/style.json',
|
||||||
linz: 'https://basemaps.linz.govt.nz/v1/tiles/topographic/EPSG:3857/style/topographic.json?api=d01fbtg0ar23gctac5m0jgyy2ds',
|
linz: 'https://basemaps.linz.govt.nz/v1/styles/topographic-v2.json?api=d01fbtg0ar23gctac5m0jgyy2ds',
|
||||||
linzTopo: {
|
linzTopo: {
|
||||||
version: 8,
|
version: 8,
|
||||||
sources: {
|
sources: {
|
||||||
@@ -836,6 +836,7 @@ export const overpassTree: LayerTreeType = {
|
|||||||
shower: true,
|
shower: true,
|
||||||
shelter: true,
|
shelter: true,
|
||||||
barrier: true,
|
barrier: true,
|
||||||
|
cemetery: true,
|
||||||
},
|
},
|
||||||
tourism: {
|
tourism: {
|
||||||
attraction: true,
|
attraction: true,
|
||||||
@@ -919,6 +920,7 @@ export const defaultOverpassQueries: LayerTreeType = {
|
|||||||
shower: false,
|
shower: false,
|
||||||
shelter: false,
|
shelter: false,
|
||||||
barrier: false,
|
barrier: false,
|
||||||
|
cemetery: false,
|
||||||
},
|
},
|
||||||
tourism: {
|
tourism: {
|
||||||
attraction: false,
|
attraction: false,
|
||||||
@@ -1053,6 +1055,7 @@ export const defaultOverpassTree: LayerTreeType = {
|
|||||||
shower: false,
|
shower: false,
|
||||||
shelter: false,
|
shelter: false,
|
||||||
barrier: false,
|
barrier: false,
|
||||||
|
cemetery: false,
|
||||||
},
|
},
|
||||||
tourism: {
|
tourism: {
|
||||||
attraction: false,
|
attraction: false,
|
||||||
@@ -1099,9 +1102,7 @@ type OverpassQueryData = {
|
|||||||
svg: string;
|
svg: string;
|
||||||
color: string;
|
color: string;
|
||||||
};
|
};
|
||||||
tags:
|
tags: Record<string, string | string[]> | Record<string, string | string[]>[];
|
||||||
| Record<string, string | boolean | string[]>
|
|
||||||
| Record<string, string | boolean | string[]>[];
|
|
||||||
symbol?: string;
|
symbol?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1182,6 +1183,20 @@ export const overpassQueryData: Record<string, OverpassQueryData> = {
|
|||||||
},
|
},
|
||||||
symbol: 'Shelter',
|
symbol: 'Shelter',
|
||||||
},
|
},
|
||||||
|
cemetery: {
|
||||||
|
icon: {
|
||||||
|
svg: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 17v-10a6 5 0 1 1 12 0v10"/><path d="M 4 21 a 1 1 0 0 0 1 1 h 14 a 1 1 0 0 0 1-1 v -1 a 2 2 0 0 0-2-2 H6 a 2 2 0 0 0-2 2 z"/></svg>',
|
||||||
|
color: '#000000',
|
||||||
|
},
|
||||||
|
tags: [
|
||||||
|
{
|
||||||
|
landuse: 'cemetery',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amenity: 'grave_yard',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
'fuel-station': {
|
'fuel-station': {
|
||||||
icon: {
|
icon: {
|
||||||
svg: Fuel,
|
svg: Fuel,
|
||||||
@@ -1218,7 +1233,25 @@ export const overpassQueryData: Record<string, OverpassQueryData> = {
|
|||||||
color: '#000000',
|
color: '#000000',
|
||||||
},
|
},
|
||||||
tags: {
|
tags: {
|
||||||
barrier: true,
|
barrier: [
|
||||||
|
'bar',
|
||||||
|
'barrier_board',
|
||||||
|
'block',
|
||||||
|
'chain',
|
||||||
|
'cycle_barrier',
|
||||||
|
'gate',
|
||||||
|
'hampshire_gate',
|
||||||
|
'horse_stile',
|
||||||
|
'kissing_gate',
|
||||||
|
'lift_gate',
|
||||||
|
'motorcycle_barrier',
|
||||||
|
'sliding_beam',
|
||||||
|
'sliding_gate',
|
||||||
|
'stile',
|
||||||
|
'swing_gate',
|
||||||
|
'turnstile',
|
||||||
|
'wicket_gate',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
attraction: {
|
attraction: {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
Landmark,
|
Landmark,
|
||||||
Icon,
|
|
||||||
Shell,
|
Shell,
|
||||||
Bike,
|
Bike,
|
||||||
Building,
|
Building,
|
||||||
@@ -29,6 +28,7 @@ import {
|
|||||||
TriangleAlert,
|
TriangleAlert,
|
||||||
Anchor,
|
Anchor,
|
||||||
Toilet,
|
Toilet,
|
||||||
|
X,
|
||||||
type IconProps,
|
type IconProps,
|
||||||
} from '@lucide/svelte';
|
} from '@lucide/svelte';
|
||||||
import {
|
import {
|
||||||
@@ -61,6 +61,7 @@ import {
|
|||||||
TriangleAlert as TriangleAlertSvg,
|
TriangleAlert as TriangleAlertSvg,
|
||||||
Anchor as AnchorSvg,
|
Anchor as AnchorSvg,
|
||||||
Toilet as ToiletSvg,
|
Toilet as ToiletSvg,
|
||||||
|
X as XSvg,
|
||||||
} from 'lucide-static';
|
} from 'lucide-static';
|
||||||
import type { Component } from 'svelte';
|
import type { Component } from 'svelte';
|
||||||
|
|
||||||
@@ -87,7 +88,11 @@ export const symbols: { [key: string]: Symbol } = {
|
|||||||
icon: ShoppingBasket,
|
icon: ShoppingBasket,
|
||||||
iconSvg: ShoppingBasketSvg,
|
iconSvg: ShoppingBasketSvg,
|
||||||
},
|
},
|
||||||
crossing: { value: 'Crossing' },
|
crossing: {
|
||||||
|
value: 'Crossing',
|
||||||
|
icon: X,
|
||||||
|
iconSvg: XSvg,
|
||||||
|
},
|
||||||
department_store: {
|
department_store: {
|
||||||
value: 'Department Store',
|
value: 'Department Store',
|
||||||
icon: ShoppingBasket,
|
icon: ShoppingBasket,
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
{i18n._('homepage.home')}
|
{i18n._('homepage.home')}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
|
data-sveltekit-reload
|
||||||
variant="link"
|
variant="link"
|
||||||
class="h-6 px-0 has-[>svg]:px-0 text-muted-foreground"
|
class="h-6 px-0 has-[>svg]:px-0 text-muted-foreground"
|
||||||
href={getURLForLanguage(i18n.lang, '/app')}
|
href={getURLForLanguage(i18n.lang, '/app')}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
{i18n._('homepage.home')}
|
{i18n._('homepage.home')}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
|
data-sveltekit-reload
|
||||||
variant="link"
|
variant="link"
|
||||||
class="text-base px-0 has-[>svg]:px-0"
|
class="text-base px-0 has-[>svg]:px-0"
|
||||||
href={getURLForLanguage(i18n.lang, '/app')}
|
href={getURLForLanguage(i18n.lang, '/app')}
|
||||||
|
|||||||
@@ -16,7 +16,8 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
class="p-1 has-[>svg]:px-2 h-8 justify-start {className}"
|
size="sm"
|
||||||
|
class="justify-start {className}"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
onclick={() => {
|
onclick={() => {
|
||||||
navigator.clipboard.writeText(
|
navigator.clipboard.writeText(
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { TrackPoint } from 'gpx';
|
import type { TrackPoint } from 'gpx';
|
||||||
|
import { Button } from '$lib/components/ui/button';
|
||||||
import CopyCoordinates from '$lib/components/map/gpx-layer/CopyCoordinates.svelte';
|
import CopyCoordinates from '$lib/components/map/gpx-layer/CopyCoordinates.svelte';
|
||||||
import * as Card from '$lib/components/ui/card';
|
import * as Card from '$lib/components/ui/card';
|
||||||
import WithUnits from '$lib/components/WithUnits.svelte';
|
import WithUnits from '$lib/components/WithUnits.svelte';
|
||||||
import { Compass, Mountain, Timer } from '@lucide/svelte';
|
import { Compass, Earth, Mountain, Timer } from '@lucide/svelte';
|
||||||
import { i18n } from '$lib/i18n.svelte';
|
import { i18n } from '$lib/i18n.svelte';
|
||||||
import type { PopupItem } from '$lib/components/map/map-popup';
|
import type { PopupItem } from '$lib/components/map/map-popup';
|
||||||
|
import { map } from '$lib/components/map/map';
|
||||||
|
|
||||||
let { trackpoint }: { trackpoint: PopupItem<TrackPoint> } = $props();
|
let { trackpoint }: { trackpoint: PopupItem<TrackPoint> } = $props();
|
||||||
</script>
|
</script>
|
||||||
@@ -35,5 +37,16 @@
|
|||||||
onCopy={() => trackpoint.hide?.()}
|
onCopy={() => trackpoint.hide?.()}
|
||||||
class="mt-0.5"
|
class="mt-0.5"
|
||||||
/>
|
/>
|
||||||
|
{#if trackpoint.fileId === undefined}
|
||||||
|
<Button
|
||||||
|
size="sm"
|
||||||
|
variant="outline"
|
||||||
|
href={`https://www.openstreetmap.org/edit?#map=${(($map?.getZoom() ?? 17) + 1).toFixed(0)}/${trackpoint.item.getLatitude().toFixed(5)}/${trackpoint.item.getLongitude().toFixed(5)}`}
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
<Earth size="14" />
|
||||||
|
{i18n._('menu.edit_osm')}
|
||||||
|
</Button>
|
||||||
|
{/if}
|
||||||
</Card.Content>
|
</Card.Content>
|
||||||
</Card.Root>
|
</Card.Root>
|
||||||
|
|||||||
@@ -160,7 +160,7 @@
|
|||||||
type="single"
|
type="single"
|
||||||
onValueChange={setOpacityFromSelection}
|
onValueChange={setOpacityFromSelection}
|
||||||
>
|
>
|
||||||
<Select.Trigger class="h-8 mr-1 w-full">
|
<Select.Trigger class="mr-1 w-full" size="sm">
|
||||||
{#if selectedOverlay}
|
{#if selectedOverlay}
|
||||||
{#if isSelected($selectedOverlayTree, selectedOverlay)}
|
{#if isSelected($selectedOverlayTree, selectedOverlay)}
|
||||||
{#if $isLayerFromExtension(selectedOverlay)}
|
{#if $isLayerFromExtension(selectedOverlay)}
|
||||||
|
|||||||
@@ -285,10 +285,12 @@ function getQuery(query: string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getQueryItem(tags: Record<string, string | boolean | string[]>) {
|
function getQueryItem(tags: Record<string, string | string[]>) {
|
||||||
let arrayEntry = Object.values(tags).find((value) => Array.isArray(value));
|
let arrayEntry = Object.entries(tags).find((entry): entry is [string, string[]] =>
|
||||||
|
Array.isArray(entry[1])
|
||||||
|
);
|
||||||
if (arrayEntry !== undefined) {
|
if (arrayEntry !== undefined) {
|
||||||
return arrayEntry
|
return arrayEntry[1]
|
||||||
.map(
|
.map(
|
||||||
(val) =>
|
(val) =>
|
||||||
`nwr${Object.entries(tags)
|
`nwr${Object.entries(tags)
|
||||||
@@ -311,7 +313,7 @@ function belongsToQuery(element: any, query: string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function belongsToQueryItem(element: any, tags: Record<string, string | boolean | string[]>) {
|
function belongsToQueryItem(element: any, tags: Record<string, string | string[]>) {
|
||||||
return Object.entries(tags).every(([tag, value]) =>
|
return Object.entries(tags).every(([tag, value]) =>
|
||||||
Array.isArray(value) ? value.includes(element.tags[tag]) : element.tags[tag] === value
|
Array.isArray(value) ? value.includes(element.tags[tag]) : element.tags[tag] === value
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
SquareArrowUpLeft,
|
SquareArrowUpLeft,
|
||||||
SquareArrowOutDownRight,
|
SquareArrowOutDownRight,
|
||||||
} from '@lucide/svelte';
|
} from '@lucide/svelte';
|
||||||
import { brouterProfiles } from '$lib/components/toolbar/tools/routing/routing';
|
import { routingProfiles } from '$lib/components/toolbar/tools/routing/routing';
|
||||||
import { i18n } from '$lib/i18n.svelte';
|
import { i18n } from '$lib/i18n.svelte';
|
||||||
import { slide } from 'svelte/transition';
|
import { slide } from 'svelte/transition';
|
||||||
import {
|
import {
|
||||||
@@ -163,11 +163,11 @@
|
|||||||
{i18n._('toolbar.routing.activity')}
|
{i18n._('toolbar.routing.activity')}
|
||||||
</span>
|
</span>
|
||||||
<Select.Root type="single" bind:value={$routingProfile}>
|
<Select.Root type="single" bind:value={$routingProfile}>
|
||||||
<Select.Trigger class="h-8 grow">
|
<Select.Trigger class="grow" size="sm">
|
||||||
{i18n._(`toolbar.routing.activities.${$routingProfile}`)}
|
{i18n._(`toolbar.routing.activities.${$routingProfile}`)}
|
||||||
</Select.Trigger>
|
</Select.Trigger>
|
||||||
<Select.Content>
|
<Select.Content>
|
||||||
{#each Object.keys(brouterProfiles) as profile}
|
{#each Object.keys(routingProfiles) as profile}
|
||||||
<Select.Item value={profile}
|
<Select.Item value={profile}
|
||||||
>{i18n._(
|
>{i18n._(
|
||||||
`toolbar.routing.activities.${profile}`
|
`toolbar.routing.activities.${profile}`
|
||||||
@@ -195,7 +195,7 @@
|
|||||||
disabled={!validSelection}
|
disabled={!validSelection}
|
||||||
onclick={fileActions.reverseSelection}
|
onclick={fileActions.reverseSelection}
|
||||||
>
|
>
|
||||||
<ArrowRightLeft size="12" />{i18n._('toolbar.routing.reverse.button')}
|
<ArrowRightLeft class="size-3" />{i18n._('toolbar.routing.reverse.button')}
|
||||||
</ButtonWithTooltip>
|
</ButtonWithTooltip>
|
||||||
<ButtonWithTooltip
|
<ButtonWithTooltip
|
||||||
label={i18n._('toolbar.routing.route_back_to_start.tooltip')}
|
label={i18n._('toolbar.routing.route_back_to_start.tooltip')}
|
||||||
@@ -231,7 +231,7 @@
|
|||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<House size="12" />{i18n._('toolbar.routing.route_back_to_start.button')}
|
<House class="size-3" />{i18n._('toolbar.routing.route_back_to_start.button')}
|
||||||
</ButtonWithTooltip>
|
</ButtonWithTooltip>
|
||||||
<ButtonWithTooltip
|
<ButtonWithTooltip
|
||||||
label={i18n._('toolbar.routing.round_trip.tooltip')}
|
label={i18n._('toolbar.routing.round_trip.tooltip')}
|
||||||
@@ -240,7 +240,7 @@
|
|||||||
disabled={!validSelection}
|
disabled={!validSelection}
|
||||||
onclick={fileActions.createRoundTripForSelection}
|
onclick={fileActions.createRoundTripForSelection}
|
||||||
>
|
>
|
||||||
<Repeat size="12" />{i18n._('toolbar.routing.round_trip.button')}
|
<Repeat class="size-3" />{i18n._('toolbar.routing.round_trip.button')}
|
||||||
</ButtonWithTooltip>
|
</ButtonWithTooltip>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full flex flex-row gap-2 items-end justify-between">
|
<div class="w-full flex flex-row gap-2 items-end justify-between">
|
||||||
|
|||||||
@@ -6,35 +6,141 @@ import { get } from 'svelte/store';
|
|||||||
|
|
||||||
const { routing, routingProfile, privateRoads } = settings;
|
const { routing, routingProfile, privateRoads } = settings;
|
||||||
|
|
||||||
export const brouterProfiles: { [key: string]: string } = {
|
export type RoutingProfile = {
|
||||||
bike: 'Trekking-dry',
|
engine: 'graphhopper' | 'brouter';
|
||||||
racing_bike: 'fastbike',
|
profile: string;
|
||||||
gravel_bike: 'gravel',
|
};
|
||||||
mountain_bike: 'MTB',
|
|
||||||
foot: 'Hiking-Alpine-SAC6',
|
export const routingProfiles: { [key: string]: RoutingProfile } = {
|
||||||
motorcycle: 'Car-FastEco',
|
bike: { engine: 'graphhopper', profile: 'bike' },
|
||||||
water: 'river',
|
racing_bike: { engine: 'graphhopper', profile: 'racingbike' },
|
||||||
railway: 'rail',
|
gravel_bike: { engine: 'brouter', profile: 'gravel' },
|
||||||
|
mountain_bike: { engine: 'graphhopper', profile: 'mtb' },
|
||||||
|
foot: { engine: 'graphhopper', profile: 'foot' },
|
||||||
|
motorcycle: { engine: 'graphhopper', profile: 'motorcycle' },
|
||||||
|
water: { engine: 'brouter', profile: 'river' },
|
||||||
|
railway: { engine: 'brouter', profile: 'rail' },
|
||||||
};
|
};
|
||||||
|
|
||||||
export function route(points: Coordinates[]): Promise<TrackPoint[]> {
|
export function route(points: Coordinates[]): Promise<TrackPoint[]> {
|
||||||
if (get(routing)) {
|
if (get(routing)) {
|
||||||
return getRoute(points, brouterProfiles[get(routingProfile)], get(privateRoads));
|
const profile = routingProfiles[get(routingProfile)];
|
||||||
|
if (profile.engine === 'graphhopper') {
|
||||||
|
return getGraphHopperRoute(points, profile.profile, get(privateRoads));
|
||||||
|
} else {
|
||||||
|
return getBRouterRoute(points, profile.profile);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return getIntermediatePoints(points);
|
return getIntermediatePoints(points);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getRoute(
|
const graphhopperDetails = ['road_class', 'surface', 'hike_rating', 'mtb_rating'];
|
||||||
|
const hikeRatingToSACScale: { [key: string]: string } = {
|
||||||
|
'1': 'hiking',
|
||||||
|
'2': 'mountain_hiking',
|
||||||
|
'3': 'demanding_mountain_hiking',
|
||||||
|
'4': 'alpine_hiking',
|
||||||
|
'5': 'demanding_alpine_hiking',
|
||||||
|
'6': 'difficult_alpine_hiking',
|
||||||
|
};
|
||||||
|
const mtbRatingToScale: { [key: string]: string } = {
|
||||||
|
'1': '0',
|
||||||
|
'2': '1',
|
||||||
|
'3': '2',
|
||||||
|
'4': '3',
|
||||||
|
'5': '4',
|
||||||
|
'6': '5',
|
||||||
|
'7': '6',
|
||||||
|
};
|
||||||
|
async function getGraphHopperRoute(
|
||||||
points: Coordinates[],
|
points: Coordinates[],
|
||||||
brouterProfile: string,
|
graphHopperProfile: string,
|
||||||
privateRoads: boolean
|
privateRoads: boolean
|
||||||
): Promise<TrackPoint[]> {
|
): 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 response = await fetch('https://graphhopper-a.gpx.studio/route', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
points: points.map((point) => [point.lon, point.lat]),
|
||||||
|
profile: graphHopperProfile,
|
||||||
|
elevation: true,
|
||||||
|
points_encoded: false,
|
||||||
|
details: graphhopperDetails,
|
||||||
|
custom_model: privateRoads
|
||||||
|
? {}
|
||||||
|
: {
|
||||||
|
priority: [
|
||||||
|
{
|
||||||
|
if: 'road_access == PRIVATE',
|
||||||
|
multiply_by: '0.0',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`${await response.text()}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
let json = await response.json();
|
||||||
|
|
||||||
|
let route: TrackPoint[] = [];
|
||||||
|
let coordinates = json.paths[0].points.coordinates;
|
||||||
|
let details = json.paths[0].details;
|
||||||
|
|
||||||
|
for (let i = 0; i < coordinates.length; i++) {
|
||||||
|
route.push(
|
||||||
|
new TrackPoint({
|
||||||
|
attributes: {
|
||||||
|
lat: coordinates[i][1],
|
||||||
|
lon: coordinates[i][0],
|
||||||
|
},
|
||||||
|
ele: coordinates[i][2] ?? (i > 0 ? route[i - 1].ele : 0),
|
||||||
|
extensions: {},
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let key of graphhopperDetails) {
|
||||||
|
let detail = details[key];
|
||||||
|
for (let i = 0; i < detail.length; i++) {
|
||||||
|
for (let j = detail[i][0]; j < detail[i][1] + (i == detail.length - 1); j++) {
|
||||||
|
if (detail[i][2] !== undefined && detail[i][2] !== 'missing') {
|
||||||
|
if (key === 'road_class') {
|
||||||
|
route[j].setExtension('highway', detail[i][2]);
|
||||||
|
} else if (key === 'hike_rating') {
|
||||||
|
const sacScale = hikeRatingToSACScale[detail[i][2]];
|
||||||
|
if (sacScale) {
|
||||||
|
route[j].setExtension('sac_scale', sacScale);
|
||||||
|
}
|
||||||
|
} else if (key === 'mtb_rating') {
|
||||||
|
const mtbScale = mtbRatingToScale[detail[i][2]];
|
||||||
|
if (mtbScale) {
|
||||||
|
route[j].setExtension('mtb_scale', mtbScale);
|
||||||
|
}
|
||||||
|
} else if (key === 'surface' && detail[i][2] !== 'other') {
|
||||||
|
route[j].setExtension('surface', detail[i][2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return route;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getBRouterRoute(
|
||||||
|
points: Coordinates[],
|
||||||
|
brouterProfile: string
|
||||||
|
): Promise<TrackPoint[]> {
|
||||||
|
let url = `https://brouter.de/brouter?lonlats=${points.map((point) => `${point.lon.toFixed(8)},${point.lat.toFixed(8)}`).join('|')}&profile=${brouterProfile}&format=geojson&alternativeidx=0`;
|
||||||
|
|
||||||
let response = await fetch(url);
|
let response = await fetch(url);
|
||||||
|
|
||||||
// Check if the response is ok
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`${await response.text()}`);
|
throw new Error(`${await response.text()}`);
|
||||||
}
|
}
|
||||||
@@ -52,14 +158,13 @@ async function getRoute(
|
|||||||
let tags = messageIdx < messages.length ? getTags(messages[messageIdx][tagIdx]) : {};
|
let tags = messageIdx < messages.length ? getTags(messages[messageIdx][tagIdx]) : {};
|
||||||
|
|
||||||
for (let i = 0; i < coordinates.length; i++) {
|
for (let i = 0; i < coordinates.length; i++) {
|
||||||
let coord = coordinates[i];
|
|
||||||
route.push(
|
route.push(
|
||||||
new TrackPoint({
|
new TrackPoint({
|
||||||
attributes: {
|
attributes: {
|
||||||
lat: coord[1],
|
lat: coordinates[i][1],
|
||||||
lon: coord[0],
|
lon: coordinates[i][0],
|
||||||
},
|
},
|
||||||
ele: coord[2] ?? (i > 0 ? route[i - 1].ele : 0),
|
ele: coordinates[i][2] ?? (i > 0 ? route[i - 1].ele : 0),
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
{i18n._('toolbar.scissors.split_as')}
|
{i18n._('toolbar.scissors.split_as')}
|
||||||
</span>
|
</span>
|
||||||
<Select.Root bind:value={$splitAs} type="single">
|
<Select.Root bind:value={$splitAs} type="single">
|
||||||
<Select.Trigger class="h-8 w-fit grow">
|
<Select.Trigger class="w-fit grow" size="sm">
|
||||||
{i18n._('gpx.' + $splitAs)}
|
{i18n._('gpx.' + $splitAs)}
|
||||||
</Select.Trigger>
|
</Select.Trigger>
|
||||||
<Select.Content>
|
<Select.Content>
|
||||||
|
|||||||
@@ -95,7 +95,7 @@
|
|||||||
desc: description.length > 0 ? description : undefined,
|
desc: description.length > 0 ? description : undefined,
|
||||||
cmt: description.length > 0 ? description : undefined,
|
cmt: description.length > 0 ? description : undefined,
|
||||||
link: link.length > 0 ? { attributes: { href: link } } : undefined,
|
link: link.length > 0 ? { attributes: { href: link } } : undefined,
|
||||||
sym: sym,
|
sym: sym.length > 0 ? sym : undefined,
|
||||||
},
|
},
|
||||||
selectedWaypoint.wpt && selectedWaypoint.fileId
|
selectedWaypoint.wpt && selectedWaypoint.fileId
|
||||||
? new ListWaypointItem(selectedWaypoint.fileId, selectedWaypoint.wpt._data.index)
|
? new ListWaypointItem(selectedWaypoint.fileId, selectedWaypoint.wpt._data.index)
|
||||||
@@ -174,19 +174,27 @@
|
|||||||
bind:value={description}
|
bind:value={description}
|
||||||
id="description"
|
id="description"
|
||||||
disabled={!canCreate && !$selectedWaypoint}
|
disabled={!canCreate && !$selectedWaypoint}
|
||||||
|
class="min-h-8 h-8 py-1 px-3 text-sm"
|
||||||
/>
|
/>
|
||||||
<Label for="symbol">{i18n._('toolbar.waypoint.icon')}</Label>
|
<Label for="symbol">{i18n._('toolbar.waypoint.icon')}</Label>
|
||||||
<Select.Root bind:value={sym} type="single">
|
<Select.Root bind:value={sym} type="single">
|
||||||
<Select.Trigger
|
<Select.Trigger
|
||||||
id="symbol"
|
id="symbol"
|
||||||
class="w-full h-8"
|
size="sm"
|
||||||
|
class="w-full"
|
||||||
disabled={!canCreate && !$selectedWaypoint}
|
disabled={!canCreate && !$selectedWaypoint}
|
||||||
>
|
>
|
||||||
|
<span class="flex flex-row gap-1.5 items-center">
|
||||||
{#if symbolKey}
|
{#if symbolKey}
|
||||||
|
{#if symbols[symbolKey].icon}
|
||||||
|
{@const Component = symbols[symbolKey].icon}
|
||||||
|
<Component size="14" />
|
||||||
|
{/if}
|
||||||
{i18n._(`gpx.symbol.${symbolKey}`)}
|
{i18n._(`gpx.symbol.${symbolKey}`)}
|
||||||
{:else}
|
{:else}
|
||||||
{sym}
|
{sym}
|
||||||
{/if}
|
{/if}
|
||||||
|
</span>
|
||||||
</Select.Trigger>
|
</Select.Trigger>
|
||||||
<Select.Content class="max-h-60 overflow-y-scroll">
|
<Select.Content class="max-h-60 overflow-y-scroll">
|
||||||
{#each sortedSymbols as [key, symbol]}
|
{#each sortedSymbols as [key, symbol]}
|
||||||
@@ -194,7 +202,7 @@
|
|||||||
<span>
|
<span>
|
||||||
{#if symbol.icon}
|
{#if symbol.icon}
|
||||||
{@const Component = symbol.icon}
|
{@const Component = symbol.icon}
|
||||||
<Component size="14" class="inline-block align-sub mr-0.5" />
|
<Component size="14" class="inline-block align-sub" />
|
||||||
{:else}
|
{:else}
|
||||||
<span class="w-4 inline-block"></span>
|
<span class="w-4 inline-block"></span>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: View options
|
title: Opciones de vista
|
||||||
---
|
---
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
|||||||
@@ -29,13 +29,13 @@ Beste era batez, fitxategiak zuzenean arrastatu eta jaregin ditzakezu zure fitxa
|
|||||||
|
|
||||||
Sortu hautatutako fitxategien kopia bat.
|
Sortu hautatutako fitxategien kopia bat.
|
||||||
|
|
||||||
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" /> Delete
|
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" /> Ezabatu
|
||||||
|
|
||||||
Delete the currently selected files.
|
Ezabatu hautatutako fitxategiak.
|
||||||
|
|
||||||
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" /> Delete all
|
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" /> Ezabatu guztiak
|
||||||
|
|
||||||
Delete all files.
|
Ezabatu fitxategi guztiak.
|
||||||
|
|
||||||
### <Download size="16" class="inline-block" style="margin-bottom: 2px" /> Esportatu...
|
### <Download size="16" class="inline-block" style="margin-bottom: 2px" /> Esportatu...
|
||||||
|
|
||||||
|
|||||||
@@ -29,13 +29,13 @@ cÈ inoltre possibile trascinare i file direttamente dal file system del tuo Pc
|
|||||||
|
|
||||||
Crea una copia dei file attualmente selezionati.
|
Crea una copia dei file attualmente selezionati.
|
||||||
|
|
||||||
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" /> Delete
|
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" />Elimina
|
||||||
|
|
||||||
Delete the currently selected files.
|
Elimina i file attualmente selezionati.
|
||||||
|
|
||||||
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" /> Delete all
|
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" />Cancella tutto
|
||||||
|
|
||||||
Delete all files.
|
Elimina tutti i file.
|
||||||
|
|
||||||
### <Download size="16" class="inline-block" style="margin-bottom: 2px" /> Esporta...
|
### <Download size="16" class="inline-block" style="margin-bottom: 2px" /> Esporta...
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ Deze handleiding zal je door alle componenten en gereedschappen van de interface
|
|||||||
<DocsImage src="getting-started/interface" alt="De gpx.studio interface." />
|
<DocsImage src="getting-started/interface" alt="De gpx.studio interface." />
|
||||||
|
|
||||||
Zoals weergegeven in bovenstaande scherm, is de interface verdeeld in vier hoofddelen rond de kaart.
|
Zoals weergegeven in bovenstaande scherm, is de interface verdeeld in vier hoofddelen rond de kaart.
|
||||||
Voordat we in de details van elke sectie duiken, hebben we een snel overzicht van de interface.
|
Voordat we in de details van elke sectie duiken, eerst een snel overzicht van de interface.
|
||||||
|
|
||||||
## Menu
|
## Menu
|
||||||
|
|
||||||
|
|||||||
@@ -33,9 +33,9 @@ title: 文件
|
|||||||
|
|
||||||
Delete the currently selected files.
|
Delete the currently selected files.
|
||||||
|
|
||||||
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" /> Delete all
|
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" /> 删除全部
|
||||||
|
|
||||||
Delete all files.
|
删除全部文件。
|
||||||
|
|
||||||
### <Download size="16" class="inline-block" style="margin-bottom: 2px" /> 导出...
|
### <Download size="16" class="inline-block" style="margin-bottom: 2px" /> 导出...
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Паказаць",
|
"unhide": "Паказаць",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Адчыніць у",
|
"open_in": "Адчыніць у",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Veure",
|
"unhide": "Veure",
|
||||||
"center": "Centrar",
|
"center": "Centrar",
|
||||||
"open_in": "Obrir amb",
|
"open_in": "Obrir amb",
|
||||||
"copy_coordinates": "Copiar coordenades"
|
"copy_coordinates": "Copiar coordenades",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Aigua",
|
"water": "Aigua",
|
||||||
"shower": "Dutxa",
|
"shower": "Dutxa",
|
||||||
"shelter": "Refugi",
|
"shelter": "Refugi",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cotxes i motos",
|
"motorized": "Cotxes i motos",
|
||||||
"fuel-station": "Gasolinera",
|
"fuel-station": "Gasolinera",
|
||||||
"parking": "Aparcament",
|
"parking": "Aparcament",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Zobrazit skryté",
|
"unhide": "Zobrazit skryté",
|
||||||
"center": "Vycentrovat",
|
"center": "Vycentrovat",
|
||||||
"open_in": "Otevřít v",
|
"open_in": "Otevřít v",
|
||||||
"copy_coordinates": "Zkopírovat souřadnice"
|
"copy_coordinates": "Zkopírovat souřadnice",
|
||||||
|
"edit_osm": "Upravit v OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Voda",
|
"water": "Voda",
|
||||||
"shower": "Sprcha",
|
"shower": "Sprcha",
|
||||||
"shelter": "Přístřeší",
|
"shelter": "Přístřeší",
|
||||||
|
"cemetery": "Hřbitov",
|
||||||
"motorized": "Automobily a motocykly",
|
"motorized": "Automobily a motocykly",
|
||||||
"fuel-station": "Čerpací stanice",
|
"fuel-station": "Čerpací stanice",
|
||||||
"parking": "Parkoviště",
|
"parking": "Parkoviště",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Unhide",
|
"unhide": "Unhide",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Open in",
|
"open_in": "Open in",
|
||||||
"copy_coordinates": "Kopier koordinater"
|
"copy_coordinates": "Kopier koordinater",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Einblenden",
|
"unhide": "Einblenden",
|
||||||
"center": "Zentrieren",
|
"center": "Zentrieren",
|
||||||
"open_in": "Öffnen in",
|
"open_in": "Öffnen in",
|
||||||
"copy_coordinates": "Koordinaten kopieren"
|
"copy_coordinates": "Koordinaten kopieren",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Trinkwasser",
|
"water": "Trinkwasser",
|
||||||
"shower": "Dusche",
|
"shower": "Dusche",
|
||||||
"shelter": "Unterstand",
|
"shelter": "Unterstand",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Autos und Motorräder",
|
"motorized": "Autos und Motorräder",
|
||||||
"fuel-station": "Tankstelle",
|
"fuel-station": "Tankstelle",
|
||||||
"parking": "Parken",
|
"parking": "Parken",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Unhide",
|
"unhide": "Unhide",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Open in",
|
"open_in": "Open in",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Unhide",
|
"unhide": "Unhide",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Open in",
|
"open_in": "Open in",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
"switch_basemap": "Cambiar al mapa base anterior",
|
"switch_basemap": "Cambiar al mapa base anterior",
|
||||||
"toggle_overlays": "Alternar capas",
|
"toggle_overlays": "Alternar capas",
|
||||||
"toggle_3d": "Alternar 3D",
|
"toggle_3d": "Alternar 3D",
|
||||||
"settings": "Configuraciones",
|
"settings": "Configuración",
|
||||||
"distance_units": "Unidades de distancia",
|
"distance_units": "Unidades de distancia",
|
||||||
"metric": "Métrico",
|
"metric": "Métrico",
|
||||||
"imperial": "Imperial",
|
"imperial": "Imperial",
|
||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Mostrar",
|
"unhide": "Mostrar",
|
||||||
"center": "Centrar",
|
"center": "Centrar",
|
||||||
"open_in": "Abrir en",
|
"open_in": "Abrir en",
|
||||||
"copy_coordinates": "Copiar coordenadas"
|
"copy_coordinates": "Copiar coordenadas",
|
||||||
|
"edit_osm": "Editar en OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Agua",
|
"water": "Agua",
|
||||||
"shower": "Ducha",
|
"shower": "Ducha",
|
||||||
"shelter": "Refugio",
|
"shelter": "Refugio",
|
||||||
|
"cemetery": "Cementerio",
|
||||||
"motorized": "Coches y motos",
|
"motorized": "Coches y motos",
|
||||||
"fuel-station": "Gasolinera",
|
"fuel-station": "Gasolinera",
|
||||||
"parking": "Aparcamiento",
|
"parking": "Aparcamiento",
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
"undo": "Desegin",
|
"undo": "Desegin",
|
||||||
"redo": "Berregin",
|
"redo": "Berregin",
|
||||||
"delete": "Ezabatu",
|
"delete": "Ezabatu",
|
||||||
"delete_all": "Delete all",
|
"delete_all": "Ezabatu guztiak",
|
||||||
"select_all": "Hautatu dena",
|
"select_all": "Hautatu dena",
|
||||||
"view": "Ikusi",
|
"view": "Ikusi",
|
||||||
"elevation_profile": "Altuera profila",
|
"elevation_profile": "Altuera profila",
|
||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Erakutsi",
|
"unhide": "Erakutsi",
|
||||||
"center": "Erdiratu",
|
"center": "Erdiratu",
|
||||||
"open_in": "Ireki hemen",
|
"open_in": "Ireki hemen",
|
||||||
"copy_coordinates": "Kopiatu koordenatuak"
|
"copy_coordinates": "Kopiatu koordenatuak",
|
||||||
|
"edit_osm": "Editatu OpenStreeMapen"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Ura",
|
"water": "Ura",
|
||||||
"shower": "Dutxa",
|
"shower": "Dutxa",
|
||||||
"shelter": "Babeslekua",
|
"shelter": "Babeslekua",
|
||||||
|
"cemetery": "Hilerria",
|
||||||
"motorized": "Kotxeak eta motorrak",
|
"motorized": "Kotxeak eta motorrak",
|
||||||
"fuel-station": "Gasolindegia",
|
"fuel-station": "Gasolindegia",
|
||||||
"parking": "Aparkalekua",
|
"parking": "Aparkalekua",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Näytä",
|
"unhide": "Näytä",
|
||||||
"center": "Keskitä",
|
"center": "Keskitä",
|
||||||
"open_in": "Avaa",
|
"open_in": "Avaa",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Afficher",
|
"unhide": "Afficher",
|
||||||
"center": "Centrer",
|
"center": "Centrer",
|
||||||
"open_in": "Ouvrir avec",
|
"open_in": "Ouvrir avec",
|
||||||
"copy_coordinates": "Copier les coordonnées"
|
"copy_coordinates": "Copier les coordonnées",
|
||||||
|
"edit_osm": "Éditer dans OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Cours d'eau",
|
"water": "Cours d'eau",
|
||||||
"shower": "Douche",
|
"shower": "Douche",
|
||||||
"shelter": "Abri",
|
"shelter": "Abri",
|
||||||
|
"cemetery": "Cimetière",
|
||||||
"motorized": "Voitures et motos",
|
"motorized": "Voitures et motos",
|
||||||
"fuel-station": "Station-service",
|
"fuel-station": "Station-service",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Unhide",
|
"unhide": "Unhide",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Open in",
|
"open_in": "Open in",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "גשם",
|
"shower": "גשם",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Felfedés ",
|
"unhide": "Felfedés ",
|
||||||
"center": "Középre ",
|
"center": "Középre ",
|
||||||
"open_in": "Megnyitás itt ",
|
"open_in": "Megnyitás itt ",
|
||||||
"copy_coordinates": "Koordináták másolása"
|
"copy_coordinates": "Koordináták másolása",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Víz",
|
"water": "Víz",
|
||||||
"shower": "Zuhanyozó",
|
"shower": "Zuhanyozó",
|
||||||
"shelter": "Menedék",
|
"shelter": "Menedék",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Autók és Motorok",
|
"motorized": "Autók és Motorok",
|
||||||
"fuel-station": "Benzinkút",
|
"fuel-station": "Benzinkút",
|
||||||
"parking": "Parkoló",
|
"parking": "Parkoló",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Tampilkan",
|
"unhide": "Tampilkan",
|
||||||
"center": "Tengah",
|
"center": "Tengah",
|
||||||
"open_in": "Buka di",
|
"open_in": "Buka di",
|
||||||
"copy_coordinates": "Salin koordinat"
|
"copy_coordinates": "Salin koordinat",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Air",
|
"water": "Air",
|
||||||
"shower": "Mandi",
|
"shower": "Mandi",
|
||||||
"shelter": "Penampungan",
|
"shelter": "Penampungan",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Mobil dan Motor",
|
"motorized": "Mobil dan Motor",
|
||||||
"fuel-station": "Stasiun bahan bakar",
|
"fuel-station": "Stasiun bahan bakar",
|
||||||
"parking": "Parkir",
|
"parking": "Parkir",
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
"undo": "Annulla",
|
"undo": "Annulla",
|
||||||
"redo": "Ripeti",
|
"redo": "Ripeti",
|
||||||
"delete": "Elimina",
|
"delete": "Elimina",
|
||||||
"delete_all": "Delete all",
|
"delete_all": "Cancella tutto",
|
||||||
"select_all": "Seleziona tutto",
|
"select_all": "Seleziona tutto",
|
||||||
"view": "Visualizza",
|
"view": "Visualizza",
|
||||||
"elevation_profile": "Profilo altimetrico",
|
"elevation_profile": "Profilo altimetrico",
|
||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Mostra",
|
"unhide": "Mostra",
|
||||||
"center": "Centra",
|
"center": "Centra",
|
||||||
"open_in": "Apri con",
|
"open_in": "Apri con",
|
||||||
"copy_coordinates": "Copia le coordinate"
|
"copy_coordinates": "Copia le coordinate",
|
||||||
|
"edit_osm": "Modifica in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Acqua",
|
"water": "Acqua",
|
||||||
"shower": "Doccia",
|
"shower": "Doccia",
|
||||||
"shelter": "Riparo",
|
"shelter": "Riparo",
|
||||||
|
"cemetery": "Cimitero",
|
||||||
"motorized": "Auto e Motocicli",
|
"motorized": "Auto e Motocicli",
|
||||||
"fuel-station": "Stazione di Rifornimento",
|
"fuel-station": "Stazione di Rifornimento",
|
||||||
"parking": "Parcheggio",
|
"parking": "Parcheggio",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "표시",
|
"unhide": "표시",
|
||||||
"center": "중앙",
|
"center": "중앙",
|
||||||
"open_in": "Open in",
|
"open_in": "Open in",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "대피소",
|
"shelter": "대피소",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "주유소",
|
"fuel-station": "주유소",
|
||||||
"parking": "주차장",
|
"parking": "주차장",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Rodyti",
|
"unhide": "Rodyti",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Atverti naudojant",
|
"open_in": "Atverti naudojant",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Vanduo",
|
"water": "Vanduo",
|
||||||
"shower": "Dušas",
|
"shower": "Dušas",
|
||||||
"shelter": "Prieglauda",
|
"shelter": "Prieglauda",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Automobiliai ir motociklai",
|
"motorized": "Automobiliai ir motociklai",
|
||||||
"fuel-station": "Degalinė",
|
"fuel-station": "Degalinė",
|
||||||
"parking": "Automobilių stovėjimo aikštelė",
|
"parking": "Automobilių stovėjimo aikštelė",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Unhide",
|
"unhide": "Unhide",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Open in",
|
"open_in": "Open in",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Maak zichtbaar",
|
"unhide": "Maak zichtbaar",
|
||||||
"center": "Midden",
|
"center": "Midden",
|
||||||
"open_in": "Openen in",
|
"open_in": "Openen in",
|
||||||
"copy_coordinates": "Coördinaten kopiëren"
|
"copy_coordinates": "Coördinaten kopiëren",
|
||||||
|
"edit_osm": "Bewerken in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Douche",
|
"shower": "Douche",
|
||||||
"shelter": "Schuilplaats",
|
"shelter": "Schuilplaats",
|
||||||
|
"cemetery": "Begraafplaats",
|
||||||
"motorized": "Auto's en Motorfietsen",
|
"motorized": "Auto's en Motorfietsen",
|
||||||
"fuel-station": "Tankstation",
|
"fuel-station": "Tankstation",
|
||||||
"parking": "Parkeren",
|
"parking": "Parkeren",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Vis",
|
"unhide": "Vis",
|
||||||
"center": "Sentrer",
|
"center": "Sentrer",
|
||||||
"open_in": "Åpne I",
|
"open_in": "Åpne I",
|
||||||
"copy_coordinates": "Kopier koordinater"
|
"copy_coordinates": "Kopier koordinater",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Vann",
|
"water": "Vann",
|
||||||
"shower": "Dusj",
|
"shower": "Dusj",
|
||||||
"shelter": "Ly",
|
"shelter": "Ly",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Biler og motorsykler",
|
"motorized": "Biler og motorsykler",
|
||||||
"fuel-station": "Bensinstasjon",
|
"fuel-station": "Bensinstasjon",
|
||||||
"parking": "Parkering",
|
"parking": "Parkering",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Pokaż",
|
"unhide": "Pokaż",
|
||||||
"center": "Wyśrodkuj",
|
"center": "Wyśrodkuj",
|
||||||
"open_in": "Otwórz w",
|
"open_in": "Otwórz w",
|
||||||
"copy_coordinates": "Kopiuj współrzędne"
|
"copy_coordinates": "Kopiuj współrzędne",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Woda",
|
"water": "Woda",
|
||||||
"shower": "Prysznic",
|
"shower": "Prysznic",
|
||||||
"shelter": "Schronienie",
|
"shelter": "Schronienie",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Samochody i motocykle",
|
"motorized": "Samochody i motocykle",
|
||||||
"fuel-station": "Stacja paliw",
|
"fuel-station": "Stacja paliw",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Mostrar",
|
"unhide": "Mostrar",
|
||||||
"center": "Centralizar",
|
"center": "Centralizar",
|
||||||
"open_in": "Abrir em",
|
"open_in": "Abrir em",
|
||||||
"copy_coordinates": "Copiar coordenadas"
|
"copy_coordinates": "Copiar coordenadas",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Água",
|
"water": "Água",
|
||||||
"shower": "Chuveiro",
|
"shower": "Chuveiro",
|
||||||
"shelter": "Abrigo",
|
"shelter": "Abrigo",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Carros e Motocicletas",
|
"motorized": "Carros e Motocicletas",
|
||||||
"fuel-station": "Postos de combustível",
|
"fuel-station": "Postos de combustível",
|
||||||
"parking": "Estacionamento",
|
"parking": "Estacionamento",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Mostrar",
|
"unhide": "Mostrar",
|
||||||
"center": "Centro",
|
"center": "Centro",
|
||||||
"open_in": "Abrir em",
|
"open_in": "Abrir em",
|
||||||
"copy_coordinates": "Copiar coordenadas"
|
"copy_coordinates": "Copiar coordenadas",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Água",
|
"water": "Água",
|
||||||
"shower": "Chuveiro",
|
"shower": "Chuveiro",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Carros e Motocicletas",
|
"motorized": "Carros e Motocicletas",
|
||||||
"fuel-station": "Postos de combustível",
|
"fuel-station": "Postos de combustível",
|
||||||
"parking": "Estacionamento",
|
"parking": "Estacionamento",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Dezvăluie",
|
"unhide": "Dezvăluie",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Open in",
|
"open_in": "Open in",
|
||||||
"copy_coordinates": "Copiază coordonatele"
|
"copy_coordinates": "Copiază coordonatele",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Отобразить",
|
"unhide": "Отобразить",
|
||||||
"center": "По центру",
|
"center": "По центру",
|
||||||
"open_in": "Открыть в",
|
"open_in": "Открыть в",
|
||||||
"copy_coordinates": "Скопировать координаты"
|
"copy_coordinates": "Скопировать координаты",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Вода",
|
"water": "Вода",
|
||||||
"shower": "Душ",
|
"shower": "Душ",
|
||||||
"shelter": "Укрытие",
|
"shelter": "Укрытие",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Автомобили и мотоциклы",
|
"motorized": "Автомобили и мотоциклы",
|
||||||
"fuel-station": "Заправочная станция",
|
"fuel-station": "Заправочная станция",
|
||||||
"parking": "Парковка",
|
"parking": "Парковка",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Prikaži",
|
"unhide": "Prikaži",
|
||||||
"center": "Centar",
|
"center": "Centar",
|
||||||
"open_in": "Otvorite u",
|
"open_in": "Otvorite u",
|
||||||
"copy_coordinates": "Kopiraj koordinate"
|
"copy_coordinates": "Kopiraj koordinate",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Voda",
|
"water": "Voda",
|
||||||
"shower": "Tuš",
|
"shower": "Tuš",
|
||||||
"shelter": "Sklonište",
|
"shelter": "Sklonište",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Automobili i motocikli",
|
"motorized": "Automobili i motocikli",
|
||||||
"fuel-station": "Benzinska stanica",
|
"fuel-station": "Benzinska stanica",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Visa",
|
"unhide": "Visa",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Öppna i",
|
"open_in": "Öppna i",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Dusch",
|
"shower": "Dusch",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Bensinstation",
|
"fuel-station": "Bensinstation",
|
||||||
"parking": "Parkering",
|
"parking": "Parkering",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Unhide",
|
"unhide": "Unhide",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Open in",
|
"open_in": "Open in",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Göster",
|
"unhide": "Göster",
|
||||||
"center": "Merkez",
|
"center": "Merkez",
|
||||||
"open_in": "Uygulamada Aç",
|
"open_in": "Uygulamada Aç",
|
||||||
"copy_coordinates": "Koordinatları kopyala"
|
"copy_coordinates": "Koordinatları kopyala",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Su",
|
"water": "Su",
|
||||||
"shower": "Duş",
|
"shower": "Duş",
|
||||||
"shelter": "Barınak",
|
"shelter": "Barınak",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Araba ve Motosiklet",
|
"motorized": "Araba ve Motosiklet",
|
||||||
"fuel-station": "Benzin istasyonu",
|
"fuel-station": "Benzin istasyonu",
|
||||||
"parking": "Otopark",
|
"parking": "Otopark",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Показати",
|
"unhide": "Показати",
|
||||||
"center": "Центр",
|
"center": "Центр",
|
||||||
"open_in": "Відкрити в",
|
"open_in": "Відкрити в",
|
||||||
"copy_coordinates": "Копіювати координати"
|
"copy_coordinates": "Копіювати координати",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Вода",
|
"water": "Вода",
|
||||||
"shower": "Душ",
|
"shower": "Душ",
|
||||||
"shelter": "Укриття",
|
"shelter": "Укриття",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Автомобілі та Мотоцикли",
|
"motorized": "Автомобілі та Мотоцикли",
|
||||||
"fuel-station": "Паливна станція",
|
"fuel-station": "Паливна станція",
|
||||||
"parking": "Парковка",
|
"parking": "Парковка",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Unhide",
|
"unhide": "Unhide",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Open in",
|
"open_in": "Open in",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Nước",
|
"water": "Nước",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "Unhide",
|
"unhide": "Unhide",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"open_in": "Open in",
|
"open_in": "Open in",
|
||||||
"copy_coordinates": "Copy coordinates"
|
"copy_coordinates": "Copy coordinates",
|
||||||
|
"edit_osm": "Edit in OpenStreetMap"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "Water",
|
"water": "Water",
|
||||||
"shower": "Shower",
|
"shower": "Shower",
|
||||||
"shelter": "Shelter",
|
"shelter": "Shelter",
|
||||||
|
"cemetery": "Cemetery",
|
||||||
"motorized": "Cars and Motorcycles",
|
"motorized": "Cars and Motorcycles",
|
||||||
"fuel-station": "Fuel Station",
|
"fuel-station": "Fuel Station",
|
||||||
"parking": "Parking",
|
"parking": "Parking",
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
"undo": "撤销",
|
"undo": "撤销",
|
||||||
"redo": "恢复",
|
"redo": "恢复",
|
||||||
"delete": "删除",
|
"delete": "删除",
|
||||||
"delete_all": "",
|
"delete_all": "全部删除",
|
||||||
"select_all": "全选",
|
"select_all": "全选",
|
||||||
"view": "显示",
|
"view": "显示",
|
||||||
"elevation_profile": "海拔剖面图",
|
"elevation_profile": "海拔剖面图",
|
||||||
@@ -79,7 +79,8 @@
|
|||||||
"unhide": "显示",
|
"unhide": "显示",
|
||||||
"center": "居中",
|
"center": "居中",
|
||||||
"open_in": "打开于",
|
"open_in": "打开于",
|
||||||
"copy_coordinates": "复制坐标"
|
"copy_coordinates": "复制坐标",
|
||||||
|
"edit_osm": "在 OpenStreetMap 中编辑"
|
||||||
},
|
},
|
||||||
"toolbar": {
|
"toolbar": {
|
||||||
"routing": {
|
"routing": {
|
||||||
@@ -352,6 +353,7 @@
|
|||||||
"water": "饮用水",
|
"water": "饮用水",
|
||||||
"shower": "淋浴",
|
"shower": "淋浴",
|
||||||
"shelter": "庇护所",
|
"shelter": "庇护所",
|
||||||
|
"cemetery": "墓地",
|
||||||
"motorized": "汽车和摩托车",
|
"motorized": "汽车和摩托车",
|
||||||
"fuel-station": "加油站",
|
"fuel-station": "加油站",
|
||||||
"parking": "停车场",
|
"parking": "停车场",
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
{i18n._('homepage.home')}
|
{i18n._('homepage.home')}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
|
data-sveltekit-reload
|
||||||
href={getURLForLanguage(i18n.lang, '/app')}
|
href={getURLForLanguage(i18n.lang, '/app')}
|
||||||
class="text-base w-1/4 min-w-fit rounded-full"
|
class="text-base w-1/4 min-w-fit rounded-full"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -64,7 +64,11 @@
|
|||||||
{i18n._('metadata.description')}
|
{i18n._('metadata.description')}
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full flex flex-row justify-center gap-3">
|
<div class="w-full flex flex-row justify-center gap-3">
|
||||||
<Button href={getURLForLanguage(i18n.lang, '/app')} class="w-1/3 min-w-fit">
|
<Button
|
||||||
|
data-sveltekit-reload
|
||||||
|
href={getURLForLanguage(i18n.lang, '/app')}
|
||||||
|
class="w-1/3 min-w-fit"
|
||||||
|
>
|
||||||
<Map size="18" />
|
<Map size="18" />
|
||||||
{i18n._('homepage.app')}
|
{i18n._('homepage.app')}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
Reference in New Issue
Block a user