8 Commits

Author SHA1 Message Date
vcoppe
9ca46b9d35 small fix 2025-12-24 17:21:26 +01:00
vcoppe
7c2e24bbc4 draft support for graphhopper 2025-12-23 16:49:47 +01:00
vcoppe
e92e48ffde New Crowdin updates (#290)
* New translations en.json (Spanish)

* New translations getting-started.mdx (Dutch)

* New translations edit.mdx (Dutch)

* New translations en.json (Basque)

* New translations file.mdx (Basque)

* New translations en.json (Chinese Simplified)

* New translations file.mdx (Chinese Simplified)
2025-12-18 17:41:09 +01:00
vcoppe
4ce7777b86 New Crowdin updates (#286)
* New translations en.json (Italian)

* New translations file.mdx (Italian)
2025-12-08 20:18:25 +01:00
vcoppe
bc130ad867 use current zoom for osm edit link 2025-12-08 20:17:57 +01:00
vcoppe
867b6a6ac7 New Crowdin updates (#285)
* New translations en.json (German)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations view.mdx (Spanish)

* New translations en.json (Belarusian)

* New translations en.json (Chinese Simplified)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Basque)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Korean)

* New translations en.json (Lithuanian)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Indonesian)

* New translations en.json (Thai)

* New translations en.json (Latvian)

* New translations en.json (Chinese Traditional, Hong Kong)

* New translations en.json (Serbian (Latin))

* New translations en.json (Chinese Simplified)

* New translations en.json (German)

* New translations en.json (Romanian)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Belarusian)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (Danish)

* New translations en.json (Greek)

* New translations en.json (Basque)

* New translations en.json (Finnish)

* New translations en.json (Hebrew)

* New translations en.json (Hungarian)

* New translations en.json (Italian)

* New translations en.json (Korean)

* New translations en.json (Lithuanian)

* New translations en.json (Dutch)

* New translations en.json (Norwegian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Russian)

* New translations en.json (Swedish)

* New translations en.json (Turkish)

* New translations en.json (Ukrainian)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Indonesian)

* New translations en.json (Thai)

* New translations en.json (Latvian)

* New translations en.json (Chinese Traditional, Hong Kong)

* New translations en.json (Serbian (Latin))

* New translations en.json (French)

* New translations en.json (Czech)

* New translations en.json (Dutch)
2025-12-07 18:56:45 +01:00
vcoppe
e585fd084c edit in osm button in context menu, closes #282 2025-12-07 14:27:07 +01:00
vcoppe
b47bb4a771 fix overpass layers, and add cemeteries, closes #235 2025-12-07 14:11:31 +01:00
46 changed files with 306 additions and 85 deletions

View File

