diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 0a86aea98..8acbc0f6f 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -15,7 +15,7 @@ "Overpass temporarily unavailable": "Overpass vorübergehend nicht verfügbar", "Retrying mapped sites…": "Neuer Versuch für kartierte Standorte…", "Fetching mapped sites…": "Kartierte Standorte werden abgerufen…", - "{reason} — retrying in {seconds}s": "{reason}: neuer Versuch in {seconds}s", + "{reason} — retrying in {seconds}s": "{reason}: neuer Versuch in {seconds} s", "{reason} — retry pending": "{reason}: neuer Versuch steht aus", "Zoom in to search mapped installations": "Hineinzoomen, um kartierte Anlagen zu suchen", "Showing cached mapped sites": "Kartierte Standorte aus dem Cache", @@ -372,7 +372,7 @@ "one": "{count} Kamera geladen · CCTV aktivieren", "other": "{count} Kameras geladen · CCTV aktivieren" }, - "Enable CCTV to load camera intersections": "CCTV aktivieren, um Kamerakreuzungen zu laden", + "Enable CCTV to load camera intersections": "CCTV aktivieren, um Kreuzungen mit Kameras zu laden", "Enable CCTV to start camera-linked intelligence summaries.": "CCTV aktivieren, um kameragestützte Lagezusammenfassungen zu starten.", "No summary available.": "Keine Zusammenfassung verfügbar.", "loading frames": "Frames werden geladen", @@ -499,7 +499,7 @@ "Context": "Kontext", "Live Flights": "Live-Flüge", "Military Flights": "Militärflüge", - "Earthquakes (24h)": "Erdbeben (24 Std)", + "Earthquakes (24h)": "Erdbeben (24 h)", "Satellites": "Satelliten", "Space Missions (30d)": "Raummissionen (30 T)", "Street Traffic": "Straßenverkehr", @@ -517,14 +517,14 @@ "DISABLING": "WIRD DEAKTIVIERT", "{state} · {source}": "{state} · {source}", "UNCERTAIN · {source} · lifecycle state requires reconciliation": "UNKLAR · {source} · Lebenszyklus-Status muss abgeglichen werden", - "{state} · {source} · {detail} · retry {seconds}s": "{state} · {source} · {detail} · neuer Versuch {seconds}s", + "{state} · {source} · {detail} · retry {seconds}s": "{state} · {source} · {detail} · neuer Versuch in {seconds} s", "{state} · {source} · {detail}": "{state} · {source} · {detail}", "never": "nie", "{source} · {loadingLabel}": "{source} · {loadingLabel}", "{accepted} of {raw} records accepted": "{accepted} von {raw} Datensätzen übernommen", "incomplete snapshot": "unvollständiger Snapshot", "{state} · {source} · {detail} · {ago}": "{state} · {source} · {detail} · {ago}", - "{state} · {source} · {ago} · retrying in {seconds}s": "{state} · {source} · {ago} · neuer Versuch in {seconds}s", + "{state} · {source} · {ago} · retrying in {seconds}s": "{state} · {source} · {ago} · neuer Versuch in {seconds} s", "{state} · {source} · {ago}": "{state} · {source} · {ago}", "{source} · {ago}": "{source} · {ago}", "UNCERTAIN": "UNKLAR", @@ -631,7 +631,7 @@ "REFRESHING LIVE DATA": "LIVE-DATEN WERDEN AKTUALISIERT", "syncing road network": "Straßennetz wird synchronisiert", "retry pending": "neuer Versuch steht aus", - "retrying in {seconds}s": "neuer Versuch in {seconds}s", + "retrying in {seconds}s": "neuer Versuch in {seconds} s", "Celestial ring — reveal the full globe": "Himmelsring: ganzen Globus zeigen", "Celestial ring — available in Normal style": "Himmelsring: im Stil Normal verfügbar", "Detection overlay: {mode}": "Erkennungs-Overlay: {mode}", @@ -656,7 +656,7 @@ "Running command": "Befehl läuft", "Voice off": "Sprache aus", "WebRTC microphone support unavailable": "WebRTC-Mikrofonunterstützung nicht verfügbar", - "VOICE UNAVAILABLE": "SPRACHE NICHT VERFÜGBAR", + "VOICE UNAVAILABLE": "SPRACHE N. V.", "VOICE ACTIVE": "SPRACHE AKTIV", "Voice session could not be started.": "Sprachsitzung konnte nicht gestartet werden.", "Next session: {pendingId} — this session stays on {modelId}": "Nächste Sitzung: {pendingId}. Diese Sitzung bleibt bei {modelId}", @@ -854,7 +854,7 @@ "START": "START", "EXPORT PRESETS": "PRESETS EXPORTIEREN", "IMPORT": "IMPORTIEREN", - "RUN LOG": "LAUFPROTOKOLL", + "RUN LOG": "PROTOKOLL", "POWER UP": "STARTKLAR", "GROUND STATION · PROVIDER SETTINGS": "BODENSTATION · ANBIETER-EINSTELLUNGEN", "Close key setup": "Schlüssel-Einrichtung schließen", @@ -1206,7 +1206,7 @@ "The photorealistic 3D planet, place search + Street View": "Der fotorealistische 3D-Planet, Ortssuche + Street View", "Voice control — API key or ChatGPT OAuth": "Sprachsteuerung – API-Schlüssel oder ChatGPT OAuth", "Gemini Live voice control": "Sprachsteuerung mit Gemini Live", - "Street-level imagery and coverage in the Street Level layer. Free: register an app in the Mapillary developer dashboard and paste its Client Token": "Bilder auf Straßenebene und Abdeckung in der Ebene Straßenansicht. Kostenlos: im Mapillary-Entwickler-Dashboard eine App registrieren und deren Client Token einfügen", + "Street-level imagery and coverage in the Street Level layer. Free: register an app in the Mapillary developer dashboard and paste its Client Token": "Bilder und Abdeckung auf Straßenebene in der Ebene „Straßenebene“. Kostenlos: im Mapillary-Entwickler-Dashboard eine App registrieren und deren Client Token einfügen", "Public space-missions access needs no key. Leave blank for standard use; paid tokens only raise request limits.": "Öffentlicher Zugang zu Raummissionen braucht keinen Schlüssel. Für normale Nutzung leer lassen; kostenpflichtige Tokens erhöhen nur die Anfragelimits.", "Air quality request failed": "Luftqualitätsabfrage fehlgeschlagen", "No readings available": "Keine Messwerte verfügbar", @@ -2153,7 +2153,7 @@ "S2 GhostMaps": "S2 GhostMaps", "Rain radar": "Regenradar", "Lightning density": "Blitzdichte", - "Cyclone advisories": "Wirbelsturmwarnungen", + "Cyclone advisories": "Sturmwarnungen", "ALPR Cameras": "ALPR-Kameras", "Live Vessels": "Live-Schiffe", "Bike Share": "Bikesharing", @@ -2252,14 +2252,14 @@ "Latest": "Neueste", "Newest frame per product": "Neuester Frame je Produkt", "Replay observed history": "Beobachteten Verlauf abspielen", - "Imagery on Esri · Google 3D returns when cleared": "Bilder auf Esri · Google 3D kehrt nach dem Löschen zurück", + "Imagery on Esri · Google 3D returns when cleared": "Bilder auf Esri · Google 3D nach dem Löschen", "Point the camera at the ground to use the view": "Kamera auf den Boden richten, um die Ansicht zu verwenden", "That point cannot anchor a box": "Dieser Punkt kann keinen Bereich verankern", "Imagery stops at ±{limit}° latitude": "Bilder enden bei ±{limit}° Breite", "{owner} is using the pointer — close it first": "{owner} verwendet gerade den Zeiger – zuerst schließen", "Box is {size} wide · limit {limit}": "Bereich ist {size} breit · Limit {limit}", "View is {size} wide · limit {limit}": "Ansicht ist {size} breit · Limit {limit}", - "VS BASEMAP": "MIT BASISKARTE", + "VS BASEMAP": "VGL. KARTE", "A / B": "A / B", "Newest low-cloud day for this box · scene cloud, not box cloud": "Neuester Tag mit wenig Wolken für diesen Bereich · Bewölkung der Szene, nicht des Bereichs", "Newest day covering this box · cloudier than 20%": "Neuester Tag mit Abdeckung dieses Bereichs · über 20 % Bewölkung", @@ -2326,8 +2326,8 @@ "Source off": "Quelle aus", "Unpin {slot}": "{slot} lösen", "Unpin the image": "Bild lösen", - "EXPORT {slot}": "{slot} EXPORTIEREN", - "EXPORT": "EXPORTIEREN", + "EXPORT {slot}": "EXPORT {slot}", + "EXPORT": "EXPORT", "Download {slot} as a PNG": "{slot} als PNG herunterladen", "Download the image as a PNG": "Bild als PNG herunterladen", "Box {width} × {height} km": "Bereich {width} × {height} km", @@ -2932,5 +2932,7 @@ "SINCE": "SEIT", "Toggle straight-down and tilted map views": "Zwischen senkrechter und geneigter Kartenansicht wechseln", "Reset map to north up": "Karte nach Norden ausrichten", - "Reset map bearing to north": "Kartenausrichtung auf Norden zurücksetzen" + "Reset map bearing to north": "Kartenausrichtung auf Norden zurücksetzen", + "Cyclone request timed out": "Zeitüberschreitung bei der Sturmabfrage", + "Malformed cyclone snapshot": "Fehlerhafter Sturm-Snapshot" } diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 0285917b0..79780cb40 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -3001,5 +3001,7 @@ "Your choice applies now, but could not be saved.": "Tu elección se aplica ahora, pero no se pudo guardar.", "Voice replies appear here.": "Las respuestas de voz aparecen aquí.", "Preview is off.": "La vista previa está desactivada.", - "Automatic stop is unavailable for this voice connection.": "La parada automática no está disponible para esta conexión de voz." + "Automatic stop is unavailable for this voice connection.": "La parada automática no está disponible para esta conexión de voz.", + "Cyclone request timed out": "La petición de ciclones agotó el tiempo de espera", + "Malformed cyclone snapshot": "Instantánea de ciclones mal formada" } diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index b1c1be229..93c0b389d 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -3070,5 +3070,7 @@ "Your choice applies now, but could not be saved.": "Ваш выбор применён, но сохранить его не удалось.", "Voice replies appear here.": "Здесь появляются голосовые ответы.", "Preview is off.": "Предпросмотр отключён.", - "Automatic stop is unavailable for this voice connection.": "Автоматическая остановка недоступна для этого голосового подключения." + "Automatic stop is unavailable for this voice connection.": "Автоматическая остановка недоступна для этого голосового подключения.", + "Cyclone request timed out": "Истекло время ожидания запроса о циклонах", + "Malformed cyclone snapshot": "Некорректный снимок данных о циклонах" } diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 9bf76700c..854235f3d 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -2863,5 +2863,7 @@ "{count} placemarks": { "other": "{count} 个地标" }, - "S2 Underground publishes these KMZ products to GitHub. New uploads are detected within seconds and replace the previous edition automatically. Click a marker for its report.": "S2 Underground 在 GitHub 发布这些 KMZ 产品。新上传的内容会在数秒内被检测到,并自动替换旧版本。点击标记查看报告。" + "S2 Underground publishes these KMZ products to GitHub. New uploads are detected within seconds and replace the previous edition automatically. Click a marker for its report.": "S2 Underground 在 GitHub 发布这些 KMZ 产品。新上传的内容会在数秒内被检测到,并自动替换旧版本。点击标记查看报告。", + "Cyclone request timed out": "气旋请求超时", + "Malformed cyclone snapshot": "气旋快照格式错误" } diff --git a/src/i18n/locales/zh-Hant.json b/src/i18n/locales/zh-Hant.json index d95a18e39..113a79e65 100644 --- a/src/i18n/locales/zh-Hant.json +++ b/src/i18n/locales/zh-Hant.json @@ -2863,5 +2863,7 @@ "{count} placemarks": { "other": "{count} 個地標" }, - "S2 Underground publishes these KMZ products to GitHub. New uploads are detected within seconds and replace the previous edition automatically. Click a marker for its report.": "S2 Underground 在 GitHub 發布這些 KMZ 產品。新上傳的內容會在數秒內被檢測到,並自動替換舊版本。點擊標記查看報告。" + "S2 Underground publishes these KMZ products to GitHub. New uploads are detected within seconds and replace the previous edition automatically. Click a marker for its report.": "S2 Underground 在 GitHub 發布這些 KMZ 產品。新上傳的內容會在數秒內被檢測到,並自動替換舊版本。點擊標記查看報告。", + "Cyclone request timed out": "氣旋請求超時", + "Malformed cyclone snapshot": "氣旋快照格式錯誤" } diff --git a/src/i18n/same-as-english.json b/src/i18n/same-as-english.json index 4946512a3..d8a4247a7 100644 --- a/src/i18n/same-as-english.json +++ b/src/i18n/same-as-english.json @@ -27,6 +27,8 @@ "Dance", "Details", "Dubai", + "EXPORT", + "EXPORT {slot}", "FALLBACK", "FILTER", "FLIR", diff --git a/src/layers/cyclones/source.js b/src/layers/cyclones/source.js index 05c805fbd..84294620f 100644 --- a/src/layers/cyclones/source.js +++ b/src/layers/cyclones/source.js @@ -1,7 +1,11 @@ import { readResponseJsonCapped } from '../../sources/httpBody.js'; +// No i18n here, as in the wind source: the texts stay English data and the +// cyclone layer shows them translated. +const msg = (text) => text; + export const CYCLONE_RESPONSE_LIMIT = 4 * 1024 * 1024; -const malformed = () => new Error('Malformed cyclone snapshot'); +const malformed = () => new Error(msg('Malformed cyclone snapshot')); const text = (value, max = 160) => { if ( typeof value !== 'string' || @@ -215,7 +219,7 @@ export function createCycloneSource({ const abort = () => controller.abort(signal.reason); signal?.addEventListener('abort', abort, { once: true }); const timer = setTimeout( - () => controller.abort(new Error('Cyclone request timed out')), + () => controller.abort(new Error(msg('Cyclone request timed out'))), timeoutMs, ); try {