diff --git a/website/src/lib/docs/es/integration.mdx b/website/src/lib/docs/es/integration.mdx
index 32498bf96..4b0a69c21 100644
--- a/website/src/lib/docs/es/integration.mdx
+++ b/website/src/lib/docs/es/integration.mdx
@@ -13,8 +13,8 @@ Puede usar **gpx.studio** para crear mapas que muestren sus archivos GPX e integ
Todo lo que necesita es:
-1. GPX files hosted on your server or on Google Drive, or accessible via a public URL;
-2. _Optional:_ a MapTiler key to load MapTiler maps.
+1. Archivos GPX alojados en su servidor o en Google Drive, o accesibles a través de una URL pública;
+2. _Opcional:_ una Tecla MapTiler para cargar mapas MapTiler.
Luego puede jugar con el configurador de abajo para personalizar su mapa y generar el código HTML correspondiente.
diff --git a/website/src/lib/docs/es/map-controls.mdx b/website/src/lib/docs/es/map-controls.mdx
index 23b7c4ddb..b1cea96d3 100644
--- a/website/src/lib/docs/es/map-controls.mdx
+++ b/website/src/lib/docs/es/map-controls.mdx
@@ -69,4 +69,4 @@ Pueden activarse en la [configuración de capas del mapa](./menu/settings).
En estos ajustes, también puede administrar la opacidad de las capas superpuestas.
-For advanced users, it is possible to add custom basemaps and overlays by providing WMTS, WMS, or MapLibre style JSON URLs.
+Para los usuarios avanzados, es posible añadir mapas base y superposiciones personalizadas proporcionando WMTS, WMS o URLs JSON estilo Mapbox.
diff --git a/website/src/lib/docs/es/toolbar/elevation.mdx b/website/src/lib/docs/es/toolbar/elevation.mdx
index 0a55ecd2b..322f0d1e8 100644
--- a/website/src/lib/docs/es/toolbar/elevation.mdx
+++ b/website/src/lib/docs/es/toolbar/elevation.mdx
@@ -10,7 +10,7 @@ title: Desnivel
# { title }
-Le permite añadir datos de desnivel a trazas y [puntos de interés](../gpx), o reemplazar los datos existentes.
+Esta herramienta permite añadir datos de elevación a los rastros y [puntos de interés](../gpx), o reemplazar los datos existentes.
@@ -18,7 +18,7 @@ Le permite añadir datos de desnivel a trazas y [puntos de interés](../gpx), o
-Elevation data is provided by MapTiler.
-You can learn more about its origin and accuracy in the documentation.
+Los datos de notificación son proporcionados por MapTiler.
+Puedes aprender más sobre su origen y precisión en la documentación.
diff --git a/website/src/lib/docs/es/toolbar/merge.mdx b/website/src/lib/docs/es/toolbar/merge.mdx
index 73f0d7cbb..26afb326d 100644
--- a/website/src/lib/docs/es/toolbar/merge.mdx
+++ b/website/src/lib/docs/es/toolbar/merge.mdx
@@ -18,8 +18,8 @@ Para usar esta herramienta, necesita [seleccionar](../files-and-stats) múltiple
-Selected items are merged in the order they appear in the files list.
-Reorder items by drag-and-drop if needed.
+Los elementos seleccionados se combinan en el orden en que aparecen en la lista de archivos.
+Si es necesario, puede reordenar los elementos arrastrando y soltando.
diff --git a/website/src/lib/logic/settings.ts b/website/src/lib/logic/settings.ts
index c27db31c4..facbba2f1 100644
--- a/website/src/lib/logic/settings.ts
+++ b/website/src/lib/logic/settings.ts
@@ -162,38 +162,26 @@ function getLayerValidator(allowed: Record
, fallback: string) {
function filterLayerTree(t: LayerTreeType, allowed: LayerTreeType | undefined): LayerTreeType {
const filtered: LayerTreeType = {};
- const values = Object.values(t);
- if (values.length == 0) return filtered;
- if (typeof values[0] === 'boolean') {
- if (allowed) {
- Object.keys(allowed).forEach((key) => {
- if (Object.hasOwn(t, key)) {
- filtered[key] = t[key];
- } else {
- filtered[key] = allowed[key];
- }
- });
+ if (!allowed) return filtered;
+ Object.keys(allowed).forEach((key) => {
+ const allowedVal = allowed[key];
+ if (typeof allowedVal === 'boolean') {
+ filtered[key] = typeof t?.[key] === 'boolean' ? t[key] : allowedVal;
+ } else {
+ filtered[key] = filterLayerTree(
+ typeof t?.[key] === 'object' ? (t[key] as LayerTreeType) : {},
+ allowedVal
+ );
}
- Object.entries(t).forEach(([key, value]) => {
- if (
- !Object.hasOwn(filtered, key) &&
- (key.startsWith('custom-') || key.startsWith('extension-'))
- ) {
- filtered[key] = value;
- }
- });
- } else {
- Object.entries(t).forEach(([key, value]) => {
- if (typeof value === 'object') {
- filtered[key] = filterLayerTree(
- value,
- typeof allowed === 'object' && typeof allowed[key] === 'object'
- ? allowed[key]
- : undefined
- );
- }
- });
- }
+ });
+ Object.entries(t ?? {}).forEach(([key, value]) => {
+ if (
+ !Object.hasOwn(filtered, key) &&
+ (key.startsWith('custom-') || key.startsWith('extension-'))
+ ) {
+ filtered[key] = value;
+ }
+ });
return filtered;
}
diff --git a/website/src/locales/es.json b/website/src/locales/es.json
index 6a33d5b9f..b664bc166 100644
--- a/website/src/locales/es.json
+++ b/website/src/locales/es.json
@@ -2,10 +2,10 @@
"metadata": {
"home_title": "el editor online de archivos GPX",
"app_title": "app",
- "embed_title": " editor online de archivos GPX",
+ "embed_title": "Editor online de archivos GPX",
"help_title": "ayuda",
"404_title": "página no encontrada",
- "description": "Mira, edita y crea archivos GPX online con planificación avanzada de rutas y herramientas de procesamiento de archivos, bonitos mapas y visualizaciones detalladas de datos."
+ "description": "Visualiza, edita y crea archivos GPX online con planificación avanzada de rutas y herramientas de procesamiento de archivos, bonitos mapas y visualizaciones detalladas de datos."
},
"menu": {
"new": "Nuevo",
@@ -234,7 +234,7 @@
},
"elevation": {
"button": "Solicitar datos de desnivel",
- "help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from MapTiler.",
+ "help": "La solicitud de datos de desnivel borrará los datos de desnivel existentes, si los hay, y los reemplazará con datos de Mapbox.",
"help_no_selection": "Seleccione un elemento del archivo para solicitar datos de desnivel."
},
"waypoint": {
@@ -276,7 +276,7 @@
"new": "Nueva capa personalizada",
"edit": "Editar capa personalizada",
"urls": "URL(s)",
- "url_placeholder": "WMTS, WMS or MapLibre style JSON",
+ "url_placeholder": "WMTS, WMS o JSON estilo Mapbox",
"max_zoom": "Zoom máximo",
"layer_type": "Tipo de capa",
"basemap": "Mapa base",
@@ -494,7 +494,7 @@
"email": "Email",
"contribute": "Contribuir",
"supported_by": "con el apoyo de",
- "features": "Features",
+ "features": "Características",
"route_planning": "Planificación de ruta",
"route_planning_description": "Una interfaz intuitiva para crear itinerarios adaptados a cada deporte, basada en datos de OpenStreetMap.",
"file_processing": "Procesamiento avanzado de archivo",
@@ -503,15 +503,15 @@
"maps_description": "Una gran colección de mapas base, capas y puntos de interés para ayudarle a crear su próxima aventura al aire libre o visualizar su último logro.",
"data_visualization": "Visualización de datos",
"data_visualization_description": "Un perfil de elevación interactivo con estadísticas detalladas para analizar actividades registradas y futuros objetivos.",
- "philosophy": "Philosophy",
- "foss": "Free, ad-free and open source",
- "foss_description": "The website is free to use, without ads, and the source code is publicly available on GitHub.",
- "privacy": "Privacy-friendly",
+ "philosophy": "Filosofía",
+ "foss": "Gratis, sin anuncios y código abierto",
+ "foss_description": "El sitio web es de uso gratuito, sin anuncios, y el código fuente está disponible públicamente en GitHub.",
+ "privacy": "Respetuosa con la privacidad",
"privacy_description": "Tus archivos GPX nunca abandonan tu navegador. Sin seguimiento, sin recopilación de datos.",
- "community": "Made possible by the community",
+ "community": "Posible gracias a la comunidad",
"community_description": "gpx.studio tiene una comunidad asombrosa que ha cubierto sus costes a través de donaciones durante años, mientras ha dado forma al proyecto a través de sugerencias de características, informes de fallos y traducciones a muchos idiomas.",
"support_button": "Apoya a gpx.studio en Open Collective",
- "translate_button": "Help translate the website on Crowdin"
+ "translate_button": "Ayuda a traducir el sitio web en Crowdin"
},
"docs": {
"translate": "Mejorar la traducción en Crowdin",
@@ -536,7 +536,7 @@
},
"embedding": {
"title": "Crear su propio mapa",
- "maptiler_key": "MapTiler key (optional, only required for MapTiler maps)",
+ "maptiler_key": "Clave MapTiler (opcional, sólo se requiere para mapas MapTiler)",
"file_urls": "URLs de archivo (separados por comas)",
"drive_ids": "IDs de archivo de Google Drive (separados por comas)",
"basemap": "Mapa base",
diff --git a/website/src/locales/zh-HK.json b/website/src/locales/zh-HK.json
index f57348da9..dec053ecf 100644
--- a/website/src/locales/zh-HK.json
+++ b/website/src/locales/zh-HK.json
@@ -16,9 +16,9 @@
"duplicate": "Duplicate",
"copy": "Copy",
"paste": "Paste",
- "cut": "Cut",
- "export": "Export...",
- "export_all": "Export all...",
+ "cut": "剪下",
+ "export": "匯出……",
+ "export_all": "匯出所有……",
"export_options": "Export options",
"support_message": "The tool is free to use, but not free to run. Please consider supporting the website if you use it frequently. Thank you!",
"support_button": "Help keep the website free",