@@ -1375,10 +1375,7 @@ export class TrackPoint {
: undefined;
}
setExtensions(extensions: Record<string, string>) {
if (Object.keys(extensions).length === 0) {
return;
}
setExtension(key: string, value: string) {
if (!this.extensions) {
this.extensions = {};
}
@@ -1388,8 +1385,12 @@ export class TrackPoint {
if (!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;
}
setExtensions(extensions: Record<string, string>) {
Object.entries(extensions).forEach(([key, value]) => {
this.setExtension(key, value);
});
}

View File

@@ -836,6 +836,7 @@ export const overpassTree: LayerTreeType = {
shower: true,
shelter: true,
barrier: true,
cemetery: true,
},
tourism: {
attraction: true,
@@ -919,6 +920,7 @@ export const defaultOverpassQueries: LayerTreeType = {
shower: false,
shelter: false,
barrier: false,
cemetery: false,
},
tourism: {
attraction: false,
@@ -1053,6 +1055,7 @@ export const defaultOverpassTree: LayerTreeType = {
shower: false,
shelter: false,
barrier: false,
cemetery: false,
},
tourism: {
attraction: false,
@@ -1099,9 +1102,7 @@ type OverpassQueryData = {
svg: string;
color: string;
};
tags:
| Record<string, string | boolean | string[]>
| Record<string, string | boolean | string[]>[];
tags: Record<string, string | string[]> | Record<string, string | string[]>[];
symbol?: string;
};
@@ -1182,6 +1183,20 @@ export const overpassQueryData: Record<string, OverpassQueryData> = {
},
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': {
icon: {
svg: Fuel,
@@ -1218,7 +1233,25 @@ export const overpassQueryData: Record<string, OverpassQueryData> = {
color: '#000000',
},
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: {

View File

@@ -16,7 +16,8 @@
</script>
<Button
class="p-1 has-[>svg]:px-2 h-8 justify-start {className}"
size="sm"
class="justify-start {className}"
variant="outline"
onclick={() => {
navigator.clipboard.writeText(

View File

@@ -1,11 +1,13 @@
<script lang="ts">
import type { TrackPoint } from 'gpx';
import { Button } from '$lib/components/ui/button';
import CopyCoordinates from '$lib/components/map/gpx-layer/CopyCoordinates.svelte';
import * as Card from '$lib/components/ui/card';
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 type { PopupItem } from '$lib/components/map/map-popup';
import { map } from '$lib/components/map/map';
let { trackpoint }: { trackpoint: PopupItem<TrackPoint> } = $props();
</script>
@@ -35,5 +37,16 @@
onCopy={() => trackpoint.hide?.()}
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.Root>

View File

@@ -285,10 +285,12 @@ function getQuery(query: string) {
}
}
function getQueryItem(tags: Record<string, string | boolean | string[]>) {
let arrayEntry = Object.values(tags).find((value) => Array.isArray(value));
function getQueryItem(tags: Record<string, string | string[]>) {
let arrayEntry = Object.entries(tags).find((entry): entry is [string, string[]] =>
Array.isArray(entry[1])
);
if (arrayEntry !== undefined) {
return arrayEntry
return arrayEntry[1]
.map(
(val) =>
`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]) =>
Array.isArray(value) ? value.includes(element.tags[tag]) : element.tags[tag] === value
);

View File

@@ -21,7 +21,7 @@
SquareArrowUpLeft,
SquareArrowOutDownRight,
} 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 { slide } from 'svelte/transition';
import {
@@ -167,7 +167,7 @@
{i18n._(`toolbar.routing.activities.${$routingProfile}`)}
</Select.Trigger>
<Select.Content>
{#each Object.keys(brouterProfiles) as profile}
{#each Object.keys(routingProfiles) as profile}
<Select.Item value={profile}
>{i18n._(
`toolbar.routing.activities.${profile}`

View File

@@ -6,35 +6,141 @@ import { get } from 'svelte/store';
const { routing, routingProfile, privateRoads } = settings;
export const brouterProfiles: { [key: string]: string } = {
bike: 'Trekking-dry',
racing_bike: 'fastbike',
gravel_bike: 'gravel',
mountain_bike: 'MTB',
foot: 'Hiking-Alpine-SAC6',
motorcycle: 'Car-FastEco',
water: 'river',
railway: 'rail',
export type RoutingProfile = {
engine: 'graphhopper' | 'brouter';
profile: string;
};
export const routingProfiles: { [key: string]: RoutingProfile } = {
bike: { engine: 'graphhopper', profile: 'bike' },
racing_bike: { engine: 'graphhopper', profile: 'racingbike' },
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[]> {
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 {
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[],
brouterProfile: string,
graphHopperProfile: 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 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);
// Check if the response is ok
if (!response.ok) {
throw new Error(`${await response.text()}`);
}
@@ -52,14 +158,13 @@ async function getRoute(
let tags = messageIdx < messages.length ? getTags(messages[messageIdx][tagIdx]) : {};
for (let i = 0; i < coordinates.length; i++) {
let coord = coordinates[i];
route.push(
new TrackPoint({
attributes: {
lat: coord[1],
lon: coord[0],
lat: coordinates[i][1],
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),
})
);

View File

@@ -1,5 +1,5 @@
---
title: View options
title: Opciones de vista
---
<script lang="ts">

View File

@@ -29,13 +29,13 @@ Beste era batez, fitxategiak zuzenean arrastatu eta jaregin ditzakezu zure fitxa
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...

View File

@@ -29,13 +29,13 @@ cÈ inoltre possibile trascinare i file direttamente dal file system del tuo Pc
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...

View File

@@ -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." />
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

View File

@@ -83,7 +83,7 @@ Deze actie is alleen beschikbaar wanneer de verticale indeling van de bestandsli
### <ClipboardPaste size="16" class="inline-block" style="margin-bottom: 2px" /> Plakken
Plak de bestandsitems van het klembord naar het huidige hiërarchie niveau indien compatibel.
Plak de bestandsitems van het klembord naar het huidige hiërarchieniveau indien compatibel.
<DocsNote>

View File

@@ -33,9 +33,9 @@ title: 文件
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" /> 导出...

View File

@@ -79,7 +79,8 @@
"unhide": "Паказаць",
"center": "Center",
"open_in": "Адчыніць у",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Shower",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Veure",
"center": "Centrar",
"open_in": "Obrir amb",
"copy_coordinates": "Copiar coordenades"
"copy_coordinates": "Copiar coordenades",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Aigua",
"shower": "Dutxa",
"shelter": "Refugi",
"cemetery": "Cemetery",
"motorized": "Cotxes i motos",
"fuel-station": "Gasolinera",
"parking": "Aparcament",

View File

@@ -79,7 +79,8 @@
"unhide": "Zobrazit skryté",
"center": "Vycentrovat",
"open_in": "Otevřít v",
"copy_coordinates": "Zkopírovat souřadnice"
"copy_coordinates": "Zkopírovat souřadnice",
"edit_osm": "Upravit v OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Voda",
"shower": "Sprcha",
"shelter": "Přístřeší",
"cemetery": "Hřbitov",
"motorized": "Automobily a motocykly",
"fuel-station": "Čerpací stanice",
"parking": "Parkoviště",

View File

@@ -79,7 +79,8 @@
"unhide": "Unhide",
"center": "Center",
"open_in": "Open in",
"copy_coordinates": "Kopier koordinater"
"copy_coordinates": "Kopier koordinater",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Shower",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Einblenden",
"center": "Zentrieren",
"open_in": "Öffnen in",
"copy_coordinates": "Koordinaten kopieren"
"copy_coordinates": "Koordinaten kopieren",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Trinkwasser",
"shower": "Dusche",
"shelter": "Unterstand",
"cemetery": "Cemetery",
"motorized": "Autos und Motorräder",
"fuel-station": "Tankstelle",
"parking": "Parken",

View File

@@ -79,7 +79,8 @@
"unhide": "Unhide",
"center": "Center",
"open_in": "Open in",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Shower",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Unhide",
"center": "Center",
"open_in": "Open in",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Shower",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -36,7 +36,7 @@
"switch_basemap": "Cambiar al mapa base anterior",
"toggle_overlays": "Alternar capas",
"toggle_3d": "Alternar 3D",
"settings": "Configuraciones",
"settings": "Configuración",
"distance_units": "Unidades de distancia",
"metric": "Métrico",
"imperial": "Imperial",
@@ -79,7 +79,8 @@
"unhide": "Mostrar",
"center": "Centrar",
"open_in": "Abrir en",
"copy_coordinates": "Copiar coordenadas"
"copy_coordinates": "Copiar coordenadas",
"edit_osm": "Editar en OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Agua",
"shower": "Ducha",
"shelter": "Refugio",
"cemetery": "Cementerio",
"motorized": "Coches y motos",
"fuel-station": "Gasolinera",
"parking": "Aparcamiento",

View File

@@ -28,7 +28,7 @@
"undo": "Desegin",
"redo": "Berregin",
"delete": "Ezabatu",
"delete_all": "Delete all",
"delete_all": "Ezabatu guztiak",
"select_all": "Hautatu dena",
"view": "Ikusi",
"elevation_profile": "Altuera profila",
@@ -79,7 +79,8 @@
"unhide": "Erakutsi",
"center": "Erdiratu",
"open_in": "Ireki hemen",
"copy_coordinates": "Kopiatu koordenatuak"
"copy_coordinates": "Kopiatu koordenatuak",
"edit_osm": "Editatu OpenStreeMapen"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Ura",
"shower": "Dutxa",
"shelter": "Babeslekua",
"cemetery": "Hilerria",
"motorized": "Kotxeak eta motorrak",
"fuel-station": "Gasolindegia",
"parking": "Aparkalekua",

View File

@@ -79,7 +79,8 @@
"unhide": "Näytä",
"center": "Keskitä",
"open_in": "Avaa",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Shower",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Afficher",
"center": "Centrer",
"open_in": "Ouvrir avec",
"copy_coordinates": "Copier les coordonnées"
"copy_coordinates": "Copier les coordonnées",
"edit_osm": "Éditer dans OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Cours d'eau",
"shower": "Douche",
"shelter": "Abri",
"cemetery": "Cimetière",
"motorized": "Voitures et motos",
"fuel-station": "Station-service",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Unhide",
"center": "Center",
"open_in": "Open in",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "גשם",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Felfedés ",
"center": "Középre ",
"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": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Víz",
"shower": "Zuhanyozó",
"shelter": "Menedék",
"cemetery": "Cemetery",
"motorized": "Autók és Motorok",
"fuel-station": "Benzinkút",
"parking": "Parkoló",

View File

@@ -79,7 +79,8 @@
"unhide": "Tampilkan",
"center": "Tengah",
"open_in": "Buka di",
"copy_coordinates": "Salin koordinat"
"copy_coordinates": "Salin koordinat",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Air",
"shower": "Mandi",
"shelter": "Penampungan",
"cemetery": "Cemetery",
"motorized": "Mobil dan Motor",
"fuel-station": "Stasiun bahan bakar",
"parking": "Parkir",

View File

@@ -28,7 +28,7 @@
"undo": "Annulla",
"redo": "Ripeti",
"delete": "Elimina",
"delete_all": "Delete all",
"delete_all": "Cancella tutto",
"select_all": "Seleziona tutto",
"view": "Visualizza",
"elevation_profile": "Profilo altimetrico",
@@ -79,7 +79,8 @@
"unhide": "Mostra",
"center": "Centra",
"open_in": "Apri con",
"copy_coordinates": "Copia le coordinate"
"copy_coordinates": "Copia le coordinate",
"edit_osm": "Modifica in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Acqua",
"shower": "Doccia",
"shelter": "Riparo",
"cemetery": "Cimitero",
"motorized": "Auto e Motocicli",
"fuel-station": "Stazione di Rifornimento",
"parking": "Parcheggio",

View File

@@ -79,7 +79,8 @@
"unhide": "표시",
"center": "중앙",
"open_in": "Open in",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Shower",
"shelter": "대피소",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "주유소",
"parking": "주차장",

View File

@@ -79,7 +79,8 @@
"unhide": "Rodyti",
"center": "Center",
"open_in": "Atverti naudojant",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Vanduo",
"shower": "Dušas",
"shelter": "Prieglauda",
"cemetery": "Cemetery",
"motorized": "Automobiliai ir motociklai",
"fuel-station": "Degalinė",
"parking": "Automobilių stovėjimo aikštelė",

View File

@@ -79,7 +79,8 @@
"unhide": "Unhide",
"center": "Center",
"open_in": "Open in",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Shower",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Maak zichtbaar",
"center": "Midden",
"open_in": "Openen in",
"copy_coordinates": "Coördinaten kopiëren"
"copy_coordinates": "Coördinaten kopiëren",
"edit_osm": "Bewerken in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Douche",
"shelter": "Schuilplaats",
"cemetery": "Begraafplaats",
"motorized": "Auto's en Motorfietsen",
"fuel-station": "Tankstation",
"parking": "Parkeren",

View File

@@ -79,7 +79,8 @@
"unhide": "Vis",
"center": "Sentrer",
"open_in": "Åpne I",
"copy_coordinates": "Kopier koordinater"
"copy_coordinates": "Kopier koordinater",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Vann",
"shower": "Dusj",
"shelter": "Ly",
"cemetery": "Cemetery",
"motorized": "Biler og motorsykler",
"fuel-station": "Bensinstasjon",
"parking": "Parkering",

View File

@@ -79,7 +79,8 @@
"unhide": "Pokaż",
"center": "Wyśrodkuj",
"open_in": "Otwórz w",
"copy_coordinates": "Kopiuj współrzędne"
"copy_coordinates": "Kopiuj współrzędne",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Woda",
"shower": "Prysznic",
"shelter": "Schronienie",
"cemetery": "Cemetery",
"motorized": "Samochody i motocykle",
"fuel-station": "Stacja paliw",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Mostrar",
"center": "Centralizar",
"open_in": "Abrir em",
"copy_coordinates": "Copiar coordenadas"
"copy_coordinates": "Copiar coordenadas",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Água",
"shower": "Chuveiro",
"shelter": "Abrigo",
"cemetery": "Cemetery",
"motorized": "Carros e Motocicletas",
"fuel-station": "Postos de combustível",
"parking": "Estacionamento",

View File

@@ -79,7 +79,8 @@
"unhide": "Mostrar",
"center": "Centro",
"open_in": "Abrir em",
"copy_coordinates": "Copiar coordenadas"
"copy_coordinates": "Copiar coordenadas",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Água",
"shower": "Chuveiro",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Carros e Motocicletas",
"fuel-station": "Postos de combustível",
"parking": "Estacionamento",

View File

@@ -79,7 +79,8 @@
"unhide": "Dezvăluie",
"center": "Center",
"open_in": "Open in",
"copy_coordinates": "Copiază coordonatele"
"copy_coordinates": "Copiază coordonatele",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Shower",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Отобразить",
"center": "По центру",
"open_in": "Открыть в",
"copy_coordinates": "Скопировать координаты"
"copy_coordinates": "Скопировать координаты",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Вода",
"shower": "Душ",
"shelter": "Укрытие",
"cemetery": "Cemetery",
"motorized": "Автомобили и мотоциклы",
"fuel-station": "Заправочная станция",
"parking": "Парковка",

View File

@@ -79,7 +79,8 @@
"unhide": "Prikaži",
"center": "Centar",
"open_in": "Otvorite u",
"copy_coordinates": "Kopiraj koordinate"
"copy_coordinates": "Kopiraj koordinate",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Voda",
"shower": "Tuš",
"shelter": "Sklonište",
"cemetery": "Cemetery",
"motorized": "Automobili i motocikli",
"fuel-station": "Benzinska stanica",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Visa",
"center": "Center",
"open_in": "Öppna i",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Dusch",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Bensinstation",
"parking": "Parkering",

View File

@@ -79,7 +79,8 @@
"unhide": "Unhide",
"center": "Center",
"open_in": "Open in",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Shower",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Göster",
"center": "Merkez",
"open_in": "Uygulamada Aç",
"copy_coordinates": "Koordinatları kopyala"
"copy_coordinates": "Koordinatları kopyala",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Su",
"shower": "Duş",
"shelter": "Barınak",
"cemetery": "Cemetery",
"motorized": "Araba ve Motosiklet",
"fuel-station": "Benzin istasyonu",
"parking": "Otopark",

View File

@@ -79,7 +79,8 @@
"unhide": "Показати",
"center": "Центр",
"open_in": "Відкрити в",
"copy_coordinates": "Копіювати координати"
"copy_coordinates": "Копіювати координати",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Вода",
"shower": "Душ",
"shelter": "Укриття",
"cemetery": "Cemetery",
"motorized": "Автомобілі та Мотоцикли",
"fuel-station": "Паливна станція",
"parking": "Парковка",

View File

@@ -79,7 +79,8 @@
"unhide": "Unhide",
"center": "Center",
"open_in": "Open in",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Nước",
"shower": "Shower",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -79,7 +79,8 @@
"unhide": "Unhide",
"center": "Center",
"open_in": "Open in",
"copy_coordinates": "Copy coordinates"
"copy_coordinates": "Copy coordinates",
"edit_osm": "Edit in OpenStreetMap"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "Water",
"shower": "Shower",
"shelter": "Shelter",
"cemetery": "Cemetery",
"motorized": "Cars and Motorcycles",
"fuel-station": "Fuel Station",
"parking": "Parking",

View File

@@ -28,7 +28,7 @@
"undo": "撤销",
"redo": "恢复",
"delete": "删除",
"delete_all": "",
"delete_all": "全部删除",
"select_all": "全选",
"view": "显示",
"elevation_profile": "海拔剖面图",
@@ -79,7 +79,8 @@
"unhide": "显示",
"center": "居中",
"open_in": "打开于",
"copy_coordinates": "复制坐标"
"copy_coordinates": "复制坐标",
"edit_osm": "在 OpenStreetMap 中编辑"
},
"toolbar": {
"routing": {
@@ -352,6 +353,7 @@
"water": "饮用水",
"shower": "淋浴",
"shelter": "庇护所",
"cemetery": "墓地",
"motorized": "汽车和摩托车",
"fuel-station": "加油站",
"parking": "停车场",