i18n(de): fixes from the screenshot review

- Labels that ran out of their buttons: EXPORT / EXPORT A stay English
  (EXPORTIEREN was cut to EXPORTI…), the imagery mode reads VGL. KARTE,
  the scene run log PROTOKOLL (it broke as LAUFPROTOKOL/L), the dock voice
  status SPRACHE N. V., and the Esri imagery note fits its line.
- The cyclone layer is Sturmwarnungen (no hyphenated break in the layer
  list); Erdbeben (24 h) matches the other hour readouts; retry countdowns
  get a space before s; the Mapillary hint names the Straßenebene layer.
- The cyclone source's timeout and malformed-snapshot errors were plain
  English in every language: mark them like the wind source does and
  translate them in de, es, ru, zh-CN and zh-Hant.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
German KhokhlovandClaude Opus 5.5 committed 2026-10-28 15:18:49 +04:00
1 parent dfa7ac98a7
commit 0d28150e22
7 files changed
+37 -21

No files matched your search

+17 -15
View File
@@ -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"
}
+3 -1
View File
@@ -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"
}
+3 -1
View File
@@ -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": "Некорректный снимок данных о циклонах"
}
+3 -1
View File
@@ -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": "气旋快照格式错误"
}
+3 -1
View File
@@ -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": "氣旋快照格式錯誤"
}
+2
View File
@@ -27,6 +27,8 @@
"Dance",
"Details",
"Dubai",
"EXPORT",
"EXPORT {slot}",
"FALLBACK",
"FILTER",
"FLIR",
+6 -2
View File
@@ -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 {