diff --git a/README.md b/README.md index f0a338279..2297ac5b0 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Start with the included data sources, then add your own. Each layer is a separat - **🎯 Click-to-track anything:** Camera locks on, draws a fading trail, surfaces full metadata — and a tracked fire or vessel hands you off to the nearest live camera in one click. - **đŸ–Šïž Voice whiteboard:** Speak annotations onto the world — real boundary polygons, marks, and routes. - **đŸ›« 3D hangar:** Real per-class aircraft models — 787, ATR-72, Citation, Bell 206, MQ-9 — and a tracked contact swaps from glyph to 3D model as you close in. -- **🎹 Reskin reality:** GLSL sensor looks over the normal globe — CRT, NVG, FLIR/thermal, Noir, Snow. +- **🎹 Reskin reality:** GLSL sensor looks over the normal globe — CRT, NVG, FLIR/thermal, Noir. - **đŸŸ© Detection overlay:** Screen-space bounding boxes and IDs on everything in view. - **đŸŽ–ïž Military HUD:** Tactical heads-up display with intelligence-style telemetry. - **🌐 Global Context:** Stage the full situational picture with one switch — and get your exact view back when you leave. @@ -294,14 +294,14 @@ Choose a first-run mission, or try these in order. The GIFs show Google Photorea ![Tracking the ISS along its orbital path as it crosses over Ukraine](docs/media/14-iss-over-ukraine.gif) -6. **Switch the optics.** Tap `1`–`7` — CRT, NVG, FLIR — and the whole live planet re-renders through a different sensor. +6. **Switch the optics.** Tap `1`–`6` — CRT, NVG, FLIR — and the whole live planet re-renders through a different sensor. ![Cycling a dense live globe through CRT, FLIR, and NVG in one continuous view](docs/media/01-style-sweep.gif) 7. **Talk to it** _(needs an OpenAI key)_: _"Take me to LAX and select the nearest airborne aircraft."_ 8. **Come home.** Hit **Reset Globe** — or just say _"zoom out to a globe view."_ -**Keyboard:** `1`–`7` visual styles · `H` HUD · `D` detection · `C` cockpit · `` ` `` frame rate · `Esc` out. Trackpad pinch zooms the globe. +**Keyboard:** `1`–`6` visual styles · `H` HUD · `D` detection · `C` cockpit · `` ` `` frame rate · `Esc` out. Trackpad pinch zooms the globe. --- diff --git a/changelog.d/1467-remove-operator-hud-layout.md b/changelog.d/1467-remove-operator-hud-layout.md new file mode 100644 index 000000000..556d551ee --- /dev/null +++ b/changelog.d/1467-remove-operator-hud-layout.md @@ -0,0 +1,3 @@ +- Remove the Operator HUD layout. Display > HUD > Layout and the HUD voice + action now offer Tactical, Minimal and Cyber; share links, scenes and saved + views that name Operator open in Tactical (asturksever, #1467). diff --git a/changelog.d/1468-remove-snow-preset.md b/changelog.d/1468-remove-snow-preset.md new file mode 100644 index 000000000..2bd1cb161 --- /dev/null +++ b/changelog.d/1468-remove-snow-preset.md @@ -0,0 +1,4 @@ +- Remove the Snow visual preset. Visual Presets, keyboard shortcuts, the + Cockpit vision carousel and the visual-style voice action now offer Normal, + CRT, NVG, FLIR, Anime and Noir; share links and scene shots that name Snow + open on Normal (asturksever, #1468). diff --git a/changelog.d/1471-context-panel-cleanup.md b/changelog.d/1471-context-panel-cleanup.md new file mode 100644 index 000000000..0d97cc397 --- /dev/null +++ b/changelog.d/1471-context-panel-cleanup.md @@ -0,0 +1,7 @@ +- Remove the Radio icon from the Context panel header, along with the compact + Radio player it opened; Radio stays in Context as its own section, and + Cockpit's compact Radio is unchanged. Context is also easier to read: the + Contacts / Space Missions modes are one segmented control, labels and + guidance are larger and higher contrast, the standby hint is plain text + instead of a dashed box, and the panel draws no glow halo. Cyber keeps its + own framed buttons and red titles (asturksever, #1471). diff --git a/changelog.d/1473-italian.md b/changelog.d/1473-italian.md new file mode 100644 index 000000000..c1af8f021 --- /dev/null +++ b/changelog.d/1473-italian.md @@ -0,0 +1,3 @@ +- Add Italian (it) to the language picker: the whole interface in Italian, + with Italian plural forms and labels shortened to fit the panels. Based on + the translation by @abiyeenzo (#912) (German, @gekh, #1473). diff --git a/changelog.d/1475-brazilian-portuguese.md b/changelog.d/1475-brazilian-portuguese.md new file mode 100644 index 000000000..1705d628a --- /dev/null +++ b/changelog.d/1475-brazilian-portuguese.md @@ -0,0 +1,4 @@ +- Add Brazilian Portuguese (pt) to the language picker, with every screen + translated and Portuguese plural forms. The CCTV summary line now names its + calibration, source and view in the page language. Based on translations by + @abiyeenzo (#909) (German, @gekh, #1475). diff --git a/changelog.d/1476-french.md b/changelog.d/1476-french.md new file mode 100644 index 000000000..30d0b8c89 --- /dev/null +++ b/changelog.d/1476-french.md @@ -0,0 +1,4 @@ +- Add French (fr) to the language picker, with French typography and plural + forms. With nine languages the picker now shows its search field. Based on + the translation by @abiyeenzo (#907), checked against @meirm's French + catalog (#312) (German, @gekh, #1476). diff --git a/changelog.d/1477-german.md b/changelog.d/1477-german.md new file mode 100644 index 000000000..77d7717b6 --- /dev/null +++ b/changelog.d/1477-german.md @@ -0,0 +1,3 @@ +- Add German (de) to the language picker, with a full translation of the + interface and a German style guide in docs/translations/de.md. Based on + translations by @abiyeenzo (#908) (German, @gekh, #1477). diff --git a/changelog.d/1478-japanese.md b/changelog.d/1478-japanese.md new file mode 100644 index 000000000..376853e24 --- /dev/null +++ b/changelog.d/1478-japanese.md @@ -0,0 +1,4 @@ +- Add Japanese (ja) to the language picker, with year-first dates, Japanese + counters, unit words joined to their numbers (5戆才, 1時間5戆) and CJK label + rules for Japanese text. Based on translations by @abiyeenzo (#913) + (German, @gekh, #1478). diff --git a/changelog.d/1485-cctv-view-thinning.md b/changelog.d/1485-cctv-view-thinning.md new file mode 100644 index 000000000..307da84ad --- /dev/null +++ b/changelog.d/1485-cctv-view-thinning.md @@ -0,0 +1,4 @@ +- Draw only the CCTV cameras in view, and thin them to one per ground cell when + zoomed out. Dragging the globe with the default 4,000-camera catalog no + longer stalls, and the camera picker lists the cameras in view with a count + of the ones outside it (samehkhamis, #1485). diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 6e8e5baf4..e5c052420 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -240,7 +240,7 @@ from 0–200%. OFF disables the slider while retaining its value. HUD layout changes preserve both settings; share links and scenes restore them. The historical missing-`scf` fallback remains 35%; explicit 0% keeps the hard edge. -With Scope OFF, Tactical, Operator and Minimal add text-sized black backplates +With Scope OFF, Tactical and Minimal add text-sized black backplates at 70% opacity behind telemetry, vertical metadata and scene chrome. Original HUD text color, glow and opacity are preserved. Scope OFF brightens the tagline and Active Style label with the shared secondary text color. The title plate @@ -250,6 +250,15 @@ the original HUD presentation; Cyber retains its existing skin. `node scripts/qa-scope-hud.mjs` checks native input, range, layout persistence, restoration and both Scope presentations. `QA_SCREENSHOT_DIR` saves screenshots. +## HUD layouts — October 29, 2026 + +Display > HUD > Layout offers Tactical, Minimal and Cyber; the `set_hud` voice +action accepts the same three. The Operator layout is retired. Share links +keep its enum code so older links still parse, and a link, scene or saved state +that names Operator restores the default Tactical layout. Operator was the +only layout that showed the HUD's top banner bar, so its markup and styles are +removed too. + ## Cyber HUD — September 30, 2026 Display > HUD > Layout includes Cyber, also available through the HUD voice @@ -265,8 +274,8 @@ red hover border in both map and cockpit, so clipping does not hide the highligh Cyber's map-side right rail opens one panel at a time while keeping collapsed launchers available. Display, CCTV and Context scroll their contents inside fixed headers and decorative frames. The narrow-screen rail remains scrollable to reach -each panel. Radio retains the shared nested Context player and compact -header disclosure, without relocating playback controls on theme changes. +each panel. Radio retains the shared nested Context player without relocating +playback controls on theme changes. Voice help/error popups and Location/Visual Presets pins extend beyond their Cyber frames without being clipped: the shapes decorate non-interactive @@ -988,6 +997,15 @@ directory. Every `/api/cctv` route refuses cross-site browser requests but accepts forwarding headers, so cameras work behind a reverse proxy; a forwarded request skips the key-bearing Street View fallback and gets the placeholder. +The CCTV layer draws only the cameras on or near the screen. Zoomed out, it +keeps one camera per ground cell sized to the view, preferring a healthy feed, +and the cells are anchored to the ground so a pan keeps the same cameras. The +active camera always shows. Ground placement and coverage geometry load only +for the cameras in view, with at most two attempts per camera and view regime. +The view pass reruns while the camera moves, paced by its own cost. The camera +picker lists the cameras in view, active camera first, and closes with the +count of cameras outside the view. + Traffic owns its rendered-surface observer only while enabled, removes it on disable/destroy, and caches surface identity without allocating on unchanged frames. Traffic and bikeshare expose factories through `./layers/traffic` and @@ -1411,8 +1429,10 @@ and sharpen. Display supplies actions and renders settings; effect execution has no DOM dependency. Existing presets and the 500 ms transition remain unchanged. Stopping the controller revokes animation before asynchronous UI teardown; final destruction removes its stages and restores the borrowed bloom configuration. -Snow's sideways sway stays within a fixed range at any session age; Wind scales -its amplitude. +Snow is no longer a visual preset. A share link that names it, in either the +long or compact form, opens on Normal and drops the Snow shader parameters. A +view passed to embed mode or `show_in_gods_eye_view`, and a saved scene shot, +that names Snow also open on Normal. Sharpen runs only when enabled with intensity above 0.001. At slider zero its stage is disabled; raising the slider resumes it when sharpen is enabled. @@ -1527,10 +1547,6 @@ Automatic collapse remains presentation only, prioritizes the latest explicit panel, and honors keyboard focus on the right. Mobile layout still releases desktop allocation styles. Stable Display allocation avoids unnecessary style writes. This extraction does not change panel positions or layout defaults. -Context expansion through the panel owner or adaptive right-rail restoration -closes an open compact Radio disclosure before Context/Space Missions becomes -visible. The mini remains available while Context is collapsed. This fixes the -Radio-overlap path reported in #804 without changing z-index or layout policy. The right rail skips panels hidden by other CSS (computed `display: none`), but keeps the collapsed panels its own exclusive presentation hides, so automatic collapse can still be undone. @@ -2019,7 +2035,7 @@ they do not reduce the materialized entity count or establish an FPS gain. rotation and mission-marker highlight as pointer hover. Focus alone does not select the mission; Enter or Space performs selection. Keyboard and pointer preview ownership remain independent when the pointer is parked over the list. -- Radio power controls in the full, compact, and Cockpit surfaces, Search Nearby +- Radio power controls in the full and Cockpit surfaces, Search Nearby Sites, and Clear Selected Layers remain focusable while lifecycle work is in progress. They announce busy/disabled semantics and ignore repeat activation until the operation settles, so async work cannot drop the keyboard ring. @@ -2265,8 +2281,9 @@ fetching, trailing-24-hour filtering and partial-success caching are unchanged. > to yield to: whoever handles ESC first calls `preventDefault()` **and** > `stopImmediatePropagation()`, and the launcher skips `defaultPrevented` events. > `stopPropagation()` alone does **not** stop later listeners on the same -> `document` — that is exactly how the compact Radio disclosure made one key -> close the disclosure _and_ dismiss the launcher. +> `document` — that is exactly how a disclosure that called it alone made one +> key close the disclosure _and_ dismiss the launcher. Cockpit's utility +> disclosures (Display, Radio) claim the key the immediate way. > > **Accepted:** a surface class that never clears means no launcher for that page > load, with no timeout. None of the four classes is restored at startup, so an @@ -2850,7 +2867,7 @@ down | auth-failed` (plus the unchanged `missing-key`/`unsupported`) with > failed searches leave the current camera owner untouched, and Context Focus > can return to the preserved Contact. Focus also restores the selected > aircraft's canonical follow frame after a manual zoom-away. -> Visual presets retain the order Normal, CRT, NVG, FLIR, Anime, Noir, Snow. +> Visual presets retain the order Normal, CRT, NVG, FLIR, Anime, Noir. > Configurable preset selection—including same-style reselection—opens the > shared Parameters surface directly below Detection and scrolls it into > view; share-link restoration @@ -2902,7 +2919,7 @@ down | auth-failed` (plus the unchanged `missing-key`/`unsupported`) with > Inside Cockpit, the focused summary card is titled Contact in both visible > copy and its accessible control labels. > The top-center Cockpit vision cycle is the fixed, duplicate-free sequence -> Normal, CRT, NVG, FLIR, Anime, Noir, and Snow. Entry selects the map preset +> Normal, CRT, NVG, FLIR, Anime, and Noir. Entry selects the map preset > already in use, so a FLIR map opens on the existing FLIR item while > Normal remains available exactly once. NONE is not offered. Cockpit choices > temporarily override the map preset, while Exit Cockpit and Reset both restore @@ -2946,7 +2963,7 @@ down | auth-failed` (plus the unchanged `missing-key`/`unsupported`) with > corridor). Its minimal Display popover exposes Intel HUD, > Detection, Parameters, and 3D aircraft. During Cockpit, those existing > standard Display controls move into the Cockpit popover and retain their normal -> nested interaction: HUD plus Tactical/Operator/Minimal layout, Detection plus +> nested interaction: HUD plus Tactical/Minimal/Cyber layout, Detection plus > Density/Allocation/Fade/Outside tuning, and 3D plus Proximity/All mode. The > same nodes and state return to the map Display on exit, so Cockpit does not > maintain a second control state. **Detection is owned by the CONTACTS @@ -3008,15 +3025,10 @@ down | auth-failed` (plus the unchanged `missing-key`/`unsupported`) with > stacking. Narrow mobile Cockpit > viewports suppress the legacy layer stack, peripheral HUD, and secondary > Context/briefing panes so the flight instruments and primary controls remain -> unobstructed. Outside Cockpit, Radio starts collapsed while off. When Context -> is collapsed, its Radio header icon opens compact controls whose explicit -> Enable/Disable action owns power; stable close and full-panel buttons own -> compact dismissal and one-way detailed expansion independently. When Context -> is already expanded, that same icon skips the floating compact card, expands -> the embedded Radio section, scrolls it into view, and moves keyboard focus to -> its disclosure control. The detailed panel's normal accordion control owns -> its collapse. Compact/detailed state and playback continuity remain shared. -> Radio volume in the full, compact, and Cockpit surfaces, plus Space Mission +> unobstructed. Outside Cockpit, Radio starts collapsed while off and lives +> only in its section inside Context; the detailed panel's normal accordion +> control owns its disclosure and its Enable/Disable action owns power. +> Radio volume in the full and Cockpit surfaces, plus Space Mission > replay speed, use Display / Sharpen's muted 3px rail, circular cyan thumb, > glow, and mono value treatment. Their larger transparent hit areas, keyboard > focus indication, ranges, disabled states, and mission speed scale remain @@ -3801,7 +3813,7 @@ test:track` 43 tracking invariants · headless QA harnesses under ### Interface localization (October 2026) -Shipped locales: **en** (source and fallback), **es**, **ru**, **uk**, **zh-CN** and **zh-Hant**. The code lives in +Shipped locales: **en** (source and fallback), **de**, **es**, **fr**, **it**, **ja**, **pt** (Brazilian Portuguese), **ru**, **uk**, **zh-CN** and **zh-Hant**. The code lives in `src/i18n/`. How to mark UI text: [`docs/I18N.md`](./I18N.md); translator workflow: [`docs/TRANSLATORS.md`](./TRANSLATORS.md). @@ -3812,7 +3824,7 @@ Shipped locales: **en** (source and fallback), **es**, **ru**, **uk**, **zh-CN** value). English has no catalog; every other locale is `src/i18n/locales/.json`, and a missing entry falls back to English. - **Locale choice.** `?lang=` → stored choice (`gev:locale:v1`) → - `navigator.languages` → English. Chinese tags default to `zh-CN`; Traditional Chinese tags + `navigator.languages` → English. Any `pt` tag (`pt-BR`, `pt-PT`) selects `pt`. Chinese tags default to `zh-CN`; Traditional Chinese tags select `zh-Hant`. Explicit `Hans` selects `zh-CN` regardless of region. `?lang=` is not stored, and share links drop it, so a recipient keeps their own language. The globe picker in the bottom-right corner (`src/ui/localePicker.js`) stores the choice, drops @@ -4801,13 +4813,6 @@ synchronous playback-control observers run, so reentrant voice cleanup cannot overwrite a released stream with a stale paused state. Layer destruction likewise retains an enabled manager entry when module disable or destroy fails semantically, preventing an active orphan and allowing retry. -When Context is collapsed, explicitly activating its Radio header icon reveals -the compact transport; hover and focus alone do not open it. When Context is -expanded, the icon instead expands and scrolls to the embedded Radio section. -Its accessible label, controlled region, and expanded state keep describing the -current route throughout enabling, enabled, disabling, and uncertain lifecycle -renders. Both routes preserve Radio power, playback, station, filter, and volume -state. Bundled datasets live in `src/data/local_data/` with per-folder provenance READMEs; they are lazily loaded via `src/data/localGeojsonCore.js` (Vite `?url` assets) when toggled on. @@ -4828,6 +4833,8 @@ silently demoting every later lookup for the session. - The expanded `CONTEXT` view offers mutually exclusive `CONTACTS` and `SPACE MISSIONS` modes. Selecting `CONTACTS` enables the context-owned Flights, Military Flights, AIS Vessels, and Mapped Installations dependencies only when they are not already user-enabled; selecting `SPACE MISSIONS` enables the recent-launch layer and its Satellite dependency. `CONTACTS` cycles the nearest supported contact of whatever type is selected. Satellites are deliberately excluded from those Awareness cohorts and keep their own tracking UX. Selecting the active mode again returns to the neutral chooser and releases only mode-owned dependencies. - If a civilian or military aircraft is already tracked when `CONTACTS` becomes operational, that source-owned track is adopted as the Context subject before nearest-contact autofocus. Context rechecks the tracker after its dependencies settle, so a newer selection wins, while an explicit clear during activation prevents fallback from silently selecting a replacement. Cockpit entry remains unavailable until that Context transaction has settled, so its camera takeover cannot clear Cesium tracking before adoption. Adoption does not recreate tracking or transfer camera ownership; it initializes the normal 250 km ring, history, proximity results, and Cockpit Previous/Next state for the original aircraft. - `SEARCH NEARBY SITES` retains the bounded OSM results and makes one user-initiated, view-biased Google Maps Places text search for “military installation.” Google results are source-stamped, deduplicated against OSM by rounded location/name, and remain mapped context rather than operational claims. If Places is unavailable or the API is not enabled for the supplied key, OSM context remains available. A view across the antimeridian is searched around its own centre, with a radius from its real width. +- The Context header holds only its title and collapse control. It no longer carries a Radio shortcut or a compact Radio player: Radio is the `RADIO` section inside the panel, with its own disclosure and the single `ENABLE` power control. Cockpit keeps its own compact Radio utility. +- Context is set for reading in every theme: mode, standby and action labels are 10 px, and the panel draws no glow halo. Outside Cyber, the two modes form one segmented control, the standby guidance is plain left-aligned text rather than a dashed placeholder, and the expanded panel's section titles use `--text-secondary`. Cyber keeps its separately framed mode buttons, its red panel titles, and in layout-focus a framed, centred standby card over its radar art. - The expanded desktop header omits the redundant `ON` label; the active mode button carries state. Expanded Contact results also omit the duplicate `GLOBAL CONTEXT` / `CONTEXT ONLY` status row and begin with the selected subject and its 250 km scope. Global Context does not fabricate a selected-entity model preview: the provisional hand-authored aircraft wireframe was removed because it was not geometry extracted from the selected entity's actual asset. - Dependency ownership is reversible: disabling Global Context releases only dependencies it enabled, while user-enabled layers remain on. This also removes the Military-layer suppression handoff when Global Context owned Military, allowing an already-enabled civilian Flights layer to resume its normal mixed rendering. If OpenSky is unavailable and has no last-good cache, Flights requests a capped 250 nm adsb.lol point snapshot around the current view anchor and labels that provenance explicitly; it never relabels military-feed rows as civilian data. If both inputs fail, Flights remains `UNKNOWN`. - Space Missions is replay-isolated: Rocket Launches and Satellites are the only Data Layers permitted while the mode is active. Direct UI and voice entry capture the same pre-entry snapshot; internal dependency and restoration enables do not create a user-owned Context session. Entry waits for incompatible layers to shut down, direct incompatible enables are blocked before lifecycle work, and the entry gate remains active through the complete Rocket Launches enable. A newer same-target ON request takes ownership of the pending entry without releasing its isolation snapshot, including when it arrives while the prior request is awaiting the adoption guard. A caller abort, resource cancellation, newer OFF, or layer teardown waits for exact manager settlement and restores that snapshot without resurrecting Rocket Launches. If an abort lands after only part of a restore settles, Context completes the same exact target without the stale caller signal and then replays newer explicit layer intent. Dedicated Voice Context cancellation reports a stable cancelled result plus the current Context state; generic layer visibility additionally exposes manager phase, reason, successor, and lifecycle details. Once an exact voice visibility intent commits, a newer voice turn cannot relabel it as cancelled while Context settlement completes; pre-commit aborts remain cancellable and final lifecycle mismatches remain failures. Clear Selected Layers reserves its complete captured OFF set before sequential teardown; a newer absolute request of any origin supersedes only its layer reservation and remains authoritative. A rejected layer teardown retains the truthful enabled state, rolls already-stopped siblings back to the captured pre-entry set, and aborts replay; rapid exit/re-entry serializes the full Satellite enabled-state and parameter restore before a new snapshot is taken. Contacts remains additive and restores user-enabled layers normally. @@ -5200,8 +5207,8 @@ and unreachable upstream (502/504) separately from road geometry. first, activates the Contacts sub-view, and returns the settled 250 km window. Its `aircraft` count is the exact civilian-plus-military total when both feeds can answer, or `unknown` when either component is unavailable. -- Cockpit's top vision switch cycles all seven map looks: Normal, CRT, NVG, - FLIR, Anime, Noir, and Snow. Entry selects the matching map style without adding +- Cockpit's top vision switch cycles all six map looks: Normal, CRT, NVG, + FLIR, Anime, and Noir. Entry selects the matching map style without adding a duplicate carousel item. There is no empty `NONE` entry. ### Live AIS Vessels (June 2026) @@ -5618,7 +5625,7 @@ apply to `public/` assets or built-preview serving. - The desktop right rail (`#right-context-rail`) owns `DISPLAY`, `CCTV`, its active parameter controls, and `GLOBAL CONTEXT` as one fixed responsive stack in that order. Its compact buttons use the same 176 px width as the left accordion and one consistent 50 px height, share the left stack's 52 px edge inset and measured top baseline across HUD variants, then constrain themselves against visible HUD/chrome rectangles and the remaining vertical corridor. `DISPLAY` is no longer draggable and legacy saved coordinates are ignored. - The right rail is labeled **DISPLAY** (formerly "MOVE") and groups, in order, HUD, DETECT, Bloom, Sharpen, 3D, Clean-UI (HUD + DETECT promoted to the top). Its expanded controls retain the same compact 176 px width as the right-side tabs instead of growing to the wider Context detail-card width. It starts expanded on first run and respects the user's later `v6` collapse choice. Collapses/expands with directional chevrons (`◀` collapsed, `▶` expanded). - Display and Context use matching 330 px expanded widths and matching compact tab dimensions. The parameter panel is part of Display's expanded content. DISPLAY may remain open beside one contextual panel; CCTV and Context are mutually exclusive. In Tactical HUD, expanding CCTV or Context hides the other contextual launcher while DISPLAY remains independently available. The most recently opened right-rail panel owns the constrained lane even when it appears later in DOM order; passive restoration and automatic disclosure do not replace that explicit owner. Minimal and other HUD layouts retain the collapsed launchers; when their active panel exceeds the measured corridor, the rail reserves sibling heights and gaps and scrolls the active panel internally. -- At 720px and below both panel stacks (`#left-panel-stack`, `#right-context-rail`) go edge-to-edge and scroll vertically. Every hosted panel's decorative `.panel-glow` is pinned to its panel box there (`inset: 0` in `src/ui/styles/responsive.css`): on desktop the glow overhangs the panel by 18–20 px as harmless paint, but inside a scroll container that overhang is scrollable overflow on both axes and drew a horizontal scrollbar band plus a vertical scrollbar that scrolled nothing but glow whenever CCTV, Context, Data Layers or Scenes was expanded. The glow's blur is ink overflow and never scrolls, so the look is unchanged. Do not fix this by clipping the stacks: `overflow-x: clip` would also clip the Context radio popover and would not remove the vertical scrollbar. Pinned by `src/ui/panelRails.test.mjs` against every `(max-width: 720px)` block in the flattened stylesheet. +- At 720px and below both panel stacks (`#left-panel-stack`, `#right-context-rail`) go edge-to-edge and scroll vertically. Every hosted panel's decorative `.panel-glow` is pinned to its panel box there (`inset: 0` in `src/ui/styles/responsive.css`): on desktop the glow overhangs the panel by 18–20 px as harmless paint, but inside a scroll container that overhang is scrollable overflow on both axes and drew a horizontal scrollbar band plus a vertical scrollbar that scrolled nothing but glow whenever CCTV, Context, Data Layers or Scenes was expanded. The glow's blur is ink overflow and never scrolls, so the look is unchanged. Do not fix this by clipping the stacks: `overflow-x: clip` would not remove the vertical scrollbar. Context draws no glow at all (`display: none`), so it is not part of that pin. Pinned by `src/ui/panelRails.test.mjs` against every `(max-width: 720px)` block in the flattened stylesheet. - `STYLE PRESETS` and `LOCATIONS` start collapsed, expand on intentional hover/click, and auto-collapse after hover leave delay. - Collapsed mini-status indicators show active style and active location/landmark. - Detection mode is user-controlled and should persist when switching styles. Since 2026-08-22 it also STARTS on — Dense @ 75% for every style on a first run, Normal included — as a `GLOBAL_POST_DEFAULTS` baseline that does NOT set `_detectionUserOverridden`. Exception (unchanged): selecting a military style (CRT/NVG/FLIR) auto-enables the same Dense preset, but only until the user manually changes detection this session (`_detectionUserOverridden` gate), after which style switches never touch it. @@ -5687,7 +5694,7 @@ apply to `public/` assets or built-preview serving. - **Cockpit left-panel clearance:** the Cockpit Contact card and peripheral HUD participate in the adaptive left accordion's live obstacle measurements, including live viewport-height changes. Expanding Layers or Scenes keeps the active panel in the available upper-left corridor with internal scrolling; it does not cover the Contact card, lower Cockpit controls, or Cesium credit line. Outside Cockpit the hidden card does not alter the normal corridor. - **Cockpit Context scope:** the 250 km radius applies to the air/sea proximity cohorts. Installation counts come only from the currently loaded viewport and are labeled `CURRENT VIEWPORT ONLY` in the cockpit as well as the normal Context panel; neither surface presents them as a complete 250 km installation survey. - **Cockpit camera anchor:** first-person mode does not write feed-boundary corrections directly into the camera. A cockpit-only inertial anchor advances from the selected aircraft's displayed course and speed, then converges toward the authoritative delayed track with correction capped below forward motion. The displayed kinematics are derived from the same consecutive fix segment as the rendered position, with raw feed speed/course used only as fallback; a transient zero/missing feed speed therefore cannot freeze a visibly moving aircraft after layer enable or a map/cockpit handoff. Rendered altitude continues to come from that interpolated track position. Late ADS-B fixes and short render stalls can remove drift without accelerating or reversing the view. Camera placement runs before scene update/culling at a bounded 20 Hz so a moving cockpit does not force Photoreal 3D Tiles to retraverse on every display frame; textual instruments update at 10 Hz and context/layout work at 4 Hz. Every far Cockpit contact pip shares one stable Cesium texture-atlas entry and skips unused screen-projected course calculations, while only in-range 2D aircraft silhouettes pay the screen-projected rotation cost; ambient glTF collections are hidden/retained rather than synchronously destroyed at cockpit entry, and context rails lay out only on explicit content/state changes and viewport resize. The deliberate 15/30-second layer interpolation delays and per-Cesium-frame position caches remain unchanged. -- **Cockpit route, vision, and view controls:** visible on-screen `COCKPIT`, `RESET`, and `EXIT COCKPIT` controls replace reliance on the `C` shortcut. RESET uses the same canonical globe route as the map and voice actions, exits Cockpit, and releases its camera ownership rather than exposing the hidden map-style top action. When the tracked commercial flight has a plausible ADSBDB route, the top of the right briefing rail shows a compact `FROM → TO` airport strip and the visor shows a centered estimated-destination chevron with its relative bearing; its destination label rounds to whole degrees in 000–359, wrapping rounded north to 000° while the chevron continues to use the relative bearing independently of label rounding; absent or implausible route data hides the strip and cue rather than guessing. The cockpit-local vision control is an interactive `PREV / CURRENT / NEXT` carousel over `NORMAL`, `CRT`, `NVG`, `FLIR`, `ANIME`, `NOIR`, and `SNOW`; its previous/next actions wrap, and activating the current value advances to the next style. Cockpit enters on the active map preset, so a Cyber FLIR map opens Cockpit on FLIR while Normal remains a distinct option instead of producing a second FLIR entry. Cockpit choices temporarily activate the existing Cesium post-process stages, while exiting Cockpit through either EXIT or RESET restores the pre-entry map style. The regional-news page uses a free Google News RSS locality query first, with the existing GDELT query retained only as a fail-soft fallback; linked headlines remain reporting, not verified incidents or risk intelligence. +- **Cockpit route, vision, and view controls:** visible on-screen `COCKPIT`, `RESET`, and `EXIT COCKPIT` controls replace reliance on the `C` shortcut. RESET uses the same canonical globe route as the map and voice actions, exits Cockpit, and releases its camera ownership rather than exposing the hidden map-style top action. When the tracked commercial flight has a plausible ADSBDB route, the top of the right briefing rail shows a compact `FROM → TO` airport strip and the visor shows a centered estimated-destination chevron with its relative bearing; its destination label rounds to whole degrees in 000–359, wrapping rounded north to 000° while the chevron continues to use the relative bearing independently of label rounding; absent or implausible route data hides the strip and cue rather than guessing. The cockpit-local vision control is an interactive `PREV / CURRENT / NEXT` carousel over `NORMAL`, `CRT`, `NVG`, `FLIR`, `ANIME`, and `NOIR`; its previous/next actions wrap, and activating the current value advances to the next style. Cockpit enters on the active map preset, so a Cyber FLIR map opens Cockpit on FLIR while Normal remains a distinct option instead of producing a second FLIR entry. Cockpit choices temporarily activate the existing Cesium post-process stages, while exiting Cockpit through either EXIT or RESET restores the pre-entry map style. The regional-news page uses a free Google News RSS locality query first, with the existing GDELT query retained only as a fail-soft fallback; linked headlines remain reporting, not verified incidents or risk intelligence. - Cockpit wind-direction labels wrap after rounding to whole degrees, so a direction of 359.5° displays as `N · 0°` rather than `N · 360°`. - **Cockpit missing observations:** missing local weather observations remain unknown rather than being converted to zero or clear skies, in the briefing and in the cloud effects; a missing temperature drops the whole local weather record, including its wind and condition. - **Cockpit weather status:** the earlier multi-canvas atmospheric compositor remains fail-closed and is not attached to the live viewer. Cockpit clouds are a separate transparent WebGL pass with a capped 520×320 framebuffer, 24 ray steps, three FBM octaves, and a 12 FPS ceiling. It defaults off and starts only when local storage explicitly contains the persisted `WX ON` opt-in (`'1'`). When opted in, observations refresh after five minutes or 25 km of aircraft movement, fail transparent when unavailable or clear, and stop on exit or disable. `WX OFF` governs atmospheric rendering only: the briefing still fetches source-backed Natural Earth region, headline, and Open-Meteo local-information data, aborting and replacing any in-flight request when the selected aircraft changes. No weather effect runs in map mode and no synthetic fallback is shown. diff --git a/docs/I18N.md b/docs/I18N.md index 9b5220917..105fd5fb3 100644 --- a/docs/I18N.md +++ b/docs/I18N.md @@ -35,7 +35,7 @@ A module the server, tools or other portable code also imports must not load the ``` -`data-i18n` replaces the element's text, so put it on the element that directly holds the text, never on a parent with child elements. `data-i18n-title`, `data-i18n-aria-label` and `data-i18n-placeholder` translate that attribute. Markup is translated once at boot, and switching language reloads the page. A module that holds work a reload would lose (an unsaved edit, an open session) registers it with `registerUnsavedWork(() => busy ? msg('unsaved 
') : null)` from `src/i18n/index.js`, and the language picker asks before reloading. +`data-i18n` replaces the element's text, so put it on the element that directly holds the text, never on a parent with child elements. `data-i18n-title`, `data-i18n-aria-label` and `data-i18n-placeholder` translate that attribute. `data-i18n-context="radio tag"` gives the element's text a context, the catalog entry `radio tag|All`, as `t('All', { context: 'radio tag' })` does in code. Markup is translated once at boot, and switching language reloads the page. A module that holds work a reload would lose (an unsaved edit, an open session) registers it with `registerUnsavedWork(() => busy ? msg('unsaved 
') : null)` from `src/i18n/index.js`, and the language picker asks before reloading. ## Rules diff --git a/docs/PERFORMANCE.md b/docs/PERFORMANCE.md index 65d0abae9..7bf6d3751 100644 --- a/docs/PERFORMANCE.md +++ b/docs/PERFORMANCE.md @@ -97,7 +97,8 @@ operational sample contained 3,909 observations and two selected labels, but its live aircraft and traffic rows were empty, so it remains a limited stress case. Snow, Noir, dense detection, and text-heavy combined layers are the clearest -controlled comparison points for later optimization work. +controlled comparison points for later optimization work. Snow has since been +retired as a visual preset; its row records the measurement as taken. ## Keyed live sources diff --git a/docs/SHARE-LINK-FORMAT.md b/docs/SHARE-LINK-FORMAT.md index cfb6d50fb..5728d1ec3 100644 --- a/docs/SHARE-LINK-FORMAT.md +++ b/docs/SHARE-LINK-FORMAT.md @@ -90,35 +90,35 @@ probability of about 255 in 256 (many of them already fail as base64url). ## Field registry (top level) -| # | State key | Type | Default | Encoding | -| --- | ---------------------------- | ----- | ----------- | ------------------------------------------------------- | -| 1 | `view.kind` | enum | see below | 0 place, 1 thing | -| 2 | `lat` | coord | 0 | zigzag of degrees × 10⁎ | -| 3 | `lon` | coord | 0 | zigzag of degrees × 10⁎ | -| 4 | `alt` | sint | 800 | whole metres | -| 5 | `heading` | angle | 0 | whole degrees, see angles | -| 6 | `pitch` | sint | −35 | whole degrees | -| 7 | `roll` | angle | 0 | whole degrees | -| 8 | `sharedAtMs` | epoch | none | zigzag seconds since 2026-01-01T00:00:00Z | -| 9 | booleans | flags | 0 | bit set when the value differs from default | -| 10 | `layerState.enabledLayerIds` | LEN | none | layer bitset, see layers | -| 11 | `layerState.options` | LEN | none | packed option triples, see layers | -| 12 | `panelState` | LEN | none | packed panel entries, see panels | -| 13 | thing | LEN | none | sub-message, see thing views | -| 14 | `style` | enum | `normal` | normal, retro, surveillance, thermal, anime, noir, snow | -| 15 | `mapStack` | enum | `photoreal` | photoreal, bing-aerial, bing-labels, esri-imagery, osm | -| 16 | `hudVariant` | enum | style | tactical, operator, minimal, cyber | -| 17 | `bloomIntensity` | uint | style | | -| 18 | `bloomVersion` | uint | 2 | | -| 19 | `sharpenIntensity` | uint | style | | -| 20 | `detectionMode` | enum | style | OFF, SPARSE, BALANCED, DENSE | -| 21 | `detectionDensity` | uint | style | one of 0, 25, 50, 75, 100 | -| 22 | `detectionAllocation` | enum | style | ELASTIC, WEIGHTED | -| 23 | `detectionFadePct` | uint | style | 0–40 | -| 24 | `detectionOutsideOpacityPct` | uint | style | 0–100 | -| 25 | `scopeFeatherPct` | uint | 100 | 0–200 | -| 26 | `scopeTerminusPct` | uint | none | 94–100; absent is the adaptive terminus | -| 27 | `styleParams` | LEN | style | packed `(token, value × 100)` pairs | +| # | State key | Type | Default | Encoding | +| --- | ---------------------------- | ----- | ----------- | ----------------------------------------------------------------- | +| 1 | `view.kind` | enum | see below | 0 place, 1 thing | +| 2 | `lat` | coord | 0 | zigzag of degrees × 10⁎ | +| 3 | `lon` | coord | 0 | zigzag of degrees × 10⁎ | +| 4 | `alt` | sint | 800 | whole metres | +| 5 | `heading` | angle | 0 | whole degrees, see angles | +| 6 | `pitch` | sint | −35 | whole degrees | +| 7 | `roll` | angle | 0 | whole degrees | +| 8 | `sharedAtMs` | epoch | none | zigzag seconds since 2026-01-01T00:00:00Z | +| 9 | booleans | flags | 0 | bit set when the value differs from default | +| 10 | `layerState.enabledLayerIds` | LEN | none | layer bitset, see layers | +| 11 | `layerState.options` | LEN | none | packed option triples, see layers | +| 12 | `panelState` | LEN | none | packed panel entries, see panels | +| 13 | thing | LEN | none | sub-message, see thing views | +| 14 | `style` | enum | `normal` | normal, retro, surveillance, thermal, anime, noir, snow (retired) | +| 15 | `mapStack` | enum | `photoreal` | photoreal, bing-aerial, bing-labels, esri-imagery, osm | +| 16 | `hudVariant` | enum | style | tactical, operator (retired), minimal, cyber | +| 17 | `bloomIntensity` | uint | style | | +| 18 | `bloomVersion` | uint | 2 | | +| 19 | `sharpenIntensity` | uint | style | | +| 20 | `detectionMode` | enum | style | OFF, SPARSE, BALANCED, DENSE | +| 21 | `detectionDensity` | uint | style | one of 0, 25, 50, 75, 100 | +| 22 | `detectionAllocation` | enum | style | ELASTIC, WEIGHTED | +| 23 | `detectionFadePct` | uint | style | 0–40 | +| 24 | `detectionOutsideOpacityPct` | uint | style | 0–100 | +| 25 | `scopeFeatherPct` | uint | 100 | 0–200 | +| 26 | `scopeTerminusPct` | uint | none | 94–100; absent is the adaptive terminus | +| 27 | `styleParams` | LEN | style | packed `(token, value × 100)` pairs | Field 1 absent means `thing` when field 13 is present and `place` otherwise, so v1 never writes it; a later view kind writes its code. @@ -129,6 +129,9 @@ table learns its code. A new style's settings are encoded against its own defaults, while a decoder that does not know the style uses Normal's; adding a style also extends the pinned style-defaults table. +`hudVariant` code 1 (`operator`) is retired: the app no longer offers that +layout and restores it as `tactical`. The code stays reserved. + Flag bits (field 9): 0 `bloom`, 1 `sharpen`, 2 `hudVisible`, 3 `celestialRing` (each defaulting by style), 4 `scopeEnabled` (default on). @@ -163,7 +166,7 @@ for it.) In v1: | thermal | sensitivity 0.85, bloom 0.2, mode 0.33, pixelation 1, palette 0 | | anime | saturation 1, edgeThick 0.5 | | noir | contrastAmt 1.2, grainAmt 0.5, vignetteAmt 0.5 | -| snow | density 0.6, wind 0.5 | +| snow | retired: decodes as normal; its parameters are dropped | These are frozen like every other default: the codec reads them from the app's tables today, and a test pins them, so if a table moves the old values @@ -342,7 +345,9 @@ the app that can open it. values in the codec (see Style defaults). The same applies to `SHARE_VIEW_LAYER_OPTION_ABSENT` and the panel defaults. 4. **Codes are append-only.** Enum lists, entity kinds, flag bits, panel - numbers and style parameter tokens only grow. + numbers and style parameter tokens only grow. A style the app no longer + offers keeps its code: `snow` (6) is retired, so a link that names it + opens as Normal and the parameters written for it are dropped. 5. **Add, don't change.** A new setting takes the next free field number (28 onwards; fields 1–15 have one-byte tags and are all taken). A new boolean takes the next flag bit instead, which costs nothing when it is at diff --git a/docs/TOOLS.md b/docs/TOOLS.md index 45ee62546..80fd80b13 100644 --- a/docs/TOOLS.md +++ b/docs/TOOLS.md @@ -92,7 +92,8 @@ pitch), data layers, visual style, map imagery, and an aircraft, military aircraft or satellite to follow. `createView` builds and bounds one, `viewToParams` and `viewFromParams` write and read it in the share-link format the app restores, and `viewUrl` gives the address that opens it. The -style names are the ones share links use. Ships cannot be followed from a +style names are the ones share links use; a retired style (`snow`) is read +as `normal`. Ships cannot be followed from a link yet. An aircraft's `follow` may ask for its cockpit view (`cockpit: true`); links cannot carry that and open the app following it. diff --git a/docs/TRANSLATORS.md b/docs/TRANSLATORS.md index 1992e6fdf..f862d8e4c 100644 --- a/docs/TRANSLATORS.md +++ b/docs/TRANSLATORS.md @@ -1,6 +1,6 @@ # Translating God's Eye View -Shipped languages: **English** (source and fallback), **Spanish** (`es`), **Russian** (`ru`), **Ukrainian** (`uk`), **Simplified Chinese** (`zh-CN`) and **Traditional Chinese** (`zh-Hant`). +Shipped languages: **English** (source and fallback), **German** (`de`), **Spanish** (`es`), **French** (`fr`), **Italian** (`it`), **Japanese** (`ja`), **Brazilian Portuguese** (`pt`), **Russian** (`ru`), **Ukrainian** (`uk`), **Simplified Chinese** (`zh-CN`) and **Traditional Chinese** (`zh-Hant`). ## How it works @@ -63,4 +63,4 @@ These are contracts, not copy: layer ids and registry keys, status enums and oth ## Language notes -Each language keeps its glossary, plural forms, units and style in its own file, `docs/translations/.md`: [Spanish](./translations/es.md), [Russian](./translations/ru.md), [Ukrainian](./translations/uk.md), [Simplified Chinese](./translations/zh-CN.md), [Traditional Chinese](./translations/zh-Hant.md). Read it before translating, and add a term there when you settle on one. +Each language keeps its glossary, plural forms, units and style in its own file, `docs/translations/.md`: [German](./translations/de.md), [Spanish](./translations/es.md), [French](./translations/fr.md), [Italian](./translations/it.md), [Japanese](./translations/ja.md), [Brazilian Portuguese](./translations/pt.md), [Russian](./translations/ru.md), [Ukrainian](./translations/uk.md), [Simplified Chinese](./translations/zh-CN.md), [Traditional Chinese](./translations/zh-Hant.md). Read it before translating, and add a term there when you settle on one. diff --git a/docs/translations/de.md b/docs/translations/de.md new file mode 100644 index 000000000..86032a238 --- /dev/null +++ b/docs/translations/de.md @@ -0,0 +1,108 @@ +# German (`de`) + +Catalog: `src/i18n/locales/de.json`. General rules: [TRANSLATORS.md](../TRANSLATORS.md). + +Translation source: abiyeenzo (#908). + +## Style + +- Standard German that reads naturally in Germany, Austria and Switzerland; ß where it belongs (Straße, schließen), no Swiss ss. +- No direct address: neither «Sie» nor «du». Actions and hints use the neutral infinitive: «Erneut versuchen», «Kamera anklicken zum Aktivieren», «Zuerst eine Aufnahme wĂ€hlen», «Mikrofonzugriff erlauben und erneut versuchen». "Your" becomes the article or «eigene»: «Eigener RTL-SDR-EmpfĂ€nger», «Die IP-Adresse ist fĂŒr diesen Sender sichtbar». +- Nouns are capitalized, as German requires; otherwise sentence case, not Title Case: "Live Flights" → «Live-FlĂŒge», "Provider Settings" → «Anbieter-Einstellungen». UPPERCASE English stays UPPERCASE: «LIVE-DATEN AUS», «KEINE ENTWARNUNG». In UPPERCASE, ß is written SS: «SCHLIESSEN», «STRASSENEBENE». +- Compounds are written as one word or with a hyphen next to a name, code or English term: «Datenebene», «Wetterkacheln», «TomTom-SchlĂŒssel», «AIS-Schiffe», «Street-View-Fallback». Do not split them with spaces. +- Short labels, chips and HUD readouts stay short. German runs about a third longer than English, so prefer a short word or a standard abbreviation with a period over a wrapped line: REICHW., GESCHW., NIEDERSCHL., SONST., NACHR., VERST., VGL., KAL., KOMM. (a bare «KOMM» reads as the imperative) +- The avionics codes HDG, BRG, CRS, DEST, SPD, ALT, GS, TRK, V/S, FOV and SQUAWK stay in English, as in the cockpit. Words used in a sentence are translated: heading → «Kurs», bearing → «Peilung», range → «Reichweite». +- A dash between clauses is a spaced en dash « – »; a colon is fine where it explains: «Feed ausgefallen – neue Versuche in grĂ¶ĂŸeren AbstĂ€nden», «SIMULIERT: Verkehrsdienst nicht erreichbar». Quotes are „
“. +- Status and waiting messages use the neutral infinitive too: «Warten auf Aktualisierung», not «Warte auf  ». Reasons inserted after a dash stay lower case: «Szene nicht gespeichert – das Projekt ist grĂ¶ĂŸer als 5 MiB». +- A layer named in a sentence takes its panel name in quotes: «Die Ebene „Live-FlĂŒge“ ist nicht aktiviert», «die Ebene „Live-FlĂŒge“ lĂ€dt Daten fĂŒr den jeweiligen Bildausschnitt». +- Rolling time windows say their length, so they cannot read as the previous calendar period: LAST YEAR → «LETZTE 12 MONATE», LAST MONTH → «LETZTE 30 TAGE». +- Keyboard keys are named as on German keyboards where they differ: Leertaste, RĂŒcktaste, Umschalt; Esc, Enter, Tab and letter keys stay. +- Decimal comma in fixed text: «M4,4», «28,2710° N». Thousands separator is a period: «1.000 km». Formatted numbers come from `Intl` and are already German. +- Units: km, m, km/h, m/s, kn (knots, also in the cockpit), ft (feet), hPa, MW, h, min, s, T (days, in short readouts); in UPPERCASE text KM, KM/H, KN, FT, MIN, H, T («VOR {count} H»). A space between number and unit, in compact readouts too: «{value} m», «{count} min», «50 %», «{speed} KN», «{count} / 30 T». `°` sticks to the number. +- "ago" goes before the time: «vor {count} min», «vor {value}». When a placeholder already holds a localized "ago" text (`{age}` in `STALE · cached {age}`, `{ago}`), do not add «vor» again. +- Compass points use O for Ost: N, NNO, NO, ONO, O, OSO, SO, SSO, S, SSW, SW, WSW, W, WNW, NW, NNW; hemisphere letters N, S, O, W. +- Routing: direction words are lowercase adverbs (links, leicht rechts, scharf links, geradeaus), so a sentence never starts with one: «Auf {road} {direction} abbiegen», «Hier {direction} abbiegen», «Weiter {direction}». «Hier», not «Dann»: the step card already says «dann {leg}» and «NĂ€chster Schritt:  ». At a fork the verb is «weiter», which also works with «geradeaus»: «An der Gabelung {direction} weiter». Roundabout exits are ordinals with a period: «die {exit} Ausfahrt» → «die 2. Ausfahrt». A lane is named by where it leads, not by its position: «Die geradeaus fĂŒhrende Spur benutzen», «die leicht nach links fĂŒhrende», «die scharf nach rechts fĂŒhrende» (not «halblinke» or «Àußerst linke»). + +## Plurals + +A `tn()` entry needs two forms. `Intl.PluralRules('de')` picks: + +| Form | Counts | Example | +| ------- | --------------------------- | --------- | +| `one` | 1 | 1 Kamera | +| `other` | everything else: 0, 2, 1,5
 | 3 Kameras | + +Keep the verb in agreement: «{count} Station meldet» / «{count} Stationen melden». Abbreviated units and codes do not change: «{count} NACHR.», «{count} EMPFANGEN». + +## Glossary + +| English | Deutsch | +| ---------------------------------------------- | ---------------------------------------------------------------------- | +| layer / data layer | Ebene / Datenebene | +| feed / source / data source / input (cockpit) | Feed / Quelle / Datenquelle / Quelle | +| LIVE (status) / live data | LIVE / Live-Daten | +| SIMULATED | SIMULIERT | +| stale / degraded / unavailable | veraltet / eingeschrĂ€nkt / nicht verfĂŒgbar | +| retry / retrying / retrying slowly | neuer Versuch / erneut versuchen / neue Versuche in grĂ¶ĂŸeren AbstĂ€nden | +| fallback | Fallback | +| key (API key) / POWER UP / POWERED UP | SchlĂŒssel / STARTKLAR / HOCHGEFAHREN | +| Provider Settings | Anbieter-Einstellungen | +| ON / OFF (state chips) | EIN / AUS | +| enable / disable | aktivieren / deaktivieren | +| globe / map / map source / map stack / basemap | Globus / Karte / Kartenquelle / Kartenstapel / Basiskarte | +| aircraft / flight / military flights | Luftfahrzeug (HUD and short labels: Flugzeug) / Flug / MilitĂ€rflĂŒge | +| vessel, ship | Schiff | +| satellite / shell (Starlink) / DENSE | Satellit / Schale / DICHT | +| launch (rocket) / launch site / space mission | Start / Startplatz / Raummission | +| ascent / replay / payload / stage / downrange | Aufstieg / Replay, Wiedergabe / Nutzlast / Stufe / Downrange | +| contact / tracking | Kontakt / Verfolgung | +| installation / site | Anlage / Standort | +| mapped / observed | kartiert / beobachtet (Bhote chip OBSERVED IMAGERY: REALE BILDDATEN) | +| camera / CCTV camera / camera badge | Kamera / CCTV-Kamera / Kamera-Markierung | +| earthquake / active fire / fire perimeter | Erdbeben / aktiver Brand / Brandgrenze | +| cyclone / advisory (NHC/CPHC) / cone | Wirbelsturm / Lagebericht (not «Warnung») / Kegel | +| issued (advisory, forecast) | ausgegeben | +| radio station | Sender | +| broadcast FM | UKW | +| road / flow (traffic) / flow coverage | Straße / Verkehrsfluss / Live-Abdeckung | +| transit / bike share | ÖPNV / Bikesharing | +| scene / shot / scene recipe | Szene / Aufnahme / Szenenrezept | +| capture shot / camera move | Aufnahme speichern / Kameraflug | +| anchor / data pack / bundle | Anker / Datenpaket / Bundle | +| story beat / evidence beat | Story-Schritt / Beweisschritt | +| briefing / panel / dock | Briefing / Bereich / Dock | +| cockpit | Cockpit | +| preset / visual preset | Preset / visuelles Preset | +| Scope (circular viewport mask) / keyhole | Scope / SchlĂŒsselloch | +| feather / fade | Weichzeichnung / Ausblenden | +| overlay / detection overlay | Overlay / Erkennungs-Overlay | +| Clean UI | Reine Ansicht | +| Night vision / Thermal / Snow (cockpit styles) | Nachtsicht / WĂ€rmebild / Schnee | +| heading / altitude / ground speed | Kurs / Höhe / Geschwindigkeit ĂŒber Grund (short: GESCHW. ÜBER GRUND) | +| HDG / BRG / CRS / DEST / SPD / FOV | unchanged | +| RANGE / PITCH / HGT (CCTV calibration chips) | REICHW. / NEIGUNG / HÖHE | +| PREV / NEXT | ZURÜCK / WEITER | +| RESUME (radio transport button) | FORTSETZEN (not «WEITER», which is NEXT in the same row) | +| nearest (spatial) | nĂ€chstgelegen (always; «nĂ€chste» is NEXT) | +| expand / collapse (sections) | ausklappen / einklappen | +| L / R (relative bearing) | L / R | +| SIG / NEWS / LOCAL (briefing tabs) | SIG / NEWS / LOKAL | +| NOT AN ALL-CLEAR | KEINE ENTWARNUNG | +| Street Level / Street View (Google) | Straßenebene / Street View | +| Recent Imagery / box / pin (a day) | Aktuelle Bilddaten / Bereich / fixieren | +| frame (bring into view) | ins Bild nehmen | +| mark (map annotation) / outline | Markierung / Umriss | +| voice (control) / voice session | Sprachsteuerung / Sprachsitzung | +| YOU / THIS / HERE (voice card labels) | EINGABE / DIES / HIER | +| click / click to 
 | anklicken / 
 klicken | +| tap (touch) | Antippen (not «Tipp», which is a hint) | +| press / tap a key | Taste drĂŒcken / kurz drĂŒcken (never «tippen» for keys) | +| tilted view | SchrĂ€gansicht | +| card (host card) / voice card | Eintrag (in hints), Infokarte / Sprachkarte | +| label (on the map) / clear (switch off layers) | Beschriftung / ausschalten (not «löschen») | +| station tag (radio filter) | Kategorie | +| DIRECTORY BAND / {category} BAND (radio dial) | SENDERSKALA / SENDERSKALA · {category} (not «-BAND»: «ROCK-BAND») | +| MIC (dock button) | MIKRO | +| frame (weather, video) / image | Frame / Bild | +| collapse / landslide (Bhote Koshi) | Erdrutsch (not «Abbruch», which reads as "cancel") | +| website (radio station) | Website (SENDER-WEBSITE; «Standort» is a physical site) | diff --git a/docs/translations/fr.md b/docs/translations/fr.md new file mode 100644 index 000000000..e2f506988 --- /dev/null +++ b/docs/translations/fr.md @@ -0,0 +1,105 @@ +# French (`fr`) + +Catalog: `src/i18n/locales/fr.json`. General rules: [TRANSLATORS.md](../TRANSLATORS.md). + +Translation source: abiyeenzo (#907); the French part of meirm's #312 was used for comparison. + +## Style + +- Standard French that reads naturally in France, Belgium, Switzerland and Canada; avoid regionalisms. +- Address the user with "vous" imperatives: « Cliquez », « Activez », « RĂ©essayez ». Tooltips that name an action use the infinitive: « RĂ©duire le panneau », « RĂ©initialiser la camĂ©ra ». UPPERCASE HUD instructions also use the infinitive: « CLIQUER SUR UNE CAMÉRA POUR L'ACTIVER ». +- Sentence case, not Title Case: "Live Flights" → « Vols en direct ». UPPERCASE English stays UPPERCASE, accents included: « ÉTAT », « PRÉC. ». +- Typography: a narrow no-break space (U+202F) goes before `:` `;` `?` `!` and `%`, and inside « » quotes: `Supprimer le plan « {shot} » ?`. It keeps the sign on the same line as the word before it. Do not type a plain space there. The same narrow no-break space separates thousands in a number written into the text: « 1 000 km ». Ellipsis is `
`, not `...`. Dashes keep their spaces: « flux indisponible — rĂ©essayez ». +- Short labels, chips and HUD readouts stay short. A standard abbreviation with a period beats a wrapped line: PRÉC., SUIV., RÉINIT., ENREG., INDISP., DIST. +- The HUD codes HDG, BRG, CRS, FOV, DEST, SPD and ALT stay in English everywhere, as in cockpit avionics. Words are translated: RANGE → « PORTÉE », heading in a sentence → « cap », ground-track course → « route » (« ROUTE 270° »). +- ON and OFF stay as they are on HUD toggles and chips (« CCTV ON », « PROJECTION OFF »); in a sentence use « activĂ© » / « dĂ©sactivĂ© ». +- Keyboard keys stay in English: Space, Esc, Enter, Tab, Shift, Backspace, H, 1–9 (« Maintenez Space pour parler », « ESC pour fermer »). +- Units: km, m, km/h, m/s, nd (knots), ft (feet), h, min, s, with a space before the unit: « 250 km », « il y a 5 min »; in UPPERCASE text KM, KM/S, ND, FT, MIN. MW, dBZ, hPa and `°` stay. Decimal comma in fixed numbers: « 28,2710° N », « M4,4 ». Money: « 12 k$ », « 3 M$ », « 2 Md$ ». +- "ago" goes before the time: « il y a {count} min ». When a placeholder already holds a localized "ago" text (`{age}`, `{ago}`), do not add « il y a » again. +- Round-about exit ordinals: 1re, 2e, 3e
 (« prenez la 1re sortie »). + +## Plurals + +A `tn()` entry needs three forms. `Intl.PluralRules('fr')` picks: + +| Form | Counts | Example | +| ------- | -------------------------------------- | -------------------- | +| `one` | 0 and 1, fractions below 2 (1,5) | 1 camĂ©ra, 0 camĂ©ra | +| `many` | 1 000 000, 2 000 000
 (exact millions) | 1 000 000 de camĂ©ras | +| `other` | everything else: 2–999 999, 2,5
 | 3 camĂ©ras | + +The `many` form is the `other` text with « de » (« d' » before a vowel) after the number: « {count} de couches effacĂ©es », « {count} D'ENTRÉES INCONNUES ». When the words after the number cannot agree (an UPPERCASE readout, a list), put the number after a colon in every form: « CAPTÉS : {count} ». The same goes for a layer name whose gender and number vary: « Couche activĂ©e : {label} », not « {label} activĂ© », or a tool name: « Outil actif : {name} », not « {name} est actif ». + +## Glossary + +| English | Français | +| ------------------------------------------------------------ | ----------------------------------------------------------------------- | +| layer / data layer / DATA LAYERS (panel title) | couche / couche de donnĂ©es / COUCHES | +| feed / source / data source | flux / source / source de donnĂ©es | +| LIVE (status) / live data | DIRECT / donnĂ©es en direct | +| SIMULATED | SIMULÉ | +| stale / degraded / unavailable | obsolĂšte / dĂ©gradĂ© / indisponible | +| retry / retrying (status: RETRYING X) | nouvel essai / rĂ©essayez (NOUVEL ESSAI : X) | +| rate-limited | limite de requĂȘtes atteinte | +| key (API key) / POWER UP / POWERED UP | clĂ© (clĂ© API) / ALLUMER / ALLUMÉ | +| Provider Settings | paramĂštres des fournisseurs | +| enable / disable | activer / dĂ©sactiver | +| globe / map / map source / basemap / map stack | globe / carte / source de carte / fond de carte / fond de carte | +| tile (map) | tuile | +| aircraft / flight / military flights | aĂ©ronef (avion in short copy) / vol / vols militaires | +| vessel, ship / tanker (AIS type) | navire / navire-citerne | +| satellite / shell (Starlink) / DENSE | satellite / couche de la constellation / DENSE | +| launch / launch site / space mission | lancement / site de lancement / mission spatiale | +| ascent / replay / payload / stage / downrange | ascension / rejeu / charge utile / Ă©tage / distance au sol (DIST. SOL) | +| contact / tracking / track (HUD) | contact / suivi / piste | +| brackets (HUD corner brackets around contacts) | cadres de ciblage | +| installation / site | installation / site | +| mapped / observed | cartographiĂ© / observĂ© | +| camera / CCTV camera / ALPR camera | camĂ©ra / camĂ©ra CCTV / camĂ©ra LAPI | +| earthquake | sĂ©isme | +| active fire (FIRMS detection) / wildfire | feu actif / incendie | +| contained / containment (wildfire) | circonscrit / part circonscrite (not « maĂźtrisĂ© », which is controlled) | +| advisory (NHC/CPHC cyclone) | bulletin | +| forecast / lead hours / valid / issued | prĂ©vision / Ă©chĂ©ances / valide / Ă©mise | +| AQHI (Canada) | CQAS (cote air santĂ©) | +| radio station / tune | station / rĂ©gler | +| bikeshare / transit | vĂ©los partagĂ©s / transports en commun | +| route (directions) / turn (maneuver) | itinĂ©raire / manƓuvre | +| scene / shot / scene recipe | scĂšne / plan / recette de scĂšne | +| bundle / data pack / anchor | archive / paquet de donnĂ©es / ancre | +| import / export (noun: file, scene, project) | importation / exportation (not « import » / « export ») | +| capture camera as anchor / set move start (scene editor) | ancre Ă  la position de la camĂ©ra / vue actuelle comme dĂ©part | +| story beat | Ă©tape du rĂ©cit | +| briefing / panel / dock | briefing / panneau / dock | +| cockpit | cockpit | +| preset / visual preset | prĂ©rĂ©glage / prĂ©rĂ©glage visuel | +| Scope (circular viewport mask) / keyhole | lunette / ouverture | +| detection overlay | surcouche de dĂ©tection | +| Clean UI | vue Ă©purĂ©e | +| Street Level (layer) / Street View (Google) | Niveau rue / Street View | +| Recent Imagery / box | imagerie rĂ©cente / zone | +| Daily overview / overview (Recent Imagery VIIRS product) | vue quotidienne (one name for the product, not « vue d'ensemble ») | +| pin (Draw tool) / pin (Recent Imagery) | Ă©pingle / Ă©pingler | +| Cyber (HUD layout, effect) | Cyber | +| heading / course (ground track) / altitude / ground speed | cap / route / altitude / vitesse sol | +| HDG / BRG / CRS / FOV / DEST / SPD / ALT | unchanged | +| RANGE / PITCH / HGT (CCTV calibration chips) | PORTÉE / INCL. / HAUT. | +| PREV / PREVIOUS / NEXT (chips) | PRÉC. / PRÉC. / SUIV. | +| Previous / Next (button text) | PrĂ©cĂ©dent / Suivant | +| L / R (relative bearing) | G / D | +| SIG / NEWS / LOCAL (briefing tabs) | SIG / ACTUS / LOCAL | +| compass points (N, NNE, 
, W, NW) | N, NNE, 
, O, NO | +| NOT AN ALL-CLEAR | PAS UN FEU VERT | +| AI agent | agent IA | +| share (a view or link) | partager | +| click / click to 
 | cliquez / cliquer pour 
 | +| map heading (compass, north-up control) | orientation (de la carte) | +| subject (cockpit / shared contact) | cible | +| cloud cover / CLOUD (briefing readout) | nĂ©bulositĂ© / NÉBULOSITÉ | +| LEVEL (cockpit horizon guide) | HORIZON | +| CALIBRATED / CURATED / RAW PRIOR (CCTV pose) | CALIBRÉE / VÉRIFIÉE / ESTIM. INITIALE | +| DATASHEET / SPEC FOV (CCTV lens range) | FICHE TECHNIQUE / FOV CONSTRUCTEUR | +| PORT TENDER (AIS type) | SERVITUDE PORT. (navire de servitude portuaire) | +| ChatGPT sign-in (action) / opening sign-in / sign-in expired | connexion / page de connexion / la session a expirĂ© | +| authored shot (scene) | plan scĂ©narisĂ© | +| report / record (USGS event card) / readout, reading | rapport / relevĂ© (a measured value only) | diff --git a/docs/translations/it.md b/docs/translations/it.md new file mode 100644 index 000000000..722916101 --- /dev/null +++ b/docs/translations/it.md @@ -0,0 +1,108 @@ +# Italian (`it`) + +Catalog: `src/i18n/locales/it.json`. General rules: [TRANSLATORS.md](../TRANSLATORS.md). + +Translation source: abiyeenzo (#912). + +## Style + +- Standard Italian as in Italian software UIs. Address the user with informal "tu" imperatives: «Aggiungi», «Attiva», «Scegli», «Incolla», «Riprova». Tooltips that name an action use the same imperative: «Espandi il pannello», «Ripristina la camera». +- Sentence case, not Title Case: "Live Flights" → «Voli live», "Space Missions" → «Missioni spaziali». UPPERCASE English stays UPPERCASE: «LIVE», «NON DISPONIBILE». +- Quotes inside Italian text are straight double quotes: «Eliminare lo scatto "{shot}"?». Use the accented capitals (È, À) in UPPERCASE text: «VELOCITÀ», «CITTÀ». +- Errors read as a statement, not a past participle on its own: "Search failed" → «Ricerca non riuscita»; "Could not 
" → «Impossibile  ». A dash that joins a cause and a hint becomes a colon: «Chiave API rifiutata: controlla AISSTREAM_API_KEY». The same goes for a label and its hint in a tooltip: «Direzione (bussola °): clic per digitare». +- Short labels, chips and HUD readouts stay short. A standard abbreviation with a period beats a wrapped line: REGOLAZ., RILEV., INCL., ALT., VEL., STIM., PROIEZ., ESP.; PREC / SUCC for PREV / NEXT and PREVIOUS / NEXT. +- The HUD codes HDG, BRG, CRS, FOV and DEST stay in English, as in cockpit avionics. RANGE is «PORTATA». Words used in a sentence are translated: heading → «prua» (aircraft, ships) or «direzione» (camera, buses, trams, trains), course → «rotta». +- Keyboard keys stay in English: Space, Enter, Esc, Tab, Shift, Backspace, H, 1–9 («Tieni premuto Space per parlare», «Premi Enter per riprovare»). +- Decimal comma in numbers written in the text, magnitudes included: «28,2710° N», «M5,2». Numbers formatted by the code follow `Intl` and need nothing. +- Amounts: thousands, millions and billions are written out or abbreviated in Italian, not with K/M/B: «{amount} mila $», «{amount} mln $», «{amount} mld $». +- Units: km, m, km/h, m/s, kn (knots), ft (feet), h, min, s; in UPPERCASE text KM, KM/S, KT, FT, MIN, H. "m" is always metres, so minutes are «min» («5 min fa»). MW stays MW. `°` and `%` stay. +- "ago" goes after the time: «{count} min fa». When a placeholder already holds a localized "ago" text (`{age}`, `{ago}`), do not add «fa» again. +- A feature name used as a sentence subject gets a head noun so the verb agrees: «La modalitĂ  Missioni spaziali isola », «Il pannello Impostazioni provider Ăš disattivato », «Il livello {layer} Ăš attivo », «Lo strumento {name} Ăš attivo ». A short card title with a placeholder name puts the state after a colon: «{label}: attivato». The same goes for a placeholder list of names: «Attivazione recente: {layers}». A count in a plain `t()` entry (no plural forms) that can be 1 goes after a label, so nothing has to agree with it: «Record accettati: {accepted} su {raw}». +- English loanwords that Italian UIs use as they are stay in English: feed, live, cockpit, briefing, preset, overlay, layout, snapshot, tile, provider, timeout, payload, bloom, scope. + +## Plurals + +A `tn()` entry needs three forms. `Intl.PluralRules('it')` picks: + +| Form | Counts | Example | +| ------- | -------------------------------------- | ----------------------- | +| `one` | 1 | 1 telecamera | +| `many` | 1 000 000, 2 000 000
 (exact millions) | 1 000 000 di telecamere | +| `other` | everything else: 0, 2–999 999, 1,5
 | 3 telecamere | + +The `many` form is the `other` text with «di» after the number when a noun follows: «{count} di telecamere caricate», «{count} DI CHIAVI IN ATTESA». When no noun follows the number («{count} vicine», «{count} RICEVUTI»), `many` repeats `other`. Nouns that do not change in the plural keep one form for all three (`{count} file`, `{count} data center`), with «di» in `many`. + +## Glossary + +| English | Italiano | +| --------------------------------------------- | ------------------------------------------------------------ | +| layer / data layer | livello / livello dati | +| feed / source / data source | feed / fonte / fonte dati | +| LIVE (status) / live data / live (feed state) | LIVE / dati live / live | +| SIMULATED | SIMULATO | +| stale / degraded / unavailable | obsoleto / degradato / non disponibile | +| retry / retrying | riprova / nuovo tentativo | +| rate limited | limite di richieste (raggiunto) | +| key (API key) / POWER UP / POWERED UP | chiave / ACCENDI / ACCESO | +| Provider Settings | Impostazioni provider | +| ON / OFF (state chips) | ON / OFF | +| enable / disable | attivare / disattivare | +| globe / map / map source / map stack | globo / mappa / fonte mappa / stack mappa | +| basemap / box (Recent Imagery area) | mappa di base / riquadro | +| aircraft, plane / flight / military flights | aereo / volo / voli militari | +| vessel, ship | nave | +| satellite / shell (Starlink) / DENSE | satellite / shell / DENSO | +| SPARSE / BALANCED / DENSE (detection modes) | RADO / BILANCIATO / DENSO (agree with «overlay») | +| broadband (Starlink shell) | a banda larga | +| VISUAL (CelesTrak group) | VISIBILI | +| launch (rocket) / launch site / space mission | lancio / sito di lancio / missione spaziale | +| ascent / replay / payload / stage | salita / replay / payload / stadio | +| contact / tracking | contatto / tracciamento | +| installation / site | installazione / sito | +| mapped / observed | mappato / osservato | +| camera (view) / camera, CCTV camera | camera / telecamera, telecamera CCTV | +| earthquake / active fire / fire perimeter | terremoto / incendio attivo / perimetro dell'incendio | +| lightning strike / cloud (cover, %) | fulmine / nuvole («non singoli fulmini», «20% di nuvole») | +| incident (wildfire, Type N) / scene incident | evento (Evento di tipo N, Incendio senza nome) / evento | +| trigger record (USGS card) / OPEN SOURCE link | scheda / APRI LA FONTE | +| advisory (NHC/CPHC cyclone) / cone | bollettino / cono di incertezza | +| forecast lead hours (cyclone points) | scadenze di previsione in ore | +| AIR / SEA (radio category) / ground station | ARIA / MARE / stazione di terra | +| radio station / broadcaster | stazione radio / emittente | +| CH (radio channel readout) | CH (unchanged) | +| road / flow (traffic) | strada / flusso | +| transit / bike share | trasporto pubblico / bike sharing | +| last report (vehicle position) | ultima segnalazione | +| scene / shot / scene recipe | scena / scatto / ricetta della scena | +| anchor / data pack / bundle (scene) | ancora / pacchetto dati / pacchetto | +| story beat | tappa del racconto | +| briefing / panel / dock | briefing / pannello / dock | +| cockpit | cockpit | +| preset / visual preset | preset / preset visivo | +| Tactical / Minimal / Cyber | Tattico / Minimale / Cyber | +| Scope (circular viewport mask) / keyhole | scope / foro | +| feather / fade | sfumatura / dissolvenza | +| detection overlay | overlay di rilevamento | +| pin (Draw tool) / mark | segnaposto / segno | +| pin (Recent Imagery) | fissare | +| Draw / Directions (tools) | Disegno / Indicazioni | +| Street Level (layer) / Street View (Google) | Vista stradale / Street View | +| Recent Imagery | Immagini recenti | +| Global Context / Context (panel) | Contesto globale / Contesto | +| heading, course / altitude / ground speed | prua, rotta / altitudine / velocitĂ  al suolo (VEL. AL SUOLO) | +| altitude in short HUD captions / Alt unknown | QUOTA (QUOTA · FT) / Quota sconosciuta | +| fallback (FALLBACK, Street View fallback) | riserva / di riserva (SUPERFICIE DI RISERVA) | +| forecast track / advisory center (cyclones) | traccia prevista / centro del ciclone da bollettino | +| witness source / authored (scene) | fonte testimoniale / predefinito, definito dall'autore | +| explore manually | esplora manualmente | +| HDG / BRG / CRS / FOV / DEST | HDG / BRG / CRS / FOV / DEST (unchanged) | +| RANGE / PITCH / HGT (CCTV calibration) | PORTATA / INCL. / ALT. | +| PREV / NEXT | PREC / SUCC | +| Previous / Next (button text) | Precedente / Successivo | +| Focus {target} (action, aria label) | Inquadra {target} (the FOCUS button stays FOCUS) | +| L / R (relative bearing) | S / D | +| SIG / NEWS / LOCAL (briefing tabs) | SIG / NOTIZIE / LOCALE | +| compass points (N, NNE, 
, W, NW) | N, NNE, 
, O, NO (west is «O», ovest) | +| NOT AN ALL-CLEAR | NON È UN VIA LIBERA | +| weather field / model / valid / issued | campo / modello / valida / emessa | +| click / click to 
 | fai clic / clic per 
 | diff --git a/docs/translations/ja.md b/docs/translations/ja.md new file mode 100644 index 000000000..9e612e8e4 --- /dev/null +++ b/docs/translations/ja.md @@ -0,0 +1,112 @@ +# Japanese (`ja`) + +Catalog: `src/i18n/locales/ja.json`. General rules: [TRANSLATORS.md](../TRANSLATORS.md). + +Translation source: abiyeenzo (#913). + +## Style + +- Sentences use ă§ă™ïŒăŸă™: ă€Œă‚­ăƒŒă‚’äżć­˜ă—ăŸă—ăŸă€, 「もう侀ćșŠăŠè©Šă—ăă ă•ă„ă€. Labels, buttons and HUD chips are short nouns or verb stems without a final 。: ă€Œć†è©ŠèĄŒă€, 「保歘」, ă€Œăƒ©ă‚€ăƒ–ă€, 「ă‚Șフ」. +- Japanese has no case: an UPPERCASE English label becomes the same short Japanese label. Codes, units and names stay in their own case (HDG, ADS-B, km). +- Full-width punctuation in Japanese text: ă€ă€‚ïŒšïŒŸïŒïŒˆïŒ‰ă€Œă€. Quote names and titles with 「」: 「{shot}ă€ă‚’ć‰Šé™€ă—ăŸă™ă‹ïŒŸ Keep `·` as the HUD separator, `
` for an ellipsis and `—`, `→`, `↗` as in English. A dash inside a sentence becomes 。 or . +- Button names cited in running text go in : ïŒ»æŹĄăžïŒœă‚’äœżăŁăŠăă ă•ă„. +- No space between Japanese and Latin letters, digits or a `{placeholder}`: 「AISèˆčèˆ¶ă€, 「Spaceă‚’é•·æŠŒă—ă§è©±ă™ă€, 「{count}ä»¶ă€, 「{name}ă‚’èĄšç€ș」. +- Two exceptions keep the space: a Japanese label before its value in a readout (「é›Č量 {pct}%」, 「ă‚čăƒ†ăƒŒă‚·ăƒ§ăƒł {id}」, ă€Œé«˜ćșŠ {altitude}」), and the state words in toggles (「CCTV ă‚Șン」, ă€Œăƒ©ă‚žă‚Ș ă‚Șフ」). +- Waiting states are 「XćŸ…ăĄă€, not 「Xă‚’ćŸ…æ©Ÿäž­ă€: ă€ŒèŠłæžŹăƒ‡ăƒŒă‚żćŸ…ăĄă€, 「é€Čè·Ż/äșˆć ±ć††ăŻçŹŹ{number}ć ±ćŸ…ăĄă€, 「RTL-SDRăƒ‡ăƒă‚€ă‚čăźæŽ„ç¶šćŸ…ăĄâ€Šă€. ćŸ…æ©Ÿäž­ is for something on standby with no object: ă€Œăƒ•ă‚ŁăƒŒăƒ‰ćŸ…æ©Ÿäž­ă€, ă€ŒéŸłćŁ°ćŸ…æ©Ÿäž­ă€. +- Key names keep their own case in running text and hints: Tab, Enter, Space, Esc (「Tabă§ăƒ—ăƒŹăƒ“ăƒ„ăƒŒ · Enter / Spaceă§éžæŠžă€). Text that CSS upper-cases shows them in capitals, as in English. +- Loanwords are katakana with the long-vowel mark, as in Microsoft and Apple style: ăƒŠăƒŒă‚¶ăƒŒ, ăƒ–ăƒ©ă‚Šă‚¶ăƒŒ, ăƒ“ăƒ„ăƒŒă‚ąăƒŒ, ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒ, ăƒŹă‚€ăƒ€ăƒŒ, ăƒ•ă‚Łăƒ«ă‚żăƒŒ, ăƒąăƒ‹ă‚żăƒŒ, ăƒ‘ăƒ©ăƒĄăƒŒă‚żăƒŒ. Pick one katakana form per term and keep it (see the glossary). +- Product, provider and dataset names stay in Latin script: Google Maps, Cesium ion, OpenSky, CelesTrak, NASA FIRMS, Sentinel-2, KartaView. Google's own product names use Google's Japanese, joined like any Latin word: Googleă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒ. Nepal place names in the Bhote Koshi scenes stay in Latin script, as in zh-CN; country and well-known city names are translated (ăƒăƒ‘ăƒŒăƒ«, 東äșŹ, ă‚ȘăƒŒă‚čティン). + +## Numbers, units and dates + +- Units: km, m, km/h, m/s, kt, ft, mph, hPa, MW, dB, °, % stay as written, with the English spacing (「250 km」, 「{frp} MW」, 「95 kt」). Code-built cockpit distances follow this too (`cockpitUnitCase` skips the HUD upper-casing for ja, as for zh). The cockpit's own speed caption is the HUD code KT, in ćŻŸćœ°é€ŸćșŠ Â· KT and under the readout. +- Number ranges keep the English en dash, not : 「2–6æ—„ă”ăšă€, 「50–99%」, ă€Œć—ç·Ż25Â°â€“ćŒ—ç·Ż80°」. +- Time units are words written straight after the number: 秒, 戆, 時間, æ—„ (「5戆才」, 「{count}æ™‚é–“ă€, 「1時間5戆」). `formatQuantity` and `formatRelativeTime` drop the space for Japanese unit words, so code-built values match the catalog. +- Counters follow the thing counted: 機 (aircraft), 隻 (ships), ćŸș (satellites), 揰 (cameras, vehicles), ć±€ (stations), ä»¶ (records, results, events), ă‹æ‰€ (sites), 怋 (generic). Prefer a counter to a bare number. +- Dates come from `Intl` and read year first: 2026ćčŽ8月26æ—„. Coordinates in prose are ćŒ—ç·Ż / 東甌; HUD hemisphere letters stay N, S, E, W. + +## Plurals + +`Intl.PluralRules('ja')` has one category, `other`: a `tn()` entry has only that form. Put the counter next to the number: 「èˆȘç©ș機{n}æ©Ÿă€, 「èˆč舶{n}éš»ă€, ă€ŒăƒĄăƒƒă‚»ăƒŒă‚ž {count}ä»¶ă€. + +## Glossary + +| English | æ—„æœŹèȘž | +| ----------------------------------------- | --------------------------------------- | +| layer / data layer | ăƒŹă‚€ăƒ€ăƒŒ / ăƒ‡ăƒŒă‚żăƒŹă‚€ăƒ€ăƒŒ | +| feed | ăƒ•ă‚ŁăƒŒăƒ‰ | +| source / data source / attribution | ă‚œăƒŒă‚č / ăƒ‡ăƒŒă‚żă‚œăƒŒă‚č / ć‡ș慾 | +| LIVE (status) / live data | ăƒ©ă‚€ăƒ– / ăƒ©ă‚€ăƒ–ăƒ‡ăƒŒă‚ż | +| SIMULATED | ă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒł | +| stale / degraded / unavailable | æ›Žæ–°é…ć»¶ / 性胜䜎䞋 / ćˆ©ç”šäžćŻ | +| cached (status) | ă‚­ăƒŁăƒƒă‚·ăƒ„ăźïŒˆă‚­ăƒŁăƒƒă‚·ăƒ„ăźäșˆć ±ïŒ‰ | +| PARTIAL (feed state) | 郹戆的 | +| upstream (remote data source) | 配信慃 | +| retry | ć†è©ŠèĄŒ | +| key (API key) / POWER UP | ă‚­ăƒŒïŒˆAPIă‚­ăƒŒïŒ‰/ ăƒ‘ăƒŻăƒŒă‚ąăƒƒăƒ— | +| Provider Settings | ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźš | +| globe / map / map source / basemap | 朰球愀 / 朰曳 / ăƒžăƒƒăƒ—ă‚œăƒŒă‚č / ăƒ™ăƒŒă‚čマップ | +| mapped (OSM-mapped sites) | ăƒžăƒƒăƒ—æžˆăż | +| aircraft / flight / military flights | èˆȘç©ș機 / ăƒ•ăƒ©ă‚€ăƒˆ / 軍甚機 | +| FLIGHT {count} (a rocket stage's nth flight) | {count}ć›žç›źăźéŁ›èĄŒ | +| vessel, ship | èˆč舶 | +| satellite | èĄ›æ˜Ÿ | +| launch (rocket) / space mission | æ‰“ăĄäžŠă’ / ćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒł | +| stage (rocket) / downrange | æź” / ダォンレンゾ | +| contact (tracked object) | コンタクト | +| installation, site | 斜蚭 | +| camera / CCTV camera | ă‚«ăƒĄăƒ© / CCTVă‚«ăƒĄăƒ© | +| earthquake / active fire / fire perimeter | 朰震 / 火灜怜矄 / ć»¶ç„ŒçŻ„ć›Č | +| contained / containment (fire) | ć°ă˜èŸŒă‚ / ć°ă˜èŸŒă‚çŽ‡ | +| scene / shot | ă‚·ăƒŒăƒł / ă‚·ăƒ§ăƒƒăƒˆ | +| briefing / panel / dock | ブăƒȘăƒŒăƒ•ă‚Łăƒłă‚° / ăƒ‘ăƒăƒ« / ドック | +| preset / visual preset | プăƒȘă‚»ăƒƒăƒˆ / ăƒ“ă‚žăƒ„ă‚ąăƒ«ăƒ—ăƒȘă‚»ăƒƒăƒˆ | +| Tactical / Minimal / Cyber | ă‚żă‚Żăƒ†ă‚Łă‚«ăƒ« / ăƒŸăƒ‹ăƒžăƒ« / ă‚”ă‚€ăƒăƒŒ | +| Scope (circular viewport mask) / keyhole | ă‚čă‚łăƒŒăƒ— / ă‚­ăƒŒăƒ›ăƒŒăƒ« | +| Clean UI | クăƒȘăƒŒăƒłUI | +| cockpit | コックピット | +| heading / altitude / ground speed | 機銖æ–č䜍 / 高ćșŠ / ćŻŸćœ°é€ŸćșŠ | +| track (TRK, direction over the ground) | ćŻŸćœ°é‡è·Ż | +| HDG / BRG / CRS / FOV / SPD / POS | ăăźăŸăŸïŒˆHUDă‚łăƒŒăƒ‰ïŒ‰ | +| squawk | ă‚čă‚łăƒŒă‚Ż | +| radio failure / emergency (7600 / 7700) | é€šäżĄæ©Ÿæ•…éšœ / 緊怄äș‹æ…‹ | +| map heading / North up | æ–č䜍 / ćŒ—ă‚’äžŠă« | +| Street Level / Street View (Google) | ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ« / ă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒ | +| Recent Imagery | æœ€èż‘ăźèĄ›æ˜Ÿç”»ćƒ | +| Global Context / Context (panel) | ă‚°ăƒ­ăƒŒăƒăƒ«ă‚łăƒłăƒ†ă‚­ă‚čト / コンテキă‚čト | +| radio (station) / tune / seek | ăƒ©ă‚žă‚ȘïŒˆć±€ïŒ‰/ éžć±€ăƒ»ćŒèȘż / ă‚·ăƒŒă‚Ż | +| Public Safety / SAFETY (radio category) | è­ŠćŻŸăƒ»æ¶ˆé˜Č | +| transit / bikeshare | ć…Źć…±äș€é€š / ă‚·ă‚§ă‚ąă‚”ă‚€ă‚Żăƒ« | +| occupancy: empty / standing room only / crushed | äč—ćźąăȘし / 立づäč—りたみ / éžćžžă«æ··é›‘ | +| traffic flow (TomTom) | äș€é€šæ” | +| Previous / Next | 才ま / æŹĄăž | +| SIG / NEWS / LOCAL (briefing tabs) | ă‚·ă‚°ăƒŠăƒ« / ăƒ‹ăƒ„ăƒŒă‚č / ăƒ­ăƒŒă‚«ăƒ« | +| compass points (N, NNE, NE, ENE, 
) | 挗, ćŒ—ćŒ—æ±, ćŒ—æ±, æ±ćŒ—æ±, 
 | +| weather field / FIELD (selector) | 芁玠 | +| weather model / forecast lead hours | ăƒąăƒ‡ăƒ« / äșˆć ±æ™‚é–“ | +| valid (forecast time) / issued | ćŻŸè±Ąæ™‚ćˆ» / ç™șèĄš | +| radar reflectivity / lightning density | ăƒŹăƒŒăƒ€ăƒŒćć°„ćŒ·ćșŠ / 雷毆ćșŠ | +| cyclone, storm (NHC/CPHC) / advisory | ă‚”ă‚€ă‚Żăƒ­ăƒł / æƒ…ć ±ïŒˆçŹŹNć ±ïŒ‰; alone: ă‚”ă‚€ă‚Żăƒ­ăƒłæƒ…ć ± | +| potential tropical cyclone (NHC PC) | ă‚”ă‚€ă‚Żăƒ­ăƒłćŒ–ăźăŠăă‚ŒăŒă‚ă‚‹æ“Ÿäč± | +| forecast uncertainty cone | äșˆć ±ć†† | +| tropical storm / tropical depression | ç†±ćžŻæšŽéąšé›š / ç†±ćžŻäœŽæ°—ćœ§ | +| scene cloud / mosaic / daily overview | ă‚·ăƒŒăƒłé›Č量 / ăƒąă‚¶ă‚€ă‚Ż / æ—„æŹĄæŠ‚èŠł | +| box (Recent Imagery area) | 範ć›Č | +| WINDOW (search radius around a subject) | 範ć›Č | +| coverage / coverage % / full, partial | ă‚«ăƒăƒŒçŻ„ć›Č / ă‚«ăƒăƒŒçŽ‡ïŒˆ%ăźăżïŒ‰/ ć…šäœ“, 侀郹 | +| pin (Recent Imagery) | ć›ș漚 | +| clear day (Recent Imagery) | é›Čぼ民ăȘă„æ—„ | +| outline / mark (map annotation) | èŒȘ郭 / ăƒžăƒŒă‚Ż | +| share (a view or link) | ć…±æœ‰ | +| import / export (project, presets) | ă‚€ăƒłăƒăƒŒăƒˆ / スクă‚čăƒăƒŒăƒˆ | +| EXPORT (image, PNG) | æ›žăć‡șし | +| voice (the voice assistant) | éŸłćŁ°ă‚ąă‚·ă‚čタント / éŸłćŁ°æ©Ÿèƒœ | +| activate (a control, screen-reader text) | æŠŒă™ïŒˆă€ŒæŠŒă™ăšâ€Šă€ïŒ‰ | +| AI agent | AIă‚šăƒŒă‚žă‚§ăƒłăƒˆ | +| frame (bring into view) | èŠ–é‡Žă«ćŽă‚ă‚‹ | +| story beat / evidence beat | ă‚čăƒˆăƒŒăƒȘăƒŒćŒș戇り / èšŒæ‹ ăźćŒș戇り | +| camera pose / camera move | ă‚«ăƒĄăƒ©ăźć§żć‹ą / 移拕 | +| roundabout / ramp / exit | ăƒ­ăƒŒă‚żăƒȘăƒŒ / ăƒ©ăƒłăƒ— / ć‡ș揣 | +| reduced motion | ć‹•ăă‚’æž›ă‚‰ă™ | +| NOT AN ALL-CLEAR | ćź‰ć…šăźäżèšŒă§ăŻă‚ă‚ŠăŸă›ă‚“ | +| 
 Watch (scene titles: Earth, Orbital) | ç›ŁèŠ–ïŒˆćœ°çƒç›ŁèŠ–, è»Œé“ç›ŁèŠ–ïŒ‰ | diff --git a/docs/translations/pt.md b/docs/translations/pt.md new file mode 100644 index 000000000..682c0a3b9 --- /dev/null +++ b/docs/translations/pt.md @@ -0,0 +1,107 @@ +# Brazilian Portuguese (`pt`) + +Catalog: `src/i18n/locales/pt.json`. General rules: [TRANSLATORS.md](../TRANSLATORS.md). + +Translation source: abiyeenzo (#909). + +## Style + +- Brazilian Portuguese (pt-BR): cĂąmera, tela, compartilhar, arquivo, baixar, ĂŽnibus, metrĂŽ. Every `pt` tag, `pt-PT` included, gets this catalog, so avoid slang and regionalisms. +- Address the user with «vocĂȘ» imperatives: «Clique no mapa», «Ative o CCTV», «Tente novamente». Tooltips that name an action use the infinitive: «Expandir painel», «Redefinir a cĂąmera». +- Sentence case, not Title Case: "Live Flights" → «Voos ao vivo». UPPERCASE English stays UPPERCASE: «AO VIVO», «SEM DADOS». +- Quotes inside Portuguese text are straight double quotes: «Excluir o plano "{shot}"?». A sentence that names a panel quotes it: «o painel "ConfiguraçÔes de provedores"» as the subject, so the verb agrees, and «adicione em "ConfiguraçÔes de provedores"» after a preposition. +- A dash between clauses is a spaced em dash « — », even where the English runs it in. +- A date or time after a participle takes a preposition: «emitido em {time}», «vĂĄlida para {valid}», «Posição em {time}», «onde estava em {time}». Use «em», not «às», wherever {time} can include a date. +- A count in a string with no plural form (no `tn()`) goes after a colon, so it reads right for 1: «sincronizando feeds de cidades: {count}...», «CÂMERAS EM ESPERA: {count}». +- A placeholder that holds a layer or tool name of unknown gender and number gets a noun to agree with: «{label}: camada ativada», «A ferramenta "{owner}" estĂĄ usando o ponteiro — feche-a primeiro». +- Short labels, chips and HUD readouts stay short. A standard abbreviation with a period beats a wrapped line: ANT., PRÓX., DESLIG., EXCL., INCL., ALT., VEL., cĂąm. +- The HUD codes HDG, BRG, CRS, FOV, DEST, SPD, RANGE, ALT, GS, TRK and V/S stay in English, as in cockpit avionics («ALT {altitude} FT · GS {speed} KT · TRK {track}», «V/S {rate} FT/MIN»), and so does the HUD recording mark REC. Words used in a sentence are translated: heading → «rumo», range → «alcance». +- Keyboard keys stay in English: Space, Esc, Enter, Tab, Shift, Backspace, H, 1–9 («Segure Space para falar»). +- Common English tech words used in Brazil stay: feed, stream, snapshot, briefing, dock, layout, bloom, status, app, link, token. +- Units: km, m, km/h, m/s, kt (knots), ft (feet), h, min, s, always spaced from the number («Terremotos (24 h)», «MissĂ”es espaciais (30 d)»; in the layer names the space is a no-break space, U+00A0, so the unit never wraps away from the number); in UPPERCASE text KM, KM/S, KT, FT, MIN, H. "m" is always metres, so minutes are «min» («hĂĄ 5 min»). MW stays MW. `°` and `%` stay. Decimal comma in written numbers («M4,4»). +- "ago" goes before the time: «hĂĄ {count} min», «mais recente hĂĄ {value}». When a placeholder already holds a localized "ago" text (`{age}`, `{ago}`), do not add «hå» again. +- Money: «US$ {amount} mil / mi / bi» for thousands, millions and billions. +- Compass points use Leste/Oeste: N, NNE, NE, ENE, L, ESE, SE, SSE, S, SSO, SO, OSO, O, ONO, NO, NNO; hemisphere letters N, S, L, O. + +## Plurals + +A `tn()` entry needs three forms. `Intl.PluralRules('pt')` follows Brazilian usage: + +| Form | Counts | Example | +| ------- | -------------------------------------- | ------------------ | +| `one` | 0, 1 and anything below 2: 0, 1, 1.5 | 0 cĂąmera, 1 cĂąmera | +| `many` | 1 000 000, 2 000 000
 (exact millions) | 1000000 de cĂąmeras | +| `other` | everything else: 2–999 999, 2.5
 | 3 cĂąmeras | + +The `many` form is the `other` text with «de» after the number: «{count} de cĂąmeras carregadas», «{count} DE CHAVES PENDENTES». A `one` form is also read for 0, so keep it natural with zero («0 arquivo selecionado» is standard Brazilian usage). + +## Glossary + +| English | PortuguĂȘs | +| --------------------------------------------- | ------------------------------------------------------------ | +| layer / data layer | camada / camada de dados | +| feed / source / data source | feed / fonte / fonte de dados | +| LIVE (status) / live data | AO VIVO / dados ao vivo | +| SIMULATED | SIMULADO | +| stale / degraded / unavailable | desatualizado / degradado / indisponĂ­vel | +| retry / retrying | nova tentativa / tentando de novo | +| retrying (a fetch) / retrying slowly | buscando de novo / tentando de novo em intervalos maiores | +| rate-limited | «X: limite de requisiçÔes atingido» | +| dismiss (window, card, error) | fechar | +| key (API key) / POWER UP / POWERED UP | chave / ATIVAR / ATIVADO | +| Provider Settings | ConfiguraçÔes de provedores | +| ON / OFF (state chips) | ATIVO / INATIVO | +| enable / disable | ativar / desativar | +| globe / map / map source / map stack | globo / mapa / fonte do mapa / pilha de mapas | +| basemap / tile | mapa base / bloco | +| aircraft, plane / flight / military flights | aeronave, aviĂŁo / voo / voos militares | +| vessel, ship / TANKER (AIS class) | embarcação / NAVIO-TANQUE | +| satellite / shell (Starlink) / DENSE | satĂ©lite / camada orbital / DENSO | +| SPARSE / BALANCED / DENSE (detection modes) | ESPARSO / EQUILIBRADO / DENSO (o modo) | +| launch (rocket) / launch site / space mission | lançamento / local de lançamento / missĂŁo espacial | +| KM DOWNRANGE / EST. DOWNRANGE | KM DO LOCAL DE LANÇAMENTO / EST. PELA DIST. DO LANÇAMENTO | +| ascent / replay / payload / stage | subida / reprise / carga Ăștil / estĂĄgio | +| contact / tracking / track | contato / rastreamento / rastro | +| installation / site | instalação / local | +| PLACES CANDIDATE (installation class) | CANDIDATO DO GOOGLE PLACES | +| mapped / observed | mapeado / observado | +| camera / CCTV camera | cĂąmera / cĂąmera de CCTV | +| CALIBRATED / CURATED (CCTV badge) | CALIBRADA / COM CURADORIA | +| AUTO HOP ON / OFF (CCTV) | TROCA AUTO. LIGADA / DESLIG. (as the other CCTV toggles) | +| earthquake / active fire | terremoto / incĂȘndio ativo | +| advisory (NHC/CPHC cyclone) | boletim | +| E/C Pacific (NHC/CPHC coverage) | PacĂ­fico Leste/Central (no «L/C») | +| weather (layer, card) / weather satellite | clima / meteorologia, meteorolĂłgico | +| FOG / cloud unknown | NEVOEIRO / nebulosidade desconhecida | +| AQHI bands Low 
 Very High | Risco baixo 
 Risco muito alto | +| radio station / broadcaster | estação de rĂĄdio / emissora | +| Oldies / World (radio tags) | Flashback / MĂșsicas do mundo | +| radio genre tags agree with «mĂșsica» | Alternativa, ClĂĄssica, EletrĂŽnica, Latina | +| road / flow (traffic) | via / fluxo | +| Street Level (layer) | NĂ­vel da rua | +| scene / shot / scene recipe | cena / plano / receita de cena | +| briefing / panel / dock | briefing / painel / dock | +| cockpit | cabine | +| preset / visual preset / EXPORT PRESETS | predefinição / predefinição visual / EXPORTAR PREDEF. | +| VISUAL PRESETS (dock caption) | PREDEF. VISUAIS | +| Scope (circular viewport mask) / keyhole | mira / visor | +| feather / fade | suavização / esmaecimento | +| detection overlay | sobreposição de detecção | +| pin (Draw tool) / box (Recent Imagery) | marcador / ĂĄrea | +| Cyber (HUD layout, effect) | Ciber | +| heading / course / altitude / ground speed | rumo / curso / altitude / velocidade solo (VELOC. SOLO) | +| map heading / bearing (compass, north up) | orientação (do mapa) | +| HDG / BRG / CRS / FOV / DEST / SPD / RANGE | HDG / BRG / CRS / FOV / DEST / SPD / RANGE (unchanged) | +| V/S (vertical speed code) | V/S (unchanged) | +| PREV / NEXT | ANT. / PRÓX. | +| Previous / Next (button text) | Anterior / PrĂłximo (PrĂłxima) | +| L / R (relative bearing) | E / D | +| SIG / NEWS / LOCAL (briefing tabs) | SIG / NOTÍCIAS / LOCAL | +| REGIONAL NEWS (fits the 16-character kicker) | NOTÍCIAS DA ÁREA | +| PITCH / HGT (CCTV calibration chips) | INCL. / ALT. | +| NOT AN ALL-CLEAR | NÃO GARANTE SEGURANÇA | +| Last report (transit vehicle position) | Último registro | +| intersection (CCTV) | cruzamento | +| {layers} just turned on (any list of layers) | «{layers}: ativação recente» (no agreement needed) | +| {label} on / off (one layer) | «{label}: camada ativada / desativada» | +| turn-by-turn: turn left / keep left / lane | vire Ă  esquerda / mantenha-se Ă  esquerda / faixa da esquerda | diff --git a/docs/translations/zh-CN.md b/docs/translations/zh-CN.md index e3b7bcad1..b3a3f973a 100644 --- a/docs/translations/zh-CN.md +++ b/docs/translations/zh-CN.md @@ -43,7 +43,7 @@ Translation sources: abiyeenzo (#914) and EDIT-Aeterna (#979). | briefing / panel / dock | çź€æŠ„ / éąæż / ćœé æ  | | preset / visual preset | éą„èźŸ / è§†è§‰éą„èźŸ | | Display / HUD layout | 星ç€ș / HUD ćžƒć±€ | -| Tactical / Operator / Minimal / Cyber | æˆ˜æœŻ / æ“äœœć‘˜ / çČŸçź€ / è”›ćš | +| Tactical / Minimal / Cyber | æˆ˜æœŻ / çČŸçź€ / è”›ćš | | Scope (circular viewport mask) / keyhole | è§†ćŸŸ | | Clean UI | çșŻć‡€ç•Œéą | | cockpit | ćș§èˆ± | diff --git a/scripts/format-scope.json b/scripts/format-scope.json index 8c0ce44eb..cd732278c 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -212,7 +212,6 @@ "src/styles/thermal.js", "src/styles/anime.js", "src/styles/noir.js", - "src/styles/snow.js", "scripts/qa-visual-effects.mjs", "scripts/qa-draw-tool.mjs", "scripts/qa-geo-import.mjs", @@ -712,7 +711,6 @@ "src/ui/shareRestoration.js", "src/ui/visualSettings.js", "src/ui/panelChrome.js", - "src/ui/panelChrome.radioOwnership.test.mjs", "src/testSupport/readShellSource.mjs", "src/ui/stateOwners.test.mjs", "src/layers/flights/records.js", diff --git a/scripts/i18n.mjs b/scripts/i18n.mjs index 0ee5d60ec..c035c6bb2 100644 --- a/scripts/i18n.mjs +++ b/scripts/i18n.mjs @@ -125,8 +125,11 @@ export function extractMessages() { const html = readFileSync(path.join(ROOT, file), 'utf8'); for (const [, tag, attrs, text] of html.matchAll(TAG)) { const where = `${file} <${tag}>`; - if (/\sdata-i18n(\s|=|$)/.test(attrs)) - add(normalize(decodeHtml(text)), where); + if (/\sdata-i18n(\s|=|$)/.test(attrs)) { + const context = attrs.match(/\sdata-i18n-context="([^"]*)"/); + const message = normalize(decodeHtml(text)); + add(context ? `${decodeHtml(context[1])}|${message}` : message, where); + } for (const [, name] of attrs.matchAll( /\sdata-i18n-(title|aria-label|placeholder)\b/g, )) { diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json index 7191bd141..6ca36a635 100644 --- a/scripts/package-boundaries.json +++ b/scripts/package-boundaries.json @@ -439,7 +439,12 @@ "src/ui/slider.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -464,7 +469,6 @@ "src/styles/thermal.js", "src/styles/anime.js", "src/styles/noir.js", - "src/styles/snow.js", "src/i18n/marker.js" ], "external": ["cesium"] @@ -480,7 +484,12 @@ "src/localRequestGate.mjs", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -511,7 +520,12 @@ "src/data/layerSnapshot.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -534,7 +548,12 @@ "src/app/stateChannel.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -552,7 +571,12 @@ "src/ui/radioTunerModel.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -573,7 +597,12 @@ "src/ui/cctvPresentation.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -601,7 +630,12 @@ "src/ui/panelRailGeometry.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -637,7 +671,12 @@ "src/ui/panelRailGeometry.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -655,7 +694,12 @@ "src/ui/actionButton.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -706,7 +750,6 @@ "src/styles/anime.js", "src/styles/noir.js", "src/styles/retro.js", - "src/styles/snow.js", "src/styles/surveillance.js", "src/styles/thermal.js", "src/ui/applicationShell.js", @@ -815,7 +858,12 @@ "src/data/cameraArrival.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -825,7 +873,8 @@ "src/ui/layerNames.js", "src/ui/statusText.js", "src/ui/statusBadge.js", - "src/scopeMaskPolicy.js" + "src/scopeMaskPolicy.js", + "src/visualStylePolicy.js" ], "external": ["cesium"] }, @@ -938,12 +987,18 @@ "src/data/cameraArrival.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", - "src/ui/unitLabels.js" + "src/ui/unitLabels.js", + "src/visualStylePolicy.js" ], "external": ["cesium"] }, @@ -1007,7 +1062,12 @@ "src/data/modelEligibility.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1057,7 +1117,12 @@ "src/data/modelEligibility.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1121,7 +1186,12 @@ "src/data/inputOwnership.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1152,7 +1222,12 @@ "src/maps/imageryHost.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1184,7 +1259,12 @@ "src/data/inputOwnership.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1216,7 +1296,12 @@ "src/data/inputOwnership.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1251,7 +1336,12 @@ "src/data/inputOwnership.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1295,7 +1385,12 @@ "src/data/infrastructureOverlayEntry.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1333,7 +1428,12 @@ "src/ui/panelRailGeometry.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1385,7 +1485,12 @@ "src/layers/traffic/roadModes.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1416,7 +1521,12 @@ "src/data/cameraSensitivity.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1466,7 +1576,12 @@ "src/layers/cctv/sourcePolicy.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1531,7 +1646,12 @@ "scripts/qa-street-level.mjs", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1562,7 +1682,12 @@ "src/layers/alpr/floors.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1604,7 +1729,12 @@ "src/data/inputOwnership.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1628,7 +1758,12 @@ "src/data/inputOwnership.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1686,7 +1821,12 @@ "src/maps/imageryHost.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -1750,7 +1890,12 @@ "src/voice/pointerReticle.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -2269,7 +2414,6 @@ "src/styles/anime.js", "src/styles/noir.js", "src/styles/retro.js", - "src/styles/snow.js", "src/styles/surveillance.js", "src/styles/thermal.js", "src/ui/applicationShell.js", @@ -2640,7 +2784,12 @@ "src/app/embed.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -2665,7 +2814,8 @@ "src/voice/geminiCaptureWorklet.js", "src/ui/statusBadge.js", "src/sceneCommandRelease.js", - "src/scopeMaskPolicy.js" + "src/scopeMaskPolicy.js", + "src/visualStylePolicy.js" ], "external": [ "hls.js", @@ -3231,7 +3381,12 @@ "src/sources/infrastructureData.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -3343,7 +3498,12 @@ "src/app/stateChannel.js", "src/data/cameraArrival.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -3368,7 +3528,12 @@ "src/ui/uiLifetime.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -3390,7 +3555,6 @@ "src/styles/anime.js", "src/styles/noir.js", "src/styles/retro.js", - "src/styles/snow.js", "src/styles/surveillance.js", "src/styles/thermal.js", "src/ui/applicationShortcuts.js", @@ -3406,13 +3570,19 @@ "src/i18n/marker.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", "src/i18n/locales/zh-Hant.json", "src/scopeMaskPolicy.js", - "src/ui/displayControls.js" + "src/ui/displayControls.js", + "src/visualStylePolicy.js" ], "external": ["cesium"] }, @@ -3434,7 +3604,12 @@ "src/ui/uiLifetime.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -3527,7 +3702,12 @@ "src/data/routeSteps.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -3584,7 +3764,12 @@ "src/voice/pointerReticle.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -3842,7 +4027,12 @@ "src/sources/capability.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -3887,7 +4077,12 @@ "src/sources/transitHistory.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -3942,7 +4137,12 @@ "src/layers/perimeters/inciweb.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -3960,7 +4160,12 @@ "src/layers/gnss/records.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -3990,7 +4195,6 @@ "src/styles/anime.js", "src/styles/noir.js", "src/styles/retro.js", - "src/styles/snow.js", "src/styles/surveillance.js", "src/styles/thermal.js", "src/view/index.js", @@ -3999,7 +4203,8 @@ "src/data/idSwitches.js", "src/data/detectionPolicy.js", "src/scopeMaskPolicy.js", - "src/i18n/marker.js" + "src/i18n/marker.js", + "src/visualStylePolicy.js" ], "external": [] }, @@ -4021,7 +4226,12 @@ "src/i18n/marker.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -4064,7 +4274,12 @@ "src/layers/droneAirspace/cards.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", @@ -4133,7 +4348,8 @@ "src/tools/views.js", "src/tools/globePanel.js", "src/tools/queries/panelRequest.js", - "src/geoDistance.js" + "src/geoDistance.js", + "src/visualStylePolicy.js" ], "external": ["satellite.js"] }, @@ -4234,7 +4450,8 @@ "src/view/index.js", "src/data/idSwitches.js", "src/data/layerState.js", - "src/data/layerStateTokenReservations.json" + "src/data/layerStateTokenReservations.json", + "src/visualStylePolicy.js" ], "external": [] }, @@ -4248,7 +4465,12 @@ "src/i18n/marker.js", "src/i18n/index.js", "src/i18n/locale.js", + "src/i18n/locales/de.json", "src/i18n/locales/es.json", + "src/i18n/locales/fr.json", + "src/i18n/locales/it.json", + "src/i18n/locales/ja.json", + "src/i18n/locales/pt.json", "src/i18n/locales/ru.json", "src/i18n/locales/uk.json", "src/i18n/locales/zh-CN.json", diff --git a/scripts/qa-cockpit-utility.mjs b/scripts/qa-cockpit-utility.mjs index cb3515ed2..e62df75f4 100644 --- a/scripts/qa-cockpit-utility.mjs +++ b/scripts/qa-cockpit-utility.mjs @@ -1603,7 +1603,7 @@ try { cockpit.setVisionMode('optical'); current.focus({ preventScroll: true }); const states = [read()]; - for (let index = 0; index < 7; index += 1) { + for (let index = 0; index < 6; index += 1) { current.click(); states.push(read()); } @@ -1637,36 +1637,36 @@ try { reentered, }; }); - const cycleModes = ['optical', 'crt', 'nvg', 'thermal', 'anime', 'noir', 'snow', 'optical']; - const cycleLabels = ['NORMAL', 'CRT', 'NVG', 'FLIR', 'ANIME', 'NOIR', 'SNOW', 'NORMAL']; + const cycleModes = ['optical', 'crt', 'nvg', 'thermal', 'anime', 'noir', 'optical']; + const cycleLabels = ['NORMAL', 'CRT', 'NVG', 'FLIR', 'ANIME', 'NOIR', 'NORMAL']; check( - 'Cockpit vision control exposes Normal, CRT, NVG, FLIR, Anime, Noir and Snow before wrapping', + 'Cockpit vision control exposes Normal, CRT, NVG, FLIR, Anime and Noir before wrapping', JSON.stringify(visionCycle.states.map((state) => state.mode)) === JSON.stringify(cycleModes) && JSON.stringify(visionCycle.states.map((state) => state.label)) === JSON.stringify(cycleLabels) && visionCycle.states[5]?.aria === 'Current cockpit vision style: Noir. Activate for next style.' - && visionCycle.states[7]?.aria === 'Current cockpit vision style: Normal. Activate for next style.', + && visionCycle.states[6]?.aria === 'Current cockpit vision style: Normal. Activate for next style.', JSON.stringify(visionCycle.states.map(({ mode, label, aria }) => ({ mode, label, aria }))), ); check( 'user vision changes open Display for every temporary treatment and retain selector focus', - visionCycle.states.slice(1, 7).every((state) => state.displayOpen === 'true') - && visionCycle.states.slice(1, 7).every((state) => state.radioOpen === 'false') - && visionCycle.states.slice(1, 7).every((state) => state.parametersActive) - && visionCycle.states.slice(1, 7).every((state) => !state.parametersCollapsed) - && visionCycle.states.slice(1, 7).every((state) => state.signalCollapsed) + visionCycle.states.slice(1, 6).every((state) => state.displayOpen === 'true') + && visionCycle.states.slice(1, 6).every((state) => state.radioOpen === 'false') + && visionCycle.states.slice(1, 6).every((state) => state.parametersActive) + && visionCycle.states.slice(1, 6).every((state) => !state.parametersCollapsed) + && visionCycle.states.slice(1, 6).every((state) => state.signalCollapsed) && visionCycle.states.every((state) => state.focusRetained), JSON.stringify(visionCycle.states), ); check( 'each Cockpit vision mode drives only its own shader and Normal clears them all', - visionCycle.states.slice(1, 7).every((state) => { + visionCycle.states.slice(1, 6).every((state) => { const target = { - crt: 'retro', nvg: 'surveillance', thermal: 'thermal', anime: 'anime', noir: 'noir', snow: 'snow', + crt: 'retro', nvg: 'surveillance', thermal: 'thermal', anime: 'anime', noir: 'noir', }[state.mode]; return Object.entries(state.intensities).every(([name, value]) => name === target ? value > 0 : value === 0); }) - && Object.values(visionCycle.states[7].intensities).every((value) => value === 0), + && Object.values(visionCycle.states[6].intensities).every((value) => value === 0), JSON.stringify(visionCycle.states.map(({ mode, intensities }) => ({ mode, intensities }))), ); check( @@ -1751,7 +1751,7 @@ try { return state; }, { variantName: variant, kind: openKind }); - for (const variant of ['off', 'minimal', 'tactical', 'operator']) { + for (const variant of ['off', 'minimal', 'tactical']) { for (const kind of ['display', 'radio']) { const state = await desktopState(variant, kind); check( @@ -2081,7 +2081,7 @@ try { await page.screenshot({ path: path.join(shotsDir, `cyber-resize-${height}.png`) }); } } - await page.evaluate(() => window.__godsEyeView.styleManager._setHudVariant('operator')); + await page.evaluate(() => window.__godsEyeView.styleManager._setHudVariant('tactical')); const signalTransition = await page.evaluate(() => { const manager = window.__godsEyeView.styleManager; @@ -2317,13 +2317,13 @@ try { const styleManager = window.__godsEyeView.styleManager; const styleBefore = styleManager.activeStyle; // A Cockpit-only choice that Reset must undo. - styleManager.cockpitView.setVisionMode('snow'); + styleManager.cockpitView.setVisionMode('anime'); window.__qaCockpitReset = { calls: 0, original: manager.resetToGlobeView, subjectId: awareness?.getContextSnapshot?.()?.subject?.id || null, styleBefore, - snowDuringCockpit: styleManager.stages?.snow?.uniforms?.intensity, + animeDuringCockpit: styleManager.stages?.anime?.uniforms?.intensity, }; manager.resetToGlobeView = function qaCountedCockpitReset(...args) { window.__qaCockpitReset.calls += 1; @@ -2360,7 +2360,7 @@ try { height, subjectPreserved: Boolean(qa.subjectId && subjectId === qa.subjectId), styleRestored: gev.styleManager.activeStyle === qa.styleBefore, - snowDuringCockpit: qa.snowDuringCockpit, + animeDuringCockpit: qa.animeDuringCockpit, // Cockpit-time intensities are Cockpit's own, so check against the map preset. visionRestored: Object.entries(gev.styleManager.stages || {}).every(([name, stage]) => name === gev.styleManager.activeStyle @@ -2376,7 +2376,7 @@ try { && resetState.resetHidden && Math.abs(resetState.height - 18_000_000) < 150_000 && resetState.subjectPreserved - && resetState.snowDuringCockpit > 0 + && resetState.animeDuringCockpit > 0 && resetState.styleRestored && resetState.visionRestored, JSON.stringify(resetState), diff --git a/scripts/qa-firstrun-mutations.mjs b/scripts/qa-firstrun-mutations.mjs index 3ef331abd..a0a6d1ca9 100644 --- a/scripts/qa-firstrun-mutations.mjs +++ b/scripts/qa-firstrun-mutations.mjs @@ -175,12 +175,12 @@ const MUTATIONS = [ to: ' /* belt removed */', }, { - // Anchored past the call so it cannot land on the cockpit disclosure's own - // stopImmediatePropagation() a few lines below and prove nothing about this. - defect: 'the radio disclosure returns to stopPropagation, so one ESC does two things', + // Anchored past the call so it lands on the Cockpit utility disclosure's + // Escape claim and nowhere else. + defect: 'a Cockpit utility disclosure returns to stopPropagation, so later document listeners also act on its ESC', file: 'radio', - from: ' event.stopImmediatePropagation();\n const escapedFromDisclosure =\n event.target === this._contextRadioToggleBtn ||', - to: ' event.stopPropagation();\n const escapedFromDisclosure =\n event.target === this._contextRadioToggleBtn ||', + from: " event.stopImmediatePropagation();\n const kind = displayOpen ? 'display' : 'radio';", + to: " event.stopPropagation();\n const kind = displayOpen ? 'display' : 'radio';", }, { defect: 'the "no timer" decision is deleted, so the next editor re-litigates it blind', diff --git a/scripts/qa-firstrun.mjs b/scripts/qa-firstrun.mjs index 24d82bd2b..c8291ed62 100644 --- a/scripts/qa-firstrun.mjs +++ b/scripts/qa-firstrun.mjs @@ -357,53 +357,6 @@ async function runArbitrationSection(page, { shots, consoleErrors }) { `classVisible=${afterUncoveredEsc.classVisible} session=${afterUncoveredEsc.session}`, ); - // ── Blocker repro: a control that claims only the KEY ─────────────────── - // The compact Radio disclosure closes on ESC from a capture listener bound - // long before this module exists. It called stopPropagation(), which does - // NOT stop later listeners on the same document — so one key closed the - // disclosure AND dismissed the launcher. The card is not hiding behind this - // one and must not yield to it: the key is simply already spoken for. - await open(page, { query: "?welcome=1", errorSink: consoleErrors }); - const beforeRadio = await launcherState(); - record('the launcher is up before the radio disclosure opens', beforeRadio.onScreen); - const radioOpened = await page.evaluate(() => { - document.getElementById('context-radio-toggle-btn')?.click(); - return !!document.getElementById('context-radio-dock')?.classList.contains('disclosure-open'); - }); - await sleep(250); - record('the compact Radio disclosure opens', radioOpened); - const withRadio = await launcherState(); - record( - 'a small disclosure is a key contest, not a screen takeover — no yield', - withRadio.classVisible && withRadio.topmost, - `classVisible=${withRadio.classVisible} topmost=${withRadio.topmost}`, - ); - - await page.keyboard.press('Escape'); - await sleep(400); - const radioAfterEsc = await page.evaluate(() => ( - !!document.getElementById('context-radio-dock')?.classList.contains('disclosure-open') - )); - const launcherAfterRadioEsc = await launcherState(); - record('ESC closes the disclosure', radioOpened && !radioAfterEsc, - `disclosure still open=${radioAfterEsc}`); - record( - 'that SAME ESC does not also dismiss the launcher', - beforeRadio.onScreen && launcherAfterRadioEsc.classVisible - && launcherAfterRadioEsc.session !== 'dismissed', - `classVisible=${launcherAfterRadioEsc.classVisible} session=${launcherAfterRadioEsc.session} — one key, one action`, - ); - // ...and the NEXT press is the launcher's, so nothing was permanently taken. - await page.keyboard.press('Escape'); - await sleep(600); - const escAfterRadioClosed = await launcherState(); - record( - 'the next ESC belongs to the launcher again', - beforeRadio.onScreen && !escAfterRadioClosed.classVisible - && escAfterRadioClosed.session === 'dismissed', - `classVisible=${escAfterRadioClosed.classVisible} session=${escAfterRadioClosed.session}`, - ); - // ── Deferred reveal: a surface already up when the launcher would show ── // The class goes on as soon as the app exists, which is well before the // launcher's reveal (~T+1.9s), so init genuinely sees a screen it does not diff --git a/scripts/qa-map-source-tray.mjs b/scripts/qa-map-source-tray.mjs index 2876e0cac..8a0c0b7fd 100644 --- a/scripts/qa-map-source-tray.mjs +++ b/scripts/qa-map-source-tray.mjs @@ -200,8 +200,8 @@ const checkResponsiveStyleFocus = async (width) => { await page.focus('#control-panel-toggle'); await pressTabs(2); // disclosure -> pin -> Normal } - for (const [index, style] of ['normal', 'thermal', 'snow'].entries()) { - if (index) await pressTabs(3); + for (const [tabs, style] of [[0, 'normal'], [3, 'thermal'], [2, 'noir']]) { + if (tabs) await pressTabs(tabs); const state = await styleFocusMetrics(); check(`${width} px ${style} keyboard ring is visible and unclipped`, hasVisibleStyleFocus(state, style) && state.selectedStyle === 'normal' @@ -567,13 +567,13 @@ try { // Visual Styles precede the five Map Source tiles. Keep the existing opening // handoff to selected OSM, then use the user's real Shift+Tab path into styles. await pressTabs(5, true); - const snowFocus = await styleFocusMetrics(); - check('Shift+Tab reaches Snow with a visible ring while Normal and OSM stay selected', - hasVisibleStyleFocus(snowFocus, 'snow') && !snowFocus.selected - && snowFocus.selectedStyle === 'normal' && snowFocus.selectedMap === 'osm', - JSON.stringify(snowFocus)); + const noirFocus = await styleFocusMetrics(); + check('Shift+Tab reaches Noir with a visible ring while Normal and OSM stay selected', + hasVisibleStyleFocus(noirFocus, 'noir') && !noirFocus.selected + && noirFocus.selectedStyle === 'normal' && noirFocus.selectedMap === 'osm', + JSON.stringify(noirFocus)); await page.screenshot({ path: path.join(shotsDir, 'keyboard-style-focus.png') }); - await pressTabs(3, true); + await pressTabs(2, true); const middleFocus = await styleFocusMetrics(); check('Shift+Tab traverses the middle FLIR style without activating it', hasVisibleStyleFocus(middleFocus, 'thermal') && !middleFocus.selected diff --git a/scripts/qa-radio.mjs b/scripts/qa-radio.mjs index d78c3dbcc..a71c69099 100644 --- a/scripts/qa-radio.mjs +++ b/scripts/qa-radio.mjs @@ -81,6 +81,32 @@ function check(name, ok, detail = '') { const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); +// Radio lives only inside Context; a user reaches its controls by expanding +// Context and then Radio. Returns the prior collapse state so a step can put +// the panels back for the scenarios that follow. +async function revealRadioControls(page, targetId) { + const prior = await page.evaluate(async (id) => { + const manager = window.__godsEyeView.styleManager; + const collapsed = (panelId) => document.getElementById(panelId).classList.contains('collapsed'); + const state = { context: collapsed('global-context-panel'), radio: collapsed('radio-panel') }; + manager.setPanelCollapsed('global-context-panel', false, { explicit: true }); + manager.setPanelCollapsed('radio-panel', false, { explicit: true }); + await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve))); + document.getElementById(id).scrollIntoView({ block: 'nearest' }); + return state; + }, targetId); + await page.waitForSelector(`#${targetId}`, { visible: true }); + return prior; +} + +async function restoreRadioPanels(page, prior) { + await page.evaluate(({ context, radio }) => { + const manager = window.__godsEyeView.styleManager; + manager.setPanelCollapsed('radio-panel', radio); + manager.setPanelCollapsed('global-context-panel', context); + }, prior); +} + // Native pick buffers and clustered overlay entries settle on rendered frames, // not on wall-clock sleeps, particularly with software rendering. async function settleRadioFrames(page) { @@ -285,31 +311,16 @@ async function main() { window.__godsEyeView.styleManager.setPanelCollapsed('global-context-panel', true); }); + const enablePanels = await revealRadioControls(page, 'radio-enable-btn'); const enableStartedAt = Date.now(); - const initialDisclosure = await page.evaluate(() => { - const button = document.getElementById('context-radio-toggle-btn'); - const mini = document.getElementById('context-radio-mini'); - const enabledBefore = window.__godsEyeView.dataManager.isEnabled('radio'); - button.click(); - return { - enabledBefore, - enabledAfterDisclosure: window.__godsEyeView.dataManager.isEnabled('radio'), - expanded: button.getAttribute('aria-expanded'), - miniHidden: mini.hidden, - }; - }); - check( - 'Radio launcher discloses compact controls without changing power', - !initialDisclosure.enabledBefore && !initialDisclosure.enabledAfterDisclosure - && initialDisclosure.expanded === 'true' && !initialDisclosure.miniHidden, - JSON.stringify(initialDisclosure), - ); - await page.$eval('#context-radio-mini-enable-btn', (button) => button.click()); + await page.click('#radio-enable-btn'); await page.waitForFunction(() => { const state = window.__godsEyeView.dataManager.layers.get('radio').module.getUIState(); return state.enabled && !state.loading && state.stationCount === 750; }); const enableElapsedMs = Date.now() - enableStartedAt; + // Later scenarios start from the collapsed rail this step began with. + await restoreRadioPanels(page, enablePanels); const initial = await page.evaluate(() => { const module = window.__godsEyeView.dataManager.layers.get('radio').module; const state = module.getUIState(); @@ -328,9 +339,6 @@ async function main() { color: entry.dataset.radioColor, })), enablePressed: document.getElementById('radio-enable-btn').getAttribute('aria-pressed'), - launcherExpanded: document.getElementById('context-radio-toggle-btn').getAttribute('aria-expanded'), - launcherActive: document.getElementById('context-radio-toggle-btn').classList.contains('active'), - compactEnablePressed: document.getElementById('context-radio-mini-enable-btn').getAttribute('aria-pressed'), fullPlayEnabled: !document.getElementById('radio-play-btn').disabled, fullPlayLabel: document.getElementById('radio-play-btn').getAttribute('aria-label'), tunerVisible: !document.getElementById('radio-tuner').hidden, @@ -341,9 +349,8 @@ async function main() { check('750-station catalog renders within the browser budget', initial.state.stationCount === 750 && enableElapsedMs < 5000, `${enableElapsedMs}ms`); check('enable does not autoplay', initial.plays === 0 && initial.state.audioState === 'stopped'); check( - 'compact and detailed Radio power controls reflect the layer manager independently of disclosure', - initial.enablePressed === 'true' && initial.compactEnablePressed === 'true' - && initial.launcherExpanded === 'true' && initial.launcherActive, + 'Radio power control reflects the layer manager after the panels collapse again', + initial.enablePressed === 'true', ); check('dynamic canonical and genre categories reach the UI', initial.filterOptions >= 10, `${initial.filterOptions} options`); const musicOption = initial.filterPalette.find((entry) => entry.id === 'music'); @@ -419,14 +426,10 @@ async function main() { prevDisabled: document.getElementById('radio-prev-btn').disabled, playDisabled: document.getElementById('radio-play-btn').disabled, volumeDisabled: document.getElementById('radio-volume').disabled, - disclosureLabel: document.getElementById('context-radio-toggle-btn').getAttribute('aria-label'), - compactPowerLabel: document.getElementById('context-radio-mini-enable-btn').getAttribute('aria-label'), - compactPowerText: document.getElementById('context-radio-mini-enable-btn').textContent, fullLabel: document.getElementById('radio-enable-btn').getAttribute('aria-label'), fullText: document.getElementById('radio-enable-btn').textContent, layerState: document.getElementById('radio-layer-state').textContent, playbackMessage: document.getElementById('radio-playback-state').textContent, - miniStation: document.getElementById('context-radio-mini-station').textContent, dataRailText: document.querySelector('[data-layer-id="radio"] .data-toggle-btn')?.textContent, dataRailState: document.querySelector('[data-layer-id="radio"] .data-toggle-btn')?.dataset.feedState, dataRailLabel: document.querySelector('[data-layer-id="radio"] .data-toggle-btn')?.getAttribute('aria-label'), @@ -468,14 +471,10 @@ async function main() { && uncertainPresentation.prevDisabled && uncertainPresentation.playDisabled && uncertainPresentation.volumeDisabled - && /compact Radio controls/i.test(uncertainPresentation.disclosureLabel) - && /uncertain/i.test(uncertainPresentation.compactPowerLabel) - && uncertainPresentation.compactPowerText === 'RECONCILE' && /uncertain/i.test(uncertainPresentation.fullLabel) && uncertainPresentation.fullText === 'RECONCILE' && uncertainPresentation.layerState === 'UNCERTAIN' && /uncertain/i.test(uncertainPresentation.playbackMessage) - && uncertainPresentation.miniStation === 'RADIO STATE UNCERTAIN' && uncertainPresentation.dataRailText === 'UNCERTAIN' && uncertainPresentation.dataRailState === 'uncertain' && /uncertain/i.test(uncertainPresentation.dataRailLabel) @@ -517,10 +516,6 @@ async function main() { presentationActive: window.__godsEyeView.dataManager.layers.get('radio').module.getUIState().presentationActive, markerSourceVisible: window.__godsEyeView.viewer.dataSources.getByName('Radio stations')[0]?.show, full: document.getElementById('radio-enable-btn').textContent, - disclosure: document.getElementById('context-radio-toggle-btn').getAttribute('aria-label'), - disclosureControls: document.getElementById('context-radio-toggle-btn').getAttribute('aria-controls'), - disclosureExpanded: document.getElementById('context-radio-toggle-btn').getAttribute('aria-expanded'), - compactPower: document.getElementById('context-radio-mini-enable-btn').textContent, layerState: document.getElementById('radio-layer-state').textContent, message: document.getElementById('radio-playback-state').textContent, stopDisabled: document.getElementById('radio-stop-btn').disabled, @@ -534,8 +529,6 @@ async function main() { && disablingPresentation.presentationActive === false && disablingPresentation.markerSourceVisible === false && disablingPresentation.full === 'DISABLING' - && /compact Radio controls/i.test(disablingPresentation.disclosure) - && disablingPresentation.compactPower === 'DISABLING' && disablingPresentation.layerState === 'DISABLING' && /disabling/i.test(disablingPresentation.message) && disablingPresentation.stopDisabled @@ -592,10 +585,6 @@ async function main() { presentationActive: window.__godsEyeView.dataManager.layers.get('radio').module.getUIState().presentationActive, markerSourceVisible: window.__godsEyeView.viewer.dataSources.getByName('Radio stations')[0]?.show, full: document.getElementById('radio-enable-btn').textContent, - disclosure: document.getElementById('context-radio-toggle-btn').getAttribute('aria-label'), - disclosureControls: document.getElementById('context-radio-toggle-btn').getAttribute('aria-controls'), - disclosureExpanded: document.getElementById('context-radio-toggle-btn').getAttribute('aria-expanded'), - compactPower: document.getElementById('context-radio-mini-enable-btn').textContent, layerState: document.getElementById('radio-layer-state').textContent, message: document.getElementById('radio-playback-state').textContent, tunerHidden: document.getElementById('radio-tuner').hidden, @@ -610,10 +599,6 @@ async function main() { && enablingPresentation.presentationActive === false && enablingPresentation.markerSourceVisible === false && enablingPresentation.full === 'ENABLING' - && enablingPresentation.disclosure === 'Go to expanded Radio section' - && enablingPresentation.disclosureControls === 'radio-panel' - && enablingPresentation.disclosureExpanded === 'true' - && enablingPresentation.compactPower === 'ENABLING' && enablingPresentation.layerState === 'ENABLING' && /enabling/i.test(enablingPresentation.message) && enablingPresentation.tunerHidden @@ -1581,112 +1566,9 @@ async function main() { JSON.stringify(directoryRefreshContinuity), ); await page.select('#radio-filter', 'news'); - check('launcher enables Radio without forcing Context open', !initial.panelExpanded && !initial.contextExpanded && initial.nestedInContext); + check('enabled Radio stays nested in Context and leaves both panels collapsed', !initial.panelExpanded && !initial.contextExpanded && initial.nestedInContext); check('full Play is available before a station is selected', !initial.state.selected && initial.fullPlayEnabled && initial.fullPlayLabel === 'Play nearest radio station'); - const hoverOnlyDisclosure = await page.evaluate(() => { - const button = document.getElementById('context-radio-toggle-btn'); - if (button.getAttribute('aria-expanded') === 'true') button.click(); - return { - expanded: button.getAttribute('aria-expanded'), - hidden: document.getElementById('context-radio-mini').hidden, - }; - }); - await page.hover('#context-radio-toggle-btn'); - await sleep(100); - const hoverOnlyVisible = await page.$eval('#context-radio-mini', (mini) => ( - !mini.hidden && getComputedStyle(mini).display !== 'none' - )); - check( - 'hover alone does not disclose compact Radio controls', - hoverOnlyDisclosure.expanded === 'false' && hoverOnlyDisclosure.hidden && !hoverOnlyVisible, - JSON.stringify({ hoverOnlyDisclosure, hoverOnlyVisible }), - ); - await page.click('#context-radio-toggle-btn'); - await page.waitForFunction(() => { - const button = document.getElementById('context-radio-toggle-btn'); - const mini = document.getElementById('context-radio-mini'); - return button.getAttribute('aria-expanded') === 'true' - && !mini.hidden && getComputedStyle(mini).display !== 'none'; - }); - const compact = await page.evaluate(() => { - const mini = document.getElementById('context-radio-mini'); - const toggle = document.getElementById('context-radio-toggle-btn'); - const dock = document.getElementById('context-radio-dock'); - const miniRect = mini.getBoundingClientRect(); - const toggleRect = toggle.getBoundingClientRect(); - const miniStyle = getComputedStyle(mini); - return { - visible: miniStyle.display !== 'none' && miniRect.width > 0 && miniRect.height > 0, - display: miniStyle.display, - visibility: miniStyle.visibility, - opacity: miniStyle.opacity, - miniRect: { top: miniRect.top, left: miniRect.left, width: miniRect.width, height: miniRect.height }, - toggleRect: { top: toggleRect.top, left: toggleRect.left, width: toggleRect.width, height: toggleRect.height }, - dockRect: (() => { - const rect = dock.getBoundingClientRect(); - return { top: rect.top, left: rect.left, width: rect.width, height: rect.height }; - })(), - offsetParent: mini.offsetParent?.id || mini.offsetParent?.className || null, - prevEnabled: !document.getElementById('context-radio-mini-prev-btn').disabled, - playEnabled: !document.getElementById('context-radio-mini-play-btn').disabled, - playLabel: document.getElementById('context-radio-mini-play-btn').getAttribute('aria-label'), - nextEnabled: !document.getElementById('context-radio-mini-next-btn').disabled, - volumeEnabled: !document.getElementById('context-radio-mini-volume').disabled, - offsetBelowToggle: Math.round(miniRect.top - toggleRect.bottom), - }; - }); - check( - 'explicit launcher disclosure reveals enabled compact Radio controls', - compact.visible && compact.prevEnabled && compact.playEnabled && compact.nextEnabled && compact.volumeEnabled, - JSON.stringify(compact), - ); - check('compact Play is available before a station is selected', compact.playLabel === 'Play nearest radio station'); - check('compact Radio controls sit 20px below the launcher', compact.offsetBelowToggle === 20, `${compact.offsetBelowToggle}px`); - const compactCloseDisclosure = await page.evaluate(() => { - const launcher = document.getElementById('context-radio-toggle-btn'); - const close = document.getElementById('context-radio-mini-close-btn'); - close.focus(); - close.click(); - const result = { - launcherExpanded: launcher.getAttribute('aria-expanded'), - compactHidden: document.getElementById('context-radio-mini').hidden, - focusRestored: document.activeElement === launcher, - radioCollapsed: document.getElementById('radio-panel').classList.contains('collapsed'), - }; - launcher.click(); - return result; - }); - check( - 'dedicated compact close hides only the compact Radio disclosure and restores launcher focus', - compactCloseDisclosure.launcherExpanded === 'false' - && compactCloseDisclosure.compactHidden - && compactCloseDisclosure.focusRestored - && compactCloseDisclosure.radioCollapsed, - JSON.stringify(compactCloseDisclosure), - ); - const compactTouchDisclosure = await page.evaluate(() => { - const button = document.getElementById('context-radio-toggle-btn'); - button.click(); - const closed = button.getAttribute('aria-expanded') === 'false' - && document.getElementById('context-radio-mini').hidden; - button.dispatchEvent(new PointerEvent('pointerdown', { - bubbles: true, - pointerType: 'touch', - isPrimary: true, - })); - button.click(); - return { - closed, - reopened: button.getAttribute('aria-expanded') === 'true' - && !document.getElementById('context-radio-mini').hidden, - }; - }); - check( - 'touch/coarse-pointer activation can close and reopen compact Radio controls', - compactTouchDisclosure.closed && compactTouchDisclosure.reopened, - JSON.stringify(compactTouchDisclosure), - ); const multiExpandedPanelLayout = await page.evaluate(async () => { const manager = window.__godsEyeView.styleManager; const ids = ['data-panel', 'scene-panel', 'pp-toggles', 'cctv-panel', 'global-context-panel']; @@ -2062,7 +1944,6 @@ async function main() { hudVariant: manager.hud.getVariant(), displayExpanded: display.getAttribute('aria-expanded') === 'true', radioExpanded: radio.getAttribute('aria-expanded') === 'true', - contextRadioExpanded: document.getElementById('context-radio-toggle-btn')?.getAttribute('aria-expanded') === 'true', focusId: document.activeElement?.id || null, detectionMode: manager.getDetectionState().detectionMode, models3dEnabled: manager._models3dEnabled, @@ -2158,11 +2039,13 @@ async function main() { for (let index = 0; index < 5; index += 1) { recordLayoutStep(); if (index < 4) { - if (index < 2) { - hudLayout.value = index === 0 ? 'operator' : 'minimal'; - hudLayout.dispatchEvent(new Event('change', { bubbles: true })); - } else { + // Off and back on in Minimal, so the toggle must restore a + // non-default layout before the cycle returns to Tactical. + if (index === 1 || index === 2) { hudToggle.click(); + } else { + hudLayout.value = index === 0 ? 'minimal' : 'tactical'; + hudLayout.dispatchEvent(new Event('change', { bubbles: true })); } await waitForHudSettle(); } @@ -2287,8 +2170,7 @@ async function main() { document.getElementById('cockpit-radio-next-btn'), ].every((button) => button?.isConnected && !button.disabled); const detailsExcluded = !document.querySelector( - '#cockpit-radio-panel #context-radio-details-btn, ' - + '#cockpit-radio-panel #radio-filter, #cockpit-radio-panel #radio-tuner', + '#cockpit-radio-panel #radio-filter, #cockpit-radio-panel #radio-tuner', ); const scenesHidden = getComputedStyle(scene).display === 'none'; radio.click(); @@ -2331,7 +2213,7 @@ async function main() { scenesHidden, mapProviderUtilityStable, hudInteractionsExact: layoutSteps.map((step) => step.hud).join('>') - === 'TACTICAL>OPERATOR>MINIMAL>OFF>MINIMAL', + === 'TACTICAL>MINIMAL>OFF>MINIMAL>TACTICAL', // The accordion clears the topline, Cockpit cards, and Cesium credits // across every HUD layout. Its list owns any overflow internally. leftLaneClearAcrossHudCycle: layoutSteps.every((step) => ( @@ -2381,7 +2263,6 @@ async function main() { manager.setPanelCollapsed('global-context-panel', prior.contextCollapsed); if (display.getAttribute('aria-expanded') !== String(prior.displayExpanded)) display.click(); if (radio.getAttribute('aria-expanded') !== String(prior.radioExpanded)) radio.click(); - manager._setRadioDisclosure(prior.contextRadioExpanded); hud.hidden = prior.hudHidden; signal.hidden = prior.signalHidden; if (prior.utilityTop) hud.style.setProperty('--cockpit-utility-top', prior.utilityTop); @@ -2416,7 +2297,6 @@ async function main() { && document.getElementById('global-context-panel').classList.contains('collapsed') === prior.contextCollapsed && display.getAttribute('aria-expanded') === String(prior.displayExpanded) && radio.getAttribute('aria-expanded') === String(prior.radioExpanded) - && document.getElementById('context-radio-toggle-btn')?.getAttribute('aria-expanded') === String(prior.contextRadioExpanded) && hud.hidden === prior.hudHidden && signal.hidden === prior.signalHidden && intelHud.style.getPropertyValue('transition') === priorHudTransition @@ -2472,21 +2352,20 @@ async function main() { check('first Play scenario starts without a leaked Radio selection', firstPlayPrecondition === null, `selected=${firstPlayPrecondition}`); await page.select('#radio-filter', 'all'); - await page.$eval('#context-radio-toggle-btn', (button) => { - if (button.getAttribute('aria-expanded') !== 'true') button.click(); - }); await page.evaluate(() => { const camera = window.__godsEyeView.viewer.camera; window.__qaFirstPlayFlyToCalls = []; window.__qaFirstPlayOriginalFlyTo = camera.flyTo; camera.flyTo = (options) => window.__qaFirstPlayFlyToCalls.push(options); - document.getElementById('context-radio-toggle-btn').focus(); }); - await page.$eval('#context-radio-mini-play-btn', (button) => button.click()); + const firstPlayPanels = await revealRadioControls(page, 'radio-play-btn'); + await page.focus('#radio-play-btn'); + await page.click('#radio-play-btn'); await page.waitForFunction(() => { const state = window.__godsEyeView.dataManager.layers.get('radio').module.getUIState(); return state.audioState === 'playing' || state.audioState === 'error'; }); + await restoreRadioPanels(page, firstPlayPanels); const postMicroDragPlayback = await page.evaluate(async () => { const mod = window.__godsEyeView.dataManager.layers.get('radio').module; let state = mod.getUIState(); @@ -2593,59 +2472,19 @@ async function main() { ); await page.select('#radio-filter', 'news'); - await page.$eval('#context-radio-mini-volume', (input) => { + await page.$eval('#radio-volume', (input) => { input.value = '35'; input.dispatchEvent(new Event('input', { bubbles: true })); }); - const compactVolume = await page.evaluate(() => ({ + const radioVolume = await page.evaluate(() => ({ volume: window.__godsEyeView.dataManager.layers.get('radio').module.getUIState().volume, full: document.getElementById('radio-volume').value, - mini: document.getElementById('context-radio-mini-volume').value, + label: document.getElementById('radio-volume-value').textContent, })); - check('compact volume shares the full Radio player state', Math.abs(compactVolume.volume - 0.35) < 0.001 && compactVolume.full === '35' && compactVolume.mini === '35'); - - const compactDisclosureContinuity = await page.evaluate(async () => { - const radio = window.__godsEyeView.dataManager.layers.get('radio').module; - const manager = window.__godsEyeView.styleManager; - manager.setPanelCollapsed('global-context-panel', true); - manager._setRadioDisclosure(true); - await radio.play({ origin: 'user' }); - const before = radio.getUIState(); - const disclosure = document.getElementById('context-radio-toggle-btn'); - if (disclosure.getAttribute('aria-expanded') !== 'true') disclosure.click(); - disclosure.click(); - const closed = { - expanded: disclosure.getAttribute('aria-expanded'), - hidden: document.getElementById('context-radio-mini').hidden, - state: radio.getUIState(), - }; - disclosure.click(); - return { - before, - closed, - reopened: disclosure.getAttribute('aria-expanded'), - miniHidden: document.getElementById('context-radio-mini').hidden, - after: radio.getUIState(), - }; - }); check( - 'compact disclosure preserves playback, station, filter, and volume continuity', - compactDisclosureContinuity.closed.expanded === 'false' - && compactDisclosureContinuity.closed.hidden - && compactDisclosureContinuity.reopened === 'true' - && !compactDisclosureContinuity.miniHidden - && compactDisclosureContinuity.before.audioState === 'playing' - && compactDisclosureContinuity.closed.state.audioState === 'playing' - && compactDisclosureContinuity.after.audioState === 'playing' - && compactDisclosureContinuity.after.selected?.id === compactDisclosureContinuity.before.selected?.id - && compactDisclosureContinuity.after.filter === compactDisclosureContinuity.before.filter - && compactDisclosureContinuity.after.volume === compactDisclosureContinuity.before.volume, - JSON.stringify({ - before: compactDisclosureContinuity.before, - closed: compactDisclosureContinuity.closed, - reopened: compactDisclosureContinuity.reopened, - after: compactDisclosureContinuity.after, - }), + 'full Radio volume drives the Radio player state', + Math.abs(radioVolume.volume - 0.35) < 0.001 && radioVolume.full === '35' && radioVolume.label === '35%', + JSON.stringify(radioVolume), ); const voicePause = await page.evaluate(async () => { @@ -2709,11 +2548,13 @@ async function main() { idleVoice.audioState === 'paused', idleVoice.audioState, ); - const manualPlayTarget = await page.evaluate(() => { + const manualPlayTarget = await page.evaluate(async () => { const manager = window.__godsEyeView.styleManager; - manager.setPanelCollapsed('global-context-panel', true); - manager._setRadioDisclosure(true); - const button = document.getElementById('context-radio-mini-play-btn'); + manager.setPanelCollapsed('global-context-panel', false); + manager.setPanelCollapsed('radio-panel', false); + await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve))); + const button = document.getElementById('radio-play-btn'); + button.scrollIntoView({ block: 'nearest' }); const rect = button.getBoundingClientRect(); const style = getComputedStyle(button); return { @@ -2728,12 +2569,12 @@ async function main() { }; }); check( - 'manual voice takeover targets the visible compact Radio Play control', + 'manual voice takeover targets the visible full Radio Play control', manualPlayTarget.visible && manualPlayTarget.enabled, JSON.stringify(manualPlayTarget), ); if (manualPlayTarget.visible && manualPlayTarget.enabled) { - await page.click('#context-radio-mini-play-btn'); + await page.click('#radio-play-btn'); await page.waitForFunction(() => ( window.__godsEyeView.dataManager.layers.get('radio').module.getUIState().audioState === 'playing' && window.__godsEyeView.voiceCommands.status === 'idle' @@ -2781,7 +2622,6 @@ async function main() { await page.evaluate(() => window.__godsEyeView.voiceCommands.setStatus('idle', 'QA complete')); await page.evaluate(async () => { const manager = window.__godsEyeView.styleManager; - manager._setRadioDisclosure(false); manager.setPanelCollapsed('global-context-panel', false); manager.setPanelCollapsed('radio-panel', false); await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve))); @@ -3835,22 +3675,22 @@ async function main() { gev.dataManager.layers.get('flights').enabled = true; }); await sleep(500); - await page.evaluate(() => window.__godsEyeView.styleManager.setPanelCollapsed('global-context-panel', true)); await page.evaluate(() => { - const button = document.getElementById('context-radio-toggle-btn'); - if (button.getAttribute('aria-expanded') !== 'true') button.click(); + const manager = window.__godsEyeView.styleManager; + manager.setPanelCollapsed('global-context-panel', false); + manager.setPanelCollapsed('radio-panel', false); }); - await page.waitForSelector('#context-radio-mini', { visible: true }); + await page.waitForSelector('#radio-next-btn', { visible: true }); await page.evaluate(() => { window.__qaRadioCameraHeight = window.__godsEyeView.viewer.camera.positionCartographic.height; }); const radioOnlyNextDispatched = await page.evaluate(() => { - const button = document.getElementById('context-radio-mini-next-btn'); + const button = document.getElementById('radio-next-btn'); if (!button) return false; button.click(); return true; }); - if (!radioOnlyNextDispatched) throw new Error('Radio compact next button unavailable'); + if (!radioOnlyNextDispatched) throw new Error('Radio next button unavailable'); await page.waitForFunction(() => typeof window.__qaRejectRadioPlay === 'function'); await page.evaluate(() => { const viewer = window.__godsEyeView.viewer; @@ -3885,7 +3725,7 @@ async function main() { flyToCalls: window.__qaRadioFlyToCalls.length, flightTargets, cameraHeight: window.__qaRadioCameraHeight, - compactPlayLabel: document.getElementById('context-radio-mini-play-btn').getAttribute('aria-label'), + playLabel: document.getElementById('radio-play-btn').getAttribute('aria-label'), regularMarkerSize: Array.from({ length: window.__godsEyeView.viewer.dataSources.length }, (_, index) => window.__godsEyeView.viewer.dataSources.get(index)) .find((item) => item.name === 'Radio stations')?.entities.values[0]?.point?.pixelSize?.getValue(), selectedMarkerSize: selectedEntity?.point?.pixelSize?.getValue(), @@ -3898,7 +3738,7 @@ async function main() { }; }); check( - 'compact Next follows stable directory order and retries its next available station', + 'Radio Next follows stable directory order and retries its next available station', playing.state.selected?.id === playing.expectedFallback?.id && playing.calls[0] === playing.expectedPrimary?.streamUrl && playing.calls[1] === playing.expectedFallback?.streamUrl, @@ -3909,9 +3749,9 @@ async function main() { fallback: playing.expectedFallback?.id, }), ); - check('compact next is explicit playback and updates play/pause state', playing.calls.length === 2 && playing.compactPlayLabel.startsWith('Pause')); + check('Radio next is explicit playback and updates play/pause state', playing.calls.length === 2 && playing.playLabel.startsWith('Pause')); check( - 'compact next rotates toward its station without changing zoom, including fallback', + 'Radio next rotates toward its station without changing zoom, including fallback', playing.flyToCalls === 2 && Math.abs(playing.flightTargets[0]?.lat - playing.expectedPrimary?.lat) < 0.001 && Math.abs(playing.flightTargets[0]?.lon - playing.expectedPrimary?.lon) < 0.001 @@ -3950,11 +3790,11 @@ async function main() { }; return [ await run('flights', 'radio-next-btn'), - await run('military', 'context-radio-mini-prev-btn'), + await run('military', 'radio-prev-btn'), ]; }); check( - 'full and compact Radio navigation preserve Flights/Military camera ownership', + 'full Radio Next and Prev navigation preserve Flights/Military camera ownership', trackedRadioControls.every((sample) => sample.afterStationId && sample.afterStationId !== sample.beforeStationId && sample.flyToDelta === 0 @@ -3968,7 +3808,7 @@ async function main() { viewer.trackedEntity = undefined; window.__qaRadioDelayNextFailure = true; const beforeFlyToCalls = window.__qaRadioFlyToCalls.length; - document.getElementById('context-radio-mini-next-btn')?.click(); + document.getElementById('radio-next-btn')?.click(); return { beforeFlyToCalls }; }); await page.waitForFunction(() => typeof window.__qaRejectRadioPlay === 'function'); @@ -4244,7 +4084,7 @@ async function main() { window.__godsEyeView.dataManager.layers.get('flights').enabled = false; }); const radioOnlyNextClicked = await page.evaluate(() => { - const button = document.getElementById('context-radio-mini-next-btn'); + const button = document.getElementById('radio-next-btn'); if (!(button instanceof HTMLButtonElement)) return false; button.click(); return true; @@ -4508,106 +4348,12 @@ async function main() { && companion.radioCollapsed && !companion.contextCollapsed && companion.nested, ); - const expandedContextRadioBefore = await page.evaluate(() => { - const gev = window.__godsEyeView; - const scroller = document.querySelector('#global-context-panel .global-context-panel-inner'); - scroller.scrollTop = 0; - const camera = gev.viewer.camera.positionWC; - return { - scrollTop: scroller.scrollTop, - pageY: window.scrollY, - camera: { x: camera.x, y: camera.y, z: camera.z }, - plays: window.__qaRadioPlayCalls.length, - }; - }); - await page.click('#context-radio-toggle-btn'); - await page.waitForFunction(() => !document.getElementById('radio-panel').classList.contains('collapsed')); - await page.waitForFunction((priorScroll) => ( - document.activeElement?.getAttribute('data-collapse-target') === 'radio-panel' - && document.querySelector('#global-context-panel .global-context-panel-inner').scrollTop > priorScroll - ), { timeout: 10_000 }, expandedContextRadioBefore.scrollTop); - const expandedContextRadioAfter = await page.evaluate(() => { - const gev = window.__godsEyeView; - gev.styleManager._renderRadioState(gev.dataManager.layers.get('radio').module.getUIState()); - const launcher = document.getElementById('context-radio-toggle-btn'); - const radio = document.getElementById('radio-panel'); - const scroller = document.querySelector('#global-context-panel .global-context-panel-inner'); - const camera = gev.viewer.camera.positionWC; - return { - ariaControls: launcher.getAttribute('aria-controls'), - expanded: launcher.getAttribute('aria-expanded'), - label: launcher.getAttribute('aria-label'), - radioCollapsed: radio.classList.contains('collapsed'), - compactHidden: document.getElementById('context-radio-mini').hidden, - scrollTop: scroller.scrollTop, - focusTarget: document.activeElement?.getAttribute('data-collapse-target'), - pageY: window.scrollY, - camera: { x: camera.x, y: camera.y, z: camera.z }, - plays: window.__qaRadioPlayCalls.length, - state: gev.dataManager.layers.get('radio').module.getUIState().audioState, - }; - }); - const expandedContextRadioCameraDelta = Math.hypot( - expandedContextRadioAfter.camera.x - expandedContextRadioBefore.camera.x, - expandedContextRadioAfter.camera.y - expandedContextRadioBefore.camera.y, - expandedContextRadioAfter.camera.z - expandedContextRadioBefore.camera.z, - ); - check( - 'expanded Context Radio icon reveals and scrolls to embedded Radio without an overlay or playback/camera theft', - expandedContextRadioAfter.ariaControls === 'radio-panel' - && expandedContextRadioAfter.expanded === 'true' - && expandedContextRadioAfter.label === 'Go to expanded Radio section' - && !expandedContextRadioAfter.radioCollapsed - && expandedContextRadioAfter.compactHidden - && expandedContextRadioAfter.scrollTop > expandedContextRadioBefore.scrollTop - && expandedContextRadioAfter.focusTarget === 'radio-panel' - && expandedContextRadioAfter.pageY === expandedContextRadioBefore.pageY - && expandedContextRadioCameraDelta < 0.01 - && expandedContextRadioAfter.plays === expandedContextRadioBefore.plays - && expandedContextRadioAfter.state === 'playing', - JSON.stringify({ - before: expandedContextRadioBefore, - after: expandedContextRadioAfter, - cameraDelta: expandedContextRadioCameraDelta, - }), - ); - await page.evaluate(() => { const manager = window.__godsEyeView.styleManager; - manager.setPanelCollapsed('global-context-panel', true); - manager._setRadioDisclosure(true); + manager.setPanelCollapsed('global-context-panel', false); + manager.setPanelCollapsed('radio-panel', false); }); - await page.waitForFunction(() => { - const close = document.getElementById('context-radio-mini-close-btn'); - const rect = close.getBoundingClientRect(); - return !document.getElementById('context-radio-mini').hidden && rect.width > 0 && rect.height > 0; - }); - await page.click('#context-radio-mini-close-btn'); - const closedCompact = await page.evaluate(() => { - const launcher = document.getElementById('context-radio-toggle-btn'); - return { - radioCollapsed: document.getElementById('radio-panel').classList.contains('collapsed'), - compactHidden: document.getElementById('context-radio-mini').hidden, - focusRestored: document.activeElement === launcher, - }; - }); - await page.click('#context-radio-toggle-btn'); - await page.waitForFunction(() => !document.getElementById('context-radio-mini').hidden); - await page.click('#context-radio-details-btn'); - const repeatedOpen = await page.evaluate(() => ({ - radioCollapsed: document.getElementById('radio-panel').classList.contains('collapsed'), - compactHidden: document.getElementById('context-radio-mini').hidden, - })); - const splitDetailActions = { closedCompact, repeatedOpen }; - check( - 'collapsed Context keeps compact close and full-panel open as separate stable actions', - !splitDetailActions.closedCompact.radioCollapsed - && splitDetailActions.closedCompact.compactHidden - && splitDetailActions.closedCompact.focusRestored - && !splitDetailActions.repeatedOpen.radioCollapsed - && splitDetailActions.repeatedOpen.compactHidden, - JSON.stringify(splitDetailActions), - ); + await page.waitForFunction(() => !document.getElementById('radio-panel').classList.contains('collapsed')); await page.click('#global-context-flights-btn'); await page.waitForFunction(() => !document.getElementById('context-flights-view').hidden); diff --git a/scripts/qa-scope-hud.mjs b/scripts/qa-scope-hud.mjs index 7fece45ee..1607b2631 100644 --- a/scripts/qa-scope-hud.mjs +++ b/scripts/qa-scope-hud.mjs @@ -345,7 +345,7 @@ try { (await readScope()).feather === 2, ); await page.click('#scope-toggle'); - for (const layout of ['minimal', 'operator', 'cyber', 'tactical']) { + for (const layout of ['minimal', 'cyber', 'tactical']) { await page.select('#hud-layout-select', layout); const state = await readScope(); check( @@ -395,7 +395,7 @@ try { restored, ); - for (const layout of ['minimal', 'operator', 'tactical']) { + for (const layout of ['minimal', 'tactical']) { await page.select('#hud-layout-select', layout); await page.evaluate(() => window.__godsEyeView.styleManager.applyVisualState({ @@ -429,20 +429,13 @@ try { wrappersTransparent: wrappers.every( (el) => getComputedStyle(el).display === 'contents', ), - operatorFrame: - hud.dataset.variant !== 'operator' || - (getComputedStyle(hud.querySelector('.hud-corner')) - .backgroundColor === 'rgba(0, 0, 0, 0.36)' && - getComputedStyle(hud.querySelector('.hud-top-bar')) - .backgroundImage !== 'none'), }; }); check( `${layout}: Scope ON retains the original presentation without new backplates`, original.markerAbsent && original.unbacked && - original.wrappersTransparent && - original.operatorFrame, + original.wrappersTransparent, original, ); check( @@ -571,7 +564,7 @@ try { ); }); const broadBackings = [ - ...hud.querySelectorAll('.hud-corner, .hud-top-bar, .hud-bottom-bar'), + ...hud.querySelectorAll('.hud-corner, .hud-bottom-bar'), ].filter( (el) => el.offsetWidth > 0 && @@ -656,7 +649,7 @@ try { }), ); check('narrow HUD text backings stay within the viewport', narrow); - for (const layout of ['minimal', 'operator', 'tactical']) { + for (const layout of ['minimal', 'tactical']) { await page.select('#hud-layout-select', layout); await page.evaluate(() => window.__godsEyeView.styleManager.applyVisualState({ diff --git a/scripts/qa-visual-effects.mjs b/scripts/qa-visual-effects.mjs index db0696e08..f3b9ab8bd 100644 --- a/scripts/qa-visual-effects.mjs +++ b/scripts/qa-visual-effects.mjs @@ -80,7 +80,6 @@ try { 'thermal', 'anime', 'noir', - 'snow', 'normal', ]) { await page.evaluate( diff --git a/server/providers/openai/instructions.js b/server/providers/openai/instructions.js index c9c4a43b4..acf576d13 100644 --- a/server/providers/openai/instructions.js +++ b/server/providers/openai/instructions.js @@ -46,15 +46,15 @@ function realtimeInstructions( // string is the whole rollback. 'NAMED VIEWS are shorthand for tool calls you already have — there is no "mode" tool for them. Treat ONLY these as the shorthand: "infrastructure mode" / "the infrastructure view" / "show me global infrastructure" means three set_layer_visibility calls (local-datacenters, local-dams, telegeography-submarine-cables) plus zoom_to_globe; "environmental mode" / "earth watch" / "active events", said as the name of a view, means set_layer_visibility for local-firms and earthquakes plus zoom_to_globe. Anything vaguer is NOT this shorthand — an open-ended question about the world or the news is an ordinary question: answer it, or use analyst_query over the layers already on. Never switch a whole view on to answer a question nobody asked to see. When you do run one, make every call before speaking, then give one confirmation naming the resulting state; if the fires layer comes back unavailable because no FIRMS key is configured, say so plainly — the earthquakes still loaded. "Live contacts" and "space missions" are NOT this pattern: they stay set_context_mode{mode:"contacts"} and set_context_mode{mode:"space-missions"}.', 'For visual filter requests, call set_visual_style with one of the allowed style IDs.', - 'SHIPS vs STYLES: "vessels" is easily heard as "visuals". "Show me vessels", "turn on vessels", "the vessels", "visuals" or "vestibules" said WITHOUT a style name means the ships layer: set_layer_visibility{layerId:"ais-live-vessels"}, exactly as "ships" or "boats" does. Call set_visual_style only when the user names a style (retro/CRT, surveillance/night vision, thermal, anime, noir, snow, normal) or says filter, effect or look. Never turn on a different data layer (such as fires) for a ships request.', + 'SHIPS vs STYLES: "vessels" is easily heard as "visuals". "Show me vessels", "turn on vessels", "the vessels", "visuals" or "vestibules" said WITHOUT a style name means the ships layer: set_layer_visibility{layerId:"ais-live-vessels"}, exactly as "ships" or "boats" does. Call set_visual_style only when the user names a style (retro/CRT, surveillance/night vision, thermal, anime, noir, normal) or says filter, effect or look. Never turn on a different data layer (such as fires) for a ships request.', 'Disambiguation table — basemap vs layer vs style: basemap switching requires an explicit stack name — "Bing aerial" means set_map_stack bing-aerial, "aerial with labels" means bing-labels, "OSM"/"road map" means osm, "Esri"/"Esri imagery" means esri-imagery, "Google 3D"/"photorealistic" means photoreal. Any other mention of "satellite" or "satellites" means the satellites DATA LAYER via set_layer_visibility, never a basemap — except "recent/latest satellite imagery" (the recent-imagery layer) and "weather satellite"/clouds (weather-satellite). "surveillance"/"night vision"/"thermal" are visual STYLES via set_visual_style.', - 'HUD requests ("hud on/off", "switch to operator/minimal/tactical/cyber layout") use set_hud. Detection requests ("detection on", "dense mode", "balanced mode", "sparse mode", "set density to 25", "use weighted allocation") use set_detection. Density snaps to 0/25/50/75/100 and derives Sparse/Balanced/Dense; panoptic is a legacy alias for Dense.', + 'HUD requests ("hud on/off", "switch to minimal/tactical/cyber layout") use set_hud. Detection requests ("detection on", "dense mode", "balanced mode", "sparse mode", "set density to 25", "use weighted allocation") use set_detection. Density snaps to 0/25/50/75/100 and derives Sparse/Balanced/Dense; panoptic is a legacy alias for Dense.', 'Cyber sonar requests use set_cyber_sonar: enabled, rings, rangePct, intensityPct (Power), opacityPct, sectorDeg. For settings questions read get_current_view_state.controls.hud.sonar. Sonar is not detection. Do not silently switch themes, reveal the HUD or enable sonar when changing a slider. If the user explicitly requests Cyber plus sonar settings, call set_hud first, wait for success, then set_cyber_sonar. Confirm returned values; mapSweepActive and contactSweepActive distinguish saved settings from active map effects, including in Cockpit or reduced motion. Do not claim visible contacts solely because enabled is true.', 'Bloom/sharpen requests use set_post_processing. Scene requests ("play orbital watch", "stop the scene", "what scenes are there") use control_scene. CCTV camera requests ("next camera", "nearest camera", "select the Congress camera", "show coverage") use control_cctv — the CCTV layer must be enabled first.', 'Radio playback requests use control_radio. "Turn on/start the radio" means action=play; action=enable only reveals Radio markers and must be reserved for explicit "show/enable the Radio layer/markers" requests. After a prepared playback result, briefly confirm any other completed actions and say "Turning on the radio"—never claim it is already playing. The client keeps Radio muted until playback is verified, then closes voice before restoring Radio volume. Examples: "play news near Austin" → select category=news locationId=austin; "play US news" → select category=news country=US; "Radio volume 30" → volume; pause/resume/stop/next/previous use the matching action. Radio selection never moves the camera.', '"Track/follow " (a callsign, ship name, satellite name) uses track_entity. "Take me to the biggest fire" uses track_entity with query "biggest fire" (the fires layer must be enabled). Bare "orbit" means camera orbit of the current landmark. "Stop following/tracking" uses stop_tracking.', '"Show me which planes are overhead"/"frame the ships"/"show me the satellites above" use frame_overhead with the matching target.', - 'Confirmations echo the RESULTING state, never the request: "HUD operator layout", "Density twenty-five percent", "Bing aerial imagery", "Tracking UAL428", "Framed fourteen aircraft". On ok=false, state the failure plainly: "Nothing matched UAL999", "No ships within 120 kilometers". Never claim an action without ok=true in the tool result.', + 'Confirmations echo the RESULTING state, never the request: "HUD minimal layout", "Density twenty-five percent", "Bing aerial imagery", "Tracking UAL428", "Framed fourteen aircraft". On ok=false, state the failure plainly: "Nothing matched UAL999", "No ships within 120 kilometers". Never claim an action without ok=true in the tool result.', 'For destination requests such as "take me to Italy", "go to NYC", or "show me the Eiffel Tower", call fly_to_location. Prefer known city IDs when available; otherwise pass the plain place query.', 'Navigation-only requests ("take me to X", "go to X", "fly to X") are NOT descriptions: call fly_to_location alone and do NOT also call annotate_map, unless the user explicitly asks to mark the place or you go on to explain specific places there. Never drop a point pin on a region-scale natural feature (a mountain range, desert, sea, or forest) — a single point in the middle of the Rockies is meaningless. If the user explicitly asks to mark such a region, prefer type=area.', 'For country and city destinations, omit rangeM so GEV frames the whole country or city in view. For landmarks and buildings, omit rangeM so GEV chooses a close landmark view.', diff --git a/src/app/embed.test.mjs b/src/app/embed.test.mjs index 54799567e..5fa949342 100644 --- a/src/app/embed.test.mjs +++ b/src/app/embed.test.mjs @@ -146,6 +146,12 @@ test('an embedded page takes views only from its parent and answers it', async ( id: 3, view: { camera: { lat: 1, lon: 2 }, layers: ['flights'] }, }); + // A view kept from before Snow was retired still applies, on Normal. + send(parent, { + type: 'gev:view', + id: 4, + view: { camera: { lat: 1, lon: 2 }, style: 'snow' }, + }); await new Promise((resolve) => setTimeout(resolve, 10)); assert.deepEqual(posted[1], { type: 'gev:view-applied', @@ -161,6 +167,13 @@ test('an embedded page takes views only from its parent and answers it', async ( name === 'set_layer_visibility' && args.layerId === 'flights', ), ); + assert.equal(posted[3].id, 4); + assert.equal(posted[3].ok, true); + assert.ok( + calls.some( + ([name, args]) => name === 'set_visual_style' && args.style === 'normal', + ), + ); assert.equal(posted.filter((message) => message.id === 1).length, 0); // Ready names no data and goes to any parent; answers go only to the // origin that asked. @@ -168,6 +181,7 @@ test('an embedded page takes views only from its parent and answers it', async ( '*', 'https://host.example', 'https://host.example', + 'https://host.example', ]); remove(); }); diff --git a/src/celestialRing.test.mjs b/src/celestialRing.test.mjs index 7260c99fc..6ee9648b3 100644 --- a/src/celestialRing.test.mjs +++ b/src/celestialRing.test.mjs @@ -87,7 +87,7 @@ test('circular angle distance remains small across the wrap point', () => { test('celestial ring is available only in Normal style', () => { assert.equal(isCelestialRingStyleSupported('normal'), true); - for (const style of ['retro', 'surveillance', 'thermal', 'anime', 'noir', 'snow']) { + for (const style of ['retro', 'surveillance', 'thermal', 'anime', 'noir']) { assert.equal(isCelestialRingStyleSupported(style), false); } }); diff --git a/src/cockpitMarkup.test.mjs b/src/cockpitMarkup.test.mjs index 0b376d9fc..075b5a0ad 100644 --- a/src/cockpitMarkup.test.mjs +++ b/src/cockpitMarkup.test.mjs @@ -151,7 +151,7 @@ test('Cockpit vision cycle exposes every map preset exactly once', () => { ); assert.match( setVisionMode.toString(), - /const labels = \{\s*optical: t\('NORMAL'\),\s*crt: t\('CRT'\),\s*nvg: t\('NVG'\),\s*thermal: t\('FLIR'\),\s*anime: t\('ANIME'\),\s*noir: t\('NOIR'\),\s*snow: t\('SNOW'\),?\s*\};/, + /const labels = \{\s*optical: t\('NORMAL'\),\s*crt: t\('CRT'\),\s*nvg: t\('NVG'\),\s*thermal: t\('FLIR'\),\s*anime: t\('ANIME'\),\s*noir: t\('NOIR'\),?\s*\};/, ); assert.doesNotMatch(setVisionMode.toString(), /none: 'NONE'/); assert.doesNotMatch(ui, /getInheritedVisionLabel/); @@ -227,13 +227,9 @@ test('Cockpit Escape handling precedes form-control shortcut suppression and foc ); }); -test('Cockpit shortcut failures do not leak and open Radio owns the first Escape', () => { +test('Cockpit shortcut failures do not leak and open utilities own the first Escape', () => { const keydown = cockpitKeyDown.toString(); assert.ok(keydown, 'Cockpit keyboard handler is missing'); - assert.match( - keydown, - /document\s*\.getElementById\('context-radio-dock'\)\s*\?\.classList\.contains\('disclosure-open'\)/, - ); assert.match(keydown, /#cockpit-utility-controls \[aria-expanded="true"\]/); assert.match( keydown, @@ -443,7 +439,7 @@ test('Cockpit owns a focused shared Display portal and compact Radio controls', assert.ok(cockpitRadio, 'Cockpit compact Radio controls are missing'); assert.doesNotMatch( cockpitRadio[0], - /context-radio-details-btn|radio-filter|radio-tuner/, + /radio-filter|radio-tuner/, ); assert.match( css, @@ -898,7 +894,7 @@ test('Cockpit Radio station changes preserve first-person camera ownership', () ); assert.match( radioBindings, - /listen\(this\._contextRadioMiniNextBtn, 'click', \(\) => cycleRadio\(1\)\)/, + /listen\(this\._radioNextBtn, 'click', \(\) => cycleRadio\(1\)\)/, ); assert.match( radioBindings, diff --git a/src/cockpitVisionPolicy.js b/src/cockpitVisionPolicy.js index 1b1c4e4b8..a6c319269 100644 --- a/src/cockpitVisionPolicy.js +++ b/src/cockpitVisionPolicy.js @@ -5,7 +5,6 @@ export const COCKPIT_VISION_MODES = Object.freeze([ 'thermal', 'anime', 'noir', - 'snow', ]); const TARGET_STYLE_BY_MODE = Object.freeze({ @@ -14,7 +13,6 @@ const TARGET_STYLE_BY_MODE = Object.freeze({ thermal: 'thermal', anime: 'anime', noir: 'noir', - snow: 'snow', }); const COCKPIT_MODE_BY_STYLE = Object.freeze({ @@ -24,7 +22,6 @@ const COCKPIT_MODE_BY_STYLE = Object.freeze({ thermal: 'thermal', anime: 'anime', noir: 'noir', - snow: 'snow', }); /** Normalize a requested Cockpit vision mode to the unfiltered Normal entry. */ diff --git a/src/cockpitVisionPolicy.test.mjs b/src/cockpitVisionPolicy.test.mjs index 3e5607543..be1ebceab 100644 --- a/src/cockpitVisionPolicy.test.mjs +++ b/src/cockpitVisionPolicy.test.mjs @@ -23,7 +23,6 @@ test('Cockpit vision order mirrors the unique map preset order', () => { 'thermal', 'anime', 'noir', - 'snow', ]); assert.equal(normalizeCockpitVisionMode('none'), 'optical'); assert.equal(normalizeCockpitVisionMode('unknown'), 'optical'); @@ -36,7 +35,7 @@ test('Cockpit entry selects the vision mode equivalent to the active map style', assert.equal(cockpitVisionModeForStyle('thermal'), 'thermal'); assert.equal(cockpitVisionModeForStyle('anime'), 'anime'); assert.equal(cockpitVisionModeForStyle('noir'), 'noir'); - assert.equal(cockpitVisionModeForStyle('snow'), 'snow'); + assert.equal(cockpitVisionModeForStyle('snow'), 'optical'); assert.equal(cockpitVisionModeForStyle('unsupported'), 'optical'); }); diff --git a/src/contextTabKeyboard.test.mjs b/src/contextTabKeyboard.test.mjs index 6994459a7..ca44d4c25 100644 --- a/src/contextTabKeyboard.test.mjs +++ b/src/contextTabKeyboard.test.mjs @@ -129,7 +129,7 @@ test('Context tabs draw a visible keyboard-focus outline including active tabs', test('Context async action buttons remain focused while busy', () => { const init = _initGlobalContextPanel.toString(); - const radio = radioBindings.slice(radioBindings.indexOf('const toggleRadio = async (trigger) => {'), radioBindings.indexOf('this.listen(this._contextRadioToggleBtn,')); + const radio = radioBindings.slice(radioBindings.indexOf('const toggleRadio = async (trigger) => {'), radioBindings.indexOf('this.listen(this._cockpitRadioToggleBtn,')); const radioSync = radioPresentation.slice(0, radioPresentation.indexOf('if (this._radioFilter)')); const clear = clearSelectedLayers.toString(); @@ -137,7 +137,7 @@ test('Context async action buttons remain focused while busy', () => { assert.doesNotMatch(init, /button\.disabled\s*=\s*true/); assert.match(radio, /trigger\.getAttribute\('aria-busy'\) === 'true'/); assert.doesNotMatch(radio, /trigger\.disabled\s*=\s*true/); - for (const name of ['_radioEnableBtn', '_contextRadioMiniEnableBtn', '_cockpitRadioEnableBtn']) { + for (const name of ['_radioEnableBtn', '_cockpitRadioEnableBtn']) { assert.match(radioSync, new RegExp(`${name}\\.disabled = false`)); } assert.doesNotMatch(clear, /_clearSelectedLayersBtn\.disabled\s*=\s*true/); @@ -146,3 +146,36 @@ test('Context async action buttons remain focused while busy', () => { assert.match(control, /button\.setAttribute\('aria-busy', String\(busy\)\)/); assert.doesNotMatch(control, /button\.disabled\s*=/); }); + +test('Context header holds only its title and collapse control', () => { + const panel = html.match(/
([\s\S]*?)<\/div>\s*
`${tag}.${cls}`); + assert.deepEqual(tags, ['span.panel-title', 'span.panel-divider', 'button.panel-collapse-btn']); +}); + +test('Context reads as one segmented control with legible type and no halo', () => { + const rules = [...css.matchAll(/([^{}]+)\{([^{}]*)\}/g)]; + const clean = (selector) => selector.replace(/\/\*[\s\S]*?\*\//g, '').replace(/\s+/g, ' ').trim(); + const rule = (selector) => rules.find(([, s]) => clean(s) === selector)?.[2] || ''; + const px = (body, prop) => Number(body.match(new RegExp(`${prop}:[^;]*?(\\d+(?:\\.\\d+)?)px`))?.[1] || 0); + + assert.match(rule('#global-context-panel .panel-glow'), /display:\s*none/); + const modes = rule('.global-context-modes'); + assert.match(modes, /border:\s*1px solid/); + assert.match(modes, /padding:\s*2px/); + assert.ok(px(rule('.context-mode-button'), 'font') >= 10, 'mode labels must stay at least 10px'); + assert.doesNotMatch(rule('.context-mode-button.active'), /box-shadow/); + const standby = rule('.context-mode-standby'); + assert.ok(px(standby, 'font') >= 10, 'standby guidance must stay at least 10px'); + assert.doesNotMatch(standby, /dashed/); + assert.ok(px(rule('.global-context-actions .panel-layer-toggle'), 'font-size') >= 10); + // Default theme only, expanded only: Cyber keeps its red titles and the + // collapsed launcher matches its sibling launchers. + assert.match( + rule(":root:not([data-ui-theme='cyber']) #global-context-panel:not(.collapsed) .panel-title"), + /color:\s*var\(--text-secondary\)/, + ); +}); diff --git a/src/data/cctv.js b/src/data/cctv.js index da65f5f08..ad95f2794 100644 --- a/src/data/cctv.js +++ b/src/data/cctv.js @@ -47,6 +47,8 @@ export const prioritizeActiveCctvGeometryRecord = export const processGeometryBatch = layer.processGeometryBatch; export const hideCctvRecordVisuals = layer.hideCctvRecordVisuals; export const refreshCoverageStyles = layer.refreshCoverageStyles; +export const refreshHorizonCulling = layer.refreshHorizonCulling; +export const _viewRecordIdsForTest = layer._viewRecordIdsForTest; export const clearProbeClampOnDeactivation = layer.clearProbeClampOnDeactivation; export const cctvRecordNeedsActivation = layer.cctvRecordNeedsActivation; diff --git a/src/data/cctv.test.mjs b/src/data/cctv.test.mjs index dafaeb5f6..0b7cee20f 100644 --- a/src/data/cctv.test.mjs +++ b/src/data/cctv.test.mjs @@ -1309,11 +1309,12 @@ test('CCTV null-active coverage, auto-hop, cycling, and panel targets stay hones assert.ok(renderer, '_renderCctvState is missing'); assert.match( renderer[0], - /else if \(!activeId\)[\s\S]*?selectedIndex = -1/, + // Nothing active clears the pick; only the outside-view note may show. + /else if \(!activeId\)[\s\S]*?selectedIndex =[^;]*\? 0 : -1;/, ); assert.match( renderer[0], - /_cctvFocusBtn\.disabled\s*=\s*!enabled\s*\|\|\s*cameras\.length === 0\s*\|\|\s*!activeId/, + /_cctvFocusBtn\.disabled\s*=\s*!enabled\s*\|\|\s*catalogCount === 0\s*\|\|\s*!activeId/, ); } finally { cctvLayer.setParams({ autoHop: false }); diff --git a/src/data/cctvViewThinning.test.mjs b/src/data/cctvViewThinning.test.mjs new file mode 100644 index 000000000..1bc94eed8 --- /dev/null +++ b/src/data/cctvViewThinning.test.mjs @@ -0,0 +1,251 @@ +// src/data/cctvViewThinning.test.mjs — the CCTV view pass: only cameras on or +// near the screen show, a zoomed-out view keeps one camera per world-anchored +// cell, and the layer's UI state never rebuilds every camera for a listener +// that does not read the list. +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import * as Cesium from 'cesium'; +import cctvLayer, { + _setCctvCoverageStateForTest, + _viewRecordIdsForTest, + refreshHorizonCulling, +} from './cctv.js'; + +const WIDTH = 800; +const HEIGHT = 600; + +/** + * Records at the given [lon, lat] degrees near the origin, each drawn at the + * screen point `screenAt` gives it (default: the middle of the screen). + */ +function recordsAt( + lonLats, + screenAt = () => ({ x: WIDTH / 2, y: HEIGHT / 2 }), +) { + const screenByPosition = new Map(); + const records = lonLats.map(([lon, lat], index) => { + const position = Cesium.Cartesian3.fromDegrees(lon, lat, 10); + screenByPosition.set(position, screenAt(index)); + return { + camera: { + id: `cam-${index}`, + name: `Camera ${index}`, + city: 'Test', + lat, + lon, + headingDeg: 0, + pitchDeg: -18, + fovDeg: 44, + rangeM: 145, + mountHeightM: 8, + }, + position, + billboard: { position, show: true }, + coverageEntities: [], + projection: null, + }; + }); + return { records, screenByPosition }; +} + +function viewerAt(heightM, screenByPosition, shiftX = 0) { + return { + isDestroyed: () => false, + camera: { + positionWC: Cesium.Cartesian3.fromDegrees(0, 0, heightM), + positionCartographic: { latitude: 0, longitude: 0, height: heightM }, + frustum: { fovy: Math.PI / 3 }, + }, + scene: { + canvas: { clientWidth: WIDTH, clientHeight: HEIGHT }, + cartesianToCanvasCoordinates: (position) => { + const screen = screenByPosition.get(position); + return screen && { x: screen.x + shiftX, y: screen.y }; + }, + }, + }; +} + +function shownIds(records) { + return records + .filter((record) => record.billboard.show) + .map((record) => record.camera.id) + .sort(); +} + +// Three cameras within ~110 m, and one ~22 km away. +const CLUSTER = [ + [0, 0], + [0.001, 0], + [0.0005, 0.0005], + [0.2, 0], +]; + +test('zoomed out, cameras sharing a ground cell show one icon', () => { + const { records, screenByPosition } = recordsAt(CLUSTER); + _setCctvCoverageStateForTest({ + viewer: viewerAt(20_000, screenByPosition), + records, + }); + assert.equal( + refreshHorizonCulling(), + true, + 'the first pass changes the view', + ); + const shown = shownIds(records); + assert.equal(shown.length, 2, 'one for the cluster, one for the far camera'); + assert.ok(shown.includes('cam-3'), 'a camera alone in its cell shows'); + assert.deepEqual(_viewRecordIdsForTest().sort(), shown); +}); + +test('a pan keeps the same winners, and an unchanged view keeps its list', () => { + const { records, screenByPosition } = recordsAt(CLUSTER, (index) => ({ + x: 100 + index * 7, + y: 300, + })); + _setCctvCoverageStateForTest({ + viewer: viewerAt(20_000, screenByPosition), + records, + }); + refreshHorizonCulling(); + const before = shownIds(records); + const list = _viewRecordIdsForTest(); + for (const shiftX of [3, 11, 20, 37]) { + _setCctvCoverageStateForTest({ + viewer: viewerAt(20_000, screenByPosition, shiftX), + records, + }); + refreshHorizonCulling(); + assert.deepEqual(shownIds(records), before, `pan by ${shiftX} px`); + } + assert.equal(refreshHorizonCulling(), false, 'the same view changes nothing'); + assert.deepEqual(_viewRecordIdsForTest(), list); +}); + +test('a small zoom within one cell size keeps the same winners', () => { + const { records, screenByPosition } = recordsAt(CLUSTER); + const shownAt = (heightM) => { + _setCctvCoverageStateForTest({ + viewer: viewerAt(heightM, screenByPosition), + records, + }); + refreshHorizonCulling(); + return shownIds(records); + }; + // Cells come in power-of-two metre steps: about 1.5 km and 1.6 km cells at + // these heights fall in the same step, so the same cameras win. + assert.deepEqual(shownAt(20_500), shownAt(20_000)); +}); + +test('a healthy camera wins its cell over an unknown one', () => { + const { records, screenByPosition } = recordsAt(CLUSTER.slice(0, 2)); + // Whichever camera the id order would pick, the healthy one must win. + for (const id of ['cam-0', 'cam-1']) { + _setCctvCoverageStateForTest({ + viewer: viewerAt(20_000, screenByPosition), + records, + healthById: new Map([[id, { status: 'ok' }]]), + }); + refreshHorizonCulling(); + assert.deepEqual(shownIds(records), [id]); + } +}); + +test('the active camera always shows, even in a crowded cell', () => { + const { records, screenByPosition } = recordsAt(CLUSTER.slice(0, 3)); + for (const active of records) { + _setCctvCoverageStateForTest({ + viewer: viewerAt(20_000, screenByPosition), + records, + activeCameraId: active.camera.id, + }); + refreshHorizonCulling(); + assert.ok(active.billboard.show, `${active.camera.id} shows while active`); + } +}); + +test('close up, every camera near the screen shows and far-off ones hide', () => { + const { records, screenByPosition } = recordsAt( + [ + [0, 0], + [0.0001, 0], + [0.0002, 0], + ], + (index) => + index === 2 ? { x: WIDTH * 3, y: HEIGHT / 2 } : { x: 100, y: 100 }, + ); + _setCctvCoverageStateForTest({ + viewer: viewerAt(300, screenByPosition), + records, + }); + refreshHorizonCulling(); + assert.deepEqual(shownIds(records), ['cam-0', 'cam-1']); +}); + +test('a disabled layer skips the view pass', () => { + const { records, screenByPosition } = recordsAt(CLUSTER); + _setCctvCoverageStateForTest({ + viewer: viewerAt(20_000, screenByPosition), + records, + enabled: false, + }); + assert.equal(refreshHorizonCulling(), false); + assert.deepEqual(_viewRecordIdsForTest(), []); +}); + +test('UI state builds the full camera list only when it is read', () => { + const { records, screenByPosition } = recordsAt(CLUSTER.slice(0, 2)); + _setCctvCoverageStateForTest({ + viewer: viewerAt(300, screenByPosition), + records, + }); + refreshHorizonCulling(); + let built = 0; + for (const record of records) { + const camera = record.camera; + record.camera = new Proxy(camera, { + get(target, key) { + if (key === 'calibration') built += 1; + return target[key]; + }, + }); + } + const first = cctvLayer.getUIState(); + assert.equal(built, 0, 'listeners that skip `cameras` cost nothing'); + assert.deepEqual( + first.cameraIndex.map((camera) => camera.id), + ['cam-0', 'cam-1'], + ); + assert.equal( + cctvLayer.getUIState().cameraIndex, + first.cameraIndex, + 'the index keeps its identity while the view does', + ); + assert.equal(first.cameras.length, 2); + assert.ok(built > 0, 'reading `cameras` builds it'); + assert.equal(first.cameras, first.cameras, 'and builds it once'); +}); + +test('the camera picker lists the view, with the active camera first', () => { + const { records, screenByPosition } = recordsAt( + [ + [0, 0], + [0.0001, 0], + [0.0002, 0], + ], + (index) => (index === 1 ? { x: WIDTH * 3, y: 0 } : { x: 100, y: 100 }), + ); + _setCctvCoverageStateForTest({ + viewer: viewerAt(300, screenByPosition), + records, + activeCameraId: 'cam-1', + }); + refreshHorizonCulling(); + const state = cctvLayer.getUIState(); + assert.deepEqual( + state.cameraIndex.map((camera) => camera.id), + ['cam-1', 'cam-0', 'cam-2'], + 'the off-screen active camera leads, then what is in view', + ); + assert.equal(state.cameras.length, 3, 'the full list is still every camera'); +}); diff --git a/src/data/directions.test.mjs b/src/data/directions.test.mjs index bf6e2878e..0522226d2 100644 --- a/src/data/directions.test.mjs +++ b/src/data/directions.test.mjs @@ -875,6 +875,13 @@ test('route numbers follow the page language and never break from their unit', ( ); const list = directionsStepList({ route }); assert.equal(list.items[1].lead, '240\u00a0ĐŒ'); + + // Japanese unit words follow the number: 1時間5戆, but 1.5 km. + setLocale('ja'); + assert.equal(routeDistanceText(1500), '1.5\u00a0km'); + assert.equal(routeDurationText(39), '39秒'); + assert.equal(routeDurationText(3900), '1時間5戆'); + assert.equal(routeDurationText(7200), '2時間'); }); test('ramp and lane wording stays localized after choosing the maneuver form', (t) => { @@ -892,6 +899,12 @@ test('ramp and lane wording stays localized after choosing the maneuver form', ( 'Toma la salida bruscamente a la derecha', 'Toma el carril izquierdo', ], + [ + 'ja', + 'ăƒ©ăƒłăƒ—ă‚’æ–œă‚ć·Šă«é€ČんでI-95に慄る', + 'ć‡șćŁă‚’æ€„è§’ćșŠă§ćłă«ć‡șる', + 'ć·Šè»Šç·šă‚’é€šèĄŒ', + ], [ 'zh-CN', 'ć‘ć·Šć‰æ–čé©¶ć…„ćŒé“ïŒŒèż›ć…„ I-95', @@ -919,3 +932,19 @@ test('ramp and lane wording stays localized after choosing the maneuver form', ( ); } }); + +test('the reroute tooltip keeps German mode nouns capitalized', (t) => { + t.after(() => setLocale('en')); + const title = (id) => + directionsRowControls(idle).chips.find((chip) => chip.id === id).title; + assert.equal(title('mode-foot'), 'Walk — reroute for walk'); + setLocale('de'); + assert.equal( + title('mode-foot'), + 'Zu Fuß – Route im Modus „Zu Fuß“ neu berechnen', + ); + assert.equal( + title('mode-bike'), + 'Fahrrad – Route im Modus „Fahrrad“ neu berechnen', + ); +}); diff --git a/src/data/trafficPresetStyle.js b/src/data/trafficPresetStyle.js index 2f16a4b33..bac391232 100644 --- a/src/data/trafficPresetStyle.js +++ b/src/data/trafficPresetStyle.js @@ -20,7 +20,7 @@ * jam keeps a size bump so queues read as fat beads. * - `crt` (retro): saturated primaries that survive 10-level posterization * plus an all-bucket size boost to out-shout the pixel grid. - * - `normal` (normal/anime/snow/unknown): every lookup returns null/0 — + * - `normal` (normal/anime/unknown): every lookup returns null/0 — * the shipped palette and sizing apply untouched. * * Sim/uncovered dots (bucket null/'sim') are NEVER restyled under any diff --git a/src/data/trafficPresetStyle.test.mjs b/src/data/trafficPresetStyle.test.mjs index 7dd88e1a0..a05040a66 100644 --- a/src/data/trafficPresetStyle.test.mjs +++ b/src/data/trafficPresetStyle.test.mjs @@ -13,7 +13,7 @@ const luma = ([r, g, b]) => (0.299 * r + 0.587 * g + 0.114 * b) / 255; const BUCKETS = ['free', 'slow', 'jam']; const MONO_STYLES = ['surveillance', 'thermal', 'noir']; -const NORMAL_STYLES = ['normal', 'anime', 'snow', 'does-not-exist', '', undefined, null]; +const NORMAL_STYLES = ['normal', 'anime', 'does-not-exist', '', undefined, null]; test('profile mapping: NVG/FLIR/noir are mono, retro is crt, everything else normal', () => { for (const s of MONO_STYLES) assert.equal(trafficStyleProfile(s), 'mono', s); diff --git a/src/data/transitPresetStyle.js b/src/data/transitPresetStyle.js index 8c79d7c05..5996d4d97 100644 --- a/src/data/transitPresetStyle.js +++ b/src/data/transitPresetStyle.js @@ -18,7 +18,7 @@ * black sprite with a light ring is what a hot object looks like there. * - `crt` (retro): saturated per-mode colours that survive posterisation, * a size boost to out-shout the pixel grid, and a thinner halo. - * - `normal` (normal/anime/snow/unknown): every lookup returns the shipped + * - `normal` (normal/anime/unknown): every lookup returns the shipped * value — mode colour, shipped size, hairline edge only. * * Brackets are a different matter. The detection canvas composites ABOVE the diff --git a/src/data/transitPresetStyle.test.mjs b/src/data/transitPresetStyle.test.mjs index fc8e81323..7cbb2dcbf 100644 --- a/src/data/transitPresetStyle.test.mjs +++ b/src/data/transitPresetStyle.test.mjs @@ -17,7 +17,6 @@ test('profile mapping: NVG/FLIR/noir and cockpit nvg are mono, retro is crt, eve for (const plain of [ 'normal', 'anime', - 'snow', 'minecraft', '', null, diff --git a/src/director/document.test.mjs b/src/director/document.test.mjs index c0b8b0935..9294abb7b 100644 --- a/src/director/document.test.mjs +++ b/src/director/document.test.mjs @@ -135,6 +135,15 @@ test('document byte, nesting, collection, finite-number and string bounds are en ); }); +test('a shot saved with the retired Snow style migrates to Normal', () => { + const project = fixture(); + project.scenes[0].shots[0].visual = { style: 'snow' }; + const migrated = normalizeProject( + parseSceneDocument(JSON.stringify(project)), + ); + assert.equal(migrated.scenes[0].shots[0].visual.style, 'normal'); +}); + test('captured scope and extended detection edits survive migration', () => { const project = fixture(); project.scenes[0].shots[0].visual = { diff --git a/src/firstRunExperience.test.mjs b/src/firstRunExperience.test.mjs index d76a48458..ca0ca5c0a 100644 --- a/src/firstRunExperience.test.mjs +++ b/src/firstRunExperience.test.mjs @@ -374,24 +374,26 @@ test('an overlay with NO class to watch still disarms the launcher', () => { assert.match(covered, /\} catch \{\s*\n\s*return false;\s*\n\s*\}/); }); -test('one ESC does one thing — the radio disclosure stops the launcher outright', () => { +test('one ESC does one thing — a Cockpit utility disclosure stops later document listeners', () => { const ui = fs.readFileSync( new URL('./ui/radioBindings.js', import.meta.url), 'utf8', ); - // stopPropagation() does NOT stop later listeners on the SAME document, so the - // disclosure's earlier capture handler closed the disclosure and the launcher - // dismissed itself off the same key. The earlier listener is the only one that - // can stop the later one — and only the immediate form does it. - const radioEsc = ui.slice(ui.indexOf("event.key !== 'Escape' ||")); - const claim = radioEsc.slice(0, radioEsc.indexOf('setRadioDisclosure(false')); + // stopPropagation() does NOT stop later listeners on the SAME document. The + // Context Radio disclosure that once raced the launcher this way is gone, and + // Cockpit's utility disclosures never share the screen with the launcher, but + // they own the same contract: their capture handler is the only one that can + // keep a later document listener (Cockpit exit, the launcher) off the key, and + // only the immediate form does it. + const utilityEsc = ui.slice(ui.indexOf('if (!displayOpen && !radioOpen) return;')); + const claim = utilityEsc.slice(0, utilityEsc.indexOf('setCockpitDisclosure(kind, false')); assert.match(claim, /event\.preventDefault\(\);/); assert.match(claim, /event\.stopImmediatePropagation\(\);/); assert.doesNotMatch( claim, /event\.stopPropagation\(\);/, - 'the plain form leaves the launcher listening and is the defect itself', + 'the plain form leaves later document listeners acting on the same key', ); // Belt on the launcher side: a key another surface already marked is not ours, @@ -1022,14 +1024,10 @@ test('the voice TOOL SCHEMA matches the pinned contract — the mission mapping ); const hudLayout = legacyTools.find((tool) => tool.name === 'set_hud') .parameters.properties.layout; - assert.deepEqual(hudLayout.enum, [ - 'tactical', - 'operator', - 'minimal', - 'cyber', - ]); - // Cyber deliberately adds one layout; first-run missions still change no tools. - hudLayout.enum = hudLayout.enum.filter((layout) => layout !== 'cyber'); + assert.deepEqual(hudLayout.enum, ['tactical', 'minimal', 'cyber']); + // Cyber deliberately adds one layout and Operator was retired; first-run + // missions still change no tools. + hudLayout.enum = ['tactical', 'operator', 'minimal']; const cameraMotion = legacyTools.find((tool) => tool.name === 'move_camera') .parameters.properties.motion; assert.deepEqual(cameraMotion.enum, [ @@ -1040,6 +1038,19 @@ test('the voice TOOL SCHEMA matches the pinned contract — the mission mapping 'rotate_globe', 'stop', ]); + // Snow is retired from set_visual_style; restore it to keep the legacy pin. + const visualStyle = legacyTools.find( + (tool) => tool.name === 'set_visual_style', + ).parameters.properties.style; + assert.deepEqual(visualStyle.enum, [ + 'normal', + 'retro', + 'surveillance', + 'thermal', + 'anime', + 'noir', + ]); + visualStyle.enum = [...visualStyle.enum, 'snow']; const block = JSON.stringify(legacyTools); // Re-derived for the voice layer manifest (generated layer enums, alias and // field hints), point-and-ask's pointer/referent arguments and the prompt diff --git a/src/hud.js b/src/hud.js index 011b53691..6eff65df7 100644 --- a/src/hud.js +++ b/src/hud.js @@ -9,7 +9,7 @@ import { applicationServices } from './services/application.js'; * real-time at configurable cadences. * * The HUD auto-activates when a military-style shader (NVG, FLIR, CRT) is - * selected and supports three layout variants: tactical, operator, minimal. + * selected and supports the layout variants: tactical, minimal, cyber. * * Color theming is driven by the active shader mode via CSS custom properties. */ @@ -76,7 +76,6 @@ const MODE_LABELS = Object.freeze({ thermal: msg('FLIR'), anime: msg('ANIME'), noir: msg('NOIR'), - snow: msg('SNOW'), }); /** Region ids from _regionLabel() and the name shown for each. */ @@ -288,12 +287,6 @@ export class IntelHUD { this._el.innerHTML = ` -
- TOP SECRET // SI-TK // NOFORN - ${this._missionId} - PAGE 1/1 -
-
┌
@@ -1063,7 +1056,7 @@ export class IntelHUD { * Switch the HUD layout variant. Falls back to `'tactical'` if the * name is unrecognized. Cyber also applies a coordinated skin to the full * application shell; leaving Cyber restores the standard shell tokens. - * @param {string} variantName - One of `'tactical'`, `'operator'`, `'minimal'`, `'cyber'`. + * @param {string} variantName - One of `'tactical'`, `'minimal'`, `'cyber'`. */ setVariant(variantName) { this._variant = normalizeHudLayout(variantName); diff --git a/src/hudAltitudeDatum.test.mjs b/src/hudAltitudeDatum.test.mjs index ca14569e5..18ed56f92 100644 --- a/src/hudAltitudeDatum.test.mjs +++ b/src/hudAltitudeDatum.test.mjs @@ -575,3 +575,25 @@ test('a summary interrupted while typing can retry unchanged context', async (t) env.restore(); } }); + +// ── Retired layouts ───────────────────────────────────────────────────────── +// +// Share links keep the retired Operator code, so old links still name it. The +// real HUD, not a caller, is what turns it into the default Tactical layout. + +test('a retired Operator layout falls back to Tactical in the live HUD', () => { + const env = installHudEnvironment(); + let hud; + try { + hud = new IntelHUD(env.viewer); + hud._el = { dataset: {} }; + hud.setVariant('minimal'); + assert.equal(hud.getVariant(), 'minimal'); + hud.setVariant('operator'); + assert.equal(hud.getVariant(), 'tactical'); + assert.equal(hud._el.dataset.variant, 'tactical'); + } finally { + hud?.destroy(); + env.restore(); + } +}); diff --git a/src/hudLayoutPolicy.js b/src/hudLayoutPolicy.js index 6b3e2287b..81a64b782 100644 --- a/src/hudLayoutPolicy.js +++ b/src/hudLayoutPolicy.js @@ -1,7 +1,2 @@ /** Browser-free layout vocabulary shared by UI and server-side voice tools. */ -export const HUD_LAYOUTS = Object.freeze([ - 'tactical', - 'operator', - 'minimal', - 'cyber', -]); +export const HUD_LAYOUTS = Object.freeze(['tactical', 'minimal', 'cyber']); diff --git a/src/hudLocalityFormat.js b/src/hudLocalityFormat.js index 697075a82..b9b8c3ea0 100644 --- a/src/hudLocalityFormat.js +++ b/src/hudLocalityFormat.js @@ -8,7 +8,10 @@ import { formatNumber, getLocale, t } from './i18n/index.js'; import { unitLabel } from './ui/unitLabels.js'; import { localizePlaceName } from './ui/placeNames.js'; -/** An upper-case HUD quantity such as `13KM` / `13КМ`, in the active language. */ +/** + * An upper-case HUD quantity such as `13KM` / `13КМ`, in the active language. + * Chinese and Japanese have no case and keep the catalog's `13 km`. + */ export function hudQuantity(value, unit, digits = 0) { const number = formatNumber(value, { useGrouping: false, @@ -16,7 +19,7 @@ export function hudQuantity(value, unit, digits = 0) { maximumFractionDigits: digits, }); const label = unitLabel(unit); - if (getLocale().startsWith('zh-')) + if (/^(zh|ja)(-|$)/.test(getLocale())) return label ? `${number} ${label}` : number; return `${number}${label.toUpperCase()}`; } diff --git a/src/i18n/i18n.test.mjs b/src/i18n/i18n.test.mjs index d38e03ae1..68541e282 100644 --- a/src/i18n/i18n.test.mjs +++ b/src/i18n/i18n.test.mjs @@ -5,6 +5,7 @@ import { applyDocumentTranslations, formatDate, formatNumber, + formatRelativeTime, msg, persistLocaleAndReload, setLocale, @@ -36,7 +37,20 @@ test('normalizeLocale folds regional variants and rejects unshipped tags', () => assert.equal(normalizeLocale('uk'), 'uk'); assert.equal(normalizeLocale('uk-UA'), 'uk'); assert.equal(normalizeLocale('en_GB'), 'en'); + assert.equal(normalizeLocale('de'), 'de'); + assert.equal(normalizeLocale('de-AT'), 'de'); + assert.equal(normalizeLocale('de_CH'), 'de'); + assert.equal(normalizeLocale('fr'), 'fr'); + assert.equal(normalizeLocale('fr-CA'), 'fr'); + assert.equal(normalizeLocale('FR_be'), 'fr'); + assert.equal(normalizeLocale('pt-BR'), 'pt'); + assert.equal(normalizeLocale('pt_PT'), 'pt'); assert.equal(normalizeLocale('xx'), null); + assert.equal(normalizeLocale('it-IT'), 'it'); + assert.equal(normalizeLocale('it_CH'), 'it'); + assert.equal(normalizeLocale('ja'), 'ja'); + assert.equal(normalizeLocale('ja-JP'), 'ja'); + assert.equal(normalizeLocale('JA_jp'), 'ja'); // Explicit script tags take precedence over regional defaults. assert.equal(normalizeLocale('zh'), 'zh-CN'); assert.equal(normalizeLocale('zh-CN'), 'zh-CN'); @@ -70,7 +84,7 @@ test('resolveLocale: ?lang= wins, then the stored choice, then browser languages resolveLocale({ location: { search: '?lang=xx' }, storage: memoryStorage(), - languages: ['de-DE', 'ru-RU'], + languages: ['ko-KR', 'ru-RU'], }), 'ru', ); @@ -78,7 +92,15 @@ test('resolveLocale: ?lang= wins, then the stored choice, then browser languages resolveLocale({ location: { search: '' }, storage: memoryStorage(), - languages: ['de'], + languages: ['de-DE', 'ru-RU'], + }), + 'de', + ); + assert.equal( + resolveLocale({ + location: { search: '' }, + storage: memoryStorage(), + languages: ['ko'], }), 'en', ); @@ -144,6 +166,20 @@ test('tn() picks English and Russian plural forms', () => { assert.match(label(21), / 21 КЛмЧ(?![А-ЯЁ])/); }); +test('tn() picks the Portuguese one, many and other forms', () => { + const label = (count) => + tn( + count, + 'POWER UP · {count} KEY WAITING', + 'POWER UP · {count} KEYS WAITING', + ); + setLocale('pt'); + assert.equal(label(0), 'ATIVAR · 0 CHAVE PENDENTE'); + assert.equal(label(1), 'ATIVAR · 1 CHAVE PENDENTE'); + assert.equal(label(3), 'ATIVAR · 3 CHAVES PENDENTES'); + assert.equal(label(1_000_000), 'ATIVAR · 1000000 DE CHAVES PENDENTES'); +}); + test('tn() picks the four Ukrainian plural forms', () => { const label = (count) => tn( @@ -182,7 +218,13 @@ test('Intl formatters follow the active locale', () => { assert.equal(formatNumber(1234.5), '1,234.5'); setLocale('ru'); assert.equal(formatDate(date, options), '15 ŃĐœĐČаря 2026 Đł.'); + assert.equal(formatRelativeTime(-5, 'minute'), '5 ĐŒĐžĐœŃƒŃ‚ ĐœĐ°Đ·Đ°ĐŽ'); assert.equal(formatNumber(1234.5), '1 234,5'); + // Japanese keeps a number and its unit together, as the catalog does. + setLocale('ja'); + assert.equal(formatDate(date, options), '2026ćčŽ1月15æ—„'); + assert.equal(formatRelativeTime(-5, 'minute'), '5戆才'); + assert.equal(formatRelativeTime(-3, 'day'), '3æ—„ć‰'); }); function fakeElement({ text = '', attributes = {} } = {}) { @@ -218,6 +260,21 @@ test('applyDocumentTranslations translates opted-in text and attributes in place assert.equal(unknown.textContent, 'No such message'); }); +test('applyDocumentTranslations reads data-i18n-context for element text', () => { + const option = fakeElement({ + text: 'All', + attributes: { 'data-i18n-context': 'radio tag' }, + }); + const doc = { + querySelectorAll: (selector) => + selector === '[data-i18n]' ? [option] : [], + }; + setLocale('pt'); + applyDocumentTranslations(doc); + assert.equal(option.textContent, t('All', { context: 'radio tag' })); + assert.notEqual(option.textContent, t('All')); +}); + test('persistLocaleAndReload keeps the choice in ?lang when storage is blocked', () => { const calls = []; const location = { diff --git a/src/i18n/index.js b/src/i18n/index.js index df15690b2..63dbe6cf2 100644 --- a/src/i18n/index.js +++ b/src/i18n/index.js @@ -16,14 +16,24 @@ import { normalizeLocale, writeStoredLocale, } from './locale.js'; +import de from './locales/de.json' with { type: 'json' }; import es from './locales/es.json' with { type: 'json' }; +import fr from './locales/fr.json' with { type: 'json' }; +import it from './locales/it.json' with { type: 'json' }; +import ja from './locales/ja.json' with { type: 'json' }; +import pt from './locales/pt.json' with { type: 'json' }; import ru from './locales/ru.json' with { type: 'json' }; import uk from './locales/uk.json' with { type: 'json' }; import zhCN from './locales/zh-CN.json' with { type: 'json' }; import zhHant from './locales/zh-Hant.json' with { type: 'json' }; const CATALOGS = Object.freeze({ + de, es, + fr, + it, + ja, + pt, ru, uk, 'zh-CN': zhCN, @@ -208,13 +218,19 @@ export function formatUtcDayMonth(value) { /** * Locale-aware relative time (Intl.RelativeTimeFormat), e.g. - * formatRelativeTime(-5, 'minute') → '5 minutes ago' / '5 ĐŒĐžĐœŃƒŃ‚ ĐœĐ°Đ·Đ°ĐŽ'. + * formatRelativeTime(-5, 'minute') → '5 minutes ago' / '5 ĐŒĐžĐœŃƒŃ‚ ĐœĐ°Đ·Đ°ĐŽ' / + * '5戆才'. */ export function formatRelativeTime(value, unit = 'second', options) { - return cachedFormatter('relative', Intl.RelativeTimeFormat, { + const text = cachedFormatter('relative', Intl.RelativeTimeFormat, { numeric: 'auto', ...options, }).format(value, unit); + // CLDR spaces Japanese (5 戆才); the ja catalog writes the number and its + // unit together (5戆才), so the two must not differ on one screen. + return currentLocale === 'ja' + ? text.replace(/(?<=\d) (?=\p{Script=Han})/gu, '') + : text; } /** Collapse markup whitespace so a message reads the same in HTML and JS. */ @@ -228,7 +244,9 @@ function normalizeMarkupText(text) { * Markup opt-in: the element's own English text or attribute is the source. * Normal * - * Also data-i18n-aria-label and data-i18n-placeholder. + * Also data-i18n-aria-label and data-i18n-placeholder. data-i18n-context + * gives the element's text a context, as t(text, { context }) does: + * */ const DOCUMENT_TRANSLATION_TARGETS = Object.freeze([ ['data-i18n', null], @@ -253,7 +271,10 @@ export function applyDocumentTranslations(doc) { ? element.getAttribute(attribute) : normalizeMarkupText(element.textContent); if (!source) continue; - const text = t(source); + const context = attribute + ? null + : element.getAttribute?.('data-i18n-context'); + const text = context ? t(source, { context }) : t(source); if (text === source) continue; if (attribute) element.setAttribute(attribute, text); else element.textContent = text; diff --git a/src/i18n/ja-display.test.mjs b/src/i18n/ja-display.test.mjs new file mode 100644 index 000000000..ade04f519 --- /dev/null +++ b/src/i18n/ja-display.test.mjs @@ -0,0 +1,21 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { setLocale } from './index.js'; +import { + cockpitUnitCase, + formatCockpitDistance, +} from '../ui/cockpitPresentation.js'; + +test('Japanese cockpit distances keep the unit in its own case', () => { + try { + setLocale('ja'); + assert.equal(formatCockpitDistance(14000), '14 km'); + assert.equal(formatCockpitDistance(9500), '9.5 km'); + assert.equal(cockpitUnitCase('km'), 'km'); + setLocale('en'); + assert.equal(formatCockpitDistance(14000), '14 KM'); + assert.equal(cockpitUnitCase('km'), 'KM'); + } finally { + setLocale('en'); + } +}); diff --git a/src/i18n/ja-hud-units.test.mjs b/src/i18n/ja-hud-units.test.mjs new file mode 100644 index 000000000..73568d0ce --- /dev/null +++ b/src/i18n/ja-hud-units.test.mjs @@ -0,0 +1,22 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { setLocale } from './index.js'; +import { hudQuantity, LOCALIZED_LOCALITY } from '../hudLocalityFormat.js'; +import { formatCockpitDistance } from '../ui/cockpitPresentation.js'; + +// revmain-opus-ja-i1-1: ja has no case, so HUD units keep the catalog case +// (km), as the cockpit already does and docs/translations/ja.md requires. +test('Japanese HUD units keep their case, like the cockpit', () => { + try { + setLocale('ja'); + assert.equal(formatCockpitDistance(14000), '14 km'); + assert.equal(hudQuantity(13, 'km'), '13 km'); + assert.equal(hudQuantity(1.5, 'km', 1), '1.5 km'); + assert.equal( + LOCALIZED_LOCALITY.near({ poi: 'Shibuya', city: 'Tokyo', distKm: 13 }), + 'SHIBUYA東äșŹïŒ‰ä»˜èż‘ 13 km', + ); + } finally { + setLocale('en'); + } +}); diff --git a/src/i18n/locale.js b/src/i18n/locale.js index 77c1e68e7..3297fcf88 100644 --- a/src/i18n/locale.js +++ b/src/i18n/locale.js @@ -10,7 +10,12 @@ export const DEFAULT_LOCALE = 'en'; /** Shipped locales; order does not matter. Adding one: docs/TRANSLATORS.md. */ export const LOCALES = Object.freeze([ 'en', + 'de', 'es', + 'fr', + 'it', + 'ja', + 'pt', 'ru', 'uk', 'zh-CN', @@ -20,7 +25,12 @@ export const LOCALES = Object.freeze([ /** Each locale named in its own language, for the selector. */ export const LOCALE_NAMES = Object.freeze({ en: 'English', + de: 'Deutsch', es: 'Español', + fr: 'Français', + it: 'Italiano', + ja: 'æ—„æœŹèȘž', + pt: 'PortuguĂȘs (Brasil)', ru: 'РуссĐșĐžĐč', uk: 'ĐŁĐșŃ€Đ°Ń—ĐœŃŃŒĐșа', 'zh-CN': 'äž­æ–‡ïŒˆçź€äœ“ïŒ‰', @@ -32,6 +42,8 @@ const RTL_LOCALES = Object.freeze([]); /** * Map any language tag to a shipped locale: 'ru-RU' and 'RU' → 'ru', + * 'de-AT' and 'de_CH' → 'de', 'ja-JP' → 'ja', + * 'pt-BR' and 'pt-PT' → 'pt' (Brazilian Portuguese), * 'zh', 'zh-CN' and 'zh-Hans-SG' → 'zh-CN'; * 'zh-Hant', 'zh-TW', 'zh-HK' and 'zh-MO' → 'zh-Hant'. * @returns {string|null} diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json new file mode 100644 index 000000000..a4cf1cd13 --- /dev/null +++ b/src/i18n/locales/de.json @@ -0,0 +1,2942 @@ +{ + "Flying to Austin, TX...": "Flug nach Austin, TX...", + "Restoring shared view...": "Geteilte Ansicht wird wiederhergestellt...", + "Configuring viewer...": "Viewer wird konfiguriert...", + "Loading Google 3D Tiles...": "Google 3D Tiles werden geladen...", + "Loading the keyless globe...": "Globus ohne SchlĂŒssel wird geladen...", + "Google 3D Tiles unavailable ({detail}). Loading the keyless globe...": "Google 3D Tiles nicht verfĂŒgbar ({detail}). Globus ohne SchlĂŒssel wird geladen...", + "Initializing systems...": "Systeme werden initialisiert...", + "Close data attribution": "Datenquellenhinweis schließen", + "UNAVAILABLE": "NICHT VERFÜGBAR", + "SOURCE": "QUELLE", + "Overpass rate-limited": "Overpass-Anfragelimit erreicht", + "Overpass timed out": "ZeitĂŒberschreitung bei Overpass", + "Overpass could not complete the query": "Overpass konnte die Abfrage nicht abschließen", + "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} — 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", + "Mapped sites not loaded": "Kartierte Standorte nicht geladen", + "Mapped sites loaded": "Kartierte Standorte geladen", + "feed unavailable": "Feed nicht verfĂŒgbar", + "feed stale": "Feed veraltet", + "observed or mapped nearby context": "beobachteter oder kartierter Kontext in der NĂ€he", + "no observed or mapped objects in current feeds": "keine beobachteten oder kartierten Objekte in den aktuellen Feeds", + "STATION": "STATION", + "Crewed stations and their visiting vehicles": "Bemannte Stationen und angedockte Raumfahrzeuge", + "NAV": "NAV", + "GNSS navigation — GPS, GLONASS, Galileo": "GNSS-Navigation: GPS, GLONASS, Galileo", + "GEO": "GEO", + "Geostationary belt — comms and weather, fixed over the equator": "GeostationĂ€rer GĂŒrtel: Kommunikation und Wetter, fest ĂŒber dem Äquator", + "VISUAL": "VISUELL", + "Brightest naked-eye objects — CelesTrak visual group": "Hellste mit bloßem Auge sichtbare Objekte: CelesTrak-Gruppe „visual“", + "COMMS": "KOMM.", + "Broadband constellation shell — shown only in DENSE mode": "Breitband-Konstellationsschale: nur im Modus DICHT sichtbar", + "FISHING": "FISCHEREI", + "TOWING": "SCHLEPPVERBAND", + "DREDGER": "BAGGER", + "DIVE OPS": "TAUCHEINSATZ", + "MILITARY": "MILITÄR", + "SAILING": "SEGLER", + "PLEASURE": "SPORTBOOT", + "PILOT": "LOTSENBOOT", + "SAR": "SAR", + "TUG": "SCHLEPPER", + "PORT TENDER": "HAFENTENDER", + "ANTI-POLLUTION": "UMWELTSCHUTZ", + "LAW ENFORCE": "POLIZEI", + "MEDICAL": "SANITÄTSDIENST", + "HIGH-SPEED": "SCHNELLSCHIFF", + "PASSENGER": "PASSAGIER", + "CARGO": "FRACHT", + "TANKER": "TANKER", + "OTHER": "SONSTIGE", + "ENVIRONMENTAL": "UMWELT", + "EARTH WATCH": "ERDBEOBACHTUNG", + "ACTIVE EVENTS": "AKTIVE EREIGNISSE", + "Starting live contacts
": "Live-Kontakte werden gestartet
", + "Opening space missions
": "Raummissionen werden geöffnet
", + "Scanning active events
": "Aktive Ereignisse werden gescannt
", + "Live earthquakes and active fires, from USGS and NASA": "Live-Erdbeben und aktive BrĂ€nde, von USGS und NASA", + "It feels like a forbidden cockpit—then you realize the sources are public and the data is real.": "Es fĂŒhlt sich an wie ein verbotenes Cockpit – dann merkt man, dass die Quellen öffentlich und die Daten echt sind.", + "Working
": "In Arbeit
", + "Could not open that mission{detail}. Retry or explore manually.": "Mission{detail} konnte nicht geöffnet werden. Erneut versuchen oder manuell erkunden.", + "This browser is blocking storage, so that could not be saved.": "Dieser Browser blockiert den Speicher, daher konnte das nicht gespeichert werden.", + "CRT": "CRT", + "NVG": "NVG", + "FLIR": "FLIR", + "SNOW": "SCHNEE", + "LOADING": "LÄDT", + "DEGRADED": "EINGESCHRÄNKT", + "STALE": "VERALTET", + "PARTIAL": "TEILWEISE", + "FALLBACK": "FALLBACK", + "SUMMARY": "ÜBERSICHT", + "Awaiting telemetry...": "Warten auf Telemetrie...", + "REC": "REC", + "AIS: --": "AIS: --", + "POWER UP · {count} KEYS WAITING": { + "one": "STARTKLAR · {count} SCHLÜSSEL OFFEN", + "other": "STARTKLAR · {count} SCHLÜSSEL OFFEN" + }, + "POWERED UP": "HOCHGEFAHREN", + "Save failed ({status}).": "Speichern fehlgeschlagen ({status}).", + "REMOVE": "ENTFERNEN", + "Remove {title} from this app's saved keys": "{title} aus den gespeicherten SchlĂŒsseln dieser App entfernen", + "your app configuration": "der App-Konfiguration", + "your local .env": "der lokalen .env", + "Saving
": "Speichern
", + "Save failed: {detail}": "Speichern fehlgeschlagen: {detail}", + "Paste at least one key first.": "Zuerst mindestens einen SchlĂŒssel einfĂŒgen.", + "Saved to {store}. Restarting — this page reloads itself.": "In {store} gespeichert. Neustart lĂ€uft, diese Seite lĂ€dt sich selbst neu.", + "Remove this key from your saved configuration?": "Diesen SchlĂŒssel aus der gespeicherten Konfiguration entfernen?", + "Removed from {store}. Restarting — this page reloads itself.": "Aus {store} entfernt. Neustart lĂ€uft, diese Seite lĂ€dt sich selbst neu.", + "Places context + Street View fallback; optional separate key": "Places-Kontext + Street-View-Fallback; optional eigener SchlĂŒssel", + "Live ships, worldwide": "Live-Schiffe, weltweit", + "Live active-fire detections": "Live-Erkennung aktiver BrĂ€nde", + "Real live traffic (keyless runs a simulation)": "Echter Live-Verkehr (ohne SchlĂŒssel: Simulation)", + "Bing imagery map stacks + world terrain": "Bing-Bildmaterial als Kartenstapel + globales GelĂ€ndemodell", + "More flight-polling credits (anonymous works without)": "Mehr Abfrage-Credits fĂŒr FlĂŒge (anonym geht es auch ohne)", + "CONTEXT READY": "KONTEXT BEREIT", + "GLOBAL CONTEXT OFF": "GLOBALER KONTEXT AUS", + "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "FLUG, SCHIFF ODER KARTIERTE ANLAGE WÄHLEN", + "ENABLE TO LOAD OBSERVED / MAPPED PROXIMITY": "AKTIVIEREN FÜR BEOBACHTETE / KARTIERTE OBJEKTE IM UMKREIS", + "Unavailable": "Nicht verfĂŒgbar", + "Focus {label}": "{label} fokussieren", + "Global Context navigation": "Navigation des globalen Kontexts", + "Previous — prior visited contact in the 250 km window": "ZurĂŒck: zuvor besuchter Kontakt im 250-km-Fenster", + "PREVIOUS": "ZURÜCK", + "FOCUS": "FOKUS", + "Next — nearest unvisited contact in the 250 km window": "Weiter: nĂ€chstgelegener unbesuchter Kontakt im 250-km-Fenster", + "NEXT": "WEITER", + "Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "Kontext aus offenen Quellen, kartiert/beobachtet. Fehlende Funksignale, nicht geladene Kartenbereiche oder nicht kartierte Standorte sind kein Beleg fĂŒr Abwesenheit.", + "HDG {value}°": "HDG {value}°", + "BRG {value}°": "BRG {value}°", + "BRG —": "BRG —", + "CRS {value}°": "CRS {value}°", + "CURRENT VIEWPORT ONLY": "NUR AKTUELLER BILDAUSSCHNITT", + "WITHIN {km} KM": "INNERHALB {km} KM", + "Flights": "FlĂŒge", + "Military flights": "MilitĂ€rflĂŒge", + "AIS vessels": "AIS-Schiffe", + "Mapped installations": "Kartierte Anlagen", + "syncing {count} city feeds...": "Synchronisierung der Stadt-Feeds ({count})...", + "scanning nearby systems...": "Systeme in der NĂ€he werden gesucht...", + "Station {id}": "Station {id}", + "Station": "Station", + "đŸšČ {bikes} avail · {docks} docks · {capacity} cap": "đŸšČ {bikes} frei · {docks} Docks · {capacity} Kap.", + "⚠ Not installed": "⚠ Nicht installiert", + "⚠ Not renting": "⚠ Keine Ausleihe", + "⚠ Not returning": "⚠ Keine RĂŒckgabe", + "HDG {value}° (ESTIMATED)": "HDG {value}° (GESCHÄTZT)", + "{count} CAMERAS STANDING BY · NO CAMERA SELECTED · CLICK A CAMERA TO ACTIVATE": "KAMERAS BEREIT: {count} · KEINE KAMERA GEWÄHLT · KAMERA ANKLICKEN ZUM AKTIVIEREN", + "No cameras available in catalog.": "Keine Kameras im Katalog verfĂŒgbar.", + "{city} CCTV": "{city} CCTV", + "FOV {value}°": "FOV {value}°", + "COVERAGE {value}kmÂČ": "ABDECKUNG {value} kmÂČ", + "OVERLAP {count} cams": "ÜBERLAPPUNG {count} Kam.", + "ISOLATED VIEW": "EINZELANSICHT", + "PROJ MONITOR": "PROJ MONITOR", + "PROJ OFF": "PROJ AUS", + "VIEWSHED": "SICHTBEREICH", + "CAL {value}": "KAL. {value}", + "SRC {value}": "QUELLE {value}", + "{value} CONTEXT": "KONTEXT {value}", + "Focus fire detection {title}, {details}": "Branderkennung {title} fokussieren, {details}", + "{value} conf": "Konf. {value}", + "{value} ago": "vor {value}", + "sensor n/a": "Sensor k. A.", + "FIRE · {frp} MW": "BRAND · {frp} MW", + "NIGHT": "NACHT", + "â–Č {frp} MW": "â–Č {frp} MW", + "FIRE": "BRAND", + "FIRES": "BRÄNDE", + "max {value} MW": "max. {value} MW", + "new {value}": "zuletzt vor {value}", + "just now": "gerade eben", + "<1m ago": "vor <1 min", + "{count}m ago": "vor {count} min", + "{count}h ago": "vor {count} h", + "STALE · cached {age}": "VERALTET · im Cache {age}", + "refreshing...": "wird aktualisiert...", + "loading...": "lĂ€dt...", + "KEY REQUIRED": "SCHLÜSSEL ERFORDERLICH", + "LIVE · updated {age}": "LIVE · aktualisiert {age}", + "loading mapped installation context": "Kontext der kartierten Anlage wird geladen", + "MAPPED INSTALLATION": "KARTIERTE ANLAGE", + "LAUNCH SITE · {site}": "STARTPLATZ · {site}", + "LAUNCH SITE": "STARTPLATZ", + "T−{time} · {mission}": "T−{time} · {mission}", + "LAUNCH STANDBY": "STARTBEREITSCHAFT", + "LIFTOFF · {mission}": "ABHEBEN · {mission}", + "ASCENT REPLAY · {mission}": "AUFSTIEGS-REPLAY · {mission}", + "ASCENT ESTIMATE · {mission}": "AUFSTIEGSSCHÄTZUNG · {mission}", + "STAGE RE-ENTRY / RECOVERY · {mission}": "STUFEN-WIEDEREINTRITT / BERGUNG · {mission}", + "ORBIT REPLAY · {mission}": "ORBIT-REPLAY · {mission}", + "PAUSED · {title}": "PAUSIERT · {title}", + "UNSPECIFIED": "NICHT ANGEGEBEN", + "+{count} additional payload records": "Weitere Nutzlast-EintrĂ€ge: +{count}", + "PAYLOAD DATA UNAVAILABLE": "NUTZLASTDATEN NICHT VERFÜGBAR", + "{value} KM DOWNRANGE": "{value} KM DOWNRANGE", + "POSITION UNAVAILABLE": "POSITION NICHT VERFÜGBAR", + "FLIGHT {count}": "FLUG {count}", + "REUSED": "WIEDERVERWENDET", + "NO STAGE RE-ENTRY / RECOVERY DATA": "KEINE DATEN ZU STUFEN-WIEDEREINTRITT / BERGUNG", + "{count} / 30D": "{count} / 30 T", + "NO MISSIONS AVAILABLE IN THE CURRENT 30-DAY WINDOW": "KEINE MISSIONEN IM AKTUELLEN 30-TAGE-FENSTER", + "DATE UNAVAILABLE": "DATUM NICHT VERFÜGBAR", + "UNSPECIFIED OPERATOR": "BETREIBER NICHT ANGEGEBEN", + "Select {mission}": "{mission} auswĂ€hlen", + "{value} KM": "{value} KM", + "{value} KM/S": "{value} KM/S", + "SELECTED SPACE MISSION": "GEWÄHLTE RAUMMISSION", + "Show all missions": "Alle Missionen anzeigen", + "Deselect mission": "Mission abwĂ€hlen", + "MISSION": "MISSION", + "STATUS · ": "STATUS · ", + "LAUNCH SITE · ": "STARTPLATZ · ", + "LAUNCH TIME · ": "STARTZEIT · ", + "ORBIT · ": "ORBIT · ", + "ASCENT PATH · ": "AUFSTIEGSPFAD · ", + "CURRENT DISTANCE FROM EARTH · ": "AKTUELLE ENTFERNUNG VON DER ERDE · ", + "SATELLITE SPEED · ": "SATELLITENGESCHW. · ", + "PAYLOAD": "NUTZLAST", + "NAME": "NAME", + "TYPE": "TYP", + "DESTINATION": "ZIEL", + "STAGE / RE-ENTRY / RECOVERY": "STUFE / WIEDEREINTRITT / BERGUNG", + "STAGE": "STUFE", + "STATUS": "STATUS", + "FINAL POSITION": "ENDPOSITION", + "REPLAY SPEED": "WIEDERGABETEMPO", + "Replay speed multiplier": "Faktor der Wiedergabegeschwindigkeit", + "REPLAY ASCENT": "AUFSTIEG ABSPIELEN", + "Previous mission": "Vorherige Mission", + "PREV": "ZURÜCK", + "Next mission": "NĂ€chste Mission", + "SHOW ALL / DESELECT": "ALLE ZEIGEN / ABWÄHLEN", + "Pause replay": "Wiedergabe pausieren", + "Cancel replay": "Wiedergabe abbrechen", + "EST. DOWNRANGE": "DOWNRANGE GESCHÄTZT", + "PLANNED · ": "GEPLANT · ", + "SUPPLIED TRAJECTORY POINTS": "GELIEFERTE BAHNPUNKTE", + "RECONSTRUCTED ESTIMATE": "REKONSTRUIERTE SCHÄTZUNG", + "Replay the estimated ascent with a following camera": "GeschĂ€tzten Aufstieg mit einer mitfliegenden Kamera abspielen", + "Resume replay": "Wiedergabe fortsetzen", + "T minus {seconds}": "T minus {seconds}", + "Preparing launch site": "Startplatz wird vorbereitet", + "Liftoff": "Abheben", + "Ascent replay": "Aufstiegs-Replay", + "Orbit replay": "Orbit-Replay", + ", paused": ", pausiert", + "Alt unknown": "Höhe unbekannt", + "Type unknown": "Typ unbekannt", + "Reg unknown": "Kennz. unbekannt", + "Operator unknown": "Betreiber unbekannt", + "News": "Nachrichten", + "Talk": "Talk", + "Weather / Emergency": "Wetter / Notfall", + "Public Safety": "Öffentliche Sicherheit", + "Aviation / Marine": "Luftfahrt / Seefahrt", + "Traffic / Transit": "Verkehr / ÖPNV", + "Music": "Musik", + "Other": "Sonstige", + "radio|TALK": "TALK", + "radio|SAFETY": "SICHERH.", + "radio|AIR / SEA": "LUFT / SEE", + "radio|TRANSIT": "ÖPNV", + "radio|MUSIC": "MUSIK", + "Alternative": "Alternative", + "Ambient": "Ambient", + "Blues": "Blues", + "Classical": "Klassik", + "Country": "Country", + "Dance": "Dance", + "Electronic": "Elektronische Musik", + "Folk": "Folk", + "Funk": "Funk", + "Hip-Hop": "Hip-Hop", + "House": "House", + "Indie": "Indie", + "Jazz": "Jazz", + "Latin": "Latin", + "Metal": "Metal", + "Oldies": "Oldies", + "Pop": "Pop", + "Punk": "Punk", + "R&B": "R&B", + "Reggae": "Reggae", + "Rock": "Rock", + "Soul": "Soul", + "Techno": "Techno", + "Trance": "Trance", + "World": "Weltmusik", + "Add the full Starlink broadband shell (thousands of extra points)": "Komplette Starlink-Breitbandschale hinzufĂŒgen (Tausende zusĂ€tzliche Punkte)", + "Loading the Starlink shell
": "Starlink-Schale wird geladen
", + "Starlink {detail} — click to retry": "Starlink: {detail} – zum erneuten Versuch klicken", + "load failed": "Laden fehlgeschlagen", + "Showing the full Starlink shell — click for the core catalog only": "Komplette Starlink-Schale sichtbar: klicken, um nur den Kernkatalog zu zeigen", + "DENSE ···": "DICHT ···", + "DENSE ✕": "DICHT ✕", + "DENSE": "DICHT", + "Syncing flow · Roads: {source}": "Verkehrsfluss wird synchronisiert · Straßen: {source}", + "LIVE · Roads: {source} · Roads without flow hidden": "LIVE · Straßen: {source} · Straßen ohne Verkehrsdaten ausgeblendet", + "LIVE · Roads: {source} · No flow roads in view": "LIVE · Straßen: {source} · Keine Straßen mit Verkehrsdaten im Bild", + "LIVE · Roads: {source} · Flow {percent}%": "LIVE · Straßen: {source} · Live-Abdeckung {percent} %", + "SIMULATED · Roads: {source} · Flow {percent}%": "SIMULIERT · Straßen: {source} · Live-Abdeckung {percent} %", + "Syncing flow · Roads: OpenStreetMap · Flow: TomTom · Unmatched: simulated": "Verkehrsfluss wird synchronisiert · Straßen: OpenStreetMap · Verkehrsfluss: TomTom · Ohne Zuordnung: simuliert", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov · Unmatched: simulated": "LIVE · Straßen: OpenStreetMap · Verkehrsfluss: TomTom · {percent} % Abd. · Ohne Zuordnung: simuliert", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov": "LIVE · Straßen: OpenStreetMap · Verkehrsfluss: TomTom · {percent} % Abd.", + "SIMULATED · Roads: OpenStreetMap · Flow: TomTom (no matches)": "SIMULIERT · Straßen: OpenStreetMap · Verkehrsfluss: TomTom (keine Treffer)", + "SIMULATED — traffic service unreachable": "SIMULIERT: Verkehrsdienst nicht erreichbar", + "SIMULATED — add TomTom key for live": "SIMULIERT: TomTom-SchlĂŒssel fĂŒr Live-Daten hinzufĂŒgen", + "AIS: {name}": "AIS: {name}", + "{type} SPD: {speed} HDG: {heading}": "{type} SPD: {speed} HDG: {heading}", + "VESSEL": "SCHIFF", + "POS: LIVE": "POS: LIVE", + "POS: {time}Z": "POS: {time}Z", + "awaiting first AIS position
": "warten auf erste AIS-Position
", + "awaiting usable AIS positions
": "warten auf nutzbare AIS-Positionen
", + "awaiting first AIS message
": "warten auf erste AIS-Nachricht
", + "Resume": "Fortsetzen", + "Pause": "Pause", + "Error: {message}": "Fehler: {message}", + "Needs {envVars} — add it in Provider Settings": "Benötigt {envVars}: in den Anbieter-Einstellungen hinzufĂŒgen", + "{label} is unavailable": "{label} ist nicht verfĂŒgbar", + "This map stack": "Dieser Kartenstapel", + "{label} unavailable: {hint}": "{label} nicht verfĂŒgbar: {hint}", + "Visible map targets": "Sichtbare Kartenziele", + "Ready": "Bereit", + "Loaded: {scene} / {shot}": "Geladen: {scene} / {shot}", + "Cannot capture shot: camera not ready": "Aufnahme nicht möglich: Kamera nicht bereit", + "Captured: {scene} / {shot}": "Aufgenommen: {scene} / {shot}", + "Select a shot first": "Zuerst eine Aufnahme wĂ€hlen", + "Updated: {scene} / {shot}": "Aktualisiert: {scene} / {shot}", + "Camera unavailable — exit cockpit first": "Kamera nicht verfĂŒgbar: zuerst Cockpit verlassen", + "No shots to run": "Keine Aufnahmen zum Abspielen", + "Project exported": "Projekt exportiert", + "Could not exit {mode} — scene layers may be refused": "{mode} konnte nicht beendet werden: Szenenebenen werden eventuell abgelehnt", + "Running {index}/{total}: {scene} / {shot}": "LĂ€uft {index}/{total}: {scene} / {shot}", + "Scene run complete": "Szenenlauf abgeschlossen", + "Global Flights Radar": "Globales Flugradar", + "Orbital Watch": "Orbitalwache", + "Thermal Threat Board": "Thermische Bedrohungslage", + "City Overload": "Stadt-Überlast", + "Omniscience Pullback": "RĂŒckflug zur WeltĂŒbersicht", + "Shot {n}": "Aufnahme {n}", + "Density": "Dichte", + "Bloom": "Bloom", + "VISUAL PRESETS": "VISUELLE PRESETS", + "LOCATION": "STANDORT", + "CONTACTS — nearest planes · vessels · sites": "KONTAKTE: nĂ€chstgelegene Flugzeuge · Schiffe · Standorte", + "SPACE MISSIONS — launches & orbital assets": "RAUMMISSIONEN: Starts & Orbit-Objekte", + "LIVE SIGNALS": "LIVE-SIGNALE", + "Contacts could not complete the requested transition; try again": "Kontakte konnten den gewĂŒnschten Wechsel nicht abschließen; erneut versuchen", + "CCTV layer unavailable": "CCTV-Ebene nicht verfĂŒgbar", + "Link copied!": "Link kopiert!", + "Copy failed": "Kopieren fehlgeschlagen", + "CCTV calibration saved": "CCTV-Kalibrierung gespeichert", + "CCTV calibration reset": "CCTV-Kalibrierung zurĂŒckgesetzt", + "ADJUST ON": "ANPASSEN EIN", + "ADJUST": "ANPASSEN", + "UNKNOWN": "UNBEKANNT", + "ERROR": "FEHLER", + "SOURCE · UNKNOWN": "QUELLE · UNBEKANNT", + "FRAME · LOADING": "FRAME · LÄDT", + "FRAME · UNAVAILABLE": "FRAME · NICHT VERFÜGBAR", + "CALIBRATED": "KALIBRIERT", + "CURATED": "KURATIERT", + "RAW PRIOR": "ROH-SCHÄTZUNG", + "CCTV ON": "CCTV EIN", + "CCTV OFF": "CCTV AUS", + "VIEWSHED ON": "SICHTBEREICH EIN", + "COVERAGE ON": "ABDECKUNG EIN", + "COVERAGE OFF": "ABDECKUNG AUS", + "AUTO HOP ON": "AUTO-WECHSEL EIN", + "AUTO HOP OFF": "AUTO-WECHSEL AUS", + "PROJECTION ON": "PROJEKTION EIN", + "PROJECTION OFF": "PROJEKTION AUS", + "CAL · EDITED (UNSAVED)": "KAL. · GEÄNDERT (UNGESPEICHERT)", + "CAL · {badge}": "KAL. · {badge}", + "MONITOR": "MONITOR", + "OFF": "AUS", + "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · REICHW. {range} m · {projection}{calBadge} · {provider}{status}", + "{count} cameras loaded · click a camera to activate": { + "one": "{count} Kamera geladen · Kamera anklicken zum Aktivieren", + "other": "{count} Kameras geladen · Kamera anklicken zum Aktivieren" + }, + "{count} cameras loaded · enable CCTV to activate": { + "one": "{count} Kamera geladen · CCTV aktivieren", + "other": "{count} Kameras geladen · CCTV aktivieren" + }, + "{count} more cameras outside this view · pan or zoom out": { + "one": "{count} weitere Kamera außerhalb dieser Ansicht · verschieben oder herauszoomen", + "other": "{count} weitere Kameras außerhalb dieser Ansicht · verschieben oder herauszoomen" + }, + "Enable CCTV to load camera intersections": "CCTV aktivieren, um Kreuzungskameras 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", + "camera grid ready": "Kameraraster bereit", + "Clearing selected data layers": "AusgewĂ€hlte Datenebenen werden ausgeschaltet", + "Clear selected data layers": "AusgewĂ€hlte Datenebenen ausschalten", + "CONDITIONS UNKNOWN": "BEDINGUNGEN UNBEKANNT", + "CLEAR": "KLAR", + "PARTLY CLOUDY": "TEILS BEWÖLKT", + "OVERCAST": "BEDECKT", + "FOG": "NEBEL", + "DRIZZLE": "NIESELREGEN", + "RAIN": "REGEN", + "RAIN SHOWERS": "REGENSCHAUER", + "SNOW SHOWERS": "SCHNEESCHAUER", + "THUNDERSTORM": "GEWITTER", + "MIXED CONDITIONS": "WECHSELHAFT", + "CYCLE ON": "WECHSEL EIN", + "CYCLE OFF": "WECHSEL AUS", + "Stop automatic page cycling. Previous, Next, and the SIG/NEWS/LOCAL tabs stay available.": "Automatischen Seitenwechsel stoppen. ZurĂŒck, Weiter und die Tabs SIG/NEWS/LOKAL bleiben verfĂŒgbar.", + "Cycle briefing pages automatically every 9 seconds (Signals → News → Local). Pauses while you hover or focus the panel. Live signal data refreshes continuously either way.": "Briefing-Seiten automatisch alle 9 Sekunden wechseln (Signale → News → Lokal). Pausiert, solange sich der Mauszeiger ĂŒber dem Bereich befindet oder dieser den Fokus hat. Live-Signaldaten werden in beiden FĂ€llen laufend aktualisiert.", + "ACQUIRING REGIONAL NEWS": "REGIONALE NEWS WERDEN ERFASST", + "REGIONAL NEWS UNAVAILABLE": "REGIONALE NEWS NICHT VERFÜGBAR", + "RESOLVING REGION": "REGION WIRD ERMITTELT", + "REGION UNAVAILABLE": "REGION NICHT VERFÜGBAR", + "NO RECENT LOCATION MATCHES": "KEINE AKTUELLEN ORTSTREFFER", + "{domain} · {age}": "{domain} · {age}", + "CLOUD {pct}%": "WOLKEN {pct} %", + "CLOUD UNKNOWN": "WOLKEN UNBEKANNT", + "{source} · LOCATION QUERY": "{source} · ORTSABFRAGE", + "REGIONAL NEWS": "REGIONALE NEWS", + "CONTEXT STANDBY": "KONTEXT STANDBY", + "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "GLOBALEN KONTEXT FÜR NÄHE-PINGS AKTIVIEREN", + "CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "KONTAKT VERLOREN · LETZTER STAND · KEINE ENTWARNUNG", + "CONTACT LOST · {subject}": "KONTAKT VERLOREN · {subject}", + "SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "OBJEKT NICHT MEHR IM FEED · ANZEIGE HÄLT LETZTEN STAND", + "{cohort} · {contact}": "{cohort} · {contact}", + "NO AVAILABLE EXAMPLE": "KEIN BEISPIEL VERFÜGBAR", + "{cohort}, Unavailable": "{cohort}, nicht verfĂŒgbar", + "AHEAD": "VORAUS", + "{side} {angle}": "{side} {angle}", + "L": "L", + "R": "R", + "{count} INPUTS UNKNOWN · NOT AN ALL-CLEAR": { + "one": "STATUS UNKLAR: {count} QUELLE · KEINE ENTWARNUNG", + "other": "STATUS UNKLAR: {count} QUELLEN · KEINE ENTWARNUNG" + }, + "AVAILABLE INPUTS CURRENT · NOT AN ALL-CLEAR": "VERFÜGBARE QUELLEN AKTUELL · KEINE ENTWARNUNG", + "AIRCRAFT": "FLUGZEUG", + "ACQUIRING SURFACE": "OBERFLÄCHE WIRD ERFASST", + "SURFACE FALLBACK": "OBERFLÄCHEN-FALLBACK", + "STALE FEED": "VERALTETER FEED", + "LIVE TRACK": "LIVE-TRACK", + "COMMERCIAL": "ZIVIL", + "{aircraftClass} · {feedState} · COURSE ALIGNED": "{aircraftClass} · {feedState} · IN KURSRICHTUNG", + "ARROW · ESTIMATED DIRECTION": "PFEIL · GESCHÄTZTE RICHTUNG", + "ROUTE DATA UNAVAILABLE": "ROUTENDATEN NICHT VERFÜGBAR", + "DEST {bearing}": "DEST {bearing}", + "Disable cockpit weather effects": "Cockpit-Wettereffekte deaktivieren", + "Enable cockpit weather effects": "Cockpit-Wettereffekte aktivieren", + "ON": "EIN", + "Normal": "Normal", + "Night vision": "Nachtsicht", + "Thermal": "WĂ€rmebild", + "Anime": "Anime", + "Noir": "Noir", + "Current cockpit vision style: {style}. Activate for next style.": "Aktueller Cockpit-Sichtstil: {style}. Aktivieren fĂŒr den nĂ€chsten Stil.", + "Current style: {style} — click for next": "Aktueller Stil: {style}. Klicken fĂŒr den nĂ€chsten", + "Collapse Contact panel": "Kontaktbereich einklappen", + "Expand Contact panel": "Kontaktbereich ausklappen", + "Collapse contact panel": "Kontaktbereich einklappen", + "Expand contact panel": "Kontaktbereich ausklappen", + "Collapse cockpit briefing panel": "Cockpit-Briefing-Bereich einklappen", + "Expand cockpit briefing panel": "Cockpit-Briefing-Bereich ausklappen", + "Collapse briefing panel": "Briefing-Bereich einklappen", + "Expand briefing panel": "Briefing-Bereich ausklappen", + "OBSERVED / MAPPED PINGS": "BEOBACHTETE / KARTIERTE PINGS", + "SOURCE-BACKED EVENTS · NO SYNTHETIC NEWS": "QUELLENBASIERTE EREIGNISSE · KEINE SYNTHETISCHEN NEWS", + "LATEST LOCATION-MATCHED REPORTING": "AKTUELLE ORTSBEZOGENE BERICHTERSTATTUNG", + "LOCAL INFO": "LOKALE INFOS", + "PLACE / CONDITIONS / POSITION": "ORT / BEDINGUNGEN / POSITION", + "TIME UNKNOWN": "ZEIT UNBEKANNT", + "{count}M AGO": "VOR {count} MIN", + "{count}H AGO": "VOR {count} H", + "{count}D AGO": "VOR {count} T", + "DIR UNKNOWN": "RICHTUNG UNBEKANNT", + "Select flight {title}": "Flug {title} auswĂ€hlen", + "{aircraftClass} · CURRENT": "{aircraftClass} · AKTUELL", + "MILITARY FLIGHT": "MILITÄRFLUG", + "COMMERCIAL FLIGHT": "ZIVILFLUG", + "{aircraftClass} · {distance}": "{aircraftClass} · {distance}", + "DISTANCE UNKNOWN": "ENTFERNUNG UNBEKANNT", + "{count} INPUTS UNKNOWN": { + "one": "STATUS UNKLAR: {count} QUELLE", + "other": "STATUS UNKLAR: {count} QUELLEN" + }, + "SOURCE STATUS UNAVAILABLE": "QUELLENSTATUS NICHT VERFÜGBAR", + "Restore real aircraft": "Echtes Flugzeug wiederherstellen", + "Reclassify as TR-3B": "Als TR-3B umklassifizieren", + "TRACK ACQUIRED": "TRACK ERFASST", + "{label} · COURSE {heading}°": "{label} · KURS {heading}°", + "Context could not restore every layer; try again": "Kontext konnte nicht alle Ebenen wiederherstellen; erneut versuchen", + "No selected data layers": "Keine Datenebenen ausgewĂ€hlt", + "{count} data layers could not be cleared": { + "one": "{count} Datenebene konnte nicht ausgeschaltet werden", + "other": "{count} Datenebenen konnten nicht ausgeschaltet werden" + }, + "Cleared {count} data layers": { + "one": "{count} Datenebene ausgeschaltet", + "other": "{count} Datenebenen ausgeschaltet" + }, + "Selected data layers could not be cleared": "AusgewĂ€hlte Datenebenen konnten nicht ausgeschaltet werden", + "Space Missions could not complete the requested transition; try again": "Raummissionen konnten den gewĂŒnschten Wechsel nicht abschließen; erneut versuchen", + "Nearby installations refreshed": "Anlagen in der NĂ€he aktualisiert", + "Nearby installations could not be refreshed; try again": "Anlagen in der NĂ€he konnten nicht aktualisiert werden; erneut versuchen", + "Space Missions cancellation could not restore the previous layer state": "Abbruch der Raummissionen konnte den vorherigen Ebenenstatus nicht wiederherstellen", + "That layer is unavailable in the current Context mode": "Diese Ebene ist im aktuellen Kontextmodus nicht verfĂŒgbar", + "{layerId} could not {action} cleanly": "{layerId} konnte nicht sauber {action}", + "start": "starten", + "stop": "beendet werden", + "{mode} could not start because another layer did not stop cleanly": "{mode}: Start nicht möglich, da eine andere Ebene nicht sauber beendet wurde", + "Space Missions": "Raummissionen", + "Context": "Kontext", + "Live Flights": "Live-FlĂŒge", + "Military Flights": "MilitĂ€rflĂŒge", + "Earthquakes (24h)": "Erdbeben (24 h)", + "Satellites": "Satelliten", + "Space Missions (30d)": "Raummissionen (30 T)", + "Street Traffic": "Straßenverkehr", + "CCTV": "CCTV", + "Radio": "Radio", + "Bikeshare": "Bikesharing", + "Live AIS Vessels": "Live-AIS-Schiffe", + "Mapped Installations": "Kartierte Anlagen", + "Global Context": "Globaler Kontext", + "Datacenters": "Rechenzentren", + "Dams": "StaudĂ€mme", + "Submarine Cables": "Seekabel", + "FIRMS Active Fires": "Aktive BrĂ€nde (FIRMS)", + "ENABLING": "WIRD AKTIVIERT", + "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 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}": "{state} · {source} · {ago}", + "{source} · {ago}": "{source} · {ago}", + "UNCERTAIN": "UNKLAR", + "{name}: {state}": "{name}: {state}", + "{count}s ago": "vor {count} s", + "CONNECTING": "VERBINDET", + "📍 Location: --": "📍 Standort: --", + "Landmark: --": "Wahrzeichen: --", + "Searched location": "Gesuchter Ort", + "ORBIT": "ORBIT", + "Location not found": "Ort nicht gefunden", + "Search failed": "Suche fehlgeschlagen", + "Fly to a POI first": "Zuerst zu einem POI fliegen", + "Reset to full globe view": "Auf Vollglobus-Ansicht zurĂŒcksetzen", + "Reset cockpit to full globe view": "Cockpit auf Vollglobus-Ansicht zurĂŒcksetzen", + "Resetting to full globe view": "ZurĂŒcksetzen auf Vollglobus-Ansicht", + "Resetting cockpit to full globe view": "Cockpit wird auf Vollglobus-Ansicht zurĂŒckgesetzt", + "MAP": "KARTE", + "panel": "Bereich", + "Expand {name}": "{name} ausklappen", + "Collapse {name}": "{name} einklappen", + "Expand Radio": "Radio ausklappen", + "Collapse Radio": "Radio einklappen", + "Expand Radio section": "Radio-Bereich ausklappen", + "Collapse Radio section": "Radio-Bereich einklappen", + "Panel layout updated — positions reset to new defaults": "Bereichslayout aktualisiert – Positionen auf neue Standardwerte zurĂŒckgesetzt", + "Collapse Cockpit display options": "Cockpit-Anzeigeoptionen einklappen", + "Expand Cockpit display options": "Cockpit-Anzeigeoptionen ausklappen", + "Collapse Cockpit Radio controls": "Cockpit-Radio-Steuerung einklappen", + "Expand Cockpit Radio controls": "Cockpit-Radio-Steuerung ausklappen", + "NO STATIONS": "KEINE SENDER", + "NO STATION AVAILABLE": "KEIN SENDER VERFÜGBAR", + "{name}, station {index} of {total}": "{name}, Sender {index} von {total}", + "No station available": "Kein Sender verfĂŒgbar", + "OFF AIR": "NICHT AUF SENDUNG", + "STATION UNAVAILABLE": "SENDER NICHT VERFÜGBAR", + "Radio could not {action} cleanly": "Radio konnte nicht sauber {action}", + "SYNC": "SYNC", + "RECONCILE": "ABGLEICHEN", + "DISABLE": "AUS", + "ENABLE": "EIN", + "Reconcile Radio — lifecycle uncertain": "Radio abgleichen: Lebenszyklus unklar", + "Disable Radio": "Radio deaktivieren", + "Enable Radio": "Radio aktivieren", + "DIRECTORY BAND": "SENDERSKALA", + "{category} BAND": "SENDERSKALA · {category}", + "NO STATION SELECTED": "KEIN SENDER GEWÄHLT", + "Directory metadata only": "Nur Verzeichnis-Metadaten", + "Loading station directory
": "Senderverzeichnis wird geladen
", + "Choose a globe marker or use next.": "Globus-Marker wĂ€hlen oder Weiter nutzen.", + "TAGS · {tags}": "TAGS · {tags}", + "Play": "Abspielen", + "PLAY": "PLAY", + "selected": "gewĂ€hlter", + "nearest": "nĂ€chstgelegener", + "{action} {target} radio station": "{action}: {target} Radiosender", + "SYNCING": "SYNC", + "READY": "BEREIT", + "station": "Sender", + " · stale/degraded directory": " · veraltetes/eingeschrĂ€nktes Verzeichnis", + " · degraded directory": " · eingeschrĂ€nktes Verzeichnis", + " · stale directory": " · veraltetes Verzeichnis", + " · outside current filter": " · außerhalb des aktuellen Filters", + "Ready — playback starts only from your action": "Bereit: Wiedergabe startet nur manuell", + "Radio off": "Radio aus", + "Connecting directly to broadcaster
": "Direktverbindung zum Sender wird aufgebaut
", + "Buffering broadcaster stream
": "Sender-Stream wird gepuffert
", + "Playing {station}": "{station} lĂ€uft", + "Paused {station}": "{station} pausiert", + "Broadcaster stream unavailable": "Sender-Stream nicht verfĂŒgbar", + " · muted during voice interaction": " · stumm bei Sprachinteraktion", + " · restoring volume after voice": " · LautstĂ€rke wird nach der Sprachinteraktion wiederhergestellt", + " · static indicates no broadcaster audio": " · Rauschen bedeutet: kein Sender-Audio", + " · tuning static until broadcaster starts": " · Rauschen, bis der Sender startet", + "Station unavailable after directory refresh — choose another channel": "Sender nach Verzeichnisaktualisierung nicht verfĂŒgbar: anderen Kanal wĂ€hlen", + "Radio is enabling
": "Radio wird aktiviert
", + "Radio is disabling
": "Radio wird deaktiviert
", + "Radio lifecycle is uncertain — use Enable or Disable to reconcile": "Radio-Lebenszyklus unklar: zum Abgleichen EIN oder AUS wĂ€hlen", + "Scene action failed": "Szenenaktion fehlgeschlagen", + "Delete shot \"{shot}\"?": "Aufnahme „{shot}“ löschen?", + "SPARSE": "DÜNN", + "BALANCED": "AUSGEWOGEN", + "DEL": "ENTF.", + "entity": "Objekt", + "Shared {subject} follow expired": "Geteilte Verfolgung abgelaufen: {subject}", + "Shared {subject} could not be restored — feed unavailable": "Geteilt: {subject} konnte nicht wiederhergestellt werden – Feed nicht verfĂŒgbar", + "Shared {subject} is unavailable": "Geteilt: {subject} ist nicht verfĂŒgbar", + "ACQUIRING": "ERFASSUNG", + "SHARED {subject}": "GETEILT: {subject}", + "LOADING LIVE DATA": "LIVE-DATEN WERDEN GELADEN", + "LOAD COMPLETE": "LADEN ABGESCHLOSSEN", + "LOAD CANCELLED": "LADEN ABGEBROCHEN", + "LOAD FAILED": "LADEN FEHLGESCHLAGEN", + "LIVE DATA OFF": "LIVE-DATEN AUS", + "MAPPED SITES LOADED": "KARTIERTE STANDORTE GELADEN", + "RETRYING MAPPED SITES": "KARTIERTE STANDORTE: NEUER VERSUCH", + "FETCHING MAPPED SITES": "KARTIERTE STANDORTE WERDEN ABGERUFEN", + "TURNING OFF LIVE DATA": "LIVE-DATEN WERDEN AUSGESCHALTET", + "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", + "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}", + "Detection overlay: off": "Erkennungs-Overlay: aus", + "DETECT": "ERKENN.", + "voice|LISTENING": "HÖRT ZU", + "voice|EXECUTING": "FÜHRT AUS", + "AI AGENT": "KI-AGENT", + "Voice model tier — applies next session": "Sprachmodell-Stufe: gilt ab nĂ€chster Sitzung", + "Estimated session cost": "GeschĂ€tzte Sitzungskosten", + "Voice control — activate to toggle voice; hold Space to speak": "Sprachsteuerung: aktivieren zum Umschalten; Leertaste halten zum Sprechen", + "VOICE STANDBY": "SPRACHE STANDBY", + "VOICE CONTROL": "SPRACHSTEUERUNG", + "Hold Space to speak · tap Space to activate focused controls": "Leertaste halten zum Sprechen · kurz drĂŒcken, um fokussierte Elemente zu aktivieren", + "VOICE SYSTEM ERROR": "SPRACHSYSTEM-FEHLER", + "DISMISS": "SCHLIESSEN", + "Check microphone permission and network access, then try again.": "Mikrofonberechtigung und Netzwerkzugriff prĂŒfen, dann erneut versuchen.", + "Release Space to send": "Leertaste loslassen zum Senden", + "Hold Space to talk": "Leertaste halten zum Sprechen", + "Requesting microphone": "Mikrofonzugriff wird angefordert", + "Ask or command": "Fragen oder Befehl geben", + "Running command": "Befehl lĂ€uft", + "Voice off": "Sprache aus", + "WebRTC microphone support unavailable": "WebRTC-MikrofonunterstĂŒtzung 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}", + "Voice model: {pendingId} — click to switch to {target}; applies next session": "Sprachmodell: {pendingId}. Klicken zum Wechsel auf {target}; gilt ab nĂ€chster Sitzung", + "Estimated session cost on {modelId} — {responses} response(s). Warns at {warn}, ends the session at {cap}.": "GeschĂ€tzte Sitzungskosten mit {modelId}. {responses} Antwort(en). Warnung bei {warn}, Sitzungsende bei {cap}.", + "{tier} applies next session": "{tier} gilt ab nĂ€chster Sitzung", + "Session ended — cost cap {cost}": "Sitzung beendet: Kostenlimit {cost}", + "Radio did not start": "Radio wurde nicht gestartet", + "Aircraft cockpit view": "Flugzeug-Cockpitansicht", + "LEVEL": "HORIZONT", + "Estimated destination direction": "GeschĂ€tzte Richtung zum Ziel", + "DEST ---°": "DEST ---°", + "OPTICAL PLANE · 01": "OPTISCHE EBENE · 01", + "VISOR LOCK · ACTIVE": "VISIER-LOCK · AKTIV", + "GROUND SPEED · KTS": "GESCHW. ÜBER GRUND · KN", + "ALTITUDE · FT": "HÖHE · FT", + "FIRST PERSON": "EGO-PERSPEKTIVE", + "LIVE TRACK · COURSE ALIGNED": "LIVE-TRACK · IN KURSRICHTUNG", + "Cockpit vision style": "Sichtstil im Cockpit", + "Previous cockpit vision style": "Vorheriger Cockpit-Sichtstil", + "Previous vision style": "Vorheriger Sichtstil", + "Current cockpit vision style: NORMAL. Activate for next style.": "Aktueller Cockpit-Sichtstil: NORMAL. Aktivieren fĂŒr den nĂ€chsten Stil.", + "Current style: NORMAL — click for next": "Aktueller Stil: NORMAL. Klicken fĂŒr den nĂ€chsten", + "CURRENT": "AKTUELL", + "Next cockpit vision style": "NĂ€chster Cockpit-Sichtstil", + "Next vision style": "NĂ€chster Sichtstil", + "Current aircraft heading": "Aktueller Flugzeugkurs", + "GROUND SPEED": "GESCHW. ÜBER GRUND", + "ALTITUDE": "HÖHE", + "Contact cockpit summary": "Cockpit-Zusammenfassung des Kontakts", + "CONTACT": "KONTAKT", + "CONTACTS · 250 KM": "KONTAKTE · 250 KM", + "Contact navigation": "Kontaktnavigation", + "CONTEXT ONLY": "NUR KONTEXT", + "Nearby cohort counts": "Anzahl Kontakte in der NĂ€he", + "NEAREST OBSERVED / MAPPED": "NÄCHSTGELEGENES OBJEKT · BEOBACHTET / KARTIERT", + "AVAILABLE INPUTS ONLY · NOT AN ALL-CLEAR": "NUR VERFÜGBARE QUELLEN · KEINE ENTWARNUNG", + "Cockpit briefing carousel": "Cockpit-Briefing-Karussell", + "Estimated flight plan": "GeschĂ€tzter Flugplan", + "ESTIMATED FLIGHT PLAN": "GESCHÄTZTER FLUGPLAN", + "FROM": "VON", + "TO": "NACH", + "Cockpit briefing controls": "Cockpit-Briefing-Steuerung", + "Previous briefing page": "Vorherige Briefing-Seite", + "Next briefing page": "NĂ€chste Briefing-Seite", + "Live signals": "Live-Signale", + "Latest regional news": "Aktuelle regionale Nachrichten", + "Location-based information": "Ortsbezogene Informationen", + "TEMP": "TEMP", + "WIND": "WIND", + "SKY": "HIMMEL", + "PRECIP": "NIEDERSCHL.", + "Show Live Signals": "Live-Signale anzeigen", + "NEWS": "NEWS", + "Show Regional News": "Regionale News anzeigen", + "Show Local Info": "Lokale Infos anzeigen", + "Cockpit display and Radio controls": "Cockpit-Anzeige und Radio-Steuerung", + "DISPLAY": "ANZEIGE", + "Cockpit display options": "Cockpit-Anzeigeoptionen", + "RADIO": "RADIO", + "Cockpit compact Radio controls": "Kompakte Cockpit-Radio-Steuerung", + "Previous filtered radio station": "Vorheriger gefilterter Radiosender", + "Play selected radio station": "GewĂ€hlten Radiosender abspielen", + "Next filtered radio station": "NĂ€chster gefilterter Radiosender", + "VOLUME": "LAUTSTÄRKE", + "Cockpit Radio volume": "Cockpit-Radio-LautstĂ€rke", + "View switcher": "Ansichtsumschalter", + "Exit cockpit and return to full globe view": "Cockpit verlassen und zur Vollglobus-Ansicht zurĂŒckkehren", + "RESET": "RESET", + "Exit cockpit view": "Cockpitansicht verlassen", + "EXIT COCKPIT": "COCKPIT VERLASSEN", + "Navigation, voice, and visual preset controls": "Steuerung fĂŒr Navigation, Sprache und visuelle Presets", + "Expand Visual Presets": "Visuelle Presets ausklappen", + "Pin visual presets": "Visuelle Presets anheften", + "Keep visual presets open": "Visuelle Presets geöffnet lassen", + "Show the globe without a visual filter.": "Globus ohne visuellen Filter anzeigen.", + "Emulate a green phosphor CRT with scanlines and screen curvature.": "GrĂŒne Phosphor-Röhre mit Scanlines und BildschirmkrĂŒmmung nachahmen.", + "Simulate night-vision goggles with green intensification and a tube vignette.": "NachtsichtgerĂ€t mit grĂŒner RestlichtverstĂ€rkung und Röhrenvignette simulieren.", + "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "FLIR-artigen WĂ€rmekontrast simulieren. Ironbow aufdrehen fĂŒr Farbe.", + "Apply bright cel-shaded color and illustrated outlines.": "Leuchtende Cel-Shading-Farben und gezeichnete Konturen anwenden.", + "Apply high-contrast monochrome film-noir grading.": "Kontrastreiche monochrome Film-noir-Farbgebung anwenden.", + "MAP SOURCE": "KARTENQUELLE", + "Map source": "Kartenquelle", + "Style": "Stil", + "Expand LOCATION": "STANDORT ausklappen", + "Collapse panel": "Bereich einklappen", + "Pin location tray": "Standortleiste anheften", + "Keep location tray open": "Standortleiste geöffnet lassen", + "Search any location": "Beliebigen Ort suchen", + "Search location by name or coordinates": "Ort nach Namen oder Koordinaten suchen", + "Search any location...": "Ort suchen...", + "WEATHER": "WETTER", + "CONTEXT": "KONTEXT", + "Expand panel": "Bereich ausklappen", + "Context mode": "Kontextmodus", + "CONTACTS": "KONTAKTE", + "Cycles the nearest contacts of whatever type you select — planes, vessels, installations. Satellites track independently.": "Wechselt zwischen den nĂ€chstgelegenen Kontakten des gewĂ€hlten Typs: Flugzeuge, Schiffe, Anlagen. Satelliten werden unabhĂ€ngig verfolgt.", + "SPACE MISSIONS": "RAUMMISSIONEN", + "SELECT CONTEXT": "KONTEXT WÄHLEN", + "Contact Context actions": "Aktionen fĂŒr Kontaktkontext", + "COCKPIT": "COCKPIT", + "SEARCH NEARBY SITES": "STANDORTE IN DER NÄHE SUCHEN", + "Reclassify tracked contact as TR-3B": "Verfolgten Kontakt als TR-3B umklassifizieren", + "CONTACTS CONTEXT OFF": "KONTAKTKONTEXT AUS", + "SELECT CONTACTS TO LOAD OBSERVED / MAPPED PROXIMITY": "KONTAKTE WÄHLEN FÜR BEOBACHTETE / KARTIERTE OBJEKTE IM UMKREIS", + "Available Space Missions": "VerfĂŒgbare Raummissionen", + "AVAILABLE MISSIONS": "VERFÜGBARE MISSIONEN", + "SELECT A MISSION TO INSPECT": "MISSION ZUM ANSEHEN WÄHLEN", + "LOADING 30-DAY MISSION INDEX": "30-TAGE-MISSIONSINDEX WIRD GELADEN", + "TAB PREVIEWS · ENTER / SPACE SELECTS": "TAB: VORSCHAU · ENTER / LEERTASTE: AUSWAHL", + "Internet radio and local SDR": "Internetradio und lokales SDR", + "STATION TAG": "KATEGORIE", + "Filter stations by station tag": "Sender nach Kategorie filtern", + "All": "Alle", + "Enable Radio, then choose a globe marker or use next.": "Radio aktivieren, dann einen Globus-Marker wĂ€hlen oder Weiter nutzen.", + "DRAG TO TUNE": "ZUM ABSTIMMEN ZIEHEN", + "ALL · DRAG THE NEEDLE": "ALLE · NADEL ZIEHEN", + "SNAPS TO AVAILABLE STATIONS": "RASTET BEI VERFÜGBAREN SENDERN EIN", + "Radio playback": "Radiowiedergabe", + "Previous filtered station": "Vorheriger gefilterter Sender", + "Play selected station": "GewĂ€hlten Sender abspielen", + "Next filtered station": "NĂ€chster gefilterter Sender", + "STOP": "STOPP", + "Stop radio playback": "Radiowiedergabe stoppen", + "Radio volume": "Radio-LautstĂ€rke", + "STATION SITE": "SENDER-WEBSITE", + "Audio connects directly to the broadcaster after you press play. Your IP is visible to that broadcaster.": "Beim Starten der Wiedergabe wird eine direkte Verbindung zum Sender hergestellt. Die IP-Adresse ist fĂŒr diesen Sender sichtbar.", + "Intelligence HUD (H)": "Lagebild-HUD (H)", + "Layout": "Layout", + "HUD layout": "HUD-Layout", + "Tactical": "Taktisch", + "Minimal": "Minimal", + "Detection Overlay (D)": "Erkennungs-Overlay (D)", + "Detection overlay": "Erkennungs-Overlay", + "Detection label density": "Dichte der Erkennungsbeschriftungen", + "Allocation": "Zuteilung", + "Detection label allocation": "Zuteilung der Erkennungsbeschriftungen", + "Elastic": "Elastisch", + "Weighted": "Gewichtet", + "Fade": "Ausblenden", + "Detection fade distance": "Ausblendeabstand der Erkennung", + "World-overlay fade distance outside the keyhole as a percentage of its radius": "Ausblendeabstand des Welt-Overlays außerhalb des SchlĂŒssellochs, in Prozent seines Radius", + "Outside": "Außen", + "Detection opacity outside the keyhole": "Erkennungsdeckkraft außerhalb des SchlĂŒssellochs", + "World-overlay label and card opacity beyond the fade distance": "Deckkraft von Beschriftungen und Infokarten im Welt-Overlay jenseits des Ausblendeabstands", + "PARAMETERS": "PARAMETER", + "3D aircraft — flat icons zoomed out, 3D models up close": "3D-Flugzeuge: flache Symbole aus der Ferne, 3D-Modelle aus der NĂ€he", + "Models": "Modelle", + "3D model coverage": "3D-Modellabdeckung", + "Proximity": "NĂ€he", + "Scope — the circular viewport mask": "Scope: die kreisrunde Ansichtsmaske", + "Scope": "Scope", + "Feather": "Weichzeichnung", + "Scope edge feather": "Weichzeichnung des Scope-Rands", + "Scope edge feather as a percentage of the keyhole radius": "Weichzeichnung des Scope-Rands in Prozent des SchlĂŒsselloch-Radius", + "Celestial": "Himmelsring", + "Hide UI chrome": "OberflĂ€che ausblenden", + "Clean UI": "Reine Ansicht", + "Bloom / Glow": "Bloom / Leuchten", + "Bloom intensity": "Bloom-StĂ€rke", + "Sharpening": "SchĂ€rfen", + "Sharpen": "SchĂ€rfen", + "Sharpen intensity": "SchĂ€rfestĂ€rke", + "EXIT CLEAN VIEW": "REINE ANSICHT BEENDEN", + "Return UI controls": "Bedienelemente wieder einblenden", + "Initializing photorealistic world...": "Fotorealistische Welt wird initialisiert...", + "DATA LAYERS": "DATENEBENEN", + "NEAREST": "NÄCHSTGELEGENE", + "CCTV camera": "CCTV-Kamera", + "CALIBRATION": "KALIBRIERUNG", + "Drag the camera in the world: rings rotate, arrows move, handles set range/FOV": "Kamera in der Welt ziehen: Ringe drehen, Pfeile verschieben, Griffe setzen Reichweite/FOV", + "Camera pose — click a value to type": "Kamerapose: Wert anklicken zum Eingeben", + "Heading (compass °) — click to type": "Ausrichtung (Kompass °): anklicken zum Eingeben", + "Pitch (° up/down) — click to type": "Neigung (° auf/ab): anklicken zum Eingeben", + "Horizontal FOV (°) — click to type": "Horizontales FOV (°): anklicken zum Eingeben", + "Range / monitor-plane distance (m) — click to type": "Reichweite / Abstand der Monitorebene (m): anklicken zum Eingeben", + "Mount height above ground (m) — click to type": "Montagehöhe ĂŒber Grund (m): anklicken zum Eingeben", + "North offset from catalog position (m) — click to type": "Nordversatz zur Katalogposition (m): anklicken zum Eingeben", + "East offset from catalog position (m) — click to type": "Ostversatz zur Katalogposition (m): anklicken zum Eingeben", + "SAVE CAL": "KAL. SPEICHERN", + "RESET CAL": "KAL. ZURÜCKSETZEN", + "SCENE SUMMARY": "SZENEN-ÜBERSICHT", + "SCENES": "SZENEN", + "Scene recipe": "Szenenrezept", + "NEW": "NEU", + "CAPTURE SHOT": "AUFNAHME SPEICHERN", + "UPDATE SHOT": "AUFNAHME AKTUALISIEREN", + "START": "START", + "EXPORT PRESETS": "PRESETS EXPORTIEREN", + "IMPORT": "IMPORTIEREN", + "RUN LOG": "PROTOKOLL", + "POWER UP": "STARTKLAR", + "GROUND STATION · PROVIDER SETTINGS": "BODENSTATION · ANBIETER-EINSTELLUNGEN", + "Close key setup": "SchlĂŒssel-Einrichtung schließen", + "Power up the globe": "Globus hochfahren", + "The globe already flies keyless. Every key below switches on another real feed — paste one and it's saved into this app's local configuration, then the server restarts itself. Server-side keys stay on this machine; Google Maps and Cesium ion run in the browser and must be provider-restricted. Keys you configured elsewhere are shown but never touched.": "Der Globus fliegt bereits ohne SchlĂŒssel. Jeder SchlĂŒssel unten schaltet einen weiteren echten Feed frei: EinfĂŒgen genĂŒgt, er wird in der lokalen Konfiguration dieser App gespeichert, danach startet der Server selbst neu. Serverseitige SchlĂŒssel bleiben auf diesem Rechner; die SchlĂŒssel fĂŒr Google Maps und Cesium ion werden im Browser verwendet und mĂŒssen beim jeweiligen Anbieter eingeschrĂ€nkt werden. Anderswo konfigurierte SchlĂŒssel werden angezeigt, aber nie verĂ€ndert.", + "SAVE KEYS": "SCHLÜSSEL SPEICHERN", + "ESC to close": "ESC zum Schließen", + "The Google Maps key buys the photorealistic planet — everything else stacks on top.": "Der Google-Maps-SchlĂŒssel liefert den fotorealistischen Planeten, alles andere kommt obendrauf.", + "NO PLACE LEFT BEHIND": "KEIN ORT BLEIBT ZURÜCK", + "ACTIVE STYLE": "AKTIVER STIL", + "Globe actions": "Globus-Aktionen", + "Turn off all selected data layers": "Alle ausgewĂ€hlten Datenebenen ausschalten", + "Copy share link": "Link zum Teilen kopieren", + "Reset camera and return to full globe view": "Kamera zurĂŒcksetzen und zur Vollglobus-Ansicht zurĂŒckkehren", + "MISSION CONTROL · FIRST LAUNCH": "MISSION CONTROL · ERSTER START", + "Choose your first view": "Erste Ansicht wĂ€hlen", + "LIVE CONTACTS": "LIVE-KONTAKTE", + "Aircraft, vessels and nearby intelligence": "Flugzeuge, Schiffe und Lagebild der Umgebung", + "Launches, spacecraft and orbital context": "Starts, Raumfahrzeuge und Orbit-Kontext", + "EXPLORE MANUALLY": "MANUELL ERKUNDEN", + "Begin with a clean globe": "Mit einem leeren Globus beginnen", + "Don't show this again": "Nicht mehr anzeigen", + "ESC to dismiss": "ESC zum Schließen", + "Tip: the GEV MIC button in the dock lets you talk to the map.": "Tipp: Mit der Mikrofontaste im Dock lĂ€sst sich die Karte per Sprache steuern.", + "Pick a shape, then click the map.": "Form wĂ€hlen, dann auf die Karte klicken.", + "Enter to place the pin, Esc to cancel.": "Enter setzt den Pin, Esc bricht ab.", + "Click where the pin goes.": "Auf die Stelle fĂŒr den Pin klicken.", + "Click {count} more points.": { + "one": "Noch {count} Punkt anklicken.", + "other": "Noch {count} Punkte anklicken." + }, + "Those points are in a line — move one off it to enclose an area.": "Diese Punkte liegen auf einer Linie – einen davon verschieben, um eine FlĂ€che einzuschließen.", + "That line has no length — click somewhere further away.": "Diese Linie hat keine LĂ€nge – weiter entfernt klicken.", + " · {max}-point limit reached": " · Limit von {max} Punkten erreicht", + "{measure} · double-click or Enter to finish, Backspace undoes, Esc cancels.{full}": "{measure} · Doppelklick oder Enter beendet, RĂŒcktaste macht rĂŒckgĂ€ngig, Esc bricht ab.{full}", + "drawings on the map": "Zeichnungen auf der Karte", + "That shape already has {count} points — finish it or press Backspace.": "Diese Form hat bereits {count} Punkte – abschließen oder RĂŒcktaste drĂŒcken.", + "That point is off the globe — click on the world.": "Dieser Punkt liegt außerhalb des Globus – auf die Erde klicken.", + "That shape could not be placed.": "Diese Form konnte nicht platziert werden.", + "Could not place the shape: {error}": "Form konnte nicht platziert werden: {error}", + "Board cleared.": "ZeichenflĂ€che geleert.", + "{owner} is using the pointer — close it first.": "{owner} verwendet gerade den Zeiger – zuerst schließen.", + "{label} · Detailed outline unavailable": "{label} · Detaillierter Umriss nicht verfĂŒgbar", + "Space Missions isolates replay data. Exit the mode to enable {layer}.": "Der Modus Raummissionen isoliert Replay-Daten. Modus verlassen, um {layer} zu aktivieren.", + "Data attribution": "Datenquellen", + "Data provided by:": "Daten bereitgestellt von:", + "Light aircraft": "Leichtflugzeug", + "Glider": "Segelflugzeug", + "Turboprop": "Turboprop", + "Airliner": "Verkehrsflugzeug", + "Widebody": "Großraumflugzeug", + "Four-engine jet": "Vierstrahliger Jet", + "Helicopter": "Hubschrauber", + "Fast jet": "Kampfjet", + "Business jet": "Businessjet", + "Drone": "Drohne", + "General emergency": "Allgemeiner Notfall", + "Unlawful interference": "Widerrechtlicher Eingriff", + "Radio failure": "Funkausfall", + "Downed aircraft": "AbgestĂŒrztes Luftfahrzeug", + "Minimum fuel": "Minimum Fuel (Treibstoff knapp)", + "Lifeguard (medical priority)": "Lifeguard (medizinische PrioritĂ€t)", + "Rasuwagadhi witness video": "Augenzeugenvideo Rasuwagadhi", + "Bhote Koshi valley footage": "Aufnahmen aus dem Bhote-Koshi-Tal", + "Flood footage": "Hochwasseraufnahmen", + "Compilation and casualty claims": "Zusammenschnitt und Opferangaben", + "SOURCE GEOCONFIRMED · WORLD-PINNED": "QUELLE GEOVERIFIZIERT · AUF GLOBUS FIXIERT", + "SOURCE CREDITED · LOCATION UNRESOLVED": "QUELLE GENANNT · ORT UNGEKLÄRT", + "REFERENCE ONLY · CLAIMS UNVERIFIED": "NUR REFERENZ · ANGABEN UNBESTÄTIGT", + "SOURCE GEOCONFIRMED": "QUELLE GEOVERIFIZIERT", + "2021 historical reference versus 2026 post-event imagery; changes are cumulative and include the July 2025 Rasuwagadhi flood. Schematic downstream progression, not modeled arrival time; not an official hazard model.": "Historische Referenz von 2021 gegenĂŒber Bildern nach dem Ereignis von 2026; die VerĂ€nderungen sind kumulativ und umfassen die Rasuwagadhi-Flut vom Juli 2025. Schematischer Verlauf flussabwĂ€rts, keine modellierte Ankunftszeit; kein offizielles Gefahrenmodell.", + "Immediate collapse viewpoint": "Blickpunkt direkt am Erdrutsch", + "Collapse viewpoint": "Blickpunkt Erdrutsch", + "Debris-dammed lake": "Durch Geröll aufgestauter See", + "Dammed lake": "Aufgestauter See", + "Second landslide": "Zweiter Erdrutsch", + "Gyirong border gate": "GrenzĂŒbergang Gyirong", + "Border gate": "GrenzĂŒbergang", + "Timure evidence cluster": "Beweiscluster Timure", + "Mailung / Upper Trishuli bridge": "Mailung / BrĂŒcke am Upper Trishuli", + "Dandagaun viewpoint restaurant": "Aussichtsrestaurant Dandagaun", + "Dandagaun viewpoint": "Aussichtspunkt Dandagaun", + "Bidur - Trishuli bridge": "Bidur – Trishuli-BrĂŒcke", + "Bidur bridge": "BrĂŒcke Bidur", + "Devighat / Taadi Khola Bridge": "Devighat / Taadi-Khola-BrĂŒcke", + "Devighat bridge": "BrĂŒcke Devighat", + "Facebook player API did not initialize.": "Facebook-Player-API wurde nicht initialisiert.", + "Facebook player API could not load.": "Facebook-Player-API konnte nicht geladen werden.", + "Facebook player API timed out.": "ZeitĂŒberschreitung bei der Facebook-Player-API.", + "X embed API did not initialize.": "X-Embed-API wurde nicht initialisiert.", + "X embed could not load.": "X-Einbettung konnte nicht geladen werden.", + "X embed timed out.": "ZeitĂŒberschreitung bei der X-Einbettung.", + "TIMEOUT": "ZEITÜBERSCHREITUNG", + "BLOCKED": "BLOCKIERT", + "Facebook embed unavailable. The post may be private, removed, region-restricted, or blocked.": "Facebook-Einbettung nicht verfĂŒgbar. Der Beitrag ist möglicherweise privat, entfernt, regional gesperrt oder blockiert.", + "Preloading {provider} media": "{provider}-Medien werden vorgeladen", + "LOADING X POST
": "X-BEITRAG WIRD GELADEN
", + "The X post is unavailable or cannot be embedded.": "Der X-Beitrag ist nicht verfĂŒgbar oder kann nicht eingebettet werden.", + "X POST · PROVIDER CONTROLS": "X-BEITRAG · STEUERUNG DES ANBIETERS", + "{reason} OPEN ORIGINAL.": "{reason} ORIGINAL ÖFFNEN.", + "X embed unavailable": "X-Einbettung nicht verfĂŒgbar", + "FACEBOOK · PROVIDER CONTROLS": "FACEBOOK · STEUERUNG DES ANBIETERS", + "Facebook embed unavailable": "Facebook-Einbettung nicht verfĂŒgbar", + "AUTOPLAY BLOCKED · USE PROVIDER CONTROLS": "AUTOPLAY BLOCKIERT · STEUERUNG DES ANBIETERS NUTZEN", + "Embedded {provider} media for {source}": "Eingebettete {provider}-Medien fĂŒr {source}", + "witness source": "Augenzeugenquelle", + "Witness source": "Augenzeugenquelle", + "{provider} · EMBEDDED SOURCE": "{provider} · EINGEBETTETE QUELLE", + "OPEN ORIGINAL ↗": "ORIGINAL ÖFFNEN ↗", + "{provider} media: {source}": "{provider}-Medien: {source}", + "{provider} · PROVIDER CONTROLS": "{provider} · STEUERUNG DES ANBIETERS", + "YOUTUBE {state} · OPEN ORIGINAL": "YOUTUBE {state} · ORIGINAL ÖFFNEN", + "INITIATION": "AUSLÖSUNG", + "DAMMING": "AUFSTAUUNG", + "SECONDARY FAILURE": "FOLGEVERSAGEN", + "BORDER ARRIVAL": "ANKUNFT AN DER GRENZE", + "PROPAGATION": "AUSBREITUNG", + "DOWNSTREAM PASSAGE": "DURCHGANG FLUSSABWÄRTS", + "CONSEQUENCE": "FOLGEN", + "DOWNSTREAM CONSEQUENCE": "FOLGEN FLUSSABWÄRTS", + "EVIDENCE": "BELEGE", + "{year} HISTORICAL REFERENCE": "HISTORISCHE REFERENZ {year}", + "{year} POST-EVENT": "NACH DEM EREIGNIS {year}", + "{count} GEOLOCATED SOURCE-MAP PLACEMENTS": { + "one": "{count} GEOLOKALISIERTE PLATZIERUNG AUF DER QUELLENKARTE", + "other": "{count} GEOLOKALISIERTE PLATZIERUNGEN AUF DER QUELLENKARTE" + }, + "NO PREVIEW": "KEINE VORSCHAU", + "YouTube source": "YouTube-Quelle", + "Facebook source": "Facebook-Quelle", + "SOURCE LINK": "QUELLENLINK", + "{publisher} / OPEN": "{publisher} / ÖFFNEN", + "Bhote Koshi flood reconstruction controls": "Steuerung der Bhote-Koshi-Flutrekonstruktion", + "EVENT RECONSTRUCTION · 26 AUG 2026": "REKONSTRUKTION DES EREIGNISSES · 26. AUG. 2026", + "BHOTE KOSHI OUTBURST FLOOD": "AUSBRUCHSFLUT BHOTE KOSHI", + "Close event layer": "Ereignisebene schließen", + "OBSERVED IMAGERY": "REALE BILDDATEN", + "SCHEMATIC CORRIDOR": "SCHEMATISCHER KORRIDOR", + "2021 HISTORICAL REFERENCE / 2026 POST-EVENT": "HISTORISCHE REFERENZ 2021 / NACH DEM EREIGNIS 2026", + "Historical reference and post-event image split": "Bildvergleich: historische Referenz und Bild nach dem Ereignis", + "RECONSTRUCTION CLOCK": "REKONSTRUKTIONSUHR", + "Schematic downstream progression": "Schematischer Verlauf flussabwĂ€rts", + "Story beat navigation": "Navigation durch die Story", + "Previous story beat": "Vorheriger Story-Schritt", + "CAUSE": "URSACHE", + "CAPTURE TIME UNVERIFIED": "AUFNAHMEZEIT UNBESTÄTIGT", + "Next story beat": "NĂ€chster Story-Schritt", + "▶ PLAY": "▶ ABSPIELEN", + "Play the next shot and continue through this scene": "NĂ€chste Aufnahme abspielen und die Szene fortsetzen", + "▶ PLAY SCENE": "▶ SZENE ABSPIELEN", + "◉ CINEMATIC": "◉ KINOMODUS", + "â†ș FULL STORY": "â†ș GANZE STORY", + "↗ OPEN ORIGINAL": "↗ ORIGINAL ÖFFNEN", + "⌖ LOWER GORGE": "⌖ UNTERE SCHLUCHT", + "FIELD REPORTS · {count}": "FELDBERICHTE · {count}", + "GEOLOCATIONS · {credit}": "GEOLOKALISIERUNGEN · {credit}", + "↗ OPEN PUBLIC MAP": "↗ ÖFFENTLICHE KARTE ÖFFNEN", + " Clouds are preserved from the source imagery.": " Die Wolken stammen aus den Quellbildern.", + "Rasuwagadhi witness": "Augenzeuge Rasuwagadhi", + "Open original source for {source}; capture time unverified": "Originalquelle fĂŒr {source} öffnen; Aufnahmezeit unbestĂ€tigt", + "Historical reference and post-event image divider": "Trennlinie zwischen historischer Referenz und Bild nach dem Ereignis", + "A historical reference {before} percent, B post-event {after} percent": "A historische Referenz {before} Prozent, B nach dem Ereignis {after} Prozent", + "■ RELEASE CAMERA": "■ KAMERA FREIGEBEN", + "Seek Nepal scene clock": "Szenenuhr Nepal spulen", + "NEPAL SCENE CLOCK": "SZENENUHR NEPAL", + "
 PLAYING SHOT": "
 AUFNAHME LÄUFT", + "▶ PLAY SHOT": "▶ AUFNAHME ABSPIELEN", + "Ⅱ PAUSE": "Ⅱ PAUSE", + "â†ș REPLAY CINEMATIC": "â†ș KINOMODUS WIEDERHOLEN", + "â†ș REPLAY": "â†ș WIEDERHOLEN", + "
 PLAYING SCENE": "
 SZENE LÄUFT", + "Continue {scene} from next shot": "{scene} ab der nĂ€chsten Aufnahme fortsetzen", + "current scene": "aktuelle Szene", + "Replay the full reconstruction": "Gesamte Rekonstruktion wiederholen", + "SCENE SHOT": "SZENENAUFNAHME", + "TIME UNVERIFIED": "ZEIT UNBESTÄTIGT", + "{count} SOURCES": { + "one": "{count} QUELLE", + "other": "{count} QUELLEN" + }, + "OUTSIDE IMAGERY SWIPE": "NICHT IM BILDVERGLEICH", + "{scene} / AUTHORED SHOT": "{scene} / GESTALTETE AUFNAHME", + "NEPAL FLOOD INCIDENT": "FLUTEREIGNIS NEPAL", + "Play {shot}": "{shot} abspielen", + "current scene shot": "aktuelle Szenenaufnahme", + "Play reconstruction": "Rekonstruktion abspielen", + "Load previous scene shot": "Vorherige Szenenaufnahme laden", + "Load next scene shot": "NĂ€chste Szenenaufnahme laden", + "SCHEMATIC CORRIDOR, NOT MODELED ARRIVAL TIME.": "SCHEMATISCHER KORRIDOR, KEINE MODELLIERTE ANKUNFTSZEIT.", + "Rasuwa · 26 Aug 2026": "Rasuwa · 26. Aug. 2026", + "Event reconstruction": "Rekonstruktion des Ereignisses", + "BHOTE KOSHI FLOOD INCIDENT": "FLUTEREIGNIS BHOTE KOSHI", + "NEPAL · 26 AUG 2026": "NEPAL · 26. AUG. 2026", + "USGS INITIAL REPORT": "USGS-ERSTMELDUNG", + "26 AUG 2026 · 08:37 NPT": "26. AUG. 2026 · 08:37 NPT", + "28.2710° N · 85.5150° E": "28,2710° N · 85,5150° O", + "INITIAL M4.4 · RECLASSIFIED M5.2 LANDSLIDE": "ZUERST M4,4 · NEU EINGESTUFT ALS M5,2-ERDRUTSCH", + "USGS EVENT us7000tbwb · OPEN SOURCE": "USGS-EREIGNIS us7000tbwb · QUELLE ÖFFNEN", + "Open the USGS initial report for the 26 August 2026 Nepal landslide": "USGS-Erstmeldung zum Erdrutsch in Nepal vom 26. August 2026 öffnen", + "Show the Nepal context callout without a border or country fill": "Kontexthinweis zu Nepal ohne Grenze und LandesflĂ€che zeigen", + "Introduce Nepal, draw its border, then reveal the Bhote Koshi incident": "Nepal vorstellen, die Grenze zeichnen und dann das Bhote-Koshi-Ereignis zeigen", + "CITIES": "STÄDTE", + "Keep the regional incident context and introduce nearby city labels": "Regionalen Ereigniskontext beibehalten und StĂ€dtenamen in der NĂ€he einblenden", + "PLACES": "ORTE", + "Introduce the reconstruction scene key places from trigger to downstream": "Die wichtigsten Orte der Rekonstruktion vom Auslöser bis flussabwĂ€rts vorstellen", + "PATH": "PFAD", + "Animate the sourced cyan river-centerline route to Trishuli Bazaar": "Die belegte cyanfarbene Flussmittellinie bis Trishuli Bazaar animieren", + "OVERVIEW": "ÜBERSICHT", + "Keep the completed flood path and location labels visible": "Fertigen Flutpfad und Ortsnamen sichtbar lassen", + "RECORD": "MELDUNG", + "Reveal the trigger record while making a slow camera approach": "USGS-Meldung zum auslösenden Ereignis zeigen, wĂ€hrend sich die Kamera langsam nĂ€hert", + "{speed} kn": "{speed} kn", + "That file is not valid JSON.": "Diese Datei ist kein gĂŒltiges JSON.", + "That JSON file is not GeoJSON.": "Diese JSON-Datei ist kein GeoJSON.", + "That FeatureCollection has no features list.": "Diese FeatureCollection hat keine Feature-Liste.", + "Every GeoJSON feature must have type Feature.": "Jedes GeoJSON-Feature muss den Typ Feature haben.", + "That GeoJSON has invalid geometries.": "Dieses GeoJSON enthĂ€lt ungĂŒltige Geometrien.", + "That GeoJSON contains an unsupported geometry.": "Dieses GeoJSON enthĂ€lt eine nicht unterstĂŒtzte Geometrie.", + "That GeoJSON has invalid coordinates.": "Dieses GeoJSON enthĂ€lt ungĂŒltige Koordinaten.", + "That file creates more than {limit} map objects (the limit).": "Diese Datei erzeugt mehr als {limit} Kartenobjekte (das Limit).", + "That file has more than {limit} style definitions and image links after cleanup (the limit).": "Diese Datei enthĂ€lt nach der Bereinigung mehr als {limit} Stildefinitionen und Bildlinks (das Limit).", + "That file has more than {limit} features (the limit).": "Diese Datei enthĂ€lt mehr als {limit} Features (das Limit).", + "That file has more than {limit} points (the limit) across {features} features.": "Diese Datei enthĂ€lt mehr als {limit} Punkte (das Limit) in {features} Features.", + "That file has more than {limit} points (the limit).": "Diese Datei enthĂ€lt mehr als {limit} Punkte (das Limit).", + "That KMZ unpacks to more than the import limit.": "Diese KMZ ist entpackt grĂ¶ĂŸer als das Importlimit.", + "That KMZ is damaged and could not be unpacked.": "Diese KMZ ist beschĂ€digt und konnte nicht entpackt werden.", + "That KMZ is not a readable zip archive.": "Diese KMZ ist kein lesbares ZIP-Archiv.", + "That KMZ uses a zip format this import does not read.": "Diese KMZ verwendet ein ZIP-Format, das dieser Import nicht liest.", + "That KMZ is encrypted.": "Diese KMZ ist verschlĂŒsselt.", + "That KMZ uses a compression method this import does not read.": "Diese KMZ verwendet eine Komprimierungsmethode, die dieser Import nicht liest.", + "That KML has invalid geometry bounds.": "Diese KML enthĂ€lt ungĂŒltige Geometriegrenzen.", + "That KML has invalid coordinates.": "Diese KML enthĂ€lt ungĂŒltige Koordinaten.", + "That GPX file has no document.": "Diese GPX-Datei hat kein -Dokument.", + "That {format} file is not valid XML.": "Diese {format}-Datei ist kein gĂŒltiges XML.", + "That file has an unreadable image or exceeds the 16-megapixel image limit.": "Diese Datei enthĂ€lt ein unlesbares Bild oder ĂŒberschreitet das Bildlimit von 16 Megapixeln.", + "That KML could not be read.": "Diese KML konnte nicht gelesen werden.", + "That file has invalid point coordinates.": "Diese Datei enthĂ€lt ungĂŒltige Punktkoordinaten.", + "Ground heights are not available for that file. Try again when the map has loaded.": "FĂŒr diese Datei sind keine GelĂ€ndehöhen verfĂŒgbar. Erneut versuchen, wenn die Karte geladen ist.", + "That file took too long to read.": "Das Lesen dieser Datei hat zu lange gedauert.", + "Nothing to import.": "Nichts zu importieren.", + "That file is larger than {size} MiB.": "Diese Datei ist grĂ¶ĂŸer als {size} MiB.", + "Only GeoJSON, KML, KMZ and GPX files can be imported.": "Nur GeoJSON-, KML-, KMZ- und GPX-Dateien können importiert werden.", + "That file has nothing to draw.": "Diese Datei enthĂ€lt nichts zum Zeichnen.", + "That KMZ holds no KML document.": "Diese KMZ enthĂ€lt kein KML-Dokument.", + "That {format} file could not be read.": "Diese {format}-Datei konnte nicht gelesen werden.", + "That file has {count} map objects; the limit is {limit}.": "Diese Datei hat {count} Kartenobjekte; das Limit ist {limit}.", + "Ground heights could not be read. Try that file again.": "GelĂ€ndehöhen konnten nicht gelesen werden. Die Datei erneut laden.", + "That file has invalid point graphics.": "Diese Datei enthĂ€lt ungĂŒltige Punktgrafiken.", + "Map tiles temporarily unavailable": "Kartenkacheln vorĂŒbergehend nicht verfĂŒgbar", + "Mapped names temporarily unavailable": "Kartierte Namen vorĂŒbergehend nicht verfĂŒgbar", + "Military airfield": "MilitĂ€rflugplatz", + "Naval base": "MarinestĂŒtzpunkt", + "Firing range": "Schießplatz", + "Military land": "MilitĂ€rgelĂ€nde", + "Mapped installation": "Kartierte Anlage", + "Military area": "MilitĂ€risches Gebiet", + "flight": "Flug", + "military flight": "MilitĂ€rflug", + "satellite": "Satellit", + "Draw": "Zeichnen", + "Directions": "Route", + "Recent imagery": "Aktuelle Bilddaten", + "Included in bundle": "Im Bundle enthalten", + "Missing bundle file — reimport its bundle": "Bundle-Datei fehlt – Bundle erneut importieren", + "Source configured; file checked when loaded": "Quelle konfiguriert; Datei wird beim Laden geprĂŒft", + "Source unavailable": "Quelle nicht verfĂŒgbar", + "NORMAL": "NORMAL", + "ANIME": "ANIME", + "NOIR": "NOIR", + "ARCTIC": "ARKTIS", + "ANTARCTIC": "ANTARKTIS", + "NORTH AMERICA": "NORDAMERIKA", + "SOUTH AMERICA": "SÜDAMERIKA", + "EUROPE": "EUROPA", + "AFRICA": "AFRIKA", + "ASIA": "ASIEN", + "OCEANIA": "OZEANIEN", + "NORTHERN OCEANIC GRID": "NÖRDLICHES OZEANRASTER", + "SOUTHERN OCEANIC GRID": "SÜDLICHES OZEANRASTER", + "{state} {layers}": "{state} {layers}", + "view band|STREET": "STRASSE", + "view band|CITY": "STADT", + "view band|METRO": "GROSSRAUM", + "view band|REGIONAL": "REGION", + "view band|GLOBAL": "GLOBAL", + "N/A": "k. A.", + "{mode} {band} {locality} | {region} | ALT {alt} | WINDOW {window} | SUN {sun}° | ONA {ona}° | {zone}": "{mode} {band} {locality} | {region} | ALT {alt} | FENSTER {window} | SONNE {sun}° | ONA {ona}° | {zone}", + "NEAR {poi} ({city}) {distance}": "NAHE {poi} ({city}) {distance}", + "SECTOR {lat} {lon}": "SEKTOR {lat} {lon}", + "hemisphere|N": "N", + "hemisphere|S": "S", + "hemisphere|E": "O", + "hemisphere|W": "W", + "Provider Settings does not answer proxied requests": "Anbieter-Einstellungen beantworten keine weitergeleiteten Anfragen", + "Provider Settings is disabled while sharing is enabled": "Anbieter-Einstellungen sind deaktiviert, solange das Teilen aktiv ist", + "Provider Settings answers only the machine running the server": "Anbieter-Einstellungen antworten nur dem Rechner, auf dem der Server lĂ€uft", + "Provider Settings answers only local hostnames": "Anbieter-Einstellungen antworten nur lokalen Hostnamen", + "Provider Settings requires an exact local Origin": "Anbieter-Einstellungen erfordern einen exakt lokalen Origin", + "Unrecognized Origin refused": "Unbekannter Origin abgelehnt", + "Cross-origin requests are refused": "Cross-Origin-Anfragen werden abgelehnt", + "Content-Type must be application/json": "Content-Type muss application/json sein", + "Method not allowed": "Methode nicht erlaubt", + "Request too large": "Anfrage zu groß", + "Invalid JSON": "UngĂŒltiges JSON", + "Body must be a JSON object of {ENV_VAR: value}": "Body muss ein JSON-Objekt der Form {ENV_VAR: value} sein", + "No keys provided": "Keine SchlĂŒssel angegeben", + "At most {limit} keys per save": "Höchstens {limit} SchlĂŒssel pro Speichervorgang", + "Unknown key: {name}": "Unbekannter SchlĂŒssel: {name}", + "{name} must be a string": "{name} muss ein String sein", + "{name} is empty": "{name} ist leer", + "{name} is longer than any real key ({limit} max)": "{name} ist lĂ€nger als jeder echte SchlĂŒssel (max. {limit})", + "{name} may only contain printable characters with no spaces": "{name} darf nur druckbare Zeichen ohne Leerzeichen enthalten", + "{name} contains a character that is not valid in a key (#, quotes, $, \\, or backtick)": "{name} enthĂ€lt ein Zeichen, das in einem SchlĂŒssel ungĂŒltig ist (#, AnfĂŒhrungszeichen, $, \\ oder Backtick)", + "{name} is configured outside Provider Settings and can only be changed where it was set": "{name} ist außerhalb der Anbieter-Einstellungen konfiguriert und kann nur dort geĂ€ndert werden, wo er gesetzt wurde", + "The key was not saved: could not restrict the credential file to your account; nothing was saved": "Der SchlĂŒssel wurde nicht gespeichert: Die Zugangsdatei ließ sich nicht auf das eigene Benutzerkonto beschrĂ€nken; nichts wurde gespeichert", + "The key was not saved: the existing configuration could not be read, so nothing was changed": "Der SchlĂŒssel wurde nicht gespeichert: Die vorhandene Konfiguration konnte nicht gelesen werden, daher wurde nichts geĂ€ndert", + "Could not write the {store} store": "Speicher {store} konnte nicht geschrieben werden", + "OAuth check failed: {detail}": "OAuth-PrĂŒfung fehlgeschlagen: {detail}", + "Could not check ChatGPT sign-in. Try again.": "ChatGPT-Anmeldung konnte nicht geprĂŒft werden. Erneut versuchen.", + "VOICE AUTH · CHATGPT OAUTH": "SPRACH-AUTH · CHATGPT OAUTH", + "VOICE AUTH · API KEY": "SPRACH-AUTH · API-SCHLÜSSEL", + "USE API KEY": "API-SCHLÜSSEL VERWENDEN", + "USE CHATGPT OAUTH": "CHATGPT OAUTH VERWENDEN", + "Use OPENAI_API_KEY for the next cloud voice session": "OPENAI_API_KEY fĂŒr die nĂ€chste Cloud-Sprachsitzung verwenden", + "Use the signed-in local ChatGPT/Codex OAuth session for the next cloud voice session": "Die angemeldete lokale ChatGPT/Codex-OAuth-Sitzung fĂŒr die nĂ€chste Cloud-Sprachsitzung verwenden", + "Metered — a billing-enabled account": "Kostenpflichtig – Konto mit aktivierter Abrechnung", + "Optional paid token — public access works without one": "Optionales kostenpflichtiges Token – öffentlicher Zugang funktioniert auch ohne", + "Free key — register, paste, done": "Kostenloser SchlĂŒssel – registrieren, einfĂŒgen, fertig", + "browser-side": "browserseitig", + "This key runs in the browser by design — restrict it at the provider (see SECURITY.md)": "Dieser SchlĂŒssel lĂ€uft absichtlich im Browser – beim Anbieter einschrĂ€nken (siehe SECURITY.md)", + "configured externally": "extern konfiguriert", + "Supplied by your environment, Keychain, or launcher — change it where it was set": "Aus Umgebung, SchlĂŒsselbund oder Launcher – dort Ă€ndern, wo er gesetzt wurde", + "MANAGE ↗": "VERWALTEN ↗", + "GET KEY ↗": "SCHLÜSSEL HOLEN ↗", + "{envVar} saved — paste to replace": "{envVar} gespeichert – zum Ersetzen einfĂŒgen", + "paste {envVar}": "{envVar} einfĂŒgen", + "unsaved provider keys": "ungespeicherte Anbieter-SchlĂŒssel", + "Project keys: {status}": "ProjektschlĂŒssel: {status}", + "Cloud voice will use OPENAI_API_KEY on the next session.": "Die Cloud-Sprachsteuerung verwendet ab der nĂ€chsten Sitzung OPENAI_API_KEY.", + "Checking local ChatGPT OAuth sign-in
": "Lokale ChatGPT-OAuth-Anmeldung wird geprĂŒft
", + "Could not check ChatGPT sign-in.": "ChatGPT-Anmeldung konnte nicht geprĂŒft werden.", + "ChatGPT OAuth selected for cloud voice. Your API key stays saved and available.": "ChatGPT OAuth fĂŒr die Cloud-Sprachsteuerung gewĂ€hlt. Der API-SchlĂŒssel bleibt gespeichert und verfĂŒgbar.", + "ChatGPT sign-in expired. Opening sign-in again
": "ChatGPT-Anmeldung abgelaufen. Anmeldung wird erneut geöffnet
", + "Opening ChatGPT sign-in in your browser
": "ChatGPT-Anmeldung wird im Browser geöffnet
", + "Could not start ChatGPT sign-in on this machine.": "ChatGPT-Anmeldung konnte auf diesem Rechner nicht gestartet werden.", + "Finish ChatGPT sign-in in the browser. Waiting for it to complete
": "ChatGPT-Anmeldung im Browser abschließen. Warten auf Abschluss
", + "ChatGPT sign-in timed out. Click {button} to try again.": "ZeitĂŒberschreitung bei der ChatGPT-Anmeldung. Zum erneuten Versuch auf {button} klicken.", + "ChatGPT sign-in complete. OAuth will be used for the next cloud voice session.": "ChatGPT-Anmeldung abgeschlossen. OAuth wird fĂŒr die nĂ€chste Cloud-Sprachsitzung verwendet.", + "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 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", + "No current readings": "Keine aktuellen Messwerte", + "{count} stations reporting": { + "one": "{count} Station meldet", + "other": "{count} Stationen melden" + }, + "Highest air-quality readings in view": "Schlechteste LuftqualitĂ€tswerte im Bild", + "Low": "Niedrig", + "Low health risk": "Geringes Gesundheitsrisiko", + "Moderate": "MĂ€ĂŸig", + "Moderate health risk": "MĂ€ĂŸiges Gesundheitsrisiko", + "High": "Hoch", + "High health risk": "Hohes Gesundheitsrisiko", + "Very High": "Sehr hoch", + "Very High health risk": "Sehr hohes Gesundheitsrisiko", + "Air quality": "LuftqualitĂ€t", + "Canada only · ECCC AQHI network": "Nur Kanada · ECCC-AQHI-Messnetz", + "ECCC request timed out": "ZeitĂŒberschreitung bei der ECCC-Abfrage", + "Malformed AQHI station response": "Fehlerhafte Antwort der AQHI-Stationen", + "No AQHI stations available": "Keine AQHI-Stationen verfĂŒgbar", + "Malformed AQHI observation response": "Fehlerhafte Antwort der AQHI-Beobachtungen", + "Camera source temporarily unavailable": "Kameraquelle vorĂŒbergehend nicht verfĂŒgbar", + "Mapped camera locations": "Kartierte Kamerastandorte", + "SHOW NEAREST": "NÄCHSTGELEGENE ZEIGEN", + "Stop following the current object before navigating to a camera": "Vor dem Wechsel zu einer Kamera das Verfolgen des aktuellen Objekts beenden", + "Move to the nearest loaded camera and show its details": "Zur nĂ€chstgelegenen geladenen Kamera wechseln und Details zeigen", + "Camera badges": "Kamera-Markierungen", + "Cyan cameras turn coral when selected. Wedges illustrate mapped direction, not measured coverage. Nearby cameras may be outside the screen.": "Cyanfarbene Kameras werden bei Auswahl korallenrot. Keile zeigen die kartierte Blickrichtung, keine gemessene Abdeckung. Kameras in der NĂ€he können außerhalb des Bildschirms liegen.", + "{count} nearby · {onScreen} on screen": { + "one": "{count} in der NĂ€he · {onScreen} im Bild", + "other": "{count} in der NĂ€he · {onScreen} im Bild" + }, + "{count} nearby": { + "one": "{count} in der NĂ€he", + "other": "{count} in der NĂ€he" + }, + "retrying mapped ALPR cameras": "kartierte ALPR-Kameras: neuer Versuch", + "loading mapped ALPR cameras": "kartierte ALPR-Kameras werden geladen", + "No ALPR data for this area — US and Canada only": "Keine ALPR-Daten fĂŒr dieses Gebiet – nur USA und Kanada", + "Zoom in to load mapped cameras": "Hineinzoomen, um kartierte Kameras zu laden", + "Showing cached locations": "Standorte aus dem Cache", + "Coverage limited — zoom in": "Abdeckung begrenzt – hineinzoomen", + "No ALPR data for this area": "Keine ALPR-Daten fĂŒr dieses Gebiet", + "None on screen — nearby cameras are outside the view": "Keine im Bild – Kameras in der NĂ€he liegen außerhalb der Ansicht", + "ALPR camera": "ALPR-Kamera", + "Camera coverage unavailable": "Kameraabdeckung nicht verfĂŒgbar", + "OpenStreetMap · community mapped": "OpenStreetMap · von der Community kartiert", + "Overpass returned an incomplete camera response": "Overpass hat eine unvollstĂ€ndige Kamera-Antwort geliefert", + "At least {count}": "Mindestens {count}", + "Named areas ({n})": "Benannte Gebiete ({n})", + "{distance} FLIGHT / VESSEL WINDOW": "{distance} FLUG-/SCHIFFSFENSTER", + "mapped matches within {km} km of the subject": "kartierte Treffer im Umkreis von {km} km um das Objekt", + "none mapped within {km} km; not a complete 250 km survey": "keine kartierten Treffer im Umkreis von {km} km; keine vollstĂ€ndige 250-km-Erfassung", + "mapped matches from the loaded viewport": "kartierte Treffer aus dem geladenen Bildausschnitt", + "viewport feed is not a complete 250 km survey": "Feed des Bildausschnitts ist keine vollstĂ€ndige 250-km-Erfassung", + "GBFS fetch error": "GBFS-Abruffehler", + "FOV {value}° (DATASHEET)": "FOV {value}° (DATENBLATT)", + "SPEC FOV {span}° (CAPABILITY)": "SPEZ. FOV {span}° (BEREICH)", + "{spec} · SPECS: CCTV-DATABASE.COM": "{spec} · SPEZ.: CCTV-DATABASE.COM", + "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "Atlantik und östlicher/zentraler Nordpazifik; keine weltweite Abdeckung von WirbelstĂŒrmen.", + "Cyclone advisories unavailable": "Wirbelsturm-Lageberichte nicht verfĂŒgbar", + "Cyclone data unavailable": "Wirbelsturmdaten nicht verfĂŒgbar", + "Potential tropical cyclone": "Potenzieller tropischer Wirbelsturm", + "Post-tropical cyclone": "Posttropischer Wirbelsturm", + "Hurricane": "Hurrikan", + "Tropical storm": "Tropischer Sturm", + "Tropical depression": "Tropisches Tiefdruckgebiet", + "Subtropical storm": "Subtropischer Sturm", + "Subtropical depression": "Subtropisches Tiefdruckgebiet", + "Track and cone match this advisory": "Zugbahn und Kegel passen zu diesem Lagebericht", + "Track/cone awaiting advisory {number}": "Zugbahn/Kegel warten auf Lagebericht {number}", + "Track/cone unavailable": "Zugbahn/Kegel nicht verfĂŒgbar", + "Cached advisory · stale source": "Lagebericht aus dem Cache · Quelle veraltet", + "Loading advisories
": "Lageberichte werden geladen
", + "{count} active storms": { + "one": "{count} aktiver Sturm", + "other": "{count} aktive StĂŒrme" + }, + "Position as of {time}": "Position, Stand {time}", + "Maximum sustained wind: {wind} · Pressure: {pressure}": "Maximaler Dauerwind: {wind} · Luftdruck: {pressure}", + "{name} · {classification} · Advisory {number} · issued {time}": "{name} · {classification} · Lagebericht {number} · ausgegeben {time}", + "No active NHC/CPHC systems": "Keine aktiven NHC/CPHC-Systeme", + "Advisories unavailable": "Lageberichte nicht verfĂŒgbar", + "Cyclones · NHC / CPHC": "WirbelstĂŒrme · NHC / CPHC", + "Atlantic · E/C Pacific": "Atlantik · östl./zentr. Pazifik", + "{storms} · {name} selected": "{storms} · {name} ausgewĂ€hlt", + "Official advisory ↗": "Offizieller Lagebericht ↗", + "Active NHC and CPHC cyclone advisories": "Aktive Wirbelsturm-Lageberichte von NHC und CPHC", + "Wind unavailable": "Wind nicht verfĂŒgbar", + "Advisory center / forecast track": "Zentrum laut Lagebericht / Vorhersagebahn", + "Center-track uncertainty cone": "Unsicherheitskegel der Zentrumsbahn", + "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "Einen Sturm auf der Karte auswĂ€hlen oder in der Liste wĂ€hlen, um ihn auszuwĂ€hlen und die Kamera dorthin zu bewegen. Auf eine leere Kartenstelle klicken, um die Auswahl aufzuheben. Kontext aus Lageberichten von NOAA NHC/CPHC. Der Kegel beschreibt die Unsicherheit der vorhergesagten Zentrumsbahn, nicht die SturmgrĂ¶ĂŸe oder das gesamte Gefahrengebiet. Die Beschriftungen der Vorhersagepunkte sind Vorlaufstunden der Quelle, keine aus dem Ausgabezeitpunkt berechneten Zeiten. Die Geometrie folgt der OberflĂ€che; die Darstellungshöhe hat keine meteorologische Bedeutung. Den offiziellen Lagebericht beachten.", + "DRIVE": "AUTO", + "Drive": "Auto", + "WALK": "ZU FUSS", + "Walk": "Zu Fuß", + "BIKE": "RAD", + "Bike": "Fahrrad", + "rate limited": "Anfragelimit erreicht", + "routing service is rate limited": "Routing-Dienst hat das Anfragelimit erreicht", + "route leg too long": "Routenabschnitt zu lang", + "route too long": "Route zu lang", + "{error} — try again in a moment": "{error} – gleich erneut versuchen", + "Routing is rate limited — try again in a moment": "Routing-Anfragelimit erreicht – gleich erneut versuchen", + "Routing unavailable (HTTP {status})": "Routing nicht verfĂŒgbar (HTTP {status})", + "Routing unavailable": "Routing nicht verfĂŒgbar", + "direction|left": "links", + "direction|right": "rechts", + "direction|slightly left": "leicht links", + "direction|slightly right": "leicht rechts", + "direction|sharply left": "scharf links", + "direction|sharply right": "scharf rechts", + "direction|straight": "geradeaus", + "direction|around": "in Gegenrichtung", + "fork direction|left": "links", + "fork direction|right": "rechts", + "fork direction|slightly left": "leicht links", + "fork direction|slightly right": "leicht rechts", + "fork direction|sharply left": "scharf links", + "fork direction|sharply right": "scharf rechts", + "fork direction|straight": "geradeaus", + "lane direction|left": "linke", + "lane direction|right": "rechte", + "lane direction|slightly left": "leicht nach links fĂŒhrende", + "lane direction|slightly right": "leicht nach rechts fĂŒhrende", + "lane direction|sharply left": "scharf nach links fĂŒhrende", + "lane direction|sharply right": "scharf nach rechts fĂŒhrende", + "lane direction|straight": "geradeaus fĂŒhrende", + "ordinal|{number}st": "{number}.", + "ordinal|{number}nd": "{number}.", + "ordinal|{number}rd": "{number}.", + "ordinal|{number}th": "{number}.", + "Head out on {road}": "Start auf {road}", + "Head out": "Start", + "Arrive at your destination, on the left": "Ziel erreicht, es liegt links", + "Arrive at your destination, on the right": "Ziel erreicht, es liegt rechts", + "Arrive at your destination": "Ziel erreicht", + "Make a U-turn onto {road}": "Wenden und weiter auf {road}", + "Make a U-turn": "Wenden", + "Continue straight onto {road}": "Geradeaus weiter auf {road}", + "Continue straight": "Geradeaus weiter", + "Turn {direction} onto {road}": "Auf {road} {direction} abbiegen", + "Turn {direction}": "Hier {direction} abbiegen", + "Turn onto {road}": "Auf {road} abbiegen", + "maneuver|Turn": "Abbiegen", + "Continue {direction} onto {road}": "Weiter {direction} auf {road}", + "Continue {direction}": "Weiter {direction}", + "At the end of the road, turn {direction} onto {road}": "Am Ende der Straße {direction} auf {road} abbiegen", + "At the end of the road, turn {direction}": "Am Ende der Straße {direction} abbiegen", + "At the end of the road, continue onto {road}": "Am Ende der Straße weiter auf {road}", + "At the end of the road, continue": "Am Ende der Straße weiter", + "Keep {direction} at the fork onto {road}": "An der Gabelung {direction} weiter auf {road}", + "Keep {direction} at the fork": "An der Gabelung {direction} weiter", + "Continue at the fork onto {road}": "An der Gabelung weiter auf {road}", + "Continue at the fork": "An der Gabelung weiter", + "Merge {direction} onto {road}": "Auf {road} {direction} einfĂ€deln", + "Merge {direction}": "Hier {direction} einfĂ€deln", + "Merge onto {road}": "Auf {road} einfĂ€deln", + "maneuver|Merge": "EinfĂ€deln", + "Take the ramp on the {direction} onto {road}": "Die Auffahrt {direction} auf {road} nehmen", + "Take the ramp on the {direction}": "Die Auffahrt {direction} nehmen", + "Take the ramp {direction} onto {road}": "Die Auffahrt {direction} auf {road} nehmen", + "Take the ramp {direction}": "Die Auffahrt {direction} nehmen", + "Take the ramp onto {road}": "Die Auffahrt auf {road} nehmen", + "Take the ramp": "Die Auffahrt nehmen", + "Take the exit on the {direction} onto {road}": "Die Ausfahrt {direction} auf {road} nehmen", + "Take the exit on the {direction}": "Die Ausfahrt {direction} nehmen", + "Take the exit {direction} onto {road}": "Die Ausfahrt {direction} auf {road} nehmen", + "Take the exit {direction}": "Die Ausfahrt {direction} nehmen", + "Take the exit onto {road}": "Die Ausfahrt auf {road} nehmen", + "Take the exit": "Die Ausfahrt nehmen", + "At the roundabout, take the {exit} exit onto {road}": "Im Kreisverkehr die {exit} Ausfahrt auf {road} nehmen", + "At the roundabout, take the {exit} exit": "Im Kreisverkehr die {exit} Ausfahrt nehmen", + "Enter the roundabout onto {road}": "In den Kreisverkehr auf {road} einfahren", + "Enter the roundabout": "In den Kreisverkehr einfahren", + "At the roundabout, turn {direction} onto {road}": "Im Kreisverkehr {direction} auf {road} abbiegen", + "At the roundabout, turn {direction}": "Im Kreisverkehr {direction} abbiegen", + "At the roundabout, continue onto {road}": "Im Kreisverkehr weiter auf {road}", + "At the roundabout, continue": "Im Kreisverkehr weiter", + "Exit the roundabout onto {road}": "Den Kreisverkehr auf {road} verlassen", + "Exit the roundabout": "Den Kreisverkehr verlassen", + "Use the {direction} lane onto {road}": "Die {direction} Spur auf {road} benutzen", + "Use the {direction} lane": "Die {direction} Spur benutzen", + "Continue onto {road}": "Weiter auf {road}", + "maneuver|Continue": "Weiter", + "{mode} — reroute for {modeLower}": "{mode} – Route im Modus „{modeLower}“ neu berechnen", + "CLICK MAP": "KARTE ANKLICKEN", + "SET A": "A SETZEN", + "Click a spot on the globe to place A (click again to cancel)": "Auf eine Stelle des Globus klicken, um A zu setzen (erneut klicken zum Abbrechen)", + "Then click the globe to place the start": "Dann auf den Globus klicken, um den Start zu setzen", + "SET B": "B SETZEN", + "Click a spot on the globe to place B (click again to cancel)": "Auf eine Stelle des Globus klicken, um B zu setzen (erneut klicken zum Abbrechen)", + "Then click the globe to place the destination": "Dann auf den Globus klicken, um das Ziel zu setzen", + "Swap A and B": "A und B tauschen", + "FLY ···": "FLIEGEN ···", + "FLYING": "IM FLUG", + "FLY": "FLIEGEN", + "Fly the camera along the route": "Kamera entlang der Route fliegen lassen", + "Place A and B first": "Zuerst A und B setzen", + "action|CLEAR": "LÖSCHEN", + "Remove the route and both markers": "Route und beide Markierungen entfernen", + "press Escape twice to leave Draw": "zweimal Esc drĂŒcken, um Zeichnen zu verlassen", + "{name} is active — turn {name} off, then set {endpoint}": "{name} ist aktiv – {name} ausschalten, dann {endpoint} setzen", + "{name} is active — {leave}, then set {endpoint}": "{name} ist aktiv – {leave}, dann {endpoint} setzen", + "Only the first {count} turns of this route are shown": "Nur die ersten {count} Abbiegungen dieser Route werden gezeigt", + "Turn-by-turn directions": "Abbiegehinweise", + "Another map tool is using clicks — close it, then SET A again": "Ein anderes Kartenwerkzeug nutzt die Klicks – es schließen, dann erneut A SETZEN", + "Routing
": "Route wird berechnet
", + "No route found": "Keine Route gefunden", + "{distance} · {duration} · {mode} · first {count} turns": "{distance} · {duration} · {mode} · erste {count} Abbiegungen", + "{distance} · {duration} · {mode}": "{distance} · {duration} · {mode}", + "Click the globe to place {endpoint}": "Auf den Globus klicken, um {endpoint} zu setzen", + "SET B, then click the globe": "B SETZEN, dann auf den Globus klicken", + "SET A, then click the globe": "A SETZEN, dann auf den Globus klicken", + "Step {step} of {total} · then {leg}": "Schritt {step} von {total} · dann {leg}", + "Step {step} of {total}": "Schritt {step} von {total}", + "Then: {instruction}": "NĂ€chster Schritt: {instruction}", + "No route found between A and B": "Keine Route zwischen A und B gefunden", + "Routing failed: {error}": "Routing fehlgeschlagen: {error}", + "Routing timed out": "ZeitĂŒberschreitung beim Routing", + "Routing unavailable — no response from the routing service": "Routing nicht verfĂŒgbar – keine Antwort vom Routing-Dienst", + "Earthquake source unavailable": "Erdbebenquelle nicht verfĂŒgbar", + "live feed unavailable": "Live-Feed nicht verfĂŒgbar", + "{value}°N": "{value}°N", + "{value}°S": "{value}°S", + "{value}°E": "{value}°O", + "{value}°W": "{value}°W", + "fire confidence|high": "hoch", + "fire confidence|nominal": "mittel", + "fire confidence|low": "niedrig", + "age|<1h": "<1 h", + "age|{count}h": "{count} h", + "age|{count}d": "{count} T", + "Source snapshot time unavailable": "Zeitpunkt des Quell-Snapshots nicht verfĂŒgbar", + "Live data unavailable": "Live-Daten nicht verfĂŒgbar", + "Intel Picture": "Lagebild", + "Kinetic 30d": "Kinetisch 30 T", + "Border Crisis": "Grenzkrise", + "Iran Picture": "Lagebild Iran", + "Iran Kinetic": "Iran kinetisch", + "Yemen FLOT": "Jemen Frontlinie", + "Latest Drop": "Neueste Ausgabe", + "GhostMaps file could not be read": "GhostMaps-Datei konnte nicht gelesen werden", + "{count} source links ↗ · click card to open the first": { + "one": "{count} Quelllink ↗ · Eintrag anklicken zum Öffnen", + "other": "{count} Quelllinks ↗ · Eintrag anklicken, um den ersten zu öffnen" + }, + "S2 · {name}": "S2 · {name}", + "Report": "Bericht", + "Open the source for {title}": "Quelle fĂŒr {title} öffnen", + "GhostMaps catalog unavailable": "GhostMaps-Katalog nicht verfĂŒgbar", + "LIVE · GitHub {commit} · {message} · checked every {seconds}s": "LIVE · GitHub {commit} · {message} · PrĂŒfung alle {seconds} s", + "GitHub {commit} · {message} · reconnecting for live updates": "GitHub {commit} · {message} · Verbindung fĂŒr Live-Updates wird wiederhergestellt", + "Connecting to the S2 GhostMaps repository
": "Verbindung zum S2-GhostMaps-Repository
", + "{count} placemarks": { + "one": "{count} Ortsmarke", + "other": "{count} Ortsmarken" + }, + "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 veröffentlicht diese KMZ-Produkte auf GitHub. Neue Uploads werden innerhalb von Sekunden erkannt und ersetzen automatisch die vorherige Ausgabe. FĂŒr den Bericht eine Markierung anklicken.", + "Malformed GhostMaps catalog": "Fehlerhafter GhostMaps-Katalog", + "Low-accuracy score < 2%": "Ungenauigkeitswert < 2 %", + "Low-accuracy score 2–10%": "Ungenauigkeitswert 2–10 %", + "Low-accuracy score > 10%": "Ungenauigkeitswert > 10 %", + "GNSS integrity source unavailable": "GNSS-IntegritĂ€tsquelle nicht verfĂŒgbar", + "Regional sample · 250 nm radius · cells from visited views over 30 min": "Regionale Stichprobe · Radius 250 NM · Zellen aus besuchten Ansichten ĂŒber 30 min", + "Retrying automatically at {time} UTC": "Automatischer neuer Versuch um {time} UTC", + "Retrying automatically after provider cooldown": "Automatischer neuer Versuch nach der Sperrzeit des Anbieters", + "Updates automatically after pan or zoom and once a minute. The public feed covers a 250-nautical-mile circle around the view centre; zooming out does not make it a worldwide snapshot. Blank cells are outside sampled coverage or have insufficient observations.": "Aktualisiert sich nach Schwenken oder Zoomen und einmal pro Minute automatisch. Der öffentliche Feed deckt einen Kreis von 250 Seemeilen um die Bildmitte ab; Herauszoomen macht daraus keinen weltweiten Snapshot. Leere Zellen liegen außerhalb der Stichprobe oder haben zu wenige Beobachtungen.", + "Low-accuracy score = 100 × max(0, bad − 1) / total: one aircraft is discounted, so this is not the raw share. Cells need {aircraft} aircraft over {minutes} minutes. Navigation-integrity anomalies are not a detection of jamming or spoofing.": "Ungenauigkeitswert = 100 × max(0, schlecht − 1) / gesamt: Ein Luftfahrzeug wird abgezogen, das ist also nicht der reine Anteil. Zellen brauchen {aircraft} Luftfahrzeuge ĂŒber {minutes} Minuten. Anomalien der NavigationsintegritĂ€t sind kein Nachweis von Jamming oder Spoofing.", + "GNSS snapshot needs a view anchor": "GNSS-Snapshot braucht einen Ansichtsanker", + "GNSS feed rate limited (HTTP 429)": "GNSS-Feed hat das Anfragelimit erreicht (HTTP 429)", + "Malformed GNSS integrity snapshot": "Fehlerhafter GNSS-IntegritĂ€ts-Snapshot", + "GNSS integrity snapshot has no observation time": "GNSS-IntegritĂ€ts-Snapshot ohne Beobachtungszeit", + "installation class|AIRFIELD": "FLUGPLATZ", + "installation class|NAVAL BASE": "MARINESTÜTZPUNKT", + "installation class|RANGE": "SCHIESSPLATZ", + "installation class|MILITARY LAND": "MILITÄRGELÄNDE", + "installation class|BASE": "STÜTZPUNKT", + "installation class|BARRACKS": "KASERNE", + "installation class|TRAINING AREA": "ÜBUNGSPLATZ", + "installation class|PLACES CANDIDATE": "AUS GOOGLE PLACES", + "installation class|INSTALLATION": "ANLAGE", + "No mapped sites within {km} km of the contact": "Keine kartierten Standorte im Umkreis von {km} km um den Kontakt", + "{count} mapped sites within {km} km of the contact": { + "one": "{count} kartierter Standort im Umkreis von {km} km um den Kontakt", + "other": "{count} kartierte Standorte im Umkreis von {km} km um den Kontakt" + }, + "No mapped sites in view": "Keine kartierten Standorte im Bild", + "{count} mapped sites in view": { + "one": "{count} kartierter Standort im Bild", + "other": "{count} kartierte Standorte im Bild" + }, + "Too many mapped sites in view to list them all": "Zu viele kartierte Standorte im Bild, um alle aufzulisten", + "Installation context unavailable": "Kontext der Anlage nicht verfĂŒgbar", + "Unknown": "Unbekannt", + "Selected Space Mission": "GewĂ€hlte Raummission", + "Malformed launch snapshot": "Fehlerhafter Start-Snapshot", + "Heard by your receiver": "Vom eigenen EmpfĂ€nger empfangen", + "1090 MHz": "1090 MHz", + "978 MHz UAT": "978 MHz UAT", + "browser SDR": "Browser-SDR", + "decoder feed": "Decoder-Feed", + "Your RTL-SDR receiver and decoder feed": "Eigener RTL-SDR-EmpfĂ€nger und Decoder-Feed", + "Your decoder feed": "Eigener Decoder-Feed", + "Your RTL-SDR receiver": "Eigener RTL-SDR-EmpfĂ€nger", + "NO CALLSIGN": "KEIN RUFZEICHEN", + "ALT {altitude} FT · GS {speed} KT · TRK {track}": "ALT {altitude} FT · GS {speed} KN · TRK {track}", + "V/S {rate}": "V/S {rate}", + "V/S {rate} FPM": "V/S {rate} FT/MIN", + "POSITION {age}": "POSITION {age}", + "POSITION {seconds} S AGO": "POSITION VOR {seconds} S", + "{count} MSGS": { + "one": "{count} NACHR.", + "other": "{count} NACHR." + }, + "Decoder feeds": "Decoder-Feeds", + "WebUSB + decoder feeds": "WebUSB + Decoder-Feeds", + "opening receiver": "EmpfĂ€nger wird geöffnet", + "checking decoder feeds": "Decoder-Feeds werden geprĂŒft", + "WebUSB needs desktop Chrome or Edge": "WebUSB braucht Chrome oder Edge auf dem Desktop", + "connect a receiver in Radio": "EmpfĂ€nger unter Radio verbinden", + "receiver is in FM mode": "EmpfĂ€nger ist im FM-Modus", + "listening": "empfĂ€ngt", + "USB error": "USB-Fehler", + "${amount}K": "{amount} Tsd. $", + "${amount}M": "{amount} Mio. $", + "${amount}B": "{amount} Mrd. $", + "fire cause|Human": "Mensch", + "fire cause|Natural": "NatĂŒrlich", + "fire cause|Undetermined": "UngeklĂ€rt", + "fire cause|Unknown": "Unbekannt", + "fire behavior|Minimal": "Minimal", + "fire behavior|Moderate": "MĂ€ĂŸig", + "fire behavior|Active": "Aktiv", + "fire behavior|Extreme": "Extrem", + "Type {level} Incident": "Einsatz Typ {level}", + "age|{count}m": "{count} min", + "{acres} ac": { + "one": "{acres} Acre", + "other": "{acres} Acres" + }, + "{percent}% contained": "{percent} % eingedĂ€mmt", + "containment unknown": "EindĂ€mmung unbekannt", + "{cause} cause": "Ursache: {cause}", + "{personnel} personnel": { + "one": "{personnel} Einsatzkraft", + "other": "{personnel} EinsatzkrĂ€fte" + }, + "{county} County": "{county} County", + "{cost} to date": "{cost} bisher", + "discovered {age} ago": "entdeckt vor {age}", + "updated {age} ago": "aktualisiert vor {age}", + "part of {complex}": "Teil von {complex}", + "InciWeb ↗ · click card to open": "InciWeb ↗ · Eintrag anklicken zum Öffnen", + "FIRE · {name}": "BRAND · {name}", + "Unnamed incident": "Unbenannter Einsatz", + "Open {title} on InciWeb": "{title} auf InciWeb öffnen", + "Perimeter source unavailable": "Quelle der Brandgrenzen nicht verfĂŒgbar", + "Not contained or unknown": "Nicht eingedĂ€mmt oder unbekannt", + "Under 50% contained": "Unter 50 % eingedĂ€mmt", + "50–99% contained": "50–99 % eingedĂ€mmt", + "Fully contained": "VollstĂ€ndig eingedĂ€mmt", + "Colour shows reported containment. Perimeters are simplified to about 100 m.": "Die Farbe zeigt die gemeldete EindĂ€mmung. Brandgrenzen sind auf etwa 100 m vereinfacht.", + "Malformed perimeter snapshot": "Fehlerhafter Brandgrenzen-Snapshot", + "radio tag|All": "Alle", + "Directory refresh degraded; showing the previous station catalog.": "Verzeichnisaktualisierung eingeschrĂ€nkt; der vorherige Senderkatalog wird gezeigt.", + "Radio directory coverage is degraded.": "Abdeckung des Radioverzeichnisses ist eingeschrĂ€nkt.", + "Directory refresh failed; showing the previous station catalog.": "Verzeichnisaktualisierung fehlgeschlagen; der vorherige Senderkatalog wird gezeigt.", + "Radio directory is temporarily unavailable.": "Radioverzeichnis vorĂŒbergehend nicht verfĂŒgbar.", + "radio|NEWS": "NEWS", + "radio|WEATHER": "WETTER", + "radio|OTHER": "SONST.", + "Broadcaster stream is unavailable or blocked by the browser.": "Der Stream des Senders ist nicht verfĂŒgbar oder wird vom Browser blockiert.", + "Playback requires a direct click or tap.": "Die Wiedergabe muss direkt per Klick oder Antippen gestartet werden.", + "Broadcaster stream could not be started.": "Der Stream des Senders konnte nicht gestartet werden.", + "overview": "Übersicht", + "cloud unknown": "Bewölkung unbekannt", + "{percent}% scene cloud": "{percent} % Bewölkung in der Szene", + "{min}–{max}% scene cloud": "{min}–{max} % Bewölkung in der Szene", + "Comparison in use by another scene": "Vergleich wird von einer anderen Szene verwendet", + "Esri map unavailable · no swipe": "Esri-Karte nicht verfĂŒgbar · kein Bildvergleich", + "Swipe needs a globe map": "Bildvergleich braucht eine Globuskarte", + "Imagery stays on Esri · CLEAR to use Google 3D": "Bilder bleiben auf Esri · LÖSCHEN, um Google 3D zu verwenden", + "Imagery catalog unavailable": "Bildkatalog nicht verfĂŒgbar", + "Catalog truncated · a newer clear day may exist": "Katalog gekĂŒrzt · ein neuerer wolkenfreier Tag ist möglich", + "{label} catalog unavailable · {detail}": "{label}-Katalog nicht verfĂŒgbar · {detail}", + "Daily overview for today may still be empty until the pass": "Die tĂ€gliche Übersicht fĂŒr heute kann bis zum Überflug noch leer sein", + "Box and images cleared": "Bereich und Bilder gelöscht", + "MORE DETAIL · 30 m": "MEHR DETAILS · 30 m", + "Sentinel-2 and Landsat via HLS, 30 m, every 2–6 days": "Sentinel-2 und Landsat ĂŒber HLS, 30 m, alle 2–6 Tage", + "DAILY OVERVIEW · 250 m": "TÄGLICHE ÜBERSICHT · 250 m", + "VIIRS daily mosaic, 250 m, follows broad changes; little detail under 25 km": "VIIRS-Tagesmosaik, 250 m, zeigt großrĂ€umige VerĂ€nderungen; kaum Details unter 25 km", + "Sentinel-2": "Sentinel-2", + "Sentinel-2 via HLS": "Sentinel-2 ĂŒber HLS", + "Landsat 8/9": "Landsat 8/9", + "Landsat 8/9 via HLS": "Landsat 8/9 ĂŒber HLS", + "Daily overview": "TĂ€gliche Übersicht", + "Box edges must be finite": "Die RĂ€nder des Bereichs mĂŒssen endlich sein", + "Longitudes must be within ±180°": "LĂ€ngengrade mĂŒssen innerhalb von ±180° liegen", + "Select one side of the dateline": "Eine Seite der Datumsgrenze wĂ€hlen", + "Box must enclose an area": "Der Bereich muss eine FlĂ€che umschließen", + "CelesTrak unreachable": "CelesTrak nicht erreichbar", + "DOCKED · {name} · +{extra}": "ANGEDOCKT · {name} · +{extra}", + "DOCKED · {name}": "ANGEDOCKT · {name}", + "{name} needs the Google 3D map: choose it under MAP SOURCE": "{name} braucht die Google-3D-Karte: unter KARTENQUELLE auswĂ€hlen", + "zoom in to a street to open {name}": "auf eine Straße hineinzoomen, um {name} zu öffnen", + "loading coverage...": "Abdeckung wird geladen...", + "No street-level imagery within {radius} m of that point": "Keine Bilder auf Straßenebene im Umkreis von {radius} m um diesen Punkt", + "No street-level imagery within {radius} m of the view centre": "Keine Bilder auf Straßenebene im Umkreis von {radius} m um die Bildmitte", + "Zoom in to see street-level coverage": "Hineinzoomen, um die Abdeckung auf Straßenebene zu sehen", + "Point the camera at the ground for street-level coverage": "Kamera auf den Boden richten, um die Abdeckung auf Straßenebene zu sehen", + "Coverage tile failed": "Abdeckungskachel fehlgeschlagen", + "The photo could not be loaded": "Das Foto konnte nicht geladen werden", + "{name} photo. ← and → step along the sequence. On a 360° photo, drag or use Shift+← →, ↑ ↓ to look around, and + − to zoom": "{name}-Foto. ← und → blĂ€ttern durch die Sequenz. Bei einem 360°-Foto ziehen oder Umschalt+← →, ↑ ↓ zum Umsehen und + − zum Zoomen verwenden", + "{name} street-level photo": "{name}-Foto auf Straßenebene", + "Previous photo in this sequence (←)": "Vorheriges Foto dieser Sequenz (←)", + "Next photo in this sequence (→)": "NĂ€chstes Foto dieser Sequenz (→)", + "Aim the middle of the view at a street to look for imagery there": "Die Bildmitte auf eine Straße richten, um dort nach Bildern zu suchen", + "KEY REJECTED": "SCHLÜSSEL ABGELEHNT", + "GOOGLE_MAPS_API_KEY is not set": "GOOGLE_MAPS_API_KEY ist nicht gesetzt", + "The Google Maps JavaScript API could not load": "Die Google Maps JavaScript API konnte nicht geladen werden", + "Google Street View": "Google Street View", + "GOOGLE STREET VIEW": "GOOGLE STREET VIEW", + "Google refused GOOGLE_MAPS_API_KEY for Street View — check that the Maps JavaScript API is enabled for it and this site is an allowed referrer": "Google hat GOOGLE_MAPS_API_KEY fĂŒr Street View abgelehnt – prĂŒfen, ob die Maps JavaScript API dafĂŒr aktiviert und diese Website als Referrer zugelassen ist", + "Street View did not answer — check the network, and that the Maps JavaScript API is enabled for GOOGLE_MAPS_API_KEY": "Street View antwortet nicht – Netzwerk prĂŒfen und ob die Maps JavaScript API fĂŒr GOOGLE_MAPS_API_KEY aktiviert ist", + "click a street to open Street View": "auf eine Straße klicken, um Street View zu öffnen", + "Street View has no imagery for this place": "Street View hat keine Bilder fĂŒr diesen Ort", + "KartaView has no position for this photo": "KartaView hat keine Position fĂŒr dieses Foto", + "The KartaView photo could not be loaded": "Das KartaView-Foto konnte nicht geladen werden", + "zoom in to see KartaView coverage": "hineinzoomen, um die KartaView-Abdeckung zu sehen", + "no KartaView photos in view": "keine KartaView-Fotos im Bild", + "KartaView is rate-limiting requests — they resume on their own": "KartaView begrenzt die Anfragen – sie laufen von selbst weiter", + "KartaView’s photos here are archived and cannot be shown": "Die KartaView-Fotos hier sind archiviert und können nicht angezeigt werden", + "KartaView did not filter this area in time — move the map to ask again": "KartaView hat dieses Gebiet nicht rechtzeitig gefiltert – Karte verschieben, um erneut anzufragen", + "None of KartaView’s photos here pass the imagery filter": "Keines der KartaView-Fotos hier passt zum Bildfilter", + "KartaView did not answer in time — try again": "KartaView hat nicht rechtzeitig geantwortet – erneut versuchen", + "KartaView could not be reached — check the network": "KartaView ist nicht erreichbar – Netzwerk prĂŒfen", + "KartaView sent an answer that could not be read": "KartaView hat eine unlesbare Antwort gesendet", + "KartaView is rate-limiting requests": "KartaView begrenzt die Anfragen", + "KartaView sent too much data": "KartaView hat zu viele Daten gesendet", + "KartaView is rate-limiting requests — try again in a moment": "KartaView begrenzt die Anfragen – gleich erneut versuchen", + "KartaView has no such photo": "KartaView hat dieses Foto nicht", + "Mapillary rejected MAPILLARY_CLIENT_TOKEN — replace it in Provider Settings": "Mapillary hat MAPILLARY_CLIENT_TOKEN abgelehnt – in den Anbieter-Einstellungen ersetzen", + "Coverage requests are being rate-limited — they resume on their own": "Abdeckungsanfragen werden begrenzt – sie laufen von selbst weiter", + "The Panoramax photo could not be loaded": "Das Panoramax-Foto konnte nicht geladen werden", + "Panoramax is busy — coverage resumes on its own": "Panoramax ist ausgelastet – die Abdeckung lĂ€dt von selbst weiter", + "no Panoramax photos in view": "keine Panoramax-Fotos im Bild", + "no Panoramax photos here match the filters": "keine Panoramax-Fotos hier passen zu den Filtern", + "Panoramax sent a map tile that could not be read": "Panoramax hat eine unlesbare Kartenkachel gesendet", + "This Panoramax photo is no longer available": "Dieses Panoramax-Foto ist nicht mehr verfĂŒgbar", + "zoom in to see Panoramax coverage": "hineinzoomen, um die Panoramax-Abdeckung zu sehen", + "Panoramax did not answer in time — try again": "Panoramax hat nicht rechtzeitig geantwortet – erneut versuchen", + "Panoramax could not be reached — check the connection": "Panoramax ist nicht erreichbar – Verbindung prĂŒfen", + "Panoramax sent too much data": "Panoramax hat zu viele Daten gesendet", + "Panoramax is busy": "Panoramax ist ausgelastet", + "Panoramax sent an unreadable answer": "Panoramax hat eine unlesbare Antwort gesendet", + "Sequence images unavailable": "Sequenzbilder nicht verfĂŒgbar", + "No street-level imagery providers configured": "Keine Anbieter fĂŒr Bilder auf Straßenebene konfiguriert", + "(by upload date)": "(nach Upload-Datum)", + "Open the Street Level panel to view imagery": "Bereich Straßenebene öffnen, um Bilder anzuzeigen", + "Image could not be opened": "Bild konnte nicht geöffnet werden", + "TeleGeography load failed": "TeleGeography konnte nicht geladen werden", + "UNAVAILABLE · {source} · Roads unavailable": "NICHT VERFÜGBAR · {source} · Straßen nicht verfĂŒgbar", + "Roads: {source}": "Straßen: {source}", + "TomTom roads unavailable while the traffic service is unreachable": "TomTom-Straßen nicht verfĂŒgbar, solange der Verkehrsdienst nicht erreichbar ist", + "Hybrid unavailable while the traffic service is unreachable": "Hybrid nicht verfĂŒgbar, solange der Verkehrsdienst nicht erreichbar ist", + "TomTom roads need a TomTom key": "TomTom-Straßen brauchen einen TomTom-SchlĂŒssel", + "Hybrid needs a TomTom key": "Hybrid braucht einen TomTom-SchlĂŒssel", + "Local surface still loading": "Lokale OberflĂ€che lĂ€dt noch", + "Partial coverage": "Teilweise Abdeckung", + "Detailed roads unavailable": "Detaillierte Straßen nicht verfĂŒgbar", + "Reduced detail coverage": "Reduzierte Detailabdeckung", + "TomTom roads only, each with its live flow": "Nur TomTom-Straßen, jeweils mit Live-Verkehrsfluss", + "TomTom roads only, each with its live flow (needs a TomTom key)": "Nur TomTom-Straßen, jeweils mit Live-Verkehrsfluss (braucht einen TomTom-SchlĂŒssel)", + "OpenStreetMap roads, with TomTom flow matched when available": "OpenStreetMap-Straßen, mit TomTom-Verkehrsfluss, wo verfĂŒgbar", + "TomTom roads first; OpenStreetMap fills the rest, simulated": "Zuerst TomTom-Straßen; OpenStreetMap fĂŒllt den Rest, simuliert", + "TomTom roads first; OpenStreetMap fills the rest, simulated (needs a TomTom key)": "Zuerst TomTom-Straßen; OpenStreetMap fĂŒllt den Rest, simuliert (braucht einen TomTom-SchlĂŒssel)", + "Hybrid": "Hybrid", + "TomTom key unavailable": "TomTom-SchlĂŒssel nicht verfĂŒgbar", + "TomTom daily budget reached": "TomTom-Tagesbudget erreicht", + "TomTom upstream unreachable": "TomTom-Upstream nicht erreichbar", + "TomTom flow unavailable": "TomTom-Verkehrsfluss nicht verfĂŒgbar", + "SIMULATED — {reason}": "SIMULIERT – {reason}", + "OpenFreeMap tiles rate-limited": "OpenFreeMap-Kacheln: Anfragelimit erreicht", + "OpenFreeMap tiles timed out": "ZeitĂŒberschreitung bei OpenFreeMap-Kacheln", + "OpenFreeMap tiles unavailable": "OpenFreeMap-Kacheln nicht verfĂŒgbar", + "occupancy|empty": "leer", + "occupancy|many seats available": "viele SitzplĂ€tze frei", + "occupancy|few seats available": "wenige SitzplĂ€tze frei", + "occupancy|standing room only": "nur StehplĂ€tze", + "occupancy|crushed standing room only": "nur StehplĂ€tze, dicht gedrĂ€ngt", + "occupancy|full": "voll", + "occupancy|not accepting passengers": "keine Fahrgastaufnahme", + "occupancy|not boardable": "kein Einstieg möglich", + "Route {route}": "Linie {route}", + "Vehicle {vehicle}": "Fahrzeug {vehicle}", + "vehicle motion|Stopped": "Steht", + "No recent fix": "Keine aktuelle Position", + "Waiting for update": "Warten auf Aktualisierung", + "Moving": "In Bewegung", + "reported {speed} km/h": "gemeldet {speed} km/h", + "reported hdg {heading}°": "gemeldeter Kurs {heading}°", + "Last report: stopped at stop {stop}": "Letzte Meldung: hĂ€lt an Haltestelle {stop}", + "Last report: arriving at stop {stop}": "Letzte Meldung: erreicht Haltestelle {stop}", + "Last report: next stop {stop}": "Letzte Meldung: nĂ€chster Halt {stop}", + "Shown at street level · depth not in the feed": "Auf Straßenebene gezeigt · Tiefe nicht im Feed", + "Reported {seconds} s ago": "Gemeldet vor {seconds} s", + "Reported {minutes} min ago": "Gemeldet vor {minutes} min", + "shown {seconds} s behind": "{seconds} s verzögert gezeigt", + "{reported} (feed time)": "{reported} (Feed-Zeit)", + "Available trail: {minutes} min (limited)": "VerfĂŒgbare Spur: {minutes} min (begrenzt)", + "Available trail: {minutes} min": "VerfĂŒgbare Spur: {minutes} min", + "Bus": "Bus", + "Tram": "Straßenbahn", + "Subway": "U-Bahn", + "Train": "Zug", + "Ferry": "FĂ€hre", + "Transit vehicle": "ÖPNV-Fahrzeug", + "{speed}KT": "{speed} KN", + "{heading}DEG": "{heading}°", + "AIS live load failed": "AIS-Live-Daten konnten nicht geladen werden", + "AISSTREAM_API_KEY not set": "AISSTREAM_API_KEY nicht gesetzt", + "live feed unsupported": "Live-Feed nicht unterstĂŒtzt", + "connecting to feed
": "Verbindung zum Feed
", + "feed disconnected": "Feed getrennt", + "feed down": "Feed ausgefallen", + "feed idle": "Feed inaktiv", + "API key rejected — check AISSTREAM_API_KEY": "API-SchlĂŒssel abgelehnt – AISSTREAM_API_KEY prĂŒfen", + "feed silent {seconds}s — no AIS data": "Feed stumm seit {seconds} s – keine AIS-Daten", + "feed silent — no AIS data": "Feed stumm – keine AIS-Daten", + "feed down — retrying slowly (attempt {attempt})": "Feed ausgefallen – neue Versuche in grĂ¶ĂŸeren AbstĂ€nden (Versuch {attempt})", + "reconnecting to feed
 (attempt {attempt})": "Verbindung zum Feed wird wiederhergestellt
 (Versuch {attempt})", + "feed down — retrying slowly": "Feed ausgefallen – neue Versuche in grĂ¶ĂŸeren AbstĂ€nden", + "reconnecting to feed
": "Verbindung zum Feed wird wiederhergestellt
", + "Focus vessel {name}, MMSI {mmsi}": "Schiff {name} fokussieren, MMSI {mmsi}", + "Hidden by this map source · choose a globe map": "Von dieser Kartenquelle ausgeblendet · eine Globuskarte wĂ€hlen", + "Weather image HTTP {status}": "Wetterbild HTTP {status}", + "Weather HTTP {status}": "Wetter HTTP {status}", + "Frame unavailable; previous observation retained": "Frame fehlt; letzter Stand bleibt erhalten", + "Weather imagery unavailable": "Wetterbilder nicht verfĂŒgbar", + "Weather source unavailable; previous observation retained": "Wetterquelle nicht verfĂŒgbar; vorherige Beobachtung bleibt erhalten", + "Weather unavailable": "Wetter nicht verfĂŒgbar", + "No frame within {gap} min of {time}": "Kein Frame in den {gap} min bis {time}", + "No frame within {gap} h of {time}": "Kein Frame in den {gap} h bis {time}", + "{hours}h {minutes}m ago": "vor {hours} h {minutes} min", + "{minutes}m ago": "vor {minutes} min", + "{state} · {time} · {lag}": "{state} · {time} · {lag}", + "Observed": "Beobachtet", + "History": "Verlauf", + "Observation unavailable": "Beobachtung nicht verfĂŒgbar", + "Waiting for observation": "Warten auf Beobachtung", + "{detail} · synced": "{detail} · synchronisiert", + "{detail} · nearest": "{detail} · zeitlich am nĂ€chsten", + "RADAR REFLECTIVITY · dBZ": "RADARREFLEKTIVITÄT · dBZ", + "LIGHTNING DENSITY · 15 min accumulation": "BLITZDICHTE · 15-min-Summe", + "GLOBAL INFRARED · hourly": "GLOBALES INFRAROT · stĂŒndlich", + "GOES INFRARED · ~5 min": "GOES-INFRAROT · ~5 min", + "{state}: {time}": "{state}: {time}", + "Latest observation": "Letzte Beobachtung", + "frame {index}/{total}": "Frame {index}/{total}", + "loading": "lĂ€dt", + "Observation: unavailable": "Beobachtung: nicht verfĂŒgbar", + "Contiguous US · gaps ≠ no rain": "USA ohne Alaska/Hawaii · LĂŒcken ≠ kein Regen", + "Americas + Pacific · not individual strikes": "Amerika + Pazifik · keine Einzelblitze", + "Color: strikes/kmÂČ/min ×10Âł": "Farbe: Blitze/kmÂČ/min ×10Âł", + "60°S–60°N · typically 2–3 h delayed": "60°S–60°N · meist 2–3 h verzögert", + "North America · infrared imagery": "Nordamerika · Infrarotbilder", + "Reduced motion · history playback unavailable": "Reduzierte Bewegung · Verlaufswiedergabe nicht verfĂŒgbar", + "Reduced motion · manual history available": "Reduzierte Bewegung · manueller Verlauf verfĂŒgbar", + "Rain radar · US": "Regenradar · USA", + "Lightning density · 15 min": "Blitzdichte · 15 min", + "Satellite clouds": "Wolken (Satellit)", + "Americas + Pacific": "Amerika + Pazifik", + "Global · 60°S–60°N": "Global · 60°S–60°N", + "North America": "Nordamerika", + "Source observations delayed": "Beobachtungen der Quelle verzögert", + "Stale source": "Quelle veraltet", + "Loading next frame
": "NĂ€chster Frame wird geladen
", + "Map center outside coverage": "Kartenmitte außerhalb der Abdeckung", + "strikes/kmÂČ/min ×10Âł": "Blitze/kmÂČ/min ×10Âł", + "N. America": "Nordamerika", + "Global": "Global", + "Hourly global mosaic; usually 2–3 hours delayed": "StĂŒndliches globales Mosaik; meist 2–3 Stunden verzögert", + "GOES regional clouds; approximately 5-minute updates": "Regionale GOES-Wolkenbilder; Aktualisierung etwa alle 5 Minuten", + "Clouds only": "Nur Wolken", + "Apply the full cloud brightness key; 100% filter strength": "Helligkeitsfilter fĂŒr Wolken vollstĂ€ndig anwenden; FilterstĂ€rke 100 %", + "Full": "Voll", + "Show the complete infrared image; 0% filter strength": "VollstĂ€ndiges Infrarotbild zeigen; FilterstĂ€rke 0 %", + "Soft": "Weich", + "Vivid": "KrĂ€ftig", + "Image opacity; does not alter the observed values": "Bilddeckkraft; Ă€ndert die beobachteten Werte nicht", + "View US radar": "US-Radar anzeigen", + "View Americas & Pacific": "Amerika & Pazifik anzeigen", + "View coverage": "Abdeckung anzeigen", + "{value} strikes/kmÂČ/min ×10Âł (15-minute density)": "{value} Blitze/kmÂČ/min ×10Âł (15-Minuten-Dichte)", + "{value} dBZ radar reflectivity": "{value} dBZ RadarreflektivitĂ€t", + "STALE · cached source metadata": "VERALTET · Quellmetadaten aus dem Cache", + "Map center is outside source coverage": "Kartenmitte liegt außerhalb der Quellabdeckung", + "NOAA/NWS 15-minute lightning density derived from Vaisala NLDN/GLD360. Coverage 110°E across the Pacific/Americas to 0°, 25°S–80°N. Not a live strike count, global coverage or a safety warning.": "NOAA/NWS-Blitzdichte ĂŒber 15 Minuten, abgeleitet aus Vaisala NLDN/GLD360. Abdeckung von 110°O ĂŒber Pazifik/Amerika bis 0°, 25°S–80°N. Keine Live-BlitzzĂ€hlung, keine globale Abdeckung und keine Sicherheitswarnung.", + "NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "NOAA-MRMS-Radarechos zeigen Niederschlagsmuster, nicht die Regenrate, keine Unwetterwarnung und keine Vorhersage. Native Quellauflösung etwa 1 km; die Anzeige ist auf Stufe 6 begrenzt. Frames verwenden die exakt angegebenen Beobachtungszeiten.", + "GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "GOES-19/18 langwelliges Infrarot Band 14 regional; globales langwelliges NESDIS-Mosaik. „Nur Wolken“ dunkelt alles außer hellen, kalten Wolkenobergrenzen ab; ein Helligkeitsfilter, keine Wolkenmaske. Abdeckung und AktualitĂ€t unterscheiden sich je nach Region.", + "REGION": "REGION", + "IMAGE": "BILD", + "FILTER": "FILTER", + "Cloud filter strength": "StĂ€rke des Wolkenfilters", + "OPACITY": "DECKKRAFT", + "Infrared decode failed": "Infrarot-Dekodierung fehlgeschlagen", + "Weather prefetch unavailable": "Wetter-Vorabruf nicht verfĂŒgbar", + "Weather tiles unavailable · previous frame retained": "Wetterkacheln nicht verfĂŒgbar · vorheriger Frame bleibt erhalten", + "Some weather tiles unavailable": "Einige Wetterkacheln nicht verfĂŒgbar", + "Malformed weather manifest": "Fehlerhaftes Wetter-Manifest", + "Weather request timed out": "ZeitĂŒberschreitung bei der Wetterabfrage", + "Temperature field unavailable": "Temperaturfeld nicht verfĂŒgbar", + "Mean sea level pressure field unavailable": "Feld des Luftdrucks auf Meereshöhe nicht verfĂŒgbar", + "Wind upstream unavailable": "Wind-Upstream nicht verfĂŒgbar", + "{source} HTTP {status}": "{source} HTTP {status}", + "Wind": "Wind", + "Wind source unavailable": "Windquelle nicht verfĂŒgbar", + "Forecast · does not follow history": "Vorhersage · folgt nicht dem Verlauf", + "Wind motion": "Windbewegung", + "Wind speed": "Windgeschwindigkeit", + "Sea-level pressure": "Luftdruck auf Meereshöhe", + "Air temperature · 2 m": "Lufttemperatur · 2 m", + "Global · 1° grid": "Global · 1°-Raster", + "{model} forecast · {time}": "{model}-Vorhersage · {time}", + "Loading forecast": "Vorhersage wird geladen", + "Preparing flow": "Strömung wird vorbereitet", + "Selected field unavailable": "GewĂ€hltes Feld nicht verfĂŒgbar", + "Cached forecast · stale": "Vorhersage aus dem Cache · veraltet", + "ECMWF IFS surface forecast": "ECMWF-IFS-Bodenvorhersage", + "NOAA GFS surface forecast": "NOAA-GFS-Bodenvorhersage", + "Reduced motion": "Reduzierte Bewegung", + "Pause visual flow; forecast time does not advance with animation": "Visuelle Strömung pausieren; die Vorhersagezeit lĂ€uft mit der Animation nicht weiter", + "None": "Ohne", + "Speed": "Geschwindigkeit", + "Pressure": "Luftdruck", + "Temperature": "Temperatur", + "Wind trails with no field shading": "Windspuren ohne Feldschattierung", + "How hard the surface wind is blowing": "Wie stark der Bodenwind weht", + "Sea-level air pressure: broad highs and lows": "Luftdruck auf Meereshöhe: großrĂ€umige Hochs und Tiefs", + "Air temperature two meters above the surface": "Lufttemperatur zwei Meter ĂŒber dem Boden", + "Wind speed units": "Einheiten der Windgeschwindigkeit", + "Read wind at map center": "Wind in der Kartenmitte ablesen", + "Read the forecast at the center of the map without changing selection": "Vorhersage in der Kartenmitte ablesen, ohne die Auswahl zu Ă€ndern", + "{model} forecast · {field} ({unit})": "{model}-Vorhersage · {field} ({unit})", + "Valid: {time}": "GĂŒltig: {time}", + "preparing": "wird vorbereitet", + "Issued: {time}": "Ausgegeben: {time}", + "Selected field unavailable · wind remains visible": "GewĂ€hltes Feld nicht verfĂŒgbar · Wind bleibt sichtbar", + "{error} · wind remains visible": "{error} · Wind bleibt sichtbar", + "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "Bodenwind in 10 m Höhe. Globales Raster von etwa 1°. Die Kurven folgen dem 10-m-Windfeld, zur Sichtbarkeit 12 km angehoben; die Darstellungshöhe hat keine meteorologische Bedeutung. Die Beleuchtung dient der Lesbarkeit. Die Animation zeigt die Strömung einer festen Vorhersage; die Zeit lĂ€uft nicht weiter. Farbfelder liegen auf der Globus-Basiskarte oder den aktiven fotorealistischen 3D Tiles.", + "MODEL": "MODELL", + "FIELD": "FELD", + "UNITS": "EINHEITEN", + "MOTION": "BEWEGUNG", + "Forecast": "Vorhersage", + "N": "N", + "NNE": "NNO", + "NE": "NO", + "ENE": "ONO", + "E": "O", + "ESE": "OSO", + "SE": "SO", + "SSE": "SSO", + "S": "S", + "SSW": "SSW", + "SW": "SW", + "WSW": "WSW", + "W": "W", + "WNW": "WNW", + "NW": "NW", + "NNW": "NNW", + "No surface reading": "Kein bodennaher Wert", + "Aim the map center at Earth": "Kartenmitte auf die Erde richten", + "A location reading needs a loaded forecast and the Earth at the center of the view.": "Ein Ortswert braucht eine geladene Vorhersage und die Erde in der Bildmitte.", + "Interpolated model forecast on an approximately 1° grid. Broad weather patterns, not a street-level measurement.": "Interpolierte Modellvorhersage auf einem Raster von etwa 1°. GroßrĂ€umige Wetterlagen, keine Messung auf Straßenebene.", + " · calm": " · windstill", + " from {direction}": " aus {direction}", + "WIND AT {coordinates}": "WIND BEI {coordinates}", + "{model} · valid {time}": "{model} · gĂŒltig {time}", + "Wind speed field unavailable": "Feld der Windgeschwindigkeit nicht verfĂŒgbar", + "Globe imagery unavailable": "Globusbilder nicht verfĂŒgbar", + "Globe field image unavailable": "Feldbild fĂŒr den Globus nicht verfĂŒgbar", + "Unknown wind model": "Unbekanntes Windmodell", + "Unknown weather overlay": "Unbekanntes Wetter-Overlay", + "Wind request timed out": "ZeitĂŒberschreitung bei der Windabfrage", + "Malformed wind manifest": "Fehlerhaftes Wind-Manifest", + "Malformed wind grid": "Fehlerhaftes Windraster", + "Google 3D tiles unavailable — check the key's API restrictions, quota, or network": "Google 3D Tiles nicht verfĂŒgbar – API-EinschrĂ€nkungen des SchlĂŒssels, Kontingent oder Netzwerk prĂŒfen", + "Needs {envVars} — add it in Provider Settings — or a Cesium ion token for the ion-hosted route": "Benötigt {envVars} – in den Anbieter-Einstellungen hinzufĂŒgen – oder ein Cesium-ion-Token fĂŒr die von ion gehostete Variante", + "Exit cockpit to fly to a camera": "Cockpit verlassen, um zu einer Kamera zu fliegen", + "Exit cockpit to fly to a location": "Cockpit verlassen, um zu einem Ort zu fliegen", + "Exit cockpit to fly to a photo": "Cockpit verlassen, um zu einem Foto zu fliegen", + "Exit cockpit to fly to a shared view": "Cockpit verlassen, um zu einer geteilten Ansicht zu fliegen", + "Exit cockpit to fly to a target": "Cockpit verlassen, um zu einem Ziel zu fliegen", + "Exit cockpit to fly to a vessel": "Cockpit verlassen, um zu einem Schiff zu fliegen", + "Exit cockpit to fly to a fire": "Cockpit verlassen, um zu einem Brand zu fliegen", + "Exit cockpit to fly to a route": "Cockpit verlassen, um zu einer Route zu fliegen", + "Exit cockpit to fly to a file": "Cockpit verlassen, um zu einer Datei zu fliegen", + "Exit cockpit to fly to a scene": "Cockpit verlassen, um zu einer Szene zu fliegen", + "Exit cockpit to view weather coverage": "Cockpit verlassen, um die Wetterabdeckung anzuzeigen", + "Exit cockpit to fly to a cyclone": "Cockpit verlassen, um zu einem Wirbelsturm zu fliegen", + "Exit cockpit to fly to an aircraft": "Cockpit verlassen, um zu einem Luftfahrzeug zu fliegen", + "Exit cockpit to fly to a satellite": "Cockpit verlassen, um zu einem Satelliten zu fliegen", + "Exit cockpit to frame contacts": "Cockpit verlassen, um Kontakte ins Bild zu nehmen", + "Focusing {label}": "{label} wird fokussiert", + "Source": "Quelle", + "Camera ownership changed": "Kamerasteuerung hat gewechselt", + "Saved project could not be read; storage preserved. Import a valid file to resume saving.": "Gespeichertes Projekt konnte nicht gelesen werden; der Speicher bleibt erhalten. Eine gĂŒltige Datei importieren, um wieder speichern zu können.", + "Scene layer turned off": "Szenenebene ausgeschaltet", + "Stopped": "Gestoppt", + "Scene not saved — existing saved project could not be read. Export edits or import a valid file.": "Szene nicht gespeichert – das vorhandene gespeicherte Projekt konnte nicht gelesen werden. Änderungen exportieren oder eine gĂŒltige Datei importieren.", + "Scene not saved — {reason}": "Szene nicht gespeichert – {reason}", + "Scene not saved — browser storage unavailable": "Szene nicht gespeichert – Browserspeicher nicht verfĂŒgbar", + "Cannot update {scene}: shot inventory changed": "{scene} kann nicht aktualisiert werden: Aufnahmenbestand hat sich geĂ€ndert", + "Cannot update {scene}: evidence beats changed": "{scene} kann nicht aktualisiert werden: Beweisschritte haben sich geĂ€ndert", + "Cannot update {scene}: shot bindings are incomplete": "{scene} kann nicht aktualisiert werden: AufnahmeverknĂŒpfungen sind unvollstĂ€ndig", + "Updated {count} shots: {scene}": { + "one": "{count} Aufnahme aktualisiert: {scene}", + "other": "{count} Aufnahmen aktualisiert: {scene}" + }, + "Appended {count} shots: {scene}": { + "one": "{count} Aufnahme angehĂ€ngt: {scene}", + "other": "{count} Aufnahmen angehĂ€ngt: {scene}" + }, + "Could not leave scene: {scene}": "Szene konnte nicht verlassen werden: {scene}", + "Seeked: {scene} / {shot}": "Gesprungen: {scene} / {shot}", + "Seeking scene clock": "Szenenuhr wird gespult", + "Scene transition limit reached — load a shot to reset": "Limit fĂŒr Szenenwechsel erreicht – eine Aufnahme laden, um es zurĂŒckzusetzen", + "Export failed: {error}": "Export fehlgeschlagen: {error}", + "Importing project": "Projekt wird importiert", + "Imported {file}": "{file} importiert", + "Import failed: {error}": "Import fehlgeschlagen: {error}", + "Import failed (could not read JSON file)": "Import fehlgeschlagen (JSON-Datei konnte nicht gelesen werden)", + "Layers refused: {layers}": "Ebenen abgelehnt: {layers}", + "Camera move interrupted": "Kameraflug unterbrochen", + "Scene media timed out": "ZeitĂŒberschreitung bei Szenenmedien", + "Action complete": "Aktion abgeschlossen", + "Action unavailable or cancelled": "Aktion nicht verfĂŒgbar oder abgebrochen", + "Scene actions": "Szenenaktionen", + "Select a feature or use Tab and Enter to choose an action.": "Ein Objekt auswĂ€hlen oder mit Tab und Enter eine Aktion wĂ€hlen.", + "Selected feature: {feature}. Choose an action.": "AusgewĂ€hltes Objekt: {feature}. Aktion wĂ€hlen.", + "Bhote Koshi Evidence Sequence": "Bhote Koshi: Beweisfolge", + "Nepal Flood Incident": "Flutereignis Nepal", + "Global Incident Context": "Globaler Ereigniskontext", + "Nepal-Focused Globe Rotation": "Globusdrehung mit Fokus auf Nepal", + "Bhote Koshi Regional Approach": "Bhote Koshi: Anflug auf die Region", + "Bhote Koshi Nearby Cities": "Bhote Koshi: StĂ€dte in der NĂ€he", + "Bhote Koshi Incident Corridor": "Bhote Koshi: Ereigniskorridor", + "Bhote Koshi Flood Path": "Bhote Koshi: Flutpfad", + "Bhote Koshi Corridor Overview": "Bhote Koshi: Korridor im Überblick", + "Bhote Koshi Upper Valley": "Bhote Koshi: oberes Tal", + "Upper Valley Collapse": "Erdrutsch im oberen Tal", + "Debris-Dammed Lake": "Durch Geröll aufgestauter See", + "Nepal-China Border Gate": "GrenzĂŒbergang Nepal–China", + "Timure Evidence Cluster": "Beweiscluster Timure", + "Syabru Besi Passage": "Durchgang Syabru Besi", + "Bidur / Trishuli Consequence": "Folgen in Bidur / Trishuli", + "Final view": "Schlussansicht", + "Scene {n}": "Szene {n}", + "the title of scene {scene} is empty or longer than {max} characters": "der Titel von Szene {scene} ist leer oder lĂ€nger als {max} Zeichen", + "the title of shot {shot} in scene {scene} is empty or longer than {max} characters": "der Titel von Aufnahme {shot} in Szene {scene} ist leer oder lĂ€nger als {max} Zeichen", + "the project is larger than 5 MiB": "das Projekt ist grĂ¶ĂŸer als 5 MiB", + "the project has too many shots": "das Projekt hat zu viele Aufnahmen", + "the scene data failed validation": "die Szenendaten haben die Validierung nicht bestanden", + "Could not complete this action. Check the file, references and selected assets.": "Diese Aktion konnte nicht abgeschlossen werden. Datei, Verweise und ausgewĂ€hlte Assets prĂŒfen.", + "{count} scenes": { + "one": "{count} Szene", + "other": "{count} Szenen" + }, + "{count} shots": { + "one": "{count} Aufnahme", + "other": "{count} Aufnahmen" + }, + "{count} data packs": { + "one": "{count} Datenpaket", + "other": "{count} Datenpakete" + }, + "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}": "{scene} / {pack}: {status}. Datei: {path}. {attribution} · {license}", + "Unavailable layers: {layers}": "Nicht verfĂŒgbare Ebenen: {layers}", + "Uses registered content or linked media. Those external files are not included in a scene bundle. Their original notices still apply.": "Verwendet registrierte Inhalte oder verknĂŒpfte Medien. Diese externen Dateien sind nicht im Szenen-Bundle enthalten. Ihre ursprĂŒnglichen Hinweise gelten weiterhin.", + "{bytes} bundled bytes verified. Files stay in memory for this session. Reimport the bundle after reloading the app.": "{bytes} gebĂŒndelte Bytes verifiziert. Die Dateien bleiben fĂŒr diese Sitzung im Speicher. Nach dem Neuladen der App das Bundle erneut importieren.", + "Review scene import": "Szenenimport prĂŒfen", + "Nothing is loaded or changed until you apply this file.": "Nichts wird geladen oder geĂ€ndert, bis diese Datei angewendet wird.", + "Ready to import": "Bereit zum Import", + "Apply replaces the current project. Export your current project first if you want to keep both.": "Anwenden ersetzt das aktuelle Projekt. Zuerst das aktuelle Projekt exportieren, um beide zu behalten.", + "Apply import": "Import anwenden", + "Import was not applied. The current project may have changed.": "Der Import wurde nicht angewendet. Das aktuelle Projekt hat sich möglicherweise geĂ€ndert.", + "Select a scene and shot first": "Zuerst eine Szene und eine Aufnahme wĂ€hlen", + "Edit scene details": "Szenendetails bearbeiten", + "Camera positions use degrees and meters above the ellipsoid. Drafts are validated before they replace your saved scene.": "Kamerapositionen werden in Grad und Metern ĂŒber dem Ellipsoid angegeben. EntwĂŒrfe werden geprĂŒft, bevor sie die gespeicherte Szene ersetzen.", + "Anchors and data packs": "Anker und Datenpakete", + "Shot camera, timing, packs and actions": "Aufnahme: Kamera, Zeitablauf, Datenpakete und Aktionen", + "New anchor ID": "Neue Anker-ID", + "Capture camera as anchor": "Kamera als Anker erfassen", + "Anchor added to draft": "Anker zum Entwurf hinzugefĂŒgt", + "Set move start to current camera": "Aktuelle Kameraposition als Startpunkt des Flugs ĂŒbernehmen", + "Move added to draft; destination remains the shot camera": "Flug zum Entwurf hinzugefĂŒgt; das Ziel bleibt die Kameraposition der Aufnahme", + "Use ordinary flight": "Normalen Flug verwenden", + "Invalid shot JSON": "UngĂŒltiges Aufnahme-JSON", + "Apply details": "Details anwenden", + "Select a scene first": "Zuerst eine Szene wĂ€hlen", + "Share selected scene": "GewĂ€hlte Szene teilen", + "Scene JSON preserves authored settings and attribution. It does not include asset files. Bundles include only pack files you choose here or previously imported bundle files.": "Szenen-JSON bewahrt die festgelegten Einstellungen und Quellenangaben. Asset-Dateien sind nicht enthalten. Bundles enthalten nur die hier gewĂ€hlten Paketdateien oder zuvor importierte Bundle-Dateien.", + "Download scene JSON": "Szenen-JSON herunterladen", + "Choose data-pack files": "Datenpaket-Dateien wĂ€hlen", + "Or choose a data-pack folder": "Oder einen Datenpaket-Ordner wĂ€hlen", + "Download asset bundle": "Asset-Bundle herunterladen", + "Asset bundle downloaded": "Asset-Bundle heruntergeladen", + "No RTL-SDR device selected": "Kein RTL-SDR-GerĂ€t ausgewĂ€hlt", + "WebUSB requires desktop Chrome or Edge on localhost/HTTPS": "WebUSB braucht Chrome oder Edge auf dem Desktop ĂŒber localhost/HTTPS", + "RTL-SDR access failed; close other SDR apps and check USB permissions": "RTL-SDR-Zugriff fehlgeschlagen; andere SDR-Apps schließen und USB-Berechtigungen prĂŒfen", + "RTL-SDR connection failed": "RTL-SDR-Verbindung fehlgeschlagen", + "Receiving 1090 MHz ADS-B": "Empfang von ADS-B auf 1090 MHz", + "Receiving broadcast FM": "Empfang von UKW-Rundfunk", + "Connect an RTL-SDR to begin.": "Ein RTL-SDR anschließen, um zu beginnen.", + "WebUSB is unavailable in this browser": "WebUSB ist in diesem Browser nicht verfĂŒgbar", + "USB work abandoned after a stalled transfer": "USB-Vorgang nach einer hĂ€ngenden Übertragung abgebrochen", + "SDR decoder worker failed": "SDR-Decoder-Worker fehlgeschlagen", + "SDR decoder did not start; receiver stopped": "SDR-Decoder ist nicht gestartet; EmpfĂ€nger gestoppt", + "SDR decoder stopped responding; receiver stopped": "SDR-Decoder reagiert nicht mehr; EmpfĂ€nger gestoppt", + "SDR decoder fell behind; receiver stopped": "SDR-Decoder kommt nicht hinterher; EmpfĂ€nger gestoppt", + "WebUSB requires desktop Chrome or Edge": "WebUSB braucht Chrome oder Edge auf dem Desktop", + "Waiting for an RTL-SDR device
": "Warten auf ein RTL-SDR-GerĂ€t
", + "Browser audio is suspended; press Connect again to resume it": "Browser-Audio ist angehalten; erneut auf Verbinden drĂŒcken, um es fortzusetzen", + "RTL-SDR sample stream stopped": "RTL-SDR-Sample-Stream gestoppt", + "Switching to {mode}
": "Wechsel zu {mode}
", + "Browser audio is suspended; select FM again to resume it": "Browser-Audio ist angehalten; erneut FM wĂ€hlen, um es fortzusetzen", + "RTL-SDR gain change failed": "VerstĂ€rkung des RTL-SDR konnte nicht geĂ€ndert werden", + "Tuned to {mhz} MHz FM": "Abgestimmt auf {mhz} MHz UKW", + "Seeking up
": "Suchlauf aufwĂ€rts
", + "Seeking down
": "Suchlauf abwĂ€rts
", + "Seek stopped": "Suchlauf gestoppt", + "Scanning {mhz} MHz
": "{mhz} MHz wird gescannt
", + "Found {mhz} MHz · {snr} dB": "{mhz} MHz gefunden · {snr} dB", + "FM signal found at {mhz} MHz": "UKW-Signal auf {mhz} MHz gefunden", + "No FM signal found": "Kein UKW-Signal gefunden", + "Browser location is unavailable": "Browser-Standort ist nicht verfĂŒgbar", + "Receiver location was not granted": "Standort des EmpfĂ€ngers wurde nicht freigegeben", + "RTL-SDR disconnected": "RTL-SDR getrennt", + "Upstream response too large": "Upstream-Antwort zu groß", + "Vector tile request timed out": "ZeitĂŒberschreitung bei der Vektorkachel-Anfrage", + "Vector tiles unavailable": "Vektorkacheln nicht verfĂŒgbar", + "Vector tile metadata unavailable": "Metadaten der Vektorkacheln nicht verfĂŒgbar", + "Zoom in for vector tile coverage": "Hineinzoomen fĂŒr die Abdeckung mit Vektorkacheln", + "Saturation": "SĂ€ttigung", + "Edge Thickness": "KantenstĂ€rke", + "Contrast": "Kontrast", + "Grain": "Körnung", + "Vignette": "Vignette", + "Pixelation": "Verpixelung", + "Distortion": "Verzerrung", + "Instability": "InstabilitĂ€t", + "Gain": "VerstĂ€rkung", + "Scanlines": "Scanlines", + "Sensitivity": "Empfindlichkeit", + "WHOT/BHOT": "WHOT/BHOT", + "Ironbow": "Ironbow", + "unsaved CCTV calibration": "ungespeicherte CCTV-Kalibrierung", + "the open cockpit": "das geöffnete Cockpit", + "Switching language reloads the page. This will be lost: {items}. Switch anyway?": "Ein Sprachwechsel lĂ€dt die Seite neu. Dabei geht Folgendes verloren: {items}. Trotzdem wechseln?", + "Link shared": "Link geteilt", + "Return map to straight-down view": "Karte wieder senkrecht von oben zeigen", + "Tilt map to oblique view": "Karte in SchrĂ€gansicht kippen", + "Reset map to north up. Current heading {heading} degrees": "Karte nach Norden ausrichten. Aktuelle Ausrichtung {heading} Grad", + "Tilted view": "SchrĂ€gansicht", + "Straight-down view": "Senkrechte Ansicht", + "North up": "Norden oben", + "HDG": "HDG", + "PITCH": "NEIGUNG", + "FOV": "FOV", + "RANGE": "REICHW.", + "HGT": "HÖHE", + "ΔN": "ΔN", + "ΔE": "ΔO", + "{value}m": "{value} m", + "SNAPSHOT": "SNAPSHOT", + "LIVE": "LIVE", + "UPSTREAM": "UPSTREAM", + "SYNTHETIC": "SYNTHETISCH", + "CONFIGURED": "KONFIGURIERT", + "SEED": "KATALOG", + "OK": "OK", + "Live HLS connected": "Live-HLS verbunden", + "Live HLS unavailable": "Live-HLS nicht verfĂŒgbar", + "No stream URL configured": "Keine Stream-URL konfiguriert", + "Live stream connected": "Live-Stream verbunden", + "Snapshot feed connected": "Snapshot-Feed verbunden", + "Media fetch failed": "Medienabruf fehlgeschlagen", + "Upstream snapshot active": "Upstream-Snapshot aktiv", + "Fallback Street View frame": "Fallback-Bild aus Street View", + "Upstream unavailable": "Upstream nicht verfĂŒgbar", + "No source configured": "Keine Quelle konfiguriert", + "Configured source": "Konfigurierte Quelle", + "Configured Source": "Konfigurierte Quelle", + "Synthetic fallback": "Synthetischer Fallback", + "Upstream HTTP {status}": "Upstream HTTP {status}", + "Unexpected media type {type}": "Unerwarteter Medientyp {type}", + "{value} KM/H": "{value} KM/H", + "{label} · {radius} AIR/SEA WINDOW": "{label} · {radius} LUFT-/SEEFENSTER", + "{scope} · INSTALLATIONS {coverage}": "{scope} · ANLAGEN {coverage}", + "SQUAWK {code} · {status}": "SQUAWK {code} · {status}", + "ADS-B PRIORITY · {status}": "ADS-B-PRIORITÄT · {status}", + "ADS-B EMERGENCY · {status}": "ADS-B-NOTFALL · {status}", + "{aircraftClass} · {emergency} · {feedState}": "{aircraftClass} · {emergency} · {feedState}", + "{source} · LOCATION QUERY · RECENT": "{source} · ORTSABFRAGE · AKTUELL", + "Rendered globe frames per second · toggle with `": "Gerenderte Globus-Frames pro Sekunde · umschalten mit `", + "imported map files": "importierte Kartendateien", + "Ground heights could not be refreshed. Try the file again when the map has loaded.": "GelĂ€ndehöhen konnten nicht aktualisiert werden. Die Datei erneut laden, wenn die Karte geladen ist.", + "{count} map objects": { + "one": "{count} Kartenobjekt", + "other": "{count} Kartenobjekte" + }, + ", drawn with its own styles": ", mit eigenen Stilen gezeichnet", + "Hide {name}": "{name} ausblenden", + "Show {name}": "{name} einblenden", + "Fly to {name}": "Zu {name} fliegen", + "Remove {name}": "{name} entfernen", + "At most {count} files at once — remove one first.": "Höchstens {count} Dateien gleichzeitig – zuerst eine entfernen.", + "Reading {name}
": "{name} wird gelesen
", + "That file could not be read.": "Diese Datei konnte nicht gelesen werden.", + "Added {count} files.": { + "one": "{count} Datei hinzugefĂŒgt.", + "other": "{count} Dateien hinzugefĂŒgt." + }, + "{count} files could not be added ({name}: {error})": { + "one": "{count} Datei konnte nicht hinzugefĂŒgt werden ({name}: {error})", + "other": "{count} Dateien konnten nicht hinzugefĂŒgt werden ({name}: {error})" + }, + "Some KML content was left out.": "Einige KML-Inhalte wurden ausgelassen.", + "Press on the ground, not the sky": "Auf den Boden klicken, nicht in den Himmel", + "Drag to size the box": "Ziehen, um die GrĂ¶ĂŸe des Bereichs festzulegen", + "light {source} to use your {name} key": "{source} einschalten, um den eigenen {name}-SchlĂŒssel zu nutzen", + "light {source}": "{source} einschalten", + ", or ": " oder ", + "{requirement}, or {offer}": "{requirement} oder {offer}", + "Local ADS-B": "Lokales ADS-B", + "Transit": "ÖPNV", + "Recent Imagery": "Aktuelle Bilddaten", + "Fire Perimeters": "Brandgrenzen", + "GNSS Integrity": "GNSS-IntegritĂ€t", + "S2 GhostMaps": "S2 GhostMaps", + "Rain radar": "Regenradar", + "Lightning density": "Blitzdichte", + "Cyclone advisories": "WirbelstĂŒrme", + "ALPR Cameras": "ALPR-Kameras", + "Live Vessels": "Live-Schiffe", + "Bike Share": "Bikesharing", + "Cameras": "Kameras", + "Street Level": "Straßenebene", + "Mapped ALPR Cameras": "Kartierte ALPR-Kameras", + "Data Centers": "Rechenzentren", + "Active Fires": "Aktive BrĂ€nde", + "Military aircraft": "MilitĂ€rflugzeuge", + "Vessels": "Schiffe", + "CCTV + Street View fallback": "CCTV + Street-View-Fallback", + "OpenStreetMap + optional Google Maps Places": "OpenStreetMap + optional Google Maps Places", + "GFS / ECMWF IFS · FORECAST": "GFS / ECMWF IFS · VORHERSAGE", + "NOAA nowCOAST · OBSERVED": "NOAA nowCOAST · BEOBACHTET", + "NASA FIRMS · LIVE": "NASA FIRMS · LIVE", + "OSM routing": "OSM-Routing", + "data source|Local": "Lokal", + "Movement": "Bewegung", + "Infrastructure": "Infrastruktur", + "Events": "Ereignisse", + "Weather": "Wetter", + "Utilities": "Werkzeuge", + "Other layers": "Weitere Ebenen", + "status chip|UNAVAILABLE": "NICHT VERFÜGBAR", + "Data source unavailable": "Datenquelle nicht verfĂŒgbar", + "Local FM stopped: internet radio started": "Lokales UKW gestoppt: Internetradio gestartet", + "IDLE": "INAKTIV", + "TUNING": "STIMMT AB", + "STREAMING": "STREAMT", + "UNSUPPORTED": "NICHT UNTERSTÜTZT", + "idle": "inaktiv", + "running": "lĂ€uft", + "suspended": "angehalten", + "closed": "geschlossen", + "feed status|live": "live", + "feed status|stale": "veraltet", + "feed status|unreachable": "nicht erreichbar", + "feed status|invalid": "ungĂŒltig", + "waiting for IQ": "warten auf IQ", + "{count} messages": { + "one": "{count} Nachricht", + "other": "{count} Nachrichten" + }, + "DSP {count} blocks": { + "one": "DSP {count} Block", + "other": "DSP {count} Blöcke" + }, + "DSP waiting": "DSP wartet", + "{level} dBFS audio": "Audio {level} dBFS", + "audio signal --": "Audiosignal --", + "audio {state}": "Audio {state}", + "{count} HEARD": { + "one": "{count} EMPFANGEN", + "other": "{count} EMPFANGEN" + }, + "DISCONNECT": "TRENNEN", + "CONNECT": "VERBINDEN", + "LOCATING
": "ORTUNG
", + "LOCATED": "GEORTET", + "LOCATE": "ORTEN", + " · read while Local ADS-B is on": " · gelesen, solange „Lokales ADS-B“ an ist", + "Decoder feeds: {feeds}": "Decoder-Feeds: {feeds}", + "Language: {language}": "Sprache: {language}", + "Change the interface language": "Sprache der OberflĂ€che Ă€ndern", + "Interface language": "Sprache der OberflĂ€che", + "Search languages": "Sprachen durchsuchen", + "No matching languages": "Keine passenden Sprachen", + "Check the spelling and press Enter to search again.": "Schreibweise prĂŒfen und Enter drĂŒcken, um erneut zu suchen.", + "Press Enter to try again.": "Enter drĂŒcken, um es erneut zu versuchen.", + "Detailed outline unavailable": "Detaillierter Umriss nicht verfĂŒgbar", + "Layers": "Ebenen", + "Search": "Suche", + "More": "Mehr", + "Panels": "Bereiche", + "Austin": "Austin", + "San Francisco": "San Francisco", + "New York": "New York", + "Tokyo": "Tokio", + "London": "London", + "Paris": "Paris", + "Dubai": "Dubai", + "Washington DC": "Washington DC", + "Tallinn": "Tallinn", + "Los Angeles": "Los Angeles", + "CH {index} / {total}": "KAN {index} / {total}", + "Station unavailable after directory refresh": "Sender nach Verzeichnisaktualisierung nicht verfĂŒgbar", + "{category} ({count})": "{category} ({count})", + "PAUSE": "PAUSE", + "RESUME": "FORTSETZEN", + "Clear reading": "Wert ausblenden", + "Earlier observation": "FrĂŒhere Beobachtung", + "Observed history": "Beobachteter Verlauf", + "Later observation": "SpĂ€tere Beobachtung", + "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 · nach LÖSCHEN wieder Google 3D", + "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": "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", + "Newest day with imagery for this box · partial coverage": "Neuester Tag mit Bildern fĂŒr diesen Bereich · teilweise Abdeckung", + "Newest daily overview for this box": "Neueste tĂ€gliche Übersicht fĂŒr diesen Bereich", + "newest clear day": "neuester wolkenfreier Tag", + "newest day (cloudy)": "neuester Tag (bewölkt)", + "newest day (partial coverage)": "neuester Tag (teilweise Abdeckung)", + "newest overview": "neueste Übersicht", + "No imagery": "Keine Bilder", + "Loading": "LĂ€dt", + "coverage|full": "vollstĂ€ndig", + "coverage|partial": "teilweise", + "unknown": "unbekannt", + "no imagery": "keine Bilder", + "{percent}% cloud": "{percent} % Bewölkung", + "{min}–{max}% cloud": "{min}–{max} % Bewölkung", + "NO BOX": "KEIN BEREICH", + "SEARCHING": "SUCHE LÄUFT", + "{count} DAYS": { + "one": "{count} TAG", + "other": "{count} TAGE" + }, + "Zoom in or draw a smaller box": "Hineinzoomen oder einen kleineren Bereich zeichnen", + "Select a box or use the view": "Bereich wĂ€hlen oder die Ansicht verwenden", + "Searching the last 30 days": "Die letzten 30 Tage werden durchsucht", + "No days to show for this box": "Keine Tage fĂŒr diesen Bereich", + "Drag the divider · SWAP trades sides": "Trennlinie ziehen · TAUSCHEN wechselt die Seiten", + "← → preview · A or B pins the focused day": "← → Vorschau · A oder B fixiert den gewĂ€hlten Tag", + "← → preview the other side · A or B pins it": "← → Vorschau der anderen Seite · A oder B fixiert sie", + "S on another day replaces it · × unpins": "S auf einem anderen Tag ersetzt ihn · × löst die Fixierung", + "← → preview · S shows the focused day": "← → Vorschau · S zeigt den gewĂ€hlten Tag", + "ZOOM IN": "HINEINZOOMEN", + "Fly in until the view fits the 1,000 km limit": "Hineinfliegen, bis die Ansicht das Limit von 1.000 km einhĂ€lt", + "Imagery days, newest first · arrows move, S or A and B pin": "Bildtage, neueste zuerst · Pfeile bewegen, S oder A und B fixieren", + "On the map": "Auf der Karte", + "Mode": "Modus", + "Imagery opacity": "Bilddeckkraft", + "SWAP": "TAUSCHEN", + "Trade the two sides of the divider": "Die beiden Seiten der Trennlinie tauschen", + "SELECT BOX": "BEREICH WÄHLEN", + "Drag a box on the map (Esc cancels)": "Auf der Karte einen Bereich aufziehen (Esc bricht ab)", + "USE VIEW": "ANSICHT NUTZEN", + "Use the current view as the box": "Die aktuelle Ansicht als Bereich verwenden", + "Forget the box and its images": "Bereich und Bilder verwerfen", + "START HERE": "HIER STARTEN", + "Checking": "Wird geprĂŒft", + "PREVIEW": "VORSCHAU", + "Newest day with imagery for this box": "Neuester Tag mit Bildern fĂŒr diesen Bereich", + "SHOW": "ZEIGEN", + "Pin {day} as {slot}": "{day} als {slot} fixieren", + "Show {day}": "{day} zeigen", + "pinned {slot}": "fixiert {slot}", + "shown": "gezeigt", + "preview": "Vorschau", + "start here": "hier starten", + "No box": "Kein Bereich", + "Searching": "Suche lĂ€uft", + "Every day is empty here": "Keine Bilddaten an den geprĂŒften Tagen", + "Sources off": "Quellen aus", + "VS": "VGL.", + "Not set": "Nicht gesetzt", + "Basemap": "Basiskarte", + "Source off": "Quelle aus", + "Unpin {slot}": "{slot} lösen", + "Unpin the image": "Bild lösen", + "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", + "Acquired {time}": "Aufgenommen {time}", + "Coverage {coverage}": "Abdeckung {coverage}", + "START HERE · {reason}": "HIER STARTEN · {reason}", + "Daily overview shows little detail in a box this small": "Die tĂ€gliche Übersicht zeigt in einem so kleinen Bereich kaum Details", + "Imagery: NASA GIBS and Worldview · HLS (Sentinel-2, Landsat 8/9) and VIIRS": "Bilder: NASA GIBS und Worldview · HLS (Sentinel-2, Landsat 8/9) und VIIRS", + "Details": "Details", + "Times, coverage, sources": "Zeiten, Abdeckung, Quellen", + "HIDE EMPTY DAYS": "LEERE TAGE AUSBLENDEN", + "SHOW EMPTY DAYS · {count}": "LEERE TAGE ZEIGEN · {count}", + "Days the probe found empty in this box": "Tage, fĂŒr die die Abfrage in diesem Bereich keine Bilddaten fand", + "image": "Bild", + "BASEMAP": "BASISKARTE", + "The basemap": "Die Basiskarte", + "basemap": "Basiskarte", + "Recent imagery against the basemap divider": "Trennlinie: aktuelle Bilddaten gegen Basiskarte", + "Recent imagery A and B divider": "Trennlinie: aktuelle Bilddaten A und B", + "{before} {left} percent, {after} {right} percent": "{before} {left} Prozent, {after} {right} Prozent", + "Export failed · {error}": "Export fehlgeschlagen · {error}", + "New scene name": "Name der neuen Szene", + "Delete scene \"{scene}\" and all shots?": "Szene „{scene}“ und alle Aufnahmen löschen?", + "Stopped (Esc)": "Gestoppt (Esc)", + "No shots yet. Use CAPTURE SHOT to save current look.": "Noch keine Aufnahmen. Mit AUFNAHME SPEICHERN die aktuelle Ansicht sichern.", + "Double-click to rename": "Doppelklick zum Umbenennen", + "Shot name": "Name der Aufnahme", + "LOAD": "LADEN", + "{duration}s + {hold}s": "{duration} s + {hold} s", + "Choose files": "Dateien wĂ€hlen", + "{count} files selected": { + "one": "{count} Datei ausgewĂ€hlt", + "other": "{count} Dateien ausgewĂ€hlt" + }, + "No file chosen": "Keine Datei gewĂ€hlt", + "Cancel": "Abbrechen", + "EDIT DETAILS": "DETAILS BEARBEITEN", + "SHARE SCENE": "SZENE TEILEN", + "Shared flight follow expired": "Verfolgung des geteilten Flugs abgelaufen", + "Shared military flight follow expired": "Verfolgung des geteilten MilitĂ€rflugs abgelaufen", + "Shared satellite follow expired": "Verfolgung des geteilten Satelliten abgelaufen", + "Shared flight could not be restored — feed unavailable": "Geteilter Flug konnte nicht wiederhergestellt werden – Feed nicht verfĂŒgbar", + "Shared military flight could not be restored — feed unavailable": "Geteilter MilitĂ€rflug konnte nicht wiederhergestellt werden – Feed nicht verfĂŒgbar", + "Shared satellite could not be restored — feed unavailable": "Geteilter Satellit konnte nicht wiederhergestellt werden – Feed nicht verfĂŒgbar", + "Shared flight is unavailable": "Geteilter Flug ist nicht verfĂŒgbar", + "Shared military flight is unavailable": "Geteilter MilitĂ€rflug ist nicht verfĂŒgbar", + "Shared satellite is unavailable": "Geteilter Satellit ist nicht verfĂŒgbar", + "{id} isn't reporting now — showing where it was last seen": "{id} sendet gerade nicht – letzte bekannte Position wird gezeigt", + "{id} isn't reporting now — showing where it was at {time}": "{id} sendet gerade nicht – Position um {time} wird gezeigt", + "This share link can't be opened": "Dieser Freigabelink kann nicht geöffnet werden", + "Shared vessel is unavailable": "Geteiltes Schiff ist nicht verfĂŒgbar", + "subject": "Objekt", + "RETRYING ALPR CAMERAS": "ALPR-KAMERAS: NEUER VERSUCH", + "FETCHING ALPR CAMERAS": "ALPR-KAMERAS WERDEN ABGERUFEN", + "OVERPASS TEMPORARILY UNAVAILABLE": "OVERPASS VORÜBERGEHEND NICHT VERFÜGBAR", + "OVERPASS RATE-LIMITED": "OVERPASS-ANFRAGELIMIT ERREICHT", + "OVERPASS TIMED OUT": "ZEITÜBERSCHREITUNG BEI OVERPASS", + "OVERPASS COULD NOT COMPLETE THE QUERY": "OVERPASS KONNTE DIE ABFRAGE NICHT ABSCHLIESSEN", + "MAP TILES TEMPORARILY UNAVAILABLE": "KARTENKACHELN VORÜBERGEHEND NICHT VERFÜGBAR", + "MAPPED NAMES TEMPORARILY UNAVAILABLE": "KARTIERTE NAMEN VORÜBERGEHEND NICHT VERFÜGBAR", + "ALPR cameras": "ALPR-Kameras", + "OpenSky OAuth client missing/invalid": "OpenSky-OAuth-Client fehlt oder ist ungĂŒltig", + "OpenSky OAuth rejected credentials": "OpenSky-OAuth hat die Zugangsdaten abgelehnt", + "OpenSky username/password rejected": "OpenSky hat Benutzername/Passwort abgelehnt", + "OpenSky auth missing": "OpenSky-Authentifizierung fehlt", + "OpenSky auth required": "OpenSky-Authentifizierung erforderlich", + "OpenSky auth invalid": "OpenSky-Authentifizierung ungĂŒltig", + "OpenSky auth failed": "OpenSky-Authentifizierung fehlgeschlagen", + "KartaView answered HTTP {status}": "KartaView hat mit HTTP {status} geantwortet", + "Panoramax answered HTTP {status}": "Panoramax hat mit HTTP {status} geantwortet", + "KartaView refused the request (code {code})": "KartaView hat die Anfrage abgelehnt (Code {code})", + "Vector tiles unavailable (HTTP {status})": "Vektorkacheln nicht verfĂŒgbar (HTTP {status})", + "GNSS feed unavailable (HTTP {status})": "GNSS-Feed nicht verfĂŒgbar (HTTP {status})", + "{count} CelesTrak groups unavailable": { + "one": "{count} CelesTrak-Gruppe nicht verfĂŒgbar", + "other": "{count} CelesTrak-Gruppen nicht verfĂŒgbar" + }, + "{feed} feed unavailable": "Feed {feed} nicht verfĂŒgbar", + "Source snapshot {minutes} min old": "Quell-Snapshot ist {minutes} min alt", + "{source} rate limited (anonymous)": "{source}: Anfragelimit erreicht (anonym)", + "{source} rate limited": "{source}: Anfragelimit erreicht", + "{source} network error": "{source}: Netzwerkfehler", + "Malformed {source} aircraft rows": "Fehlerhafte Flugzeugzeilen von {source}", + "Malformed {source} response": "Fehlerhafte Antwort von {source}", + "entry {n}": "Eintrag {n}", + "feeds {names} stale": { + "one": "Feed {names} veraltet", + "other": "Feeds {names} veraltet" + }, + "feeds {names} unreachable": { + "one": "Feed {names} nicht erreichbar", + "other": "Feeds {names} nicht erreichbar" + }, + "feeds {names} invalid": { + "one": "Feed {names} ungĂŒltig", + "other": "Feeds {names} ungĂŒltig" + }, + "Loading {feeds}": "Wird geladen: {feeds}", + "{count} heard": { + "one": "{count} empfangen", + "other": "{count} empfangen" + }, + "USB {rate} msg/s": "USB {rate} Nachr./s", + "{rate} msg/s": "{rate} Nachr./s", + "{count} feeds live": { + "one": "{count} Feed live", + "other": "{count} Feeds live" + }, + "{feed} {count} ({seconds}s old)": "{feed} {count} (vor {seconds} s)", + "Street Level toggle failed": "Umschalten der Straßenebene fehlgeschlagen", + "Street Level could not start": "Straßenebene konnte nicht gestartet werden", + "SHRINK": "VERKLEINERN", + "EXPAND": "VERGRÖSSERN", + "Shrink": "Verkleinern", + "Expand": "VergrĂ¶ĂŸern", + "ANY DATE": "BELIEBIGES DATUM", + "LAST 10 YEARS": "LETZTE 10 JAHRE", + "LAST 5 YEARS": "LETZTE 5 JAHRE", + "LAST 3 YEARS": "LETZTE 3 JAHRE", + "LAST 2 YEARS": "LETZTE 2 JAHRE", + "LAST YEAR": "LETZTE 12 MONATE", + "LAST 6 MONTHS": "LETZTE 6 MONATE", + "LAST 3 MONTHS": "LETZTE 3 MONATE", + "LAST MONTH": "LETZTE 30 TAGE", + "LAST {count} DAYS": { + "one": "{count} TAG", + "other": "LETZTE {count} TAGE" + }, + "{window} · SINCE {date}": "{window} · SEIT {date}", + "Turn Street Level off": "Straßenebene ausschalten", + "Turn Street Level on": "Straßenebene einschalten", + "{name} imagery on": "{name}-Bilder an", + "{name} imagery off": "{name}-Bilder aus", + "Image by {creator}": "Bild von {creator}", + " or ": " oder ", + "OPEN {labels}": "{labels} ÖFFNEN", + "Open {names} at the centre of the view": "{names} in der Bildmitte öffnen", + "Zoom in to a street to open {names} here": "Auf eine Straße hineinzoomen, um hier {names} zu öffnen", + "Switch Street Level on to draw its coverage.": "Straßenebene einschalten, um ihre Abdeckung zu zeichnen.", + "Every provider is switched off: light a chip to draw its coverage.": "Alle Anbieter sind ausgeschaltet: einen Chip einschalten, um seine Abdeckung zu zeichnen.", + "Loading this sequence
": "Diese Sequenz wird geladen
", + "{n} images in this sequence · Esc clears": { + "one": "{n} Bild in dieser Sequenz · Esc hebt die Auswahl auf", + "other": "{n} Bilder in dieser Sequenz · Esc hebt die Auswahl auf" + }, + "No sequences in view match the filter": "Keine Sequenzen im Bild passen zum Filter", + "No coverage in view": "Keine Abdeckung im Bild", + "{n} streets in view · click a line for its nearest photo": { + "one": "{n} Straße im Bild · Linie anklicken fĂŒr das nĂ€chstgelegene Foto", + "other": "{n} Straßen im Bild · Linie anklicken fĂŒr das nĂ€chstgelegene Foto" + }, + "{n} sequences in view · click a line for its nearest photo": { + "one": "{n} Sequenz im Bild · Linie anklicken fĂŒr das nĂ€chstgelegene Foto", + "other": "{n} Sequenzen im Bild · Linie anklicken fĂŒr das nĂ€chstgelegene Foto" + }, + "{n} sequences in view · click a line for its photos": { + "one": "{n} Sequenz im Bild · Linie anklicken fĂŒr ihre Fotos", + "other": "{n} Sequenzen im Bild · Linie anklicken fĂŒr ihre Fotos" + }, + "km/h": "km/h", + "m/s": "m/s", + "mph": "mph", + "hPa": "hPa", + "kt": "kn", + "kts": "kn", + "ft": "ft", + "km": "km", + "m": "m", + "h": "h", + "min": "min", + "s": "s", + "dB": "dB", + "{time} · {minutes} min ago": "{time} · vor {minutes} min", + "Active weather": "Aktives Wetter", + "LATEST · newest per product": "NEUESTE · je Produkt", + "Forecast · valid {valid} · issued {issued}": "Vorhersage · gĂŒltig {valid} · ausgegeben {issued}", + "{detail} · Does not follow history": "{detail} · Folgt nicht dem Verlauf", + "Forecast · valid {valid}": "Vorhersage · gĂŒltig {valid}", + "voice|OFF": "AUS", + "voice|CONNECTING": "VERBINDET", + "voice|ERROR": "FEHLER", + "Voice provider": "Anbieter der Sprachsteuerung", + "Changing provider reconnects voice if it is on.": "Ein Anbieterwechsel verbindet die Sprachsteuerung neu, wenn sie an ist.", + "Voice Settings": "Einstellungen der Sprachsteuerung", + "STD": "STD", + "ON/OFF": "EIN/AUS", + "VOICE": "SPRACHE", + "Preview": "Vorschau", + "Settings": "Einstellungen", + "Close voice panel": "Sprachbereich schließen", + "Voice replies appear here.": "Sprachantworten erscheinen hier.", + "Voice assistant": "Sprachassistent", + "Dismiss voice card": "Sprachkarte schließen", + "YOU": "EINGABE", + "THIS": "DIES", + "Plan": "Plan", + "Referenced items": "ErwĂ€hnte Objekte", + "NOTES & SOURCES": "NOTIZEN & QUELLEN", + "Show Voice Preview": "Sprachvorschau anzeigen", + "Voice inactivity timeout": "Zeitlimit bei SprachinaktivitĂ€t", + "Minutes": "Minuten", + "Custom": "Benutzerdefiniert", + "These preferences stay in this browser.": "Diese Einstellungen bleiben in diesem Browser.", + "Gemini returned an oversized audio chunk": "Gemini hat einen zu großen Audioblock geliefert", + "Gemini returned an unsupported audio format": "Gemini hat ein nicht unterstĂŒtztes Audioformat geliefert", + "Gemini returned an invalid audio sample rate": "Gemini hat eine ungĂŒltige Audio-Abtastrate geliefert", + "Gemini returned incomplete PCM audio": "Gemini hat unvollstĂ€ndiges PCM-Audio geliefert", + "This browser does not support Gemini microphone audio": "Dieser Browser unterstĂŒtzt kein Mikrofon-Audio fĂŒr Gemini", + "Microphone audio processing failed": "Verarbeitung des Mikrofon-Audios fehlgeschlagen", + "Gemini audio playback fell behind. Reconnect to continue.": "Die Gemini-Audiowiedergabe kommt nicht hinterher. Neu verbinden, um fortzufahren.", + "Gemini token response did not include an ephemeral credential": "Die Gemini-Token-Antwort enthielt keine temporĂ€ren Zugangsdaten", + "Invalid Gemini connection endpoint": "UngĂŒltiger Gemini-Verbindungsendpunkt", + "Gemini voice could not connect. Try again.": "Gemini-Sprachsteuerung konnte keine Verbindung herstellen. Erneut versuchen.", + "Gemini voice requires a same-origin app request": "Gemini-Sprachsteuerung erfordert eine Anfrage vom selben Origin", + "Add a Gemini API key in Provider Settings": "Einen Gemini-API-SchlĂŒssel in den Anbieter-Einstellungen hinzufĂŒgen", + "The Gemini Live model configuration is invalid": "Die Modellkonfiguration fĂŒr Gemini Live ist ungĂŒltig", + "Gemini voice is starting too often. Try again shortly.": "Gemini-Sprachsteuerung wird zu oft gestartet. Gleich erneut versuchen.", + "Gemini quota is unavailable. Try again later.": "Gemini-Kontingent ist nicht verfĂŒgbar. SpĂ€ter erneut versuchen.", + "Gemini access was refused. Check the API key and model access.": "Gemini hat den Zugriff verweigert. API-SchlĂŒssel und Modellzugriff prĂŒfen.", + "Gemini Live is unavailable for the configured model.": "Gemini Live ist fĂŒr das konfigurierte Modell nicht verfĂŒgbar.", + "Token request is too large": "Token-Anfrage ist zu groß", + "Use an empty JSON token request": "Eine leere JSON-Token-Anfrage verwenden", + "Voice command context is too large": "Kontext des Sprachbefehls ist zu groß", + "Gemini reliable transport exceeded its queue limit. Start voice again.": "Die Gemini-Sendewarteschlange ist voll. Sprachsteuerung neu starten.", + "Gemini reliable transport did not drain. Start voice again.": "Gemini-Nachrichten konnten nicht rechtzeitig gesendet werden. Sprachsteuerung neu starten.", + "Gemini token request failed (HTTP {status})": "Gemini-Token-Anfrage fehlgeschlagen (HTTP {status})", + "Gemini token response did not include a valid model": "Die Gemini-Token-Antwort enthielt kein gĂŒltiges Modell", + "Gemini token response did not include session settings": "Die Gemini-Token-Antwort enthielt keine Sitzungseinstellungen", + "Gemini session settings do not match the input mode": "Die Gemini-Sitzungseinstellungen passen nicht zum Eingabemodus", + "Gemini could not submit this input. Start voice again.": "Gemini konnte diese Eingabe nicht senden. Sprachsteuerung neu starten.", + "Connecting to Gemini": "Verbindung zu Gemini", + "Gemini returned an oversized message": "Gemini hat eine zu große Nachricht geliefert", + "Gemini Live connection failed. Check network access, then start voice again.": "Verbindung zu Gemini Live fehlgeschlagen. Netzwerkzugang prĂŒfen, dann die Sprachsteuerung neu starten.", + "Gemini Live connection ended. Start voice again for a new conversation.": "Verbindung zu Gemini Live beendet. FĂŒr ein neues GesprĂ€ch die Sprachsteuerung neu starten.", + "Gemini Live could not start. Start voice again to request a fresh session.": "Gemini Live konnte nicht starten. Sprachsteuerung neu starten, um eine neue Sitzung anzufordern.", + "Start voice again for a fresh token and a new conversation.": "Sprachsteuerung neu starten fĂŒr ein neues Token und ein neues GesprĂ€ch.", + "Start voice again to request a fresh session credential.": "Sprachsteuerung neu starten, um neue Sitzungszugangsdaten anzufordern.", + "Microphone permission was denied. Allow microphone access and try again.": "Mikrofonberechtigung wurde verweigert. Mikrofonzugriff erlauben und erneut versuchen.", + "Gemini connection timed out. Try again.": "ZeitĂŒberschreitung bei der Gemini-Verbindung. Erneut versuchen.", + "Gemini voice could not start": "Gemini-Sprachsteuerung konnte nicht starten", + "Gemini did not finish the interrupted reply. Start voice again.": "Gemini hat die unterbrochene Antwort nicht beendet. Sprachsteuerung neu starten.", + "Gemini session expiring; finishing the current reply": "Gemini-Sitzung lĂ€uft ab; die aktuelle Antwort wird beendet", + "Gemini rejected the voice session. Start voice again to request a fresh session.": "Gemini hat die Sprachsitzung abgelehnt. Sprachsteuerung neu starten, um eine neue Sitzung anzufordern.", + "Start voice again for a fresh session credential. If it repeats, check Gemini model and API access.": "Sprachsteuerung neu starten fĂŒr neue Sitzungszugangsdaten. Falls es sich wiederholt, Gemini-Modell und API-Zugriff prĂŒfen.", + "Gemini action history is full. Start voice again for a fresh session.": "Der Gemini-Aktionsverlauf ist voll. Sprachsteuerung fĂŒr eine neue Sitzung neu starten.", + "Gemini requested too many simultaneous actions": "Gemini hat zu viele gleichzeitige Aktionen angefordert", + "Voice text command is too long": "Textbefehl fĂŒr die Sprachsteuerung ist zu lang", + "Gemini voice is not connected": "Gemini-Sprachsteuerung ist nicht verbunden", + "Gemini interrupted input exceeded its buffer or wait limit. Start voice again.": "Unterbrochene Gemini-Eingabe hat ihr Puffer- oder Wartelimit ĂŒberschritten. Sprachsteuerung neu starten.", + "Gemini Live connection is expiring. Start voice again for a new conversation.": "Die Verbindung zu Gemini Live lĂ€uft ab. FĂŒr ein neues GesprĂ€ch die Sprachsteuerung neu starten.", + "Gemini voice sessions have a time limit. When a session expires, start voice again for a new conversation.": "Gemini-Sprachsitzungen sind zeitlich begrenzt. Wenn eine Sitzung ablĂ€uft, die Sprachsteuerung fĂŒr ein neues GesprĂ€ch neu starten.", + "Stopped by voice": "Per Sprache gestoppt", + "Automatic stop is unavailable for this voice connection.": "Automatisches Beenden ist fĂŒr diese Sprachverbindung nicht verfĂŒgbar.", + "Preview is off.": "Vorschau ist aus.", + "Your choice applies now, but could not be saved.": "Die Auswahl gilt jetzt, konnte aber nicht gespeichert werden.", + "MINI": "MINI", + "standard": "Standard", + "mini": "Mini", + "COST UNKNOWN": "KOSTEN UNBEKANNT", + "ChatGPT OAuth session: {responses} response(s), {input} input and {output} output tokens, {captions} caption transcription(s) reported.": "ChatGPT-OAuth-Sitzung: {responses} Antwort(en), {input} Eingabe- und {output} Ausgabe-Tokens, {captions} Untertitel-Transkription(en) gemeldet.", + "USD cost and the API spend cap are unavailable for this auth mode.": "USD-Kosten und das API-Ausgabenlimit sind in diesem Authentifizierungsmodus nicht verfĂŒgbar.", + "Usage is incomplete because a response was still in flight when the session ended.": "Die Nutzung ist unvollstĂ€ndig, weil beim Sitzungsende noch eine Antwort unterwegs war.", + "Estimate is incomplete — a response was still in flight when the session ended, so its usage was never reported.": "SchĂ€tzung unvollstĂ€ndig – beim Sitzungsende war noch eine Antwort unterwegs, ihre Nutzung wurde daher nie gemeldet.", + "STANDARD": "STANDARD", + "MIC": "MIKRO", + "{n} aircraft": { + "one": "{n} Luftfahrzeug", + "other": "{n} Luftfahrzeuge" + }, + "{n} military aircraft": { + "one": "{n} MilitĂ€rluftfahrzeug", + "other": "{n} MilitĂ€rluftfahrzeuge" + }, + "{n} ships": { + "one": "{n} Schiff", + "other": "{n} Schiffe" + }, + "{n} satellites": { + "one": "{n} Satellit", + "other": "{n} Satelliten" + }, + "{n} launches": { + "one": "{n} Start", + "other": "{n} Starts" + }, + "{n} earthquakes": { + "one": "{n} Erdbeben", + "other": "{n} Erdbeben" + }, + "{n} fires": { + "one": "{n} Brand", + "other": "{n} BrĂ€nde" + }, + "{n} fire perimeters": { + "one": "{n} Brandgrenze", + "other": "{n} Brandgrenzen" + }, + "{n} cyclones": { + "one": "{n} Wirbelsturm", + "other": "{n} WirbelstĂŒrme" + }, + "{n} buses": { + "one": "{n} Bus", + "other": "{n} Busse" + }, + "{n} bike share": { + "one": "{n} Bikesharing-Station", + "other": "{n} Bikesharing-Stationen" + }, + "{n} flock cameras": { + "one": "{n} ALPR-Kamera", + "other": "{n} ALPR-Kameras" + }, + "{n} military bases": { + "one": "{n} MilitĂ€rstĂŒtzpunkt", + "other": "{n} MilitĂ€rstĂŒtzpunkte" + }, + "{n} datacenters": { + "one": "{n} Rechenzentrum", + "other": "{n} Rechenzentren" + }, + "{n} dams": { + "one": "{n} Staudamm", + "other": "{n} StaudĂ€mme" + }, + "{n} air quality": { + "one": "{n} LuftqualitĂ€tsstation", + "other": "{n} LuftqualitĂ€tsstationen" + }, + "{n} results": { + "one": "{n} Ergebnis", + "other": "{n} Ergebnisse" + }, + "anywhere in the loaded data": "irgendwo in den geladenen Daten", + "in view": "im Bild", + "within {radius} of the view centre": "im Umkreis von {radius} um die Bildmitte", + "within {radius} of {place} (Contacts window)": "im Umkreis von {radius} um {place} (Kontaktfenster)", + "within {radius} of {place}": "im Umkreis von {radius} um {place}", + "within {radius}": "im Umkreis von {radius}", + "over {region}": "ĂŒber {region}", + "At least {items}": "Mindestens {items}", + "{items} {scope}": "{items} {scope}", + "last 24 h": "letzte 24 h", + "past 30 d and upcoming": "letzte 30 Tage und anstehende", + "the flights layer loads by viewport": "die Ebene „Live-FlĂŒge“ lĂ€dt Daten fĂŒr den jeweiligen Bildausschnitt", + "distance is ground distance, not overhead": "Entfernung am Boden, ohne BerĂŒcksichtigung der Höhe", + "the count is a lower bound because at least one layer reached its retained limit.": "die Anzahl ist eine Untergrenze, weil mindestens eine Ebene ihr Speicherlimit erreicht hat.", + "{label} off": "{label} aus", + "{label} loading": "{label} lĂ€dt", + "{label} error": "{label}: Fehler", + "counted the first {returned} loaded records": "die ersten {returned} geladenen EintrĂ€ge gezĂ€hlt", + "counted {returned} of {total} loaded records": "{returned} von {total} geladenen EintrĂ€gen gezĂ€hlt", + "{layers} just turned on — still loading, counts will rise": "{layers} gerade eingeschaltet – Daten werden noch geladen, die Zahlen steigen", + "Contacts panel snapshot at {time} — the same retained cohort supplies the card, speech, and follow-up memory": "Snapshot des Kontaktbereichs um {time} – dieselbe gespeicherte Auswahl liefert die Sprachkarte, die Sprachausgabe und das GedĂ€chtnis fĂŒr Folgefragen", + "Contacts panel snapshot — the same retained cohort supplies the card, speech, and follow-up memory": "Snapshot des Kontaktbereichs – dieselbe gespeicherte Auswahl liefert die Sprachkarte, die Sprachausgabe und das GedĂ€chtnis fĂŒr Folgefragen", + "Fly below {km} km to a covered region": "Unter {km} km Höhe zu einer abgedeckten Region fliegen", + "No feed here yet · {n} regions available": { + "one": "Hier noch kein Feed · {n} Region verfĂŒgbar", + "other": "Hier noch kein Feed · {n} Regionen verfĂŒgbar" + }, + "degraded": "eingeschrĂ€nkt", + "stale": "veraltet", + "partial": "teilweise", + "fallback": "Fallback", + "unavailable": "nicht verfĂŒgbar", + "Not answered: {layers}": "Keine Antwort: {layers}", + "Toggle voice control": "Sprachsteuerung umschalten", + "Activate to toggle voice": "Aktivieren, um die Sprachsteuerung umzuschalten", + "Voice active": "Sprachsteuerung aktiv", + "Voice could not be started.": "Sprachsteuerung konnte nicht gestartet werden.", + "the active voice session": "die aktive Sprachsitzung", + "{value} feet": "{value} Fuß", + "Fire · FRP {frp} MW": "Brand · FRP {frp} MW", + "The flights layer is not enabled": "Die Ebene „Live-FlĂŒge“ ist nicht aktiviert", + "The military layer is not enabled": "Die Ebene „MilitĂ€rflĂŒge“ ist nicht aktiviert", + "The satellites layer is not enabled": "Die Ebene „Satelliten“ ist nicht aktiviert", + "The ais-live-vessels layer is not enabled": "Die Ebene „Live-Schiffe“ ist nicht aktiviert", + "Could not enable the requested layer": "Die angeforderte Ebene konnte nicht aktiviert werden", + "Could not disable the requested layer": "Die angeforderte Ebene konnte nicht deaktiviert werden", + "Radio layer unavailable": "Radio-Ebene nicht verfĂŒgbar", + "Camera navigation is unavailable in the current view": "Kameranavigation ist in der aktuellen Ansicht nicht verfĂŒgbar", + "Camera navigation policy unavailable": "Richtlinie fĂŒr die Kameranavigation nicht verfĂŒgbar", + "Nearest-aircraft selection supports Flights or Military Flights only": "Die Auswahl des nĂ€chstgelegenen Luftfahrzeugs unterstĂŒtzt nur „Live-FlĂŒge“ oder „MilitĂ€rflĂŒge“", + "Nearest-aircraft selection needs a preset, place name, or latitude and longitude": "Die Auswahl des nĂ€chstgelegenen Luftfahrzeugs braucht ein Preset, einen Ortsnamen oder Breite und LĂ€nge", + "Could not arrive at the requested place": "Der angeforderte Ort konnte nicht erreicht werden", + "The nearest airborne aircraft could not be selected": "Das nĂ€chstgelegene Luftfahrzeug in der Luft konnte nicht ausgewĂ€hlt werden", + "No flights within {radius} of the current view": "Keine FlĂŒge im Umkreis von {radius} um die Bildmitte", + "No military within {radius} of the current view": "Keine MilitĂ€rflĂŒge im Umkreis von {radius} um die Bildmitte", + "No satellites within {radius} of the current view": "Keine Satelliten im Umkreis von {radius} um die Bildmitte", + "No vessels within {radius} of the current view": "Keine Schiffe im Umkreis von {radius} um die Bildmitte", + "{layer} is enabled on the {source} feed, but no airborne aircraft is loaded in the {place} view yet": "{layer} ist mit dem Feed {source} aktiviert, aber in der Ansicht {place} ist noch kein Luftfahrzeug in der Luft geladen", + "{layer} is enabled, but no airborne aircraft is loaded in the {place} view yet": "{layer} ist aktiviert, aber in der Ansicht {place} ist noch kein Luftfahrzeug in der Luft geladen", + "{layer} is enabled, but its aircraft feed is unavailable": "{layer} ist aktiviert, aber der Flugzeug-Feed ist nicht verfĂŒgbar", + "{layer} is enabled, but its destination refresh did not complete": "{layer} ist aktiviert, aber die Aktualisierung am Ziel wurde nicht abgeschlossen", + "{layer} is enabled, but {source} is unavailable": "{layer} ist aktiviert, aber {source} ist nicht verfĂŒgbar", + "Could not arrive at {place}": "{place} konnte nicht erreicht werden", + "{name} is no longer loaded": "{name} ist nicht mehr geladen", + "Unknown target layer: {target}": "Unbekannte Zielebene: {target}", + "nominal": "normal", + "{label} on": "{label} an", + "Frame aircraft": "Luftfahrzeuge ins Bild nehmen", + "Frame military aircraft": "MilitĂ€rluftfahrzeuge ins Bild nehmen", + "Frame ships": "Schiffe ins Bild nehmen", + "Frame satellites": "Satelliten ins Bild nehmen", + "Frame contacts": "Kontakte ins Bild nehmen", + "{count} aircraft in frame": { + "one": "{count} Luftfahrzeug im Bild", + "other": "{count} Luftfahrzeuge im Bild" + }, + "{count} military aircraft in frame": { + "one": "{count} MilitĂ€rluftfahrzeug im Bild", + "other": "{count} MilitĂ€rluftfahrzeuge im Bild" + }, + "{count} ships in frame": { + "one": "{count} Schiff im Bild", + "other": "{count} Schiffe im Bild" + }, + "{count} satellites in frame": { + "one": "{count} Satellit im Bild", + "other": "{count} Satelliten im Bild" + }, + "{count} contacts in frame": { + "one": "{count} Kontakt im Bild", + "other": "{count} Kontakte im Bild" + }, + "Nearest military aircraft": "NĂ€chstgelegene MilitĂ€rluftfahrzeuge", + "Nearest ships": "NĂ€chstgelegene Schiffe", + "Nearest satellites": "NĂ€chstgelegene Satelliten", + "Nearest aircraft": "NĂ€chstgelegene Luftfahrzeuge", + "{first} and {second}": "{first} und {second}", + "Layer": "Ebene", + "there": "dort", + "Camera range {range}": "Kameraentfernung {range}", + "Within {radius} of the view": "Im Umkreis von {radius} um die Bildmitte", + "Labels on": "Beschriftungen an", + "Framing uses the nearest 80 loaded contacts": "Ins Bild genommen werden höchstens die 80 nĂ€chstgelegenen geladenen Kontakte", + "{distance} from {location}": "{distance} von {location} entfernt", + "Altitude {altitude}": "Höhe {altitude}", + "{origin} to {destination}": "{origin} nach {destination}", + "from {origin}": "von {origin}", + "to {destination}": "nach {destination}", + "Registration {registration}": "Kennzeichen {registration}", + "View state": "Ansichtsstatus", + "Marked {count} places": { + "one": "{count} Ort markiert", + "other": "{count} Orte markiert" + }, + "Nothing marked": "Nichts markiert", + "Not found: {places}": "Nicht gefunden: {places}", + "Tracing outlines": "Umrisse werden nachgezeichnet", + "Frame flights": "FlĂŒge ins Bild nehmen", + "Frame military": "MilitĂ€rflĂŒge ins Bild nehmen", + "Frame vessels": "Schiffe ins Bild nehmen", + "Frame {target}": "{target} ins Bild nehmen", + "Zoom out to globe": "Auf den Globus herauszoomen", + "Open data layers": "Datenebenen öffnen", + "Open or close a panel": "Bereich öffnen oder schließen", + "Change context mode": "Kontextmodus Ă€ndern", + "Control cockpit": "Cockpit steuern", + "Change visual style": "Visuellen Stil Ă€ndern", + "Adjust HUD": "HUD anpassen", + "Adjust cyber sonar": "Cyber-Sonar anpassen", + "Adjust detection overlay": "Erkennungs-Overlay anpassen", + "Change map stack": "Kartenstapel Ă€ndern", + "Adjust post-processing": "Nachbearbeitung anpassen", + "Control scene": "Szene steuern", + "Control CCTV": "CCTV steuern", + "Control radio": "Radio steuern", + "Track contact": "Kontakt verfolgen", + "Stop tracking": "Verfolgung beenden", + "Clear marks": "Markierungen löschen", + "Move camera": "Kamera bewegen", + "Fly route": "Route abfliegen", + "Analyst query": "Analyseabfrage", + "Next ISS pass": "NĂ€chster ISS-Überflug", + "Next satellite pass": "NĂ€chster SatellitenĂŒberflug", + "Mark the map": "Karte markieren", + "Mark {targets} +{more}": "{targets} +{more} markieren", + "Mark {targets}": "{targets} markieren", + "Fly to {place}": "Zu {place} fliegen", + "Fly to Location": "Zu einem Ort fliegen", + "Nearest aircraft to {place}": "NĂ€chstgelegenes Luftfahrzeug bei {place}", + "Nearest aircraft to Here": "NĂ€chstgelegenes Luftfahrzeug hier", + "Layer on": "Ebene an", + "Layer off": "Ebene aus", + "Zoom out": "Herauszoomen", + "Zoom in": "Hineinzoomen", + "Read the view": "Ansicht auslesen", + "Check view state": "Ansichtsstatus prĂŒfen", + "Action": "Aktion", + "Finding places": "Orte werden gesucht", + "Tracing outline": "Umriss wird nachgezeichnet", + "Looking up place": "Ort wird nachgeschlagen", + "Flying": "Im Flug", + "Turning on layer": "Ebene wird eingeschaltet", + "Loading aircraft": "Luftfahrzeuge werden geladen", + "Picking nearest": "NĂ€chstgelegenes wird ausgewĂ€hlt", + "Working": "In Arbeit", + "in progress": "lĂ€uft", + "done": "erledigt", + "failed": "fehlgeschlagen", + "cancelled": "abgebrochen", + "Outline traced": "Umriss nachgezeichnet", + "Outline unavailable": "Umriss nicht verfĂŒgbar", + "Source: {label}": "Quelle: {label}", + "WORKING": "IN ARBEIT", + "DONE": "ERLEDIGT", + "Recent speech": "Zuletzt gesagt", + "HERE": "HIER", + "KTS": "KN", + "FT": "FT", + "FLT": "FLÜGE", + "MIL": "MIL", + "SITE": "STANDORTE", + "WX": "WETTER", + "MM": "MM", + "Weather data by Open-Meteo.com": "Wetterdaten von Open-Meteo.com", + "Cockpit briefing pages": "Briefing-Seiten im Cockpit", + "SIG": "SIG", + "LOCAL": "LOKAL", + "ESC EXIT": "ESC BEENDEN", + "C TOGGLE": "C UMSCHALTEN", + "Active weather products": "Aktive Wetterprodukte", + "RECENT IMAGERY": "AKTUELLE BILDDATEN", + "Imagery days in the box": "Bildtage im Bereich", + "Tune available internet radio stations": "VerfĂŒgbare Internetradiosender einstellen", + "DIRECTORY: RADIO BROWSER": "VERZEICHNIS: RADIO BROWSER", + "Local RTL-SDR receiver": "Lokaler RTL-SDR-EmpfĂ€nger", + "LOCAL RTL-SDR": "LOKALES RTL-SDR", + "Chrome/Edge · WebUSB · one local tuner shared by FM and the Local ADS-B layer.": "Chrome/Edge · WebUSB · ein lokaler Tuner, den UKW und die Ebene „Lokales ADS-B“ gemeinsam nutzen.", + "Use your location for faster ADS-B position decoding": "Eigenen Standort fĂŒr schnellere Dekodierung von ADS-B-Positionen verwenden", + "CHANGE DEVICE": "GERÄT WECHSELN", + "Choose a different RTL-SDR or receiver channel": "Ein anderes RTL-SDR oder einen anderen EmpfĂ€ngerkanal wĂ€hlen", + "RTL-SDR receiver mode": "RTL-SDR-Empfangsmodus", + "GAIN": "VERST.", + "RTL-SDR tuner gain for the current mode": "Tuner-VerstĂ€rkung des RTL-SDR fĂŒr den aktuellen Modus", + "AUTO": "AUTO", + "MSG/S": "NACHR./S", + "HEARD": "EMPFANGEN", + "POSITIONED": "MIT POSITION", + "FM MHZ": "UKW MHZ", + "TUNE": "ABSTIMMEN", + "Seek broadcast FM stations": "UKW-Rundfunksender suchen", + "◀ SEEK": "◀ SUCHEN", + "SEEK ▶": "SUCHEN ▶", + "SDR VOL": "SDR-LAUTST.", + "Local SDR volume": "LautstĂ€rke des lokalen SDR", + "Cyber": "Cyber", + "Sonar": "Sonar", + "Cyber sonar contact scanner": "Cyber-Sonar-Kontaktscanner", + "Rings": "Ringe", + "Sonar ring count": "Anzahl der Sonarringe", + "Range": "Reichweite", + "Sonar ring range": "Reichweite der Sonarringe", + "Power": "Leistung", + "Sonar intensity": "SonarintensitĂ€t", + "Opacity": "Deckkraft", + "Cyber contact and label opacity": "Deckkraft von Cyber-Kontakten und Beschriftungen", + "Minimum opacity for map dots, icons, models, brackets, and labels between sonar passes": "Minimale Deckkraft fĂŒr Kartenpunkte, Symbole, Modelle, Klammern und Beschriftungen zwischen SonardurchlĂ€ufen", + "Sector": "Sektor", + "Sonar sector width": "Breite des Sonarsektors", + "Draw on the world — click vertices, double-click or Enter to finish, Esc to cancel": "Auf die Welt zeichnen – Eckpunkte anklicken, Doppelklick oder Enter zum Beenden, Esc zum Abbrechen", + "Shape": "Form", + "Shape to draw": "Zu zeichnende Form", + "Area": "FlĂ€che", + "Line": "Linie", + "Pin": "Pin", + "Label (optional)": "Beschriftung (optional)", + "Label for the drawn shape": "Beschriftung der gezeichneten Form", + "Colour of the drawn shape": "Farbe der gezeichneten Form", + "Primary": "PrimĂ€r", + "Amber": "Bernstein", + "Cyan": "Cyan", + "Green": "GrĂŒn", + "Red": "Rot", + "Clear": "Leeren", + "Remove every mark from the board": "Alle Markierungen von der ZeichenflĂ€che entfernen", + "Show your own GeoJSON, KML, KMZ or GPX files on the globe (or drop them onto it). File bytes stay on this device; overlays can appear in map screenshots shared with voice.": "Eigene GeoJSON-, KML-, KMZ- oder GPX-Dateien auf dem Globus zeigen (oder auf ihn ziehen). Die Dateien bleiben auf diesem GerĂ€t; Overlays können in Kartenscreenshots erscheinen, die mit der Sprachsteuerung geteilt werden.", + "Import": "Importieren", + "Choose GeoJSON, KML, KMZ or GPX files": "GeoJSON-, KML-, KMZ- oder GPX-Dateien wĂ€hlen", + "Imported files": "Importierte Dateien", + "ACQUIRING FRAME": "FRAME WIRD ERFASST", + "STREET LEVEL": "STRASSENEBENE", + "Turn Street Level on or off": "Straßenebene ein- oder ausschalten", + "Show the street-level view full screen (Esc shrinks it)": "Ansicht auf Straßenebene im Vollbild zeigen (Esc verkleinert sie)", + "Image fit": "Bildanpassung", + "FIT": "EINPASSEN", + "Fit: show the whole photo, with dark bars where its shape differs from the frame": "Einpassen: ganzes Foto zeigen, mit dunklen Balken, wo seine Form vom Rahmen abweicht", + "FILL": "FÜLLEN", + "Fill: fill the frame edge to edge, cropping the photo": "FĂŒllen: den Rahmen randlos fĂŒllen, das Foto wird beschnitten", + "Close the image and deselect it on the map": "Bild schließen und auf der Karte abwĂ€hlen", + "Close the street-level image": "Bild auf Straßenebene schließen", + "Street-level viewer": "Viewer fĂŒr Straßenebene", + "Open this image on the provider's site": "Dieses Bild auf der Website des Anbieters öffnen", + "Imagery providers": "Bildanbieter", + "PROVIDERS": "ANBIETER", + "Imagery filters": "Bildfilter", + "IMAGERY": "BILDER", + "Panorama filter": "Panoramafilter", + "ALL": "ALLE", + "FLAT": "FLACH", + "SINCE": "SEIT", + "Toggle straight-down and tilted map views": "Zwischen senkrechter Ansicht und SchrĂ€gansicht wechseln", + "Reset map to north up": "Karte nach Norden ausrichten", + "Reset map bearing to north": "Kartenausrichtung auf Norden zurĂŒcksetzen", + "Cyclone request timed out": "ZeitĂŒberschreitung bei der Wirbelsturm-Abfrage", + "Malformed cyclone snapshot": "Fehlerhafter Wirbelsturm-Snapshot", + "STALE · Roads: {source} · Flow: cached TomTom tiles": "VERALTET · Straßen: {source} · Verkehrsfluss: TomTom-Kacheln aus dem Cache", + "routing busy — too many routes at once": "Routing-Dienst ausgelastet – zu viele Routen gleichzeitig", + "route proxy error": "Fehler des Routen-Proxys", + "{lower} to {upper}": "{lower} bis {upper}", + "Up to {upper}": "Bis {upper}", + "From {lower}": "Ab {lower}", + "Informational only · not for flight planning": "Nur zur Information · nicht fĂŒr die Flugplanung", + "Unnamed zone": "Unbenannte Zone", + "Restricted airspace source unavailable": "Quelle fĂŒr Sperrgebiete nicht verfĂŒgbar", + "Prohibited (P)": "Sperrgebiet (P)", + "Restricted (R)": "FlugbeschrĂ€nkungsgebiet (R)", + "FAA prohibited and restricted special-use airspace only, not the UAS Facility Map or UAS flight restrictions. Informational only — not a substitute for official UAS flight-planning tools (B4UFLY / LAANC).": "Nur Sperr- und FlugbeschrĂ€nkungsgebiete der FAA (Luftraum mit besonderer Nutzung), nicht die UAS Facility Map oder UAS-FlugbeschrĂ€nkungen. Nur zur Information – kein Ersatz fĂŒr offizielle UAS-Flugplanungstools (B4UFLY / LAANC).", + "Prohibited": "Sperrgebiet", + "Restricted": "FlugbeschrĂ€nkungsgebiet", + "Prohibited & Restricted Airspace": "Sperr- und FlugbeschrĂ€nkungsgebiete" +} diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 919eaac1c..068e8f230 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -66,8 +66,6 @@ "Anime": "Anime", "Apply high-contrast monochrome film-noir grading.": "Aplica una gradaciĂłn monocroma de alto contraste estilo film noir.", "Noir": "Noir", - "Add a cold, snowy whiteout treatment to the scene.": "Añade a la escena un tratamiento frĂ­o de ventisca blanca.", - "Snow": "Nieve", "MAP SOURCE": "FUENTE DEL MAPA", "Map source": "Fuente del mapa", "Style": "Estilo", @@ -76,7 +74,6 @@ "Layout": "DisposiciĂłn", "HUD layout": "DisposiciĂłn del HUD", "Tactical": "TĂĄctica", - "Operator": "De operador", "Minimal": "MĂ­nima", "Detection Overlay (D)": "SuperposiciĂłn de detecciĂłn (D)", "Detection overlay": "SuperposiciĂłn de detecciĂłn", @@ -198,21 +195,13 @@ "AVAILABLE MISSIONS": "MISIONES DISPONIBLES", "SELECT A MISSION TO INSPECT": "SELECCIONA UNA MISIÓN PARA INSPECCIONAR", "LOADING 30-DAY MISSION INDEX": "CARGANDO ÍNDICE DE MISIONES DE 30 DÍAS", - "Open compact Radio controls": "Abrir los controles compactos de Radio", - "Compact Radio controls": "Controles compactos de Radio", "RADIO": "RADIO", - "RADIO READY": "RADIO LISTA", - "Open detailed Radio controls": "Abrir los controles detallados de Radio", - "Close compact Radio controls": "Cerrar los controles compactos de Radio", "ENABLE": "ACTIVAR", "Previous filtered radio station": "Emisora de radio filtrada anterior", - "Previous station": "Emisora anterior", "Play selected radio station": "Reproducir la emisora de radio seleccionada", "Play": "Reproducir", "Next filtered radio station": "Siguiente emisora de radio filtrada", - "Next station": "Siguiente emisora", "VOLUME": "VOLUMEN", - "Compact Radio volume": "Volumen de la Radio compacta", "Cockpit display and Radio controls": "Controles de visualizaciĂłn y Radio de la cabina", "Expand Cockpit display options": "Expandir las opciones de visualizaciĂłn de la cabina", "Cockpit display options": "Opciones de visualizaciĂłn de la cabina", @@ -357,8 +346,6 @@ "selected": "seleccionada", "nearest": "mĂĄs cercana", "{action} {target} radio station": "{action} la emisora de radio {target}", - "RADIO STATE UNCERTAIN": "ESTADO DE RADIO SIN CONFIRMAR", - "SYNCING DIRECTORY": "SINCRONIZANDO DIRECTORIO", "SYNCING": "SINCRONIZANDO", "station": "emisora", "Ready": "Listo", @@ -382,6 +369,11 @@ "many": "{count} de cĂĄmaras cargadas · activa CCTV para activarlas", "other": "{count} cĂĄmaras cargadas · activa CCTV para activarlas" }, + "{count} more cameras outside this view · pan or zoom out": { + "one": "{count} cĂĄmara mĂĄs fuera de esta vista · desplaza o aleja", + "many": "{count} de cĂĄmaras mĂĄs fuera de esta vista · desplaza o aleja", + "other": "{count} cĂĄmaras mĂĄs fuera de esta vista · desplaza o aleja" + }, "No summary available.": "No hay resumen disponible.", "Celestial ring — available in Normal style": "Anillo celestial — disponible en el estilo Normal", "Detection overlay: {mode}": "SuperposiciĂłn de detecciĂłn: {mode}", @@ -2227,6 +2219,8 @@ "GOOGLE_MAPS_API_KEY is not set": "GOOGLE_MAPS_API_KEY no estĂĄ configurada", "The Google Maps JavaScript API could not load": "No se pudo cargar la API de Maps JavaScript de Google", "Weather request timed out": "La peticiĂłn del clima agotĂł el tiempo de espera", + "Cyclone request timed out": "La peticiĂłn de ciclones agotĂł el tiempo de espera", + "Malformed cyclone snapshot": "InstantĂĄnea de ciclones mal formada", "Malformed weather manifest": "Manifiesto del clima mal formado", "Weather HTTP {status}": "Clima: HTTP {status}", "Weather image HTTP {status}": "Imagen del clima: HTTP {status}", @@ -2442,8 +2436,6 @@ "Exit cockpit to fly to a route": "Sal de la cabina para volar a una ruta", "Exit cockpit to fly to a file": "Sal de la cabina para volar a un archivo", "Exit cockpit to fly to a scene": "Sal de la cabina para volar a una escena", - "Go to expanded Radio section": "Ir a la secciĂłn de Radio expandida", - "Expand Radio section in Context": "Expandir la secciĂłn de Radio en Contexto", "New scene name": "Nombre de la nueva escena", "Delete scene \"{scene}\" and all shots?": "ÂżEliminar la escena \"{scene}\" y todos sus planos?", "Detailed outline unavailable": "Contorno detallado no disponible", diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json new file mode 100644 index 000000000..58bcd2f21 --- /dev/null +++ b/src/i18n/locales/fr.json @@ -0,0 +1,3012 @@ +{ + "Pick a shape, then click the map.": "Choisissez une forme, puis cliquez sur la carte.", + "Enter to place the pin, Esc to cancel.": "Enter pour poser l'Ă©pingle, Esc pour annuler.", + "Click where the pin goes.": "Cliquez Ă  l'endroit oĂč poser l'Ă©pingle.", + "Click {count} more points.": { + "one": "Cliquez pour ajouter encore {count} point.", + "many": "Cliquez pour ajouter encore {count} de points.", + "other": "Cliquez pour ajouter encore {count} points." + }, + "Those points are in a line — move one off it to enclose an area.": "Ces points sont alignĂ©s — dĂ©placez-en un hors de la ligne pour dĂ©limiter une zone.", + "That line has no length — click somewhere further away.": "Cette ligne n'a pas de longueur — cliquez plus loin.", + " · {max}-point limit reached": " · limite de {max} points atteinte", + "{measure} · double-click or Enter to finish, Backspace undoes, Esc cancels.{full}": "{measure} · double-clic ou Enter pour terminer, Backspace annule le dernier point, Esc annule.{full}", + "drawings on the map": "les dessins sur la carte", + "That shape already has {count} points — finish it or press Backspace.": "Cette forme a dĂ©jĂ  {count} points — terminez-la ou appuyez sur Backspace.", + "That point is off the globe — click on the world.": "Ce point est hors du globe — cliquez sur la Terre.", + "That shape could not be placed.": "Impossible de placer cette forme.", + "Could not place the shape: {error}": "Impossible de placer la forme : {error}", + "Board cleared.": "Tableau effacĂ©.", + "{owner} is using the pointer — close it first.": "Pointeur utilisĂ© par : {owner}. Fermez d'abord cet outil.", + "{label} · Detailed outline unavailable": "{label} · Contour dĂ©taillĂ© indisponible", + "Flying to Austin, TX...": "En route vers Austin, Texas
", + "Restoring shared view...": "Restauration de la vue partagĂ©e
", + "Configuring viewer...": "Configuration de la vue
", + "Loading Google 3D Tiles...": "Chargement de Google 3D Tiles
", + "Loading the keyless globe...": "Chargement du globe sans clé ", + "Google 3D Tiles unavailable ({detail}). Loading the keyless globe...": "Google 3D Tiles indisponible ({detail}). Chargement du globe sans clé ", + "Initializing systems...": "Initialisation des systĂšmes
", + "Space Missions isolates replay data. Exit the mode to enable {layer}.": "Le mode Missions spatiales isole les donnĂ©es de rejeu. Quittez-le pour activer {layer}.", + "Data attribution": "Attribution des donnĂ©es", + "Data provided by:": "DonnĂ©es fournies par :", + "Close data attribution": "Fermer l'attribution des donnĂ©es", + "Light aircraft": "Avion lĂ©ger", + "Glider": "Planeur", + "Turboprop": "Turbopropulseur", + "Airliner": "Avion de ligne", + "Widebody": "Gros-porteur", + "Four-engine jet": "QuadrirĂ©acteur", + "Helicopter": "HĂ©licoptĂšre", + "Fast jet": "Avion de chasse", + "Business jet": "Jet d'affaires", + "Drone": "Drone", + "General emergency": "Urgence gĂ©nĂ©rale", + "Unlawful interference": "Intervention illicite", + "Radio failure": "Panne radio", + "Downed aircraft": "AĂ©ronef accidentĂ©", + "Minimum fuel": "Carburant minimum", + "Lifeguard (medical priority)": "Lifeguard (prioritĂ© mĂ©dicale)", + "Rasuwagadhi witness video": "VidĂ©o d'un tĂ©moin Ă  Rasuwagadhi", + "Bhote Koshi valley footage": "Images de la vallĂ©e de la Bhote Koshi", + "Flood footage": "Images de la crue", + "Compilation and casualty claims": "Compilation et bilans de victimes", + "SOURCE GEOCONFIRMED · WORLD-PINNED": "SOURCE GÉOCONFIRMÉE · ÉPINGLÉE SUR LA CARTE", + "SOURCE CREDITED · LOCATION UNRESOLVED": "SOURCE CRÉDITÉE · LIEU NON DÉTERMINÉ", + "REFERENCE ONLY · CLAIMS UNVERIFIED": "RÉFÉRENCE SEULEMENT · AFFIRMATIONS NON VÉRIFIÉES", + "SOURCE GEOCONFIRMED": "SOURCE GÉOCONFIRMÉE", + "2021 historical reference versus 2026 post-event imagery; changes are cumulative and include the July 2025 Rasuwagadhi flood. Schematic downstream progression, not modeled arrival time; not an official hazard model.": "RĂ©fĂ©rence historique de 2021 comparĂ©e aux images postĂ©rieures Ă  l'Ă©vĂ©nement de 2026 ; les changements sont cumulĂ©s et incluent la crue de Rasuwagadhi de juillet 2025. Progression schĂ©matique vers l'aval, pas une heure d'arrivĂ©e modĂ©lisĂ©e ; ce n'est pas un modĂšle officiel d'alĂ©a.", + "Immediate collapse viewpoint": "Point de vue au pied de l'effondrement", + "Collapse viewpoint": "Vue de l'effondrement", + "Debris-dammed lake": "Lac de barrage formĂ© par les dĂ©bris", + "Dammed lake": "Lac de barrage", + "Second landslide": "Second glissement de terrain", + "Gyirong border gate": "Poste frontiĂšre de Gyirong", + "Border gate": "Poste frontiĂšre", + "Timure evidence cluster": "Groupe de preuves de Timure", + "Mailung / Upper Trishuli bridge": "Mailung / pont d'Upper Trishuli", + "Dandagaun viewpoint restaurant": "Restaurant-belvĂ©dĂšre de Dandagaun", + "Dandagaun viewpoint": "BelvĂ©dĂšre de Dandagaun", + "Bidur - Trishuli bridge": "Pont Bidur - Trishuli", + "Bidur bridge": "Pont de Bidur", + "Devighat / Taadi Khola Bridge": "Devighat / pont de la Taadi Khola", + "Devighat bridge": "Pont de Devighat", + "Facebook player API did not initialize.": "L'API du lecteur Facebook ne s'est pas initialisĂ©e.", + "Facebook player API could not load.": "Impossible de charger l'API du lecteur Facebook.", + "Facebook player API timed out.": "DĂ©lai dĂ©passĂ© pour l'API du lecteur Facebook.", + "X embed API did not initialize.": "L'API d'intĂ©gration X ne s'est pas initialisĂ©e.", + "X embed could not load.": "Impossible de charger l'intĂ©gration X.", + "X embed timed out.": "DĂ©lai dĂ©passĂ© pour l'intĂ©gration X.", + "UNAVAILABLE": "INDISPONIBLE", + "TIMEOUT": "DÉLAI DÉPASSÉ", + "BLOCKED": "BLOQUÉ", + "SOURCE": "SOURCE", + "Facebook embed unavailable. The post may be private, removed, region-restricted, or blocked.": "IntĂ©gration Facebook indisponible. La publication est peut-ĂȘtre privĂ©e, supprimĂ©e, restreinte dans votre rĂ©gion ou bloquĂ©e.", + "Preloading {provider} media": "PrĂ©chargement du mĂ©dia {provider}", + "LOADING X POST
": "CHARGEMENT DU POST X
", + "The X post is unavailable or cannot be embedded.": "Le post X est indisponible ou ne peut pas ĂȘtre intĂ©grĂ©.", + "X POST · PROVIDER CONTROLS": "POST X · COMMANDES DU FOURNISSEUR", + "{reason} OPEN ORIGINAL.": "{reason} OUVRIR L'ORIGINAL.", + "X embed unavailable": "IntĂ©gration X indisponible", + "FACEBOOK · PROVIDER CONTROLS": "FACEBOOK · COMMANDES DU FOURNISSEUR", + "Facebook embed unavailable": "IntĂ©gration Facebook indisponible", + "AUTOPLAY BLOCKED · USE PROVIDER CONTROLS": "LECTURE AUTO BLOQUÉE · UTILISER LES COMMANDES DU FOURNISSEUR", + "Embedded {provider} media for {source}": "MĂ©dia {provider} intĂ©grĂ© pour {source}", + "witness source": "source tĂ©moin", + "Witness source": "Source tĂ©moin", + "{provider} · EMBEDDED SOURCE": "{provider} · SOURCE INTÉGRÉE", + "OPEN ORIGINAL ↗": "OUVRIR L'ORIGINAL ↗", + "{provider} media: {source}": "MĂ©dia {provider} : {source}", + "{provider} · PROVIDER CONTROLS": "{provider} · COMMANDES DU FOURNISSEUR", + "YOUTUBE {state} · OPEN ORIGINAL": "YOUTUBE {state} · OUVRIR L'ORIGINAL", + "INITIATION": "DÉCLENCHEMENT", + "DAMMING": "BARRAGE", + "SECONDARY FAILURE": "RUPTURE SECONDAIRE", + "BORDER ARRIVAL": "ARRIVÉE À LA FRONTIÈRE", + "PROPAGATION": "PROPAGATION", + "DOWNSTREAM PASSAGE": "PASSAGE EN AVAL", + "CONSEQUENCE": "CONSÉQUENCES", + "DOWNSTREAM CONSEQUENCE": "CONSÉQUENCES EN AVAL", + "EVIDENCE": "PREUVES", + "{year} HISTORICAL REFERENCE": "RÉFÉRENCE HISTORIQUE {year}", + "{year} POST-EVENT": "APRÈS L'ÉVÉNEMENT {year}", + "{count} GEOLOCATED SOURCE-MAP PLACEMENTS": { + "one": "{count} EMPLACEMENT GÉOLOCALISÉ SUR LA CARTE DES SOURCES", + "many": "{count} D'EMPLACEMENTS GÉOLOCALISÉS SUR LA CARTE DES SOURCES", + "other": "{count} EMPLACEMENTS GÉOLOCALISÉS SUR LA CARTE DES SOURCES" + }, + "NO PREVIEW": "PAS D'APERÇU", + "YouTube source": "Source YouTube", + "Facebook source": "Source Facebook", + "SOURCE LINK": "LIEN DE LA SOURCE", + "{publisher} / OPEN": "{publisher} / OUVRIR", + "Bhote Koshi flood reconstruction controls": "Commandes de la reconstitution de la crue de la Bhote Koshi", + "EVENT RECONSTRUCTION · 26 AUG 2026": "RECONSTITUTION DE L'ÉVÉNEMENT · 26 AOÛT 2026", + "BHOTE KOSHI OUTBURST FLOOD": "CRUE PAR VIDANGE BRUTALE DE LA BHOTE KOSHI", + "Close event layer": "Fermer la couche de l'Ă©vĂ©nement", + "OBSERVED IMAGERY": "IMAGERIE OBSERVÉE", + "SCHEMATIC CORRIDOR": "CORRIDOR SCHÉMATIQUE", + "2021 HISTORICAL REFERENCE / 2026 POST-EVENT": "RÉF. HISTORIQUE 2021 / APRÈS L'ÉVÉNEMENT 2026", + "Historical reference and post-event image split": "Comparaison entre l'image de rĂ©fĂ©rence historique et l'image postĂ©rieure Ă  l'Ă©vĂ©nement", + "RECONSTRUCTION CLOCK": "HORLOGE DE LA RECONSTITUTION", + "Schematic downstream progression": "Progression schĂ©matique vers l'aval", + "Story beat navigation": "Navigation entre les Ă©tapes du rĂ©cit", + "Previous story beat": "Étape prĂ©cĂ©dente du rĂ©cit", + "CAUSE": "CAUSE", + "CAPTURE TIME UNVERIFIED": "HEURE DE PRISE DE VUE NON VÉRIFIÉE", + "Next story beat": "Étape suivante du rĂ©cit", + "▶ PLAY": "▶ LIRE", + "Play the next shot and continue through this scene": "Lire le plan suivant et poursuivre la scĂšne", + "▶ PLAY SCENE": "▶ LIRE LA SCÈNE", + "◉ CINEMATIC": "◉ CINÉMATIQUE", + "â†ș FULL STORY": "â†ș RÉCIT COMPLET", + "↗ OPEN ORIGINAL": "↗ OUVRIR L'ORIGINAL", + "⌖ LOWER GORGE": "⌖ GORGE AVAL", + "FIELD REPORTS · {count}": "RAPPORTS DE TERRAIN · {count}", + "GEOLOCATIONS · {credit}": "GÉOLOCALISATIONS · {credit}", + "↗ OPEN PUBLIC MAP": "↗ OUVRIR LA CARTE PUBLIQUE", + " Clouds are preserved from the source imagery.": " Les nuages proviennent de l'imagerie source.", + "Rasuwagadhi witness": "TĂ©moin de Rasuwagadhi", + "Open original source for {source}; capture time unverified": "Ouvrir la source originale de {source} ; heure de prise de vue non vĂ©rifiĂ©e", + "Historical reference and post-event image divider": "SĂ©parateur entre l'image de rĂ©fĂ©rence historique et l'image postĂ©rieure Ă  l'Ă©vĂ©nement", + "A historical reference {before} percent, B post-event {after} percent": "A, rĂ©fĂ©rence historique, {before} pour cent ; B, aprĂšs l'Ă©vĂ©nement, {after} pour cent", + "■ RELEASE CAMERA": "■ LIBÉRER LA CAMÉRA", + "Seek Nepal scene clock": "Parcourir l'horloge de la scĂšne du NĂ©pal", + "NEPAL SCENE CLOCK": "HORLOGE DE LA SCÈNE DU NÉPAL", + "
 PLAYING SHOT": "
 LECTURE DU PLAN", + "▶ PLAY SHOT": "▶ LIRE LE PLAN", + "Ⅱ PAUSE": "Ⅱ PAUSE", + "â†ș REPLAY CINEMATIC": "â†ș REVOIR LA CINÉMATIQUE", + "â†ș REPLAY": "â†ș REVOIR", + "
 PLAYING SCENE": "
 LECTURE DE LA SCÈNE", + "Continue {scene} from next shot": "Reprendre {scene} au plan suivant", + "current scene": "la scĂšne actuelle", + "Replay the full reconstruction": "Revoir toute la reconstitution", + "SCENE SHOT": "PLAN DE SCÈNE", + "TIME UNVERIFIED": "HEURE NON VÉRIFIÉE", + "{count} SOURCES": { + "one": "{count} SOURCE", + "many": "{count} DE SOURCES", + "other": "{count} SOURCES" + }, + "OUTSIDE IMAGERY SWIPE": "HORS DE LA COMPARAISON D'IMAGES", + "{scene} / AUTHORED SHOT": "{scene} / PLAN SCÉNARISÉ", + "NEPAL FLOOD INCIDENT": "CRUE AU NÉPAL", + "Play {shot}": "Lire {shot}", + "current scene shot": "le plan actuel de la scĂšne", + "Play reconstruction": "Lire la reconstitution", + "Load previous scene shot": "Charger le plan prĂ©cĂ©dent de la scĂšne", + "Load next scene shot": "Charger le plan suivant de la scĂšne", + "SCHEMATIC CORRIDOR, NOT MODELED ARRIVAL TIME.": "CORRIDOR SCHÉMATIQUE, PAS UNE HEURE D'ARRIVÉE MODÉLISÉE.", + "Rasuwa · 26 Aug 2026": "Rasuwa · 26 aoĂ»t 2026", + "Event reconstruction": "Reconstitution de l'Ă©vĂ©nement", + "BHOTE KOSHI FLOOD INCIDENT": "CRUE DE LA BHOTE KOSHI", + "NEPAL · 26 AUG 2026": "NÉPAL · 26 AOÛT 2026", + "USGS INITIAL REPORT": "RAPPORT INITIAL DE L'USGS", + "26 AUG 2026 · 08:37 NPT": "26 AOÛT 2026 · 08:37 NPT", + "28.2710° N · 85.5150° E": "28,2710° N · 85,5150° E", + "INITIAL M4.4 · RECLASSIFIED M5.2 LANDSLIDE": "INITIALEMENT M4,4 · RECLASSÉ EN GLISSEMENT DE TERRAIN M5,2", + "USGS EVENT us7000tbwb · OPEN SOURCE": "ÉVÉNEMENT USGS us7000tbwb · OUVRIR LA SOURCE", + "Open the USGS initial report for the 26 August 2026 Nepal landslide": "Ouvrir le rapport initial de l'USGS sur le glissement de terrain du 26 aoĂ»t 2026 au NĂ©pal", + "Show the Nepal context callout without a border or country fill": "Afficher l'encart de contexte du NĂ©pal sans frontiĂšre ni remplissage du pays", + "Introduce Nepal, draw its border, then reveal the Bhote Koshi incident": "PrĂ©senter le NĂ©pal, tracer sa frontiĂšre, puis rĂ©vĂ©ler l'incident de la Bhote Koshi", + "CITIES": "VILLES", + "Keep the regional incident context and introduce nearby city labels": "Garder le contexte rĂ©gional de l'incident et faire apparaĂźtre les noms des villes proches", + "PLACES": "LIEUX", + "Introduce the reconstruction scene key places from trigger to downstream": "PrĂ©senter les lieux clĂ©s de la reconstitution, du dĂ©clenchement jusqu'Ă  l'aval", + "PATH": "TRACÉ", + "Animate the sourced cyan river-centerline route to Trishuli Bazaar": "Animer le tracĂ© cyan sourcĂ© de l'axe de la riviĂšre jusqu'Ă  Trishuli Bazaar", + "OVERVIEW": "VUE D'ENSEMBLE", + "Keep the completed flood path and location labels visible": "Garder visibles le tracĂ© complet de la crue et les noms de lieux", + "RECORD": "RAPPORT", + "Reveal the trigger record while making a slow camera approach": "RĂ©vĂ©ler le rapport sur l'Ă©vĂ©nement dĂ©clencheur pendant une lente approche de la camĂ©ra", + "{speed} kn": "{speed} nd", + "That file is not valid JSON.": "Ce fichier n'est pas un JSON valide.", + "That JSON file is not GeoJSON.": "Ce fichier JSON n'est pas du GeoJSON.", + "That FeatureCollection has no features list.": "Cette FeatureCollection n'a pas de liste features.", + "Every GeoJSON feature must have type Feature.": "Chaque entitĂ© GeoJSON doit ĂȘtre de type Feature.", + "That GeoJSON has invalid geometries.": "Ce GeoJSON contient des gĂ©omĂ©tries non valides.", + "That GeoJSON contains an unsupported geometry.": "Ce GeoJSON contient une gĂ©omĂ©trie non prise en charge.", + "That GeoJSON has invalid coordinates.": "Ce GeoJSON contient des coordonnĂ©es non valides.", + "That file creates more than {limit} map objects (the limit).": "Ce fichier crĂ©e plus de {limit} objets sur la carte (la limite).", + "That file has more than {limit} style definitions and image links after cleanup (the limit).": "AprĂšs nettoyage, ce fichier contient plus de {limit} dĂ©finitions de style et liens d'images (la limite).", + "That file has more than {limit} features (the limit).": "Ce fichier contient plus de {limit} entitĂ©s (la limite).", + "That file has more than {limit} points (the limit) across {features} features.": "Ce fichier contient plus de {limit} points (la limite) rĂ©partis sur {features} entitĂ©s.", + "That file has more than {limit} points (the limit).": "Ce fichier contient plus de {limit} points (la limite).", + "That KMZ unpacks to more than the import limit.": "Une fois dĂ©compressĂ©, ce KMZ dĂ©passe la limite d'importation.", + "That KMZ is damaged and could not be unpacked.": "Ce KMZ est endommagĂ© et n'a pas pu ĂȘtre dĂ©compressĂ©.", + "That KMZ is not a readable zip archive.": "Ce KMZ n'est pas une archive zip lisible.", + "That KMZ uses a zip format this import does not read.": "Ce KMZ utilise un format zip que cette importation ne lit pas.", + "That KMZ is encrypted.": "Ce KMZ est chiffrĂ©.", + "That KMZ uses a compression method this import does not read.": "Ce KMZ utilise une mĂ©thode de compression que cette importation ne lit pas.", + "That KML has invalid geometry bounds.": "Ce KML a des limites de gĂ©omĂ©trie non valides.", + "That KML has invalid coordinates.": "Ce KML contient des coordonnĂ©es non valides.", + "That GPX file has no document.": "Ce fichier GPX n'a pas de document .", + "That {format} file is not valid XML.": "Ce fichier {format} n'est pas un XML valide.", + "That file has an unreadable image or exceeds the 16-megapixel image limit.": "Ce fichier contient une image illisible ou dĂ©passe la limite de 16 mĂ©gapixels par image.", + "That KML could not be read.": "Impossible de lire ce KML.", + "That file has invalid point coordinates.": "Ce fichier contient des coordonnĂ©es de points non valides.", + "Ground heights are not available for that file. Try again when the map has loaded.": "Les altitudes du sol ne sont pas disponibles pour ce fichier. RĂ©essayez une fois la carte chargĂ©e.", + "That file took too long to read.": "La lecture de ce fichier a pris trop de temps.", + "Nothing to import.": "Rien Ă  importer.", + "That file is larger than {size} MiB.": "Ce fichier dĂ©passe {size} Mio.", + "Only GeoJSON, KML, KMZ and GPX files can be imported.": "Seuls les fichiers GeoJSON, KML, KMZ et GPX peuvent ĂȘtre importĂ©s.", + "That file has nothing to draw.": "Ce fichier ne contient rien Ă  dessiner.", + "That KMZ holds no KML document.": "Ce KMZ ne contient aucun document KML.", + "That {format} file could not be read.": "Impossible de lire ce fichier {format}.", + "That file has {count} map objects; the limit is {limit}.": "Ce fichier contient {count} objets cartographiques ; la limite est de {limit}.", + "Ground heights could not be read. Try that file again.": "Impossible de lire les altitudes du sol. RĂ©essayez avec ce fichier.", + "That file has invalid point graphics.": "Ce fichier contient des symboles de points non valides.", + "Overpass rate-limited": "Overpass : limite de requĂȘtes atteinte", + "Overpass timed out": "DĂ©lai Overpass dĂ©passĂ©", + "Overpass could not complete the query": "Overpass n'a pas pu terminer la requĂȘte", + "Map tiles temporarily unavailable": "Tuiles de la carte temporairement indisponibles", + "Mapped names temporarily unavailable": "Noms cartographiĂ©s temporairement indisponibles", + "Overpass temporarily unavailable": "Overpass temporairement indisponible", + "Retrying mapped sites
": "Nouvel essai : sites cartographiĂ©s
", + "Fetching mapped sites
": "RĂ©cupĂ©ration des sites cartographiĂ©s
", + "{reason} — retrying in {seconds}s": "{reason} — nouvel essai dans {seconds} s", + "{reason} — retry pending": "{reason} — nouvel essai en attente", + "Zoom in to search mapped installations": "Zoomez pour rechercher les installations cartographiĂ©es", + "Showing cached mapped sites": "Sites cartographiĂ©s en cache affichĂ©s", + "Mapped sites not loaded": "Sites cartographiĂ©s non chargĂ©s", + "Mapped sites loaded": "Sites cartographiĂ©s chargĂ©s", + "Military airfield": "AĂ©rodrome militaire", + "Naval base": "Base navale", + "Firing range": "Champ de tir", + "Military land": "Terrain militaire", + "Mapped installation": "Installation cartographiĂ©e", + "Military area": "Zone militaire", + "flight": "vol", + "military flight": "vol militaire", + "satellite": "satellite", + "feed unavailable": "flux indisponible", + "feed stale": "flux obsolĂšte", + "observed or mapped nearby context": "contexte observĂ© ou cartographiĂ© Ă  proximitĂ©", + "no observed or mapped objects in current feeds": "aucun objet observĂ© ou cartographiĂ© dans les flux actuels", + "Draw": "Dessin", + "Directions": "ItinĂ©raire", + "Recent imagery": "Imagerie rĂ©cente", + "STATION": "STATION", + "Crewed stations and their visiting vehicles": "Stations habitĂ©es et leurs vĂ©hicules visiteurs", + "NAV": "NAV", + "GNSS navigation — GPS, GLONASS, Galileo": "Navigation GNSS — GPS, GLONASS, Galileo", + "GEO": "GEO", + "Geostationary belt — comms and weather, fixed over the equator": "Ceinture gĂ©ostationnaire — tĂ©lĂ©coms et mĂ©tĂ©o, en position fixe au-dessus de l'Ă©quateur", + "VISUAL": "VISUEL", + "Brightest naked-eye objects — CelesTrak visual group": "Objets les plus brillants Ă  l'Ɠil nu — groupe visuel CelesTrak", + "COMMS": "TÉLÉCOM", + "Broadband constellation shell — shown only in DENSE mode": "Couche de la constellation haut dĂ©bit — affichĂ©e uniquement en mode DENSE", + "FISHING": "PÊCHE", + "TOWING": "REMORQUAGE", + "DREDGER": "DRAGUE", + "DIVE OPS": "PLONGÉE", + "MILITARY": "MILITAIRE", + "SAILING": "VOILIER", + "PLEASURE": "PLAISANCE", + "PILOT": "PILOTINE", + "SAR": "SAR", + "TUG": "REMORQUEUR", + "PORT TENDER": "SERVITUDE PORT.", + "ANTI-POLLUTION": "ANTIPOLLUTION", + "LAW ENFORCE": "POLICE", + "MEDICAL": "MÉDICAL", + "HIGH-SPEED": "GRANDE VITESSE", + "PASSENGER": "PASSAGERS", + "CARGO": "CARGO", + "TANKER": "NAVIRE-CITERNE", + "OTHER": "AUTRE", + "Included in bundle": "Inclus dans l'archive", + "Missing bundle file — reimport its bundle": "Fichier de l'archive manquant — rĂ©importez l'archive", + "Source configured; file checked when loaded": "Source configurĂ©e ; fichier vĂ©rifiĂ© au chargement", + "Source unavailable": "Source indisponible", + "ENVIRONMENTAL": "ENVIRONNEMENT", + "EARTH WATCH": "VEILLE TERRE", + "ACTIVE EVENTS": "ÉVÉNEMENTS ACTIFS", + "Starting live contacts
": "DĂ©marrage des contacts en direct
", + "Opening space missions
": "Ouverture des missions spatiales
", + "Scanning active events
": "Analyse des Ă©vĂ©nements actifs
", + "Live earthquakes and active fires, from USGS and NASA": "SĂ©ismes et feux actifs en direct, via USGS et NASA", + "It feels like a forbidden cockpit—then you realize the sources are public and the data is real.": "On se croirait dans un cockpit interdit — puis on comprend que les sources sont publiques et les donnĂ©es rĂ©elles.", + "Working
": "En cours
", + "Could not open that mission{detail}. Retry or explore manually.": "Impossible d'ouvrir cette mission{detail}. RĂ©essayez ou explorez manuellement.", + "This browser is blocking storage, so that could not be saved.": "Ce navigateur bloque le stockage, l'enregistrement a donc Ă©chouĂ©.", + "NORMAL": "NORMAL", + "CRT": "CRT", + "NVG": "NVG", + "FLIR": "FLIR", + "ANIME": "ANIME", + "NOIR": "NOIR", + "SNOW": "NEIGE", + "ARCTIC": "ARCTIQUE", + "ANTARCTIC": "ANTARCTIQUE", + "NORTH AMERICA": "AMÉRIQUE DU NORD", + "SOUTH AMERICA": "AMÉRIQUE DU SUD", + "EUROPE": "EUROPE", + "AFRICA": "AFRIQUE", + "ASIA": "ASIE", + "OCEANIA": "OCÉANIE", + "NORTHERN OCEANIC GRID": "GRILLE OCÉANIQUE NORD", + "SOUTHERN OCEANIC GRID": "GRILLE OCÉANIQUE SUD", + "LOADING": "CHARGEMENT", + "DEGRADED": "DÉGRADÉ", + "STALE": "OBSOLÈTE", + "PARTIAL": "PARTIEL", + "FALLBACK": "SECOURS", + "{state} {layers}": "{state} : {layers}", + "view band|STREET": "RUE", + "view band|CITY": "VILLE", + "view band|METRO": "MÉTROPOLE", + "view band|REGIONAL": "RÉGION", + "view band|GLOBAL": "MONDE", + "SUMMARY": "RÉSUMÉ", + "Awaiting telemetry...": "En attente de tĂ©lĂ©mĂ©trie
", + "REC": "REC", + "AIS: --": "AIS : --", + "N/A": "N/D", + "{mode} {band} {locality} | {region} | ALT {alt} | WINDOW {window} | SUN {sun}° | ONA {ona}° | {zone}": "{mode} · {band} · {locality} | {region} | ALT {alt} | FENÊTRE {window} | SOLEIL {sun}° | ONA {ona}° | {zone}", + "NEAR {poi} ({city}) {distance}": "PRÈS DE {poi} ({city}) {distance}", + "SECTOR {lat} {lon}": "SECTEUR {lat} {lon}", + "hemisphere|N": "N", + "hemisphere|S": "S", + "hemisphere|E": "E", + "hemisphere|W": "O", + "POWER UP · {count} KEYS WAITING": { + "one": "ALLUMER · {count} CLÉ EN ATTENTE", + "many": "ALLUMER · {count} DE CLÉS EN ATTENTE", + "other": "ALLUMER · {count} CLÉS EN ATTENTE" + }, + "POWERED UP": "ALLUMÉ", + "Provider Settings does not answer proxied requests": "Les paramĂštres des fournisseurs ne rĂ©pondent pas aux requĂȘtes passant par un proxy", + "Provider Settings is disabled while sharing is enabled": "Les paramĂštres des fournisseurs sont dĂ©sactivĂ©s tant que le partage est activĂ©", + "Provider Settings answers only the machine running the server": "Les paramĂštres des fournisseurs ne rĂ©pondent qu'Ă  la machine qui exĂ©cute le serveur", + "Provider Settings answers only local hostnames": "Les paramĂštres des fournisseurs ne rĂ©pondent qu'aux noms d'hĂŽte locaux", + "Provider Settings requires an exact local Origin": "Les paramĂštres des fournisseurs exigent un Origin local exact", + "Unrecognized Origin refused": "Origin non reconnu : requĂȘte refusĂ©e", + "Cross-origin requests are refused": "Les requĂȘtes d'une autre origine sont refusĂ©es", + "Content-Type must be application/json": "Le Content-Type doit ĂȘtre application/json", + "Method not allowed": "MĂ©thode non autorisĂ©e", + "Request too large": "RequĂȘte trop volumineuse", + "Invalid JSON": "JSON non valide", + "Body must be a JSON object of {ENV_VAR: value}": "Le corps doit ĂȘtre un objet JSON de la forme {ENV_VAR: value}", + "No keys provided": "Aucune clĂ© fournie", + "At most {limit} keys per save": "{limit} clĂ©s au maximum par enregistrement", + "Unknown key: {name}": "ClĂ© inconnue : {name}", + "{name} must be a string": "{name} : la valeur doit ĂȘtre une chaĂźne de caractĂšres", + "{name} is empty": "{name} : la valeur est vide", + "{name} is longer than any real key ({limit} max)": "{name} : la valeur est plus longue que toute clĂ© rĂ©elle ({limit} max.)", + "{name} may only contain printable characters with no spaces": "{name} : seuls les caractĂšres imprimables sans espace sont acceptĂ©s", + "{name} contains a character that is not valid in a key (#, quotes, $, \\, or backtick)": "{name} : un caractĂšre n'est pas valide dans une clĂ© (#, guillemets, $, \\ ou accent grave)", + "{name} is configured outside Provider Settings and can only be changed where it was set": "{name} est configurĂ©e hors des paramĂštres des fournisseurs et ne peut ĂȘtre modifiĂ©e qu'Ă  l'endroit oĂč elle a Ă©tĂ© dĂ©finie", + "The key was not saved: could not restrict the credential file to your account; nothing was saved": "La clĂ© n'a pas Ă©tĂ© enregistrĂ©e : impossible de restreindre le fichier d'identifiants Ă  votre compte ; rien n'a Ă©tĂ© enregistrĂ©", + "The key was not saved: the existing configuration could not be read, so nothing was changed": "La clĂ© n'a pas Ă©tĂ© enregistrĂ©e : la configuration existante est illisible, rien n'a donc Ă©tĂ© modifiĂ©", + "Could not write the {store} store": "Impossible d'Ă©crire dans le stockage {store}", + "Save failed ({status}).": "Échec de l'enregistrement ({status}).", + "OAuth check failed: {detail}": "Échec de la vĂ©rification OAuth : {detail}", + "Could not check ChatGPT sign-in. Try again.": "Impossible de vĂ©rifier la connexion ChatGPT. RĂ©essayez.", + "VOICE AUTH · CHATGPT OAUTH": "AUTH. VOCALE · OAUTH CHATGPT", + "VOICE AUTH · API KEY": "AUTH. VOCALE · CLÉ API", + "USE API KEY": "UTILISER LA CLÉ API", + "USE CHATGPT OAUTH": "UTILISER L'OAUTH CHATGPT", + "Use OPENAI_API_KEY for the next cloud voice session": "Utiliser OPENAI_API_KEY pour la prochaine session vocale cloud", + "Use the signed-in local ChatGPT/Codex OAuth session for the next cloud voice session": "Utiliser la session OAuth ChatGPT/Codex locale dĂ©jĂ  connectĂ©e pour la prochaine session vocale cloud", + "Metered — a billing-enabled account": "Payant Ă  l'usage — compte avec facturation activĂ©e", + "Optional paid token — public access works without one": "Jeton payant facultatif — l'accĂšs public fonctionne sans", + "Free key — register, paste, done": "ClĂ© gratuite — inscrivez-vous, collez-la, c'est tout", + "browser-side": "cĂŽtĂ© navigateur", + "This key runs in the browser by design — restrict it at the provider (see SECURITY.md)": "Cette clĂ© est conçue pour ĂȘtre utilisĂ©e dans le navigateur — restreignez son usage chez le fournisseur (voir SECURITY.md)", + "configured externally": "configurĂ©e ailleurs", + "Supplied by your environment, Keychain, or launcher — change it where it was set": "Fournie par votre environnement, le Trousseau ou le lanceur — modifiez-la lĂ  oĂč elle a Ă©tĂ© dĂ©finie", + "MANAGE ↗": "GÉRER ↗", + "GET KEY ↗": "OBTENIR UNE CLÉ ↗", + "{envVar} saved — paste to replace": "{envVar} enregistrĂ©e — collez-en une autre pour la remplacer", + "paste {envVar}": "collez {envVar}", + "REMOVE": "SUPPRIMER", + "Remove {title} from this app's saved keys": "Supprimer {title} des clĂ©s enregistrĂ©es de l'application", + "unsaved provider keys": "les clĂ©s de fournisseurs non enregistrĂ©es", + "Project keys: {status}": "ClĂ©s du projet : {status}", + "your app configuration": "la configuration de votre application", + "your local .env": "votre .env local", + "Saving
": "Enregistrement
", + "Save failed: {detail}": "Échec de l'enregistrement : {detail}", + "Paste at least one key first.": "Collez d'abord au moins une clĂ©.", + "Saved to {store}. Restarting — this page reloads itself.": "EnregistrĂ© dans {store}. RedĂ©marrage — cette page se recharge seule.", + "Cloud voice will use OPENAI_API_KEY on the next session.": "La voix cloud utilisera OPENAI_API_KEY Ă  la prochaine session.", + "Checking local ChatGPT OAuth sign-in
": "VĂ©rification de la connexion OAuth ChatGPT locale
", + "Could not check ChatGPT sign-in.": "Impossible de vĂ©rifier la connexion ChatGPT.", + "ChatGPT OAuth selected for cloud voice. Your API key stays saved and available.": "OAuth ChatGPT sĂ©lectionnĂ© pour la voix cloud. Votre clĂ© API reste enregistrĂ©e et disponible.", + "ChatGPT sign-in expired. Opening sign-in again
": "La session ChatGPT a expirĂ©. RĂ©ouverture de la page de connexion
", + "Opening ChatGPT sign-in in your browser
": "Ouverture de la page de connexion ChatGPT dans votre navigateur
", + "Could not start ChatGPT sign-in on this machine.": "Impossible de lancer la connexion ChatGPT sur cette machine.", + "Finish ChatGPT sign-in in the browser. Waiting for it to complete
": "Terminez la connexion ChatGPT dans le navigateur. En attente de la fin
", + "ChatGPT sign-in timed out. Click {button} to try again.": "DĂ©lai de connexion ChatGPT dĂ©passĂ©. Cliquez sur « {button} » pour rĂ©essayer.", + "ChatGPT sign-in complete. OAuth will be used for the next cloud voice session.": "Connexion ChatGPT terminĂ©e. OAuth sera utilisĂ© pour la prochaine session vocale cloud.", + "Remove this key from your saved configuration?": "Supprimer cette clĂ© de votre configuration enregistrĂ©e ?", + "Removed from {store}. Restarting — this page reloads itself.": "SupprimĂ© de {store}. RedĂ©marrage — cette page se recharge seule.", + "The photorealistic 3D planet, place search + Street View": "La planĂšte 3D photorĂ©aliste, la recherche de lieux + Street View", + "Places context + Street View fallback; optional separate key": "Contexte Places + secours Street View ; clĂ© sĂ©parĂ©e facultative", + "Voice control — API key or ChatGPT OAuth": "Commande vocale — clĂ© API ou OAuth ChatGPT", + "Gemini Live voice control": "Commande vocale Gemini Live", + "Live ships, worldwide": "Navires en direct, dans le monde entier", + "Live active-fire detections": "DĂ©tections de feux actifs en direct", + "Real live traffic (keyless runs a simulation)": "Trafic rĂ©el en direct (sans clé : simulation)", + "Bing imagery map stacks + world terrain": "Fonds de carte Bing + relief mondial", + "More flight-polling credits (anonymous works without)": "Plus de crĂ©dits d'interrogation des vols (fonctionne sans, en anonyme)", + "Street-level imagery and coverage in the Street Level layer. Free: register an app in the Mapillary developer dashboard and paste its Client Token": "Images et couverture au niveau de la rue dans la couche Niveau rue. Gratuit : enregistrez une application dans le tableau de bord dĂ©veloppeur de Mapillary et collez son Client Token", + "Public space-missions access needs no key. Leave blank for standard use; paid tokens only raise request limits.": "L'accĂšs public aux missions spatiales ne nĂ©cessite pas de clĂ©. Laissez vide pour un usage standard ; les jetons payants ne font qu'augmenter les limites de requĂȘtes.", + "Air quality request failed": "Échec de la requĂȘte sur la qualitĂ© de l'air", + "No readings available": "Aucune mesure disponible", + "No current readings": "Aucune mesure actuelle", + "{count} stations reporting": { + "one": "{count} station transmet", + "many": "{count} de stations transmettent", + "other": "{count} stations transmettent" + }, + "Highest air-quality readings in view": "Mesures de qualitĂ© de l'air les plus Ă©levĂ©es dans la vue", + "Low": "Faible", + "Low health risk": "Risque faible pour la santĂ©", + "Moderate": "ModĂ©rĂ©", + "Moderate health risk": "Risque modĂ©rĂ© pour la santĂ©", + "High": "ÉlevĂ©", + "High health risk": "Risque Ă©levĂ© pour la santĂ©", + "Very High": "TrĂšs Ă©levĂ©", + "Very High health risk": "Risque trĂšs Ă©levĂ© pour la santĂ©", + "Air quality": "QualitĂ© de l'air", + "Canada only · ECCC AQHI network": "Canada seulement · rĂ©seau CQAS d'ECCC", + "ECCC request timed out": "DĂ©lai dĂ©passĂ© pour la requĂȘte ECCC", + "Malformed AQHI station response": "RĂ©ponse des stations CQAS mal formĂ©e", + "No AQHI stations available": "Aucune station CQAS disponible", + "Malformed AQHI observation response": "RĂ©ponse des observations CQAS mal formĂ©e", + "Camera source temporarily unavailable": "Source de camĂ©ras temporairement indisponible", + "Mapped camera locations": "Emplacements de camĂ©ras cartographiĂ©s", + "SHOW NEAREST": "LA PLUS PROCHE", + "Stop following the current object before navigating to a camera": "ArrĂȘtez de suivre l'objet actuel avant d'aller vers une camĂ©ra", + "Move to the nearest loaded camera and show its details": "Aller Ă  la camĂ©ra chargĂ©e la plus proche et afficher ses dĂ©tails", + "Camera badges": "Badges de camĂ©ras", + "Cyan cameras turn coral when selected. Wedges illustrate mapped direction, not measured coverage. Nearby cameras may be outside the screen.": "Les camĂ©ras cyan deviennent corail une fois sĂ©lectionnĂ©es. Les secteurs illustrent l'orientation cartographiĂ©e, pas une couverture mesurĂ©e. Des camĂ©ras proches peuvent ĂȘtre hors de l'Ă©cran.", + "{count} nearby · {onScreen} on screen": { + "one": "{count} Ă  proximitĂ© · {onScreen} Ă  l'Ă©cran", + "many": "{count} Ă  proximitĂ© · {onScreen} Ă  l'Ă©cran", + "other": "{count} Ă  proximitĂ© · {onScreen} Ă  l'Ă©cran" + }, + "{count} nearby": { + "one": "{count} Ă  proximitĂ©", + "many": "{count} Ă  proximitĂ©", + "other": "{count} Ă  proximitĂ©" + }, + "retrying mapped ALPR cameras": "nouvel essai : camĂ©ras LAPI cartographiĂ©es", + "loading mapped ALPR cameras": "chargement des camĂ©ras LAPI cartographiĂ©es", + "No ALPR data for this area — US and Canada only": "Aucune donnĂ©e LAPI pour cette zone — États-Unis et Canada seulement", + "Zoom in to load mapped cameras": "Zoomez pour charger les camĂ©ras cartographiĂ©es", + "Showing cached locations": "Emplacements en cache affichĂ©s", + "Coverage limited — zoom in": "Couverture limitĂ©e — zoomez", + "No ALPR data for this area": "Aucune donnĂ©e LAPI pour cette zone", + "None on screen — nearby cameras are outside the view": "Aucune Ă  l'Ă©cran — les camĂ©ras proches sont hors de la vue", + "ALPR camera": "CamĂ©ra LAPI", + "Camera coverage unavailable": "Couverture des camĂ©ras indisponible", + "OpenStreetMap · community mapped": "OpenStreetMap · cartographie communautaire", + "Overpass returned an incomplete camera response": "Overpass a renvoyĂ© une rĂ©ponse incomplĂšte pour les camĂ©ras", + "At least {count}": "Au moins {count}", + "CONTEXT READY": "CONTEXTE PRÊT", + "GLOBAL CONTEXT OFF": "CONTEXTE GLOBAL DÉSACTIVÉ", + "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "CHOISIR UN VOL, UN NAVIRE OU UNE INSTALLATION CARTOGRAPHIÉE", + "ENABLE TO LOAD OBSERVED / MAPPED PROXIMITY": "ACTIVER POUR VOIR LES CONTACTS PROCHES OBSERVÉS / CARTOGRAPHIÉS", + "Unavailable": "Indisponible", + "Focus {label}": "Centrer sur {label}", + "Global Context navigation": "Navigation du Contexte global", + "Previous — prior visited contact in the 250 km window": "PrĂ©cĂ©dent — contact visitĂ© prĂ©cĂ©demment dans la fenĂȘtre de 250 km", + "PREVIOUS": "PRÉC.", + "FOCUS": "CENTRER", + "Next — nearest unvisited contact in the 250 km window": "Suivant — contact non visitĂ© le plus proche dans la fenĂȘtre de 250 km", + "NEXT": "SUIV.", + "Named areas ({n})": "Zones nommĂ©es ({n})", + "{distance} FLIGHT / VESSEL WINDOW": "FENÊTRE VOLS / NAVIRES DE {distance}", + "Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "Contexte cartographiĂ©/observĂ© en source ouverte. Des diffusions manquantes, des zones de carte non chargĂ©es ou des sites non cartographiĂ©s ne prouvent pas une absence.", + "mapped matches within {km} km of the subject": "correspondances cartographiĂ©es Ă  moins de {km} km de la cible", + "none mapped within {km} km; not a complete 250 km survey": "aucune cartographiĂ©e Ă  moins de {km} km ; pas un relevĂ© complet sur 250 km", + "mapped matches from the loaded viewport": "correspondances cartographiĂ©es dans la vue chargĂ©e", + "viewport feed is not a complete 250 km survey": "les donnĂ©es de la vue ne sont pas un relevĂ© complet sur 250 km", + "HDG {value}°": "HDG {value}°", + "BRG {value}°": "BRG {value}°", + "BRG —": "BRG —", + "CRS {value}°": "CRS {value}°", + "CURRENT VIEWPORT ONLY": "VUE ACTUELLE SEULEMENT", + "WITHIN {km} KM": "À MOINS DE {km} KM", + "Flights": "Vols", + "Military flights": "Vols militaires", + "AIS vessels": "Navires AIS", + "Mapped installations": "Installations cartographiĂ©es", + "syncing {count} city feeds...": "synchro de {count} flux de villes
", + "scanning nearby systems...": "analyse des systĂšmes proches
", + "GBFS fetch error": "erreur de rĂ©cupĂ©ration GBFS", + "Station {id}": "Station {id}", + "Station": "Station", + "đŸšČ {bikes} avail · {docks} docks · {capacity} cap": "đŸšČ {bikes} dispo · {docks} bornes libres · {capacity} places", + "⚠ Not installed": "⚠ Non installĂ©e", + "⚠ Not renting": "⚠ Location impossible", + "⚠ Not returning": "⚠ Retour impossible", + "HDG {value}° (ESTIMATED)": "HDG {value}° (ESTIMÉ)", + "{count} CAMERAS STANDING BY · NO CAMERA SELECTED · CLICK A CAMERA TO ACTIVATE": "{count} CAMÉRAS EN ATTENTE · AUCUNE CAMÉRA SÉLECTIONNÉE · CLIQUER SUR UNE CAMÉRA POUR L'ACTIVER", + "No cameras available in catalog.": "Aucune camĂ©ra disponible dans le catalogue.", + "{city} CCTV": "CCTV {city}", + "FOV {value}° (DATASHEET)": "FOV {value}° (FICHE TECHNIQUE)", + "FOV {value}°": "FOV {value}°", + "SPEC FOV {span}° (CAPABILITY)": "FOV CONSTRUCTEUR {span}° (CAPACITÉ)", + "COVERAGE {value}kmÂČ": "COUVERTURE {value} kmÂČ", + "OVERLAP {count} cams": "CHEVAUCHEMENT {count} cam.", + "ISOLATED VIEW": "VUE ISOLÉE", + "PROJ MONITOR": "PROJ MONITEUR", + "PROJ OFF": "PROJ OFF", + "VIEWSHED": "ZONE VISIBLE", + "CAL {value}": "CAL {value}", + "SRC {value}": "SRC {value}", + "{value} CONTEXT": "CONTEXTE {value}", + "{spec} · SPECS: CCTV-DATABASE.COM": "{spec} · CARACT. : CCTV-DATABASE.COM", + "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "Atlantique et Pacifique Nord oriental/central ; pas une couverture mondiale des cyclones.", + "Cyclone advisories unavailable": "Bulletins cycloniques indisponibles", + "Cyclone data unavailable": "DonnĂ©es cycloniques indisponibles", + "Potential tropical cyclone": "Cyclone tropical potentiel", + "Post-tropical cyclone": "Cyclone post-tropical", + "Hurricane": "Ouragan", + "Tropical storm": "TempĂȘte tropicale", + "Tropical depression": "DĂ©pression tropicale", + "Subtropical storm": "TempĂȘte subtropicale", + "Subtropical depression": "DĂ©pression subtropicale", + "Track and cone match this advisory": "La trajectoire et le cĂŽne correspondent Ă  ce bulletin", + "Track/cone awaiting advisory {number}": "Trajectoire/cĂŽne en attente du bulletin {number}", + "Track/cone unavailable": "Trajectoire/cĂŽne indisponible", + "Cached advisory · stale source": "Bulletin en cache · source obsolĂšte", + "Loading advisories
": "Chargement des bulletins
", + "{count} active storms": { + "one": "{count} cyclone actif", + "many": "{count} de cyclones actifs", + "other": "{count} cyclones actifs" + }, + "Position as of {time}": "Position au {time}", + "Maximum sustained wind: {wind} · Pressure: {pressure}": "Vent maximal soutenu : {wind} · Pression : {pressure}", + "{name} · {classification} · Advisory {number} · issued {time}": "{name} · {classification} · Bulletin {number} · Ă©mis le {time}", + "No active NHC/CPHC systems": "Aucun systĂšme actif NHC/CPHC", + "Advisories unavailable": "Bulletins indisponibles", + "Cyclones · NHC / CPHC": "Cyclones · NHC / CPHC", + "Atlantic · E/C Pacific": "Atlantique · Pacifique E/C", + "{storms} · {name} selected": "{storms} · {name} sĂ©lectionnĂ©", + "Official advisory ↗": "Bulletin officiel ↗", + "Active NHC and CPHC cyclone advisories": "Bulletins cycloniques actifs du NHC et du CPHC", + "Wind unavailable": "Vent indisponible", + "Advisory center / forecast track": "Centre selon le bulletin / trajectoire prĂ©vue", + "Center-track uncertainty cone": "CĂŽne d'incertitude de la trajectoire du centre", + "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "SĂ©lectionnez un cyclone sur la carte, ou choisissez-en un dans la liste pour le sĂ©lectionner et dĂ©placer la camĂ©ra. Cliquez sur une zone vide de la carte pour effacer la sĂ©lection. Contexte des bulletins NOAA NHC/CPHC. Le cĂŽne dĂ©crit l'incertitude de la trajectoire prĂ©vue du centre, pas la taille du cyclone ni toute la zone de danger. Les Ă©tiquettes des points de prĂ©vision sont les Ă©chĂ©ances de la source, pas des heures calculĂ©es depuis l'Ă©mission du bulletin. La gĂ©omĂ©trie suit la surface ; la hauteur n'est pas une altitude mĂ©tĂ©orologique. Consultez le bulletin officiel.", + "DRIVE": "VOITURE", + "Drive": "En voiture", + "WALK": "À PIED", + "Walk": "À pied", + "BIKE": "VÉLO", + "Bike": "À vĂ©lo", + "rate limited": "limite de requĂȘtes atteinte", + "routing service is rate limited": "le service d'itinĂ©raire a atteint sa limite de requĂȘtes", + "route leg too long": "tronçon d'itinĂ©raire trop long", + "route too long": "itinĂ©raire trop long", + "routing busy — too many routes at once": "service d'itinĂ©raire occupĂ© — trop d'itinĂ©raires Ă  la fois", + "route proxy error": "erreur du proxy d'itinĂ©raire", + "{error} — try again in a moment": "{error} — rĂ©essayez dans un instant", + "Routing is rate limited — try again in a moment": "Limite de requĂȘtes d'itinĂ©raire atteinte — rĂ©essayez dans un instant", + "Routing unavailable (HTTP {status})": "ItinĂ©raire indisponible (HTTP {status})", + "Routing unavailable": "ItinĂ©raire indisponible", + "direction|left": "Ă  gauche", + "direction|right": "Ă  droite", + "direction|slightly left": "lĂ©gĂšrement Ă  gauche", + "direction|slightly right": "lĂ©gĂšrement Ă  droite", + "direction|sharply left": "franchement Ă  gauche", + "direction|sharply right": "franchement Ă  droite", + "direction|straight": "tout droit", + "direction|around": "en sens inverse", + "fork direction|left": "Ă  gauche", + "fork direction|right": "Ă  droite", + "fork direction|slightly left": "lĂ©gĂšrement Ă  gauche", + "fork direction|slightly right": "lĂ©gĂšrement Ă  droite", + "fork direction|sharply left": "franchement Ă  gauche", + "fork direction|sharply right": "franchement Ă  droite", + "fork direction|straight": "tout droit", + "lane direction|left": "de gauche", + "lane direction|right": "de droite", + "lane direction|slightly left": "de gauche", + "lane direction|slightly right": "de droite", + "lane direction|sharply left": "la plus Ă  gauche", + "lane direction|sharply right": "la plus Ă  droite", + "lane direction|straight": "qui va tout droit", + "ordinal|{number}st": "{number}re", + "ordinal|{number}nd": "{number}e", + "ordinal|{number}rd": "{number}e", + "ordinal|{number}th": "{number}e", + "Head out on {road}": "Partez par {road}", + "Head out": "Partez", + "Arrive at your destination, on the left": "Vous ĂȘtes arrivĂ©, la destination est Ă  gauche", + "Arrive at your destination, on the right": "Vous ĂȘtes arrivĂ©, la destination est Ă  droite", + "Arrive at your destination": "Vous ĂȘtes arrivĂ© Ă  destination", + "Make a U-turn onto {road}": "Faites demi-tour sur {road}", + "Make a U-turn": "Faites demi-tour", + "Continue straight onto {road}": "Continuez tout droit sur {road}", + "Continue straight": "Continuez tout droit", + "Turn {direction} onto {road}": "Tournez {direction} sur {road}", + "Turn {direction}": "Tournez {direction}", + "Turn onto {road}": "Tournez sur {road}", + "maneuver|Turn": "Tournez", + "Continue {direction} onto {road}": "Continuez {direction} sur {road}", + "Continue {direction}": "Continuez {direction}", + "At the end of the road, turn {direction} onto {road}": "Au bout de la route, tournez {direction} sur {road}", + "At the end of the road, turn {direction}": "Au bout de la route, tournez {direction}", + "At the end of the road, continue onto {road}": "Au bout de la route, continuez sur {road}", + "At the end of the road, continue": "Au bout de la route, continuez", + "Keep {direction} at the fork onto {road}": "À l'embranchement, continuez {direction} sur {road}", + "Keep {direction} at the fork": "À l'embranchement, continuez {direction}", + "Continue at the fork onto {road}": "À l'embranchement, continuez sur {road}", + "Continue at the fork": "À l'embranchement, continuez", + "Merge {direction} onto {road}": "InsĂ©rez-vous {direction} sur {road}", + "Merge {direction}": "InsĂ©rez-vous {direction}", + "Merge onto {road}": "InsĂ©rez-vous sur {road}", + "maneuver|Merge": "InsĂ©rez-vous", + "Take the ramp on the {direction} onto {road}": "Prenez la bretelle {direction} vers {road}", + "Take the ramp on the {direction}": "Prenez la bretelle {direction}", + "Take the ramp {direction} onto {road}": "Prenez la bretelle {direction} vers {road}", + "Take the ramp {direction}": "Prenez la bretelle {direction}", + "Take the ramp onto {road}": "Prenez la bretelle vers {road}", + "Take the ramp": "Prenez la bretelle", + "Take the exit on the {direction} onto {road}": "Prenez la sortie {direction} vers {road}", + "Take the exit on the {direction}": "Prenez la sortie {direction}", + "Take the exit {direction} onto {road}": "Prenez la sortie {direction} vers {road}", + "Take the exit {direction}": "Prenez la sortie {direction}", + "Take the exit onto {road}": "Prenez la sortie vers {road}", + "Take the exit": "Prenez la sortie", + "At the roundabout, take the {exit} exit onto {road}": "Au rond-point, prenez la {exit} sortie vers {road}", + "At the roundabout, take the {exit} exit": "Au rond-point, prenez la {exit} sortie", + "Enter the roundabout onto {road}": "Engagez-vous dans le rond-point vers {road}", + "Enter the roundabout": "Engagez-vous dans le rond-point", + "At the roundabout, turn {direction} onto {road}": "Au rond-point, tournez {direction} sur {road}", + "At the roundabout, turn {direction}": "Au rond-point, tournez {direction}", + "At the roundabout, continue onto {road}": "Au rond-point, continuez sur {road}", + "At the roundabout, continue": "Au rond-point, continuez", + "Exit the roundabout onto {road}": "Sortez du rond-point vers {road}", + "Exit the roundabout": "Sortez du rond-point", + "Use the {direction} lane onto {road}": "Prenez la voie {direction} vers {road}", + "Use the {direction} lane": "Prenez la voie {direction}", + "Continue onto {road}": "Continuez sur {road}", + "maneuver|Continue": "Continuez", + "{mode} — reroute for {modeLower}": "{mode} — recalculer l'itinĂ©raire {modeLower}", + "CLICK MAP": "CLIQUER SUR LA CARTE", + "SET A": "PLACER A", + "Click a spot on the globe to place A (click again to cancel)": "Cliquez sur un point du globe pour placer A (cliquez Ă  nouveau pour annuler)", + "Then click the globe to place the start": "Puis cliquez sur le globe pour placer le dĂ©part", + "SET B": "PLACER B", + "Click a spot on the globe to place B (click again to cancel)": "Cliquez sur un point du globe pour placer B (cliquez Ă  nouveau pour annuler)", + "Then click the globe to place the destination": "Puis cliquez sur le globe pour placer la destination", + "Swap A and B": "Inverser A et B", + "FLY ···": "SURVOL ···", + "FLYING": "EN SURVOL", + "FLY": "SURVOLER", + "Fly the camera along the route": "Faire voler la camĂ©ra le long de l'itinĂ©raire", + "Place A and B first": "Placez d'abord A et B", + "action|CLEAR": "EFFACER", + "Remove the route and both markers": "Supprimer l'itinĂ©raire et les deux marqueurs", + "press Escape twice to leave Draw": "appuyez deux fois sur Esc pour quitter Dessin", + "{name} is active — turn {name} off, then set {endpoint}": "Outil actif : {name} — dĂ©sactivez {name}, puis placez {endpoint}", + "{name} is active — {leave}, then set {endpoint}": "Outil actif : {name} — {leave}, puis placez {endpoint}", + "Only the first {count} turns of this route are shown": "Seules les {count} premiĂšres manƓuvres de cet itinĂ©raire sont affichĂ©es", + "Turn-by-turn directions": "Instructions pas Ă  pas", + "Another map tool is using clicks — close it, then SET A again": "Un autre outil de carte utilise les clics — fermez-le, puis refaites PLACER A", + "Routing
": "Calcul de l'itinĂ©raire
", + "No route found": "Aucun itinĂ©raire trouvĂ©", + "{distance} · {duration} · {mode} · first {count} turns": "{distance} · {duration} · {mode} · {count} premiĂšres manƓuvres", + "{distance} · {duration} · {mode}": "{distance} · {duration} · {mode}", + "Click the globe to place {endpoint}": "Cliquez sur le globe pour placer {endpoint}", + "SET B, then click the globe": "PLACER B, puis cliquez sur le globe", + "SET A, then click the globe": "PLACER A, puis cliquez sur le globe", + "Step {step} of {total} · then {leg}": "Étape {step} sur {total} · puis {leg}", + "Step {step} of {total}": "Étape {step} sur {total}", + "Then: {instruction}": "Puis : {instruction}", + "No route found between A and B": "Aucun itinĂ©raire trouvĂ© entre A et B", + "Routing failed: {error}": "Échec du calcul d'itinĂ©raire : {error}", + "Routing timed out": "DĂ©lai dĂ©passĂ© pour le calcul d'itinĂ©raire", + "Routing unavailable — no response from the routing service": "ItinĂ©raire indisponible — aucune rĂ©ponse du service d'itinĂ©raire", + "Earthquake source unavailable": "Source des sĂ©ismes indisponible", + "Focus fire detection {title}, {details}": "Centrer sur la dĂ©tection de feu {title}, {details}", + "live feed unavailable": "flux en direct indisponible", + "{value} conf": "conf. {value}", + "{value} ago": "il y a {value}", + "sensor n/a": "capteur n/d", + "FIRE · {frp} MW": "FEU · {frp} MW", + "NIGHT": "NUIT", + "â–Č {frp} MW": "â–Č {frp} MW", + "FIRE": "FEU", + "FIRES": "FEUX", + "max {value} MW": "max {value} MW", + "new {value}": "dernier il y a {value}", + "{value}°N": "{value}°N", + "{value}°S": "{value}°S", + "{value}°E": "{value}°E", + "{value}°W": "{value}°O", + "just now": "Ă  l'instant", + "<1m ago": "il y a <1 min", + "{count}m ago": "il y a {count} min", + "{count}h ago": "il y a {count} h", + "fire confidence|high": "Ă©levĂ©e", + "fire confidence|nominal": "nominale", + "fire confidence|low": "faible", + "age|<1h": "<1 h", + "age|{count}h": "{count} h", + "age|{count}d": "{count} j", + "STALE · cached {age}": "OBSOLÈTE · en cache {age}", + "refreshing...": "actualisation
", + "loading...": "chargement
", + "KEY REQUIRED": "CLÉ REQUISE", + "LIVE · updated {age}": "DIRECT · mis Ă  jour {age}", + "Source snapshot time unavailable": "Heure de l'instantanĂ© source indisponible", + "Live data unavailable": "DonnĂ©es en direct indisponibles", + "Intel Picture": "Situation renseignement", + "Kinetic 30d": "CinĂ©tique 30 j", + "Border Crisis": "Crise frontaliĂšre", + "Iran Picture": "Situation Iran", + "Iran Kinetic": "CinĂ©tique Iran", + "Yemen FLOT": "FLOT YĂ©men", + "Latest Drop": "DerniĂšre publication", + "GhostMaps file could not be read": "Impossible de lire le fichier GhostMaps", + "{count} source links ↗ · click card to open the first": { + "one": "{count} lien source ↗ · cliquez sur la fiche pour l'ouvrir", + "many": "{count} de liens sources ↗ · cliquez sur la fiche pour ouvrir le premier", + "other": "{count} liens sources ↗ · cliquez sur la fiche pour ouvrir le premier" + }, + "S2 · {name}": "S2 · {name}", + "Report": "Rapport", + "Open the source for {title}": "Ouvrir la source de {title}", + "GhostMaps catalog unavailable": "Catalogue GhostMaps indisponible", + "LIVE · GitHub {commit} · {message} · checked every {seconds}s": "DIRECT · GitHub {commit} · {message} · vĂ©rifiĂ© toutes les {seconds} s", + "GitHub {commit} · {message} · reconnecting for live updates": "GitHub {commit} · {message} · reconnexion pour les mises Ă  jour en direct", + "Connecting to the S2 GhostMaps repository
": "Connexion au dĂ©pĂŽt S2 GhostMaps
", + "{count} placemarks": { + "one": "{count} repĂšre", + "many": "{count} de repĂšres", + "other": "{count} repĂšres" + }, + "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 publie ces produits KMZ sur GitHub. Les nouvelles publications sont dĂ©tectĂ©es en quelques secondes et remplacent automatiquement l'Ă©dition prĂ©cĂ©dente. Cliquez sur un marqueur pour voir son rapport.", + "Malformed GhostMaps catalog": "Catalogue GhostMaps mal formĂ©", + "Low-accuracy score < 2%": "Indice de faible prĂ©cision < 2 %", + "Low-accuracy score 2–10%": "Indice de faible prĂ©cision 2–10 %", + "Low-accuracy score > 10%": "Indice de faible prĂ©cision > 10 %", + "GNSS integrity source unavailable": "Source d'intĂ©gritĂ© GNSS indisponible", + "Regional sample · 250 nm radius · cells from visited views over 30 min": "Échantillon rĂ©gional · rayon de 250 NM · cellules des vues visitĂ©es sur 30 min", + "Retrying automatically at {time} UTC": "Nouvel essai automatique Ă  {time} UTC", + "Retrying automatically after provider cooldown": "Nouvel essai automatique aprĂšs la pause du fournisseur", + "Updates automatically after pan or zoom and once a minute. The public feed covers a 250-nautical-mile circle around the view centre; zooming out does not make it a worldwide snapshot. Blank cells are outside sampled coverage or have insufficient observations.": "Mise Ă  jour automatique aprĂšs un dĂ©placement ou un zoom, et une fois par minute. Le flux public couvre un cercle de 250 milles nautiques autour du centre de la vue ; dĂ©zoomer n'en fait pas un instantanĂ© mondial. Les cellules vides sont hors de la couverture Ă©chantillonnĂ©e ou manquent d'observations.", + "Low-accuracy score = 100 × max(0, bad − 1) / total: one aircraft is discounted, so this is not the raw share. Cells need {aircraft} aircraft over {minutes} minutes. Navigation-integrity anomalies are not a detection of jamming or spoofing.": "Indice de faible prĂ©cision = 100 × max(0, mauvais − 1) / total : un aĂ©ronef est dĂ©duit, ce n'est donc pas la proportion brute. Chaque cellule exige {aircraft} aĂ©ronefs sur {minutes} minutes. Les anomalies d'intĂ©gritĂ© de navigation ne constituent pas une dĂ©tection de brouillage ou de leurrage.", + "GNSS snapshot needs a view anchor": "L'instantanĂ© GNSS nĂ©cessite un point d'ancrage de la vue", + "GNSS feed rate limited (HTTP 429)": "Flux GNSS : limite de requĂȘtes atteinte (HTTP 429)", + "Malformed GNSS integrity snapshot": "InstantanĂ© d'intĂ©gritĂ© GNSS mal formĂ©", + "GNSS integrity snapshot has no observation time": "L'instantanĂ© d'intĂ©gritĂ© GNSS n'a pas d'heure d'observation", + "installation class|AIRFIELD": "AÉRODROME", + "installation class|NAVAL BASE": "BASE NAVALE", + "installation class|RANGE": "CHAMP DE TIR", + "installation class|MILITARY LAND": "TERRAIN MILITAIRE", + "installation class|BASE": "BASE", + "installation class|BARRACKS": "CASERNE", + "installation class|TRAINING AREA": "ZONE D'ENTRAÎNEMENT", + "installation class|PLACES CANDIDATE": "CANDIDAT PLACES", + "installation class|INSTALLATION": "INSTALLATION", + "No mapped sites within {km} km of the contact": "Aucun site cartographiĂ© Ă  moins de {km} km du contact", + "{count} mapped sites within {km} km of the contact": { + "one": "{count} site cartographiĂ© Ă  moins de {km} km du contact", + "many": "{count} de sites cartographiĂ©s Ă  moins de {km} km du contact", + "other": "{count} sites cartographiĂ©s Ă  moins de {km} km du contact" + }, + "No mapped sites in view": "Aucun site cartographiĂ© dans la vue", + "{count} mapped sites in view": { + "one": "{count} site cartographiĂ© dans la vue", + "many": "{count} de sites cartographiĂ©s dans la vue", + "other": "{count} sites cartographiĂ©s dans la vue" + }, + "loading mapped installation context": "chargement du contexte de l'installation cartographiĂ©e", + "Too many mapped sites in view to list them all": "Trop de sites cartographiĂ©s dans la vue pour tous les lister", + "Installation context unavailable": "Contexte des installations indisponible", + "MAPPED INSTALLATION": "INSTALLATION CARTOGRAPHIÉE", + "Unknown": "Inconnu", + "LAUNCH SITE · {site}": "SITE DE LANCEMENT · {site}", + "LAUNCH SITE": "SITE DE LANCEMENT", + "T−{time} · {mission}": "T−{time} · {mission}", + "LAUNCH STANDBY": "LANCEMENT EN ATTENTE", + "LIFTOFF · {mission}": "DÉCOLLAGE · {mission}", + "ASCENT REPLAY · {mission}": "REJEU DE L'ASCENSION · {mission}", + "ASCENT ESTIMATE · {mission}": "ASCENSION ESTIMÉE · {mission}", + "STAGE RE-ENTRY / RECOVERY · {mission}": "RENTRÉE / RÉCUPÉRATION D'ÉTAGE · {mission}", + "ORBIT REPLAY · {mission}": "REJEU DE L'ORBITE · {mission}", + "PAUSED · {title}": "PAUSE · {title}", + "UNSPECIFIED": "NON PRÉCISÉ", + "+{count} additional payload records": "Enregistrements de charge utile supplĂ©mentaires : +{count}", + "PAYLOAD DATA UNAVAILABLE": "DONNÉES DE CHARGE UTILE INDISPONIBLES", + "{value} KM DOWNRANGE": "DIST. SOL : {value} KM", + "POSITION UNAVAILABLE": "POSITION INDISPONIBLE", + "FLIGHT {count}": "VOL {count}", + "REUSED": "RÉUTILISÉ", + "NO STAGE RE-ENTRY / RECOVERY DATA": "AUCUNE DONNÉE DE RENTRÉE / RÉCUPÉRATION D'ÉTAGE", + "{count} / 30D": "{count} / 30J", + "NO MISSIONS AVAILABLE IN THE CURRENT 30-DAY WINDOW": "AUCUNE MISSION DISPONIBLE DANS LA FENÊTRE ACTUELLE DE 30 JOURS", + "DATE UNAVAILABLE": "DATE INDISPONIBLE", + "UNSPECIFIED OPERATOR": "OPÉRATEUR NON PRÉCISÉ", + "Select {mission}": "SĂ©lectionner {mission}", + "{value} KM": "{value} KM", + "{value} KM/S": "{value} KM/S", + "Selected Space Mission": "Mission spatiale sĂ©lectionnĂ©e", + "SELECTED SPACE MISSION": "MISSION SPATIALE SÉLECTIONNÉE", + "Show all missions": "Afficher toutes les missions", + "Deselect mission": "DĂ©sĂ©lectionner la mission", + "MISSION": "MISSION", + "STATUS · ": "STATUT · ", + "LAUNCH SITE · ": "SITE DE LANCEMENT · ", + "LAUNCH TIME · ": "HEURE DE LANCEMENT · ", + "ORBIT · ": "ORBITE · ", + "ASCENT PATH · ": "TRAJECTOIRE D'ASCENSION · ", + "CURRENT DISTANCE FROM EARTH · ": "DISTANCE ACTUELLE À LA TERRE · ", + "SATELLITE SPEED · ": "VITESSE DU SATELLITE · ", + "PAYLOAD": "CHARGE UTILE", + "NAME": "NOM", + "TYPE": "TYPE", + "DESTINATION": "DESTINATION", + "STAGE / RE-ENTRY / RECOVERY": "ÉTAGE / RENTRÉE / RÉCUPÉRATION", + "STAGE": "ÉTAGE", + "STATUS": "STATUT", + "FINAL POSITION": "POSITION FINALE", + "REPLAY SPEED": "VITESSE DU REJEU", + "Replay speed multiplier": "Multiplicateur de vitesse du rejeu", + "REPLAY ASCENT": "REJOUER L'ASCENSION", + "Previous mission": "Mission prĂ©cĂ©dente", + "PREV": "PRÉC.", + "Next mission": "Mission suivante", + "SHOW ALL / DESELECT": "TOUT AFFICHER / DÉSÉLECTIONNER", + "Pause replay": "Mettre le rejeu en pause", + "Cancel replay": "Annuler le rejeu", + "EST. DOWNRANGE": "DIST. SOL ESTIMÉE", + "PLANNED · ": "PRÉVU · ", + "SUPPLIED TRAJECTORY POINTS": "POINTS DE TRAJECTOIRE FOURNIS", + "RECONSTRUCTED ESTIMATE": "ESTIMATION RECONSTITUÉE", + "Replay the estimated ascent with a following camera": "Rejouer l'ascension estimĂ©e avec une camĂ©ra de suivi", + "Resume replay": "Reprendre le rejeu", + "T minus {seconds}": "T moins {seconds}", + "Preparing launch site": "PrĂ©paration du site de lancement", + "Liftoff": "DĂ©collage", + "Ascent replay": "Rejeu de l'ascension", + "Orbit replay": "Rejeu de l'orbite", + ", paused": ", en pause", + "Malformed launch snapshot": "InstantanĂ© des lancements mal formĂ©", + "Heard by your receiver": "CaptĂ© par votre rĂ©cepteur", + "1090 MHz": "1090 MHz", + "978 MHz UAT": "978 MHz UAT", + "browser SDR": "SDR du navigateur", + "decoder feed": "flux du dĂ©codeur", + "Your RTL-SDR receiver and decoder feed": "Votre rĂ©cepteur RTL-SDR et le flux du dĂ©codeur", + "Your decoder feed": "Votre flux de dĂ©codeur", + "Your RTL-SDR receiver": "Votre rĂ©cepteur RTL-SDR", + "NO CALLSIGN": "SANS INDICATIF", + "ALT {altitude} FT · GS {speed} KT · TRK {track}": "ALT {altitude} FT · GS {speed} ND · TRK {track}", + "V/S {rate}": "V/S {rate}", + "V/S {rate} FPM": "V/S {rate} FT/MIN", + "POSITION {age}": "POSITION {age}", + "POSITION {seconds} S AGO": "POSITION IL Y A {seconds} S", + "{count} MSGS": { + "one": "{count} MSG", + "many": "{count} DE MSG", + "other": "{count} MSG" + }, + "Decoder feeds": "Flux du dĂ©codeur", + "WebUSB + decoder feeds": "WebUSB + flux du dĂ©codeur", + "opening receiver": "ouverture du rĂ©cepteur", + "checking decoder feeds": "vĂ©rification des flux du dĂ©codeur", + "WebUSB needs desktop Chrome or Edge": "WebUSB nĂ©cessite Chrome ou Edge sur ordinateur", + "connect a receiver in Radio": "connectez un rĂ©cepteur dans Radio", + "receiver is in FM mode": "le rĂ©cepteur est en mode FM", + "listening": "Ă  l'Ă©coute", + "USB error": "erreur USB", + "Alt unknown": "Alt. inconnue", + "Type unknown": "Type inconnu", + "Reg unknown": "Immat. inconnue", + "Operator unknown": "OpĂ©rateur inconnu", + "${amount}K": "{amount} k$", + "${amount}M": "{amount} M$", + "${amount}B": "{amount} Md$", + "fire cause|Human": "humaine", + "fire cause|Natural": "naturelle", + "fire cause|Undetermined": "indĂ©terminĂ©e", + "fire cause|Unknown": "inconnue", + "fire behavior|Minimal": "activitĂ© minimale", + "fire behavior|Moderate": "activitĂ© modĂ©rĂ©e", + "fire behavior|Active": "activitĂ© forte", + "fire behavior|Extreme": "activitĂ© extrĂȘme", + "Type {level} Incident": "incident de type {level}", + "age|{count}m": "{count} min", + "{acres} ac": { + "one": "{acres} acre", + "many": "{acres} d'acres", + "other": "{acres} acres" + }, + "{percent}% contained": "circonscrit Ă  {percent} %", + "containment unknown": "part circonscrite inconnue", + "{cause} cause": "cause : {cause}", + "{personnel} personnel": { + "one": "{personnel} intervenant", + "many": "{personnel} d'intervenants", + "other": "{personnel} intervenants" + }, + "{county} County": "comtĂ© de {county}", + "{cost} to date": "{cost} Ă  ce jour", + "discovered {age} ago": "dĂ©tectĂ© il y a {age}", + "updated {age} ago": "mis Ă  jour il y a {age}", + "part of {complex}": "fait partie de {complex}", + "InciWeb ↗ · click card to open": "InciWeb ↗ · cliquez sur la fiche pour l'ouvrir", + "FIRE · {name}": "INCENDIE · {name}", + "Unnamed incident": "Incident sans nom", + "Open {title} on InciWeb": "Ouvrir {title} sur InciWeb", + "Perimeter source unavailable": "Source des pĂ©rimĂštres indisponible", + "Not contained or unknown": "Non circonscrit ou inconnu", + "Under 50% contained": "Circonscrit Ă  moins de 50 %", + "50–99% contained": "Circonscrit Ă  50–99 %", + "Fully contained": "EntiĂšrement circonscrit", + "Colour shows reported containment. Perimeters are simplified to about 100 m.": "La couleur indique la part du pĂ©rimĂštre dĂ©clarĂ©e circonscrite. Les pĂ©rimĂštres sont simplifiĂ©s Ă  environ 100 m.", + "Malformed perimeter snapshot": "InstantanĂ© des pĂ©rimĂštres mal formĂ©", + "radio tag|All": "Toutes", + "News": "ActualitĂ©s", + "Talk": "DĂ©bats", + "Weather / Emergency": "MĂ©tĂ©o / Urgences", + "Public Safety": "SĂ©curitĂ© publique", + "Aviation / Marine": "Aviation / Marine", + "Traffic / Transit": "Trafic / Transports", + "Music": "Musique", + "Other": "Autres", + "Directory refresh degraded; showing the previous station catalog.": "Actualisation partielle de l'annuaire ; affichage du catalogue de stations prĂ©cĂ©dent.", + "Radio directory coverage is degraded.": "La couverture de l'annuaire radio est dĂ©gradĂ©e.", + "Directory refresh failed; showing the previous station catalog.": "Échec de l'actualisation de l'annuaire ; affichage du catalogue de stations prĂ©cĂ©dent.", + "Radio directory is temporarily unavailable.": "L'annuaire radio est temporairement indisponible.", + "radio|NEWS": "ACTUS", + "radio|TALK": "DÉBATS", + "radio|WEATHER": "MÉTÉO", + "radio|SAFETY": "SÉCURITÉ", + "radio|AIR / SEA": "AIR / MER", + "radio|TRANSIT": "TRANSPORTS", + "radio|MUSIC": "MUSIQUE", + "radio|OTHER": "AUTRES", + "Broadcaster stream is unavailable or blocked by the browser.": "Le flux du diffuseur est indisponible ou bloquĂ© par le navigateur.", + "Playback requires a direct click or tap.": "La lecture nĂ©cessite un clic ou un appui direct.", + "Broadcaster stream could not be started.": "Impossible de dĂ©marrer le flux du diffuseur.", + "Alternative": "Alternatif", + "Ambient": "Ambient", + "Blues": "Blues", + "Classical": "Classique", + "Country": "Country", + "Dance": "Dance", + "Electronic": "Électronique", + "Folk": "Folk", + "Funk": "Funk", + "Hip-Hop": "Hip-Hop", + "House": "House", + "Indie": "Indie", + "Jazz": "Jazz", + "Latin": "Latino", + "Metal": "Metal", + "Oldies": "Oldies", + "Pop": "Pop", + "Punk": "Punk", + "R&B": "R&B", + "Reggae": "Reggae", + "Rock": "Rock", + "Soul": "Soul", + "Techno": "Techno", + "Trance": "Trance", + "World": "Musiques du monde", + "overview": "vue quotidienne", + "cloud unknown": "nĂ©bulositĂ© inconnue", + "{percent}% scene cloud": "{percent} % de nuages sur la scĂšne", + "{min}–{max}% scene cloud": "{min}–{max} % de nuages sur la scĂšne", + "Comparison in use by another scene": "Comparaison utilisĂ©e par une autre scĂšne", + "Esri map unavailable · no swipe": "Carte Esri indisponible · pas de comparaison", + "Swipe needs a globe map": "La comparaison nĂ©cessite une carte du globe", + "Imagery stays on Esri · CLEAR to use Google 3D": "L'imagerie reste sur Esri · EFFACER pour utiliser Google 3D", + "Imagery catalog unavailable": "Catalogue d'images indisponible", + "Catalog truncated · a newer clear day may exist": "Catalogue tronquĂ© · un jour dĂ©gagĂ© plus rĂ©cent peut exister", + "{label} catalog unavailable · {detail}": "Catalogue {label} indisponible · {detail}", + "Daily overview for today may still be empty until the pass": "La vue quotidienne d'aujourd'hui peut rester vide jusqu'au passage du satellite", + "Box and images cleared": "Zone et images effacĂ©es", + "MORE DETAIL · 30 m": "PLUS DE DÉTAIL · 30 m", + "Sentinel-2 and Landsat via HLS, 30 m, every 2–6 days": "Sentinel‑2 et Landsat via HLS, 30 m, tous les 2 Ă  6 jours", + "DAILY OVERVIEW · 250 m": "VUE QUOTIDIENNE · 250 m", + "VIIRS daily mosaic, 250 m, follows broad changes; little detail under 25 km": "MosaĂŻque quotidienne VIIRS, 250 m, suit les changements Ă  grande Ă©chelle ; peu de dĂ©tail sous 25 km", + "Sentinel-2": "Sentinel‑2", + "Sentinel-2 via HLS": "Sentinel‑2 via HLS", + "Landsat 8/9": "Landsat 8/9", + "Landsat 8/9 via HLS": "Landsat 8/9 via HLS", + "Daily overview": "Vue quotidienne", + "Box edges must be finite": "CoordonnĂ©es de la zone non valides", + "Longitudes must be within ±180°": "Les longitudes doivent ĂȘtre comprises entre −180° et +180°", + "Select one side of the dateline": "Ne traversez pas la ligne de changement de date", + "Box must enclose an area": "La zone doit dĂ©limiter une surface", + "Add the full Starlink broadband shell (thousands of extra points)": "Ajouter toute la constellation Starlink (des milliers de points en plus)", + "Loading the Starlink shell
": "Chargement de la constellation Starlink
", + "Starlink {detail} — click to retry": "Starlink {detail} — cliquer pour rĂ©essayer", + "load failed": "Ă©chec du chargement", + "Showing the full Starlink shell — click for the core catalog only": "Constellation Starlink complĂšte affichĂ©e — cliquer pour le catalogue de base seulement", + "DENSE ···": "DENSE ···", + "DENSE ✕": "DENSE ✕", + "DENSE": "DENSE", + "CelesTrak unreachable": "CelesTrak injoignable", + "DOCKED · {name} · +{extra}": "AMARRÉ · {name} · +{extra}", + "DOCKED · {name}": "AMARRÉ · {name}", + "{name} needs the Google 3D map: choose it under MAP SOURCE": "{name} nĂ©cessite la carte Google 3D : choisissez-la dans SOURCE CARTE", + "zoom in to a street to open {name}": "zoomez sur une rue pour ouvrir {name}", + "loading coverage...": "chargement de la couverture
", + "No street-level imagery within {radius} m of that point": "Aucune image au niveau de la rue Ă  moins de {radius} m de ce point", + "No street-level imagery within {radius} m of the view centre": "Aucune image au niveau de la rue Ă  moins de {radius} m du centre de la vue", + "Zoom in to see street-level coverage": "Zoomez pour voir la couverture au niveau de la rue", + "Point the camera at the ground for street-level coverage": "Orientez la camĂ©ra vers le sol pour voir la couverture au niveau de la rue", + "Coverage tile failed": "Échec de la tuile de couverture", + "The photo could not be loaded": "Impossible de charger la photo", + "{name} photo. ← and → step along the sequence. On a 360° photo, drag or use Shift+← →, ↑ ↓ to look around, and + − to zoom": "Photo {name}. ← et → parcourent la sĂ©quence. Sur une photo Ă  360°, faites glisser ou utilisez Shift+← →, ↑ ↓ pour regarder autour, et + − pour zoomer", + "{name} street-level photo": "Photo {name} au niveau de la rue", + "Previous photo in this sequence (←)": "Photo prĂ©cĂ©dente de la sĂ©quence (←)", + "Next photo in this sequence (→)": "Photo suivante de la sĂ©quence (→)", + "Aim the middle of the view at a street to look for imagery there": "Visez une rue avec le centre de la vue pour y chercher des images", + "KEY REJECTED": "CLÉ REFUSÉE", + "GOOGLE_MAPS_API_KEY is not set": "GOOGLE_MAPS_API_KEY n'est pas dĂ©finie", + "The Google Maps JavaScript API could not load": "Impossible de charger l'API Google Maps JavaScript", + "Google Street View": "Google Street View", + "GOOGLE STREET VIEW": "GOOGLE STREET VIEW", + "Google refused GOOGLE_MAPS_API_KEY for Street View — check that the Maps JavaScript API is enabled for it and this site is an allowed referrer": "Google a refusĂ© GOOGLE_MAPS_API_KEY pour Street View — vĂ©rifiez que l'API Maps JavaScript est activĂ©e pour cette clĂ© et que ce site figure parmi les rĂ©fĂ©rents autorisĂ©s", + "Street View did not answer — check the network, and that the Maps JavaScript API is enabled for GOOGLE_MAPS_API_KEY": "Street View n'a pas rĂ©pondu — vĂ©rifiez le rĂ©seau et que l'API Maps JavaScript est activĂ©e pour GOOGLE_MAPS_API_KEY", + "click a street to open Street View": "cliquez sur une rue pour ouvrir Street View", + "Street View has no imagery for this place": "Street View n'a pas d'images pour ce lieu", + "KartaView has no position for this photo": "KartaView n'a pas de position pour cette photo", + "The KartaView photo could not be loaded": "Impossible de charger la photo KartaView", + "zoom in to see KartaView coverage": "zoomez pour voir la couverture KartaView", + "no KartaView photos in view": "aucune photo KartaView dans la vue", + "KartaView is rate-limiting requests — they resume on their own": "KartaView limite les requĂȘtes — elles reprendront d'elles-mĂȘmes", + "KartaView’s photos here are archived and cannot be shown": "Les photos KartaView de cet endroit sont archivĂ©es et ne peuvent pas ĂȘtre affichĂ©es", + "KartaView did not filter this area in time — move the map to ask again": "KartaView n'a pas filtrĂ© cette zone Ă  temps — dĂ©placez la carte pour relancer la demande", + "None of KartaView’s photos here pass the imagery filter": "Aucune photo KartaView de cet endroit ne passe le filtre d'images", + "KartaView did not answer in time — try again": "KartaView n'a pas rĂ©pondu Ă  temps — rĂ©essayez", + "KartaView could not be reached — check the network": "KartaView est injoignable — vĂ©rifiez le rĂ©seau", + "KartaView sent an answer that could not be read": "KartaView a envoyĂ© une rĂ©ponse illisible", + "KartaView is rate-limiting requests": "KartaView limite les requĂȘtes", + "KartaView sent too much data": "KartaView a envoyĂ© trop de donnĂ©es", + "KartaView is rate-limiting requests — try again in a moment": "KartaView limite les requĂȘtes — rĂ©essayez dans un instant", + "KartaView has no such photo": "Cette photo n'existe pas sur KartaView", + "Mapillary rejected MAPILLARY_CLIENT_TOKEN — replace it in Provider Settings": "Mapillary a refusĂ© MAPILLARY_CLIENT_TOKEN — remplacez-le dans les paramĂštres des fournisseurs", + "Coverage requests are being rate-limited — they resume on their own": "Les requĂȘtes de couverture sont limitĂ©es — elles reprendront d'elles-mĂȘmes", + "The Panoramax photo could not be loaded": "Impossible de charger la photo Panoramax", + "Panoramax is busy — coverage resumes on its own": "Panoramax est saturĂ© — la couverture reprendra d'elle-mĂȘme", + "no Panoramax photos in view": "aucune photo Panoramax dans la vue", + "no Panoramax photos here match the filters": "aucune photo Panoramax de cet endroit ne correspond aux filtres", + "Panoramax sent a map tile that could not be read": "Panoramax a envoyĂ© une tuile de carte illisible", + "This Panoramax photo is no longer available": "Cette photo Panoramax n'est plus disponible", + "zoom in to see Panoramax coverage": "zoomez pour voir la couverture Panoramax", + "Panoramax did not answer in time — try again": "Panoramax n'a pas rĂ©pondu Ă  temps — rĂ©essayez", + "Panoramax could not be reached — check the connection": "Panoramax est injoignable — vĂ©rifiez la connexion", + "Panoramax sent too much data": "Panoramax a envoyĂ© trop de donnĂ©es", + "Panoramax is busy": "Panoramax est saturĂ©", + "Panoramax sent an unreadable answer": "Panoramax a envoyĂ© une rĂ©ponse illisible", + "Sequence images unavailable": "Images de la sĂ©quence indisponibles", + "No street-level imagery providers configured": "Aucun fournisseur d'images au niveau de la rue configurĂ©", + "(by upload date)": "(par date de mise en ligne)", + "Open the Street Level panel to view imagery": "Ouvrez le panneau Niveau rue pour voir les images", + "Image could not be opened": "Impossible d'ouvrir l'image", + "TeleGeography load failed": "Échec du chargement de TeleGeography", + "UNAVAILABLE · {source} · Roads unavailable": "INDISPONIBLE · {source} · Routes indisponibles", + "Roads: {source}": "Routes : {source}", + "TomTom roads unavailable while the traffic service is unreachable": "Routes TomTom indisponibles tant que le service de trafic est injoignable", + "Hybrid unavailable while the traffic service is unreachable": "Mode hybride indisponible tant que le service de trafic est injoignable", + "TomTom roads need a TomTom key": "Les routes TomTom nĂ©cessitent une clĂ© TomTom", + "Hybrid needs a TomTom key": "Le mode hybride nĂ©cessite une clĂ© TomTom", + "Local surface still loading": "Surface locale encore en chargement", + "Partial coverage": "Couverture partielle", + "Detailed roads unavailable": "Routes dĂ©taillĂ©es indisponibles", + "Reduced detail coverage": "Couverture moins dĂ©taillĂ©e", + "TomTom roads only, each with its live flow": "Routes TomTom seulement, chacune avec son flux en direct", + "TomTom roads only, each with its live flow (needs a TomTom key)": "Routes TomTom seulement, chacune avec son flux en direct (nĂ©cessite une clĂ© TomTom)", + "OpenStreetMap roads, with TomTom flow matched when available": "Routes OpenStreetMap, avec le flux TomTom associĂ© quand il est disponible", + "TomTom roads first; OpenStreetMap fills the rest, simulated": "Routes TomTom d'abord ; OpenStreetMap complĂšte le reste, en simulation", + "TomTom roads first; OpenStreetMap fills the rest, simulated (needs a TomTom key)": "Routes TomTom d'abord ; OpenStreetMap complĂšte le reste, en simulation (nĂ©cessite une clĂ© TomTom)", + "Hybrid": "Hybride", + "TomTom key unavailable": "ClĂ© TomTom indisponible", + "TomTom daily budget reached": "Quota quotidien TomTom atteint", + "TomTom upstream unreachable": "Serveur TomTom injoignable", + "TomTom flow unavailable": "Flux TomTom indisponible", + "SIMULATED — {reason}": "SIMULÉ — {reason}", + "Syncing flow · Roads: {source}": "Synchro du flux · Routes : {source}", + "LIVE · Roads: {source} · Roads without flow hidden": "DIRECT · Routes : {source} · Routes sans flux masquĂ©es", + "LIVE · Roads: {source} · No flow roads in view": "DIRECT · Routes : {source} · Aucune route avec flux dans la vue", + "LIVE · Roads: {source} · Flow {percent}%": "DIRECT · Routes : {source} · Flux {percent} %", + "SIMULATED · Roads: {source} · Flow {percent}%": "SIMULÉ · Routes : {source} · Flux {percent} %", + "STALE · Roads: {source} · Flow: cached TomTom tiles": "OBSOLÈTE · Routes : {source} · Flux : tuiles TomTom en cache", + "Syncing flow · Roads: OpenStreetMap · Flow: TomTom · Unmatched: simulated": "Synchro du flux · Routes : OpenStreetMap · Flux : TomTom · Non appariĂ©es : simulĂ©es", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov · Unmatched: simulated": "DIRECT · Routes : OpenStreetMap · Flux : TomTom · couv. {percent} % · Non appariĂ©es : simulĂ©es", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov": "DIRECT · Routes : OpenStreetMap · Flux : TomTom · couv. {percent} %", + "SIMULATED · Roads: OpenStreetMap · Flow: TomTom (no matches)": "SIMULÉ · Routes : OpenStreetMap · Flux : TomTom (aucune correspondance)", + "SIMULATED — traffic service unreachable": "SIMULÉ — service de trafic injoignable", + "SIMULATED — add TomTom key for live": "SIMULÉ — ajoutez une clĂ© TomTom pour le direct", + "OpenFreeMap tiles rate-limited": "Tuiles OpenFreeMap : limite de requĂȘtes atteinte", + "OpenFreeMap tiles timed out": "DĂ©lai dĂ©passĂ© pour les tuiles OpenFreeMap", + "OpenFreeMap tiles unavailable": "Tuiles OpenFreeMap indisponibles", + "occupancy|empty": "vide", + "occupancy|many seats available": "nombreuses places assises libres", + "occupancy|few seats available": "peu de places assises libres", + "occupancy|standing room only": "places debout seulement", + "occupancy|crushed standing room only": "bondĂ©, places debout seulement", + "occupancy|full": "complet", + "occupancy|not accepting passengers": "n'accepte pas de passagers", + "occupancy|not boardable": "embarquement impossible", + "Route {route}": "Ligne {route}", + "Vehicle {vehicle}": "VĂ©hicule {vehicle}", + "vehicle motion|Stopped": "À l'arrĂȘt", + "No recent fix": "Aucune position rĂ©cente", + "Waiting for update": "En attente de mise Ă  jour", + "Moving": "En mouvement", + "reported {speed} km/h": "vitesse signalĂ©e : {speed} km/h", + "reported hdg {heading}°": "cap signalé : {heading}°", + "Last report: stopped at stop {stop}": "Dernier signalement : Ă  l'arrĂȘt {stop}", + "Last report: arriving at stop {stop}": "Dernier signalement : arrivĂ©e Ă  l'arrĂȘt {stop}", + "Last report: next stop {stop}": "Dernier signalement : prochain arrĂȘt {stop}", + "Shown at street level · depth not in the feed": "AffichĂ© au niveau de la rue · profondeur absente du flux", + "Reported {seconds} s ago": "SignalĂ© il y a {seconds} s", + "Reported {minutes} min ago": "SignalĂ© il y a {minutes} min", + "shown {seconds} s behind": "affichĂ© avec {seconds} s de retard", + "{reported} (feed time)": "{reported} (heure du flux)", + "Available trail: {minutes} min (limited)": "Trace disponible : {minutes} min (limitĂ©e)", + "Available trail: {minutes} min": "Trace disponible : {minutes} min", + "Bus": "Bus", + "Tram": "Tramway", + "Subway": "MĂ©tro", + "Train": "Train", + "Ferry": "Ferry", + "Transit vehicle": "VĂ©hicule de transport en commun", + "AIS: {name}": "AIS : {name}", + "{type} SPD: {speed} HDG: {heading}": "{type} SPD : {speed} HDG : {heading}", + "VESSEL": "NAVIRE", + "{speed}KT": "{speed} ND", + "{heading}DEG": "{heading}°", + "POS: LIVE": "POS : DIRECT", + "POS: {time}Z": "POS : {time}Z", + "AIS live load failed": "Échec du chargement AIS en direct", + "awaiting first AIS position
": "en attente de la premiĂšre position AIS
", + "awaiting usable AIS positions
": "en attente de positions AIS exploitables
", + "awaiting first AIS message
": "en attente du premier message AIS
", + "AISSTREAM_API_KEY not set": "AISSTREAM_API_KEY non dĂ©finie", + "live feed unsupported": "flux en direct non pris en charge", + "connecting to feed
": "connexion au flux
", + "feed disconnected": "flux dĂ©connectĂ©", + "feed down": "flux hors service", + "feed idle": "flux inactif", + "API key rejected — check AISSTREAM_API_KEY": "ClĂ© API refusĂ©e — vĂ©rifiez AISSTREAM_API_KEY", + "feed silent {seconds}s — no AIS data": "flux muet depuis {seconds} s — aucune donnĂ©e AIS", + "feed silent — no AIS data": "flux muet — aucune donnĂ©e AIS", + "feed down — retrying slowly (attempt {attempt})": "flux hors service — nouvel essai espacĂ© (tentative {attempt})", + "reconnecting to feed
 (attempt {attempt})": "reconnexion au flux
 (tentative {attempt})", + "feed down — retrying slowly": "flux hors service — nouvel essai espacĂ©", + "reconnecting to feed
": "reconnexion au flux
", + "Focus vessel {name}, MMSI {mmsi}": "Centrer sur le navire {name}, MMSI {mmsi}", + "Hidden by this map source · choose a globe map": "MasquĂ© avec cette source de carte · choisissez une carte du globe", + "Weather image HTTP {status}": "Image mĂ©tĂ©o : HTTP {status}", + "Weather HTTP {status}": "MĂ©tĂ©o : HTTP {status}", + "Frame unavailable; previous observation retained": "Image indisponible ; prĂ©cĂ©dente conservĂ©e", + "Weather imagery unavailable": "Imagerie mĂ©tĂ©o indisponible", + "Weather source unavailable; previous observation retained": "Source mĂ©tĂ©o indisponible ; observation prĂ©cĂ©dente conservĂ©e", + "Weather unavailable": "MĂ©tĂ©o indisponible", + "No frame within {gap} min of {time}": "Aucune image Ă  ±{gap} min de {time}", + "No frame within {gap} h of {time}": "Aucune image Ă  ±{gap} h de {time}", + "{hours}h {minutes}m ago": "il y a {hours} h {minutes} min", + "{minutes}m ago": "il y a {minutes} min", + "{state} · {time} · {lag}": "{state} · {time} · {lag}", + "Observed": "ObservĂ©", + "History": "Historique", + "Observation unavailable": "Observation indisponible", + "Waiting for observation": "En attente d'observation", + "{detail} · synced": "{detail} · synchro", + "{detail} · nearest": "{detail} · plus proche", + "RADAR REFLECTIVITY · dBZ": "RÉFLECTIVITÉ RADAR · dBZ", + "LIGHTNING DENSITY · 15 min accumulation": "DENSITÉ DE FOUDRE · cumul sur 15 min", + "GLOBAL INFRARED · hourly": "INFRAROUGE MONDIAL · horaire", + "GOES INFRARED · ~5 min": "INFRAROUGE GOES · ~5 min", + "{state}: {time}": "{state} : {time}", + "Latest observation": "DerniĂšre observation", + "frame {index}/{total}": "image {index}/{total}", + "loading": "chargement", + "Observation: unavailable": "Observation : indisponible", + "Contiguous US · gaps ≠ no rain": "États-Unis contigus · lacunes ≠ absence de pluie", + "Americas + Pacific · not individual strikes": "AmĂ©riques + Pacifique · pas des impacts individuels", + "Color: strikes/kmÂČ/min ×10Âł": "Couleur : impacts/kmÂČ/min ×10Âł", + "60°S–60°N · typically 2–3 h delayed": "60°S–60°N · retard habituel de 2 Ă  3 h", + "North America · infrared imagery": "AmĂ©rique du Nord · imagerie infrarouge", + "Reduced motion · history playback unavailable": "Animations rĂ©duites · lecture de l'historique indisponible", + "Reduced motion · manual history available": "Animations rĂ©duites · historique parcourable manuellement", + "Rain radar · US": "Radar de pluie · États-Unis", + "Lightning density · 15 min": "DensitĂ© de foudre · 15 min", + "Satellite clouds": "Nuages par satellite", + "Americas + Pacific": "AmĂ©riques + Pacifique", + "Global · 60°S–60°N": "Monde · 60°S–60°N", + "North America": "AmĂ©rique du Nord", + "Source observations delayed": "Observations de la source en retard", + "Stale source": "Source obsolĂšte", + "Loading next frame
": "Chargement de l'image suivante
", + "Map center outside coverage": "Centre de la carte hors couverture", + "strikes/kmÂČ/min ×10Âł": "impacts/kmÂČ/min ×10Âł", + "N. America": "Am. du Nord", + "Global": "Monde", + "Hourly global mosaic; usually 2–3 hours delayed": "MosaĂŻque mondiale horaire ; retard habituel de 2 Ă  3 heures", + "GOES regional clouds; approximately 5-minute updates": "Nuages rĂ©gionaux GOES ; mise Ă  jour toutes les 5 minutes environ", + "Clouds only": "Nuages seuls", + "Apply the full cloud brightness key; 100% filter strength": "Appliquer pleinement le filtre de luminositĂ© des nuages ; intensitĂ© du filtre 100 %", + "Full": "ComplĂšte", + "Show the complete infrared image; 0% filter strength": "Afficher l'image infrarouge complĂšte ; intensitĂ© du filtre 0 %", + "Soft": "Faible", + "Vivid": "Forte", + "Image opacity; does not alter the observed values": "OpacitĂ© de l'image ; ne modifie pas les valeurs observĂ©es", + "View US radar": "Voir le radar des États-Unis", + "View Americas & Pacific": "Voir les AmĂ©riques et le Pacifique", + "View coverage": "Voir la couverture", + "{value} strikes/kmÂČ/min ×10Âł (15-minute density)": "{value} impacts/kmÂČ/min ×10Âł (densitĂ© sur 15 minutes)", + "{value} dBZ radar reflectivity": "{value} dBZ de rĂ©flectivitĂ© radar", + "STALE · cached source metadata": "OBSOLÈTE · mĂ©tadonnĂ©es de la source en cache", + "Map center is outside source coverage": "Le centre de la carte est hors de la couverture de la source", + "NOAA/NWS 15-minute lightning density derived from Vaisala NLDN/GLD360. Coverage 110°E across the Pacific/Americas to 0°, 25°S–80°N. Not a live strike count, global coverage or a safety warning.": "DensitĂ© de foudre sur 15 minutes de NOAA/NWS, dĂ©rivĂ©e de Vaisala NLDN/GLD360. Couverture de 110°E Ă  0° Ă  travers le Pacifique et les AmĂ©riques, 25°S–80°N. Ce n'est ni un dĂ©compte d'impacts en direct, ni une couverture mondiale, ni une alerte de sĂ©curitĂ©.", + "NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "Les Ă©chos radar NOAA MRMS indiquent la structure des prĂ©cipitations, pas l'intensitĂ© de la pluie, une alerte d'orage ou une prĂ©vision. RĂ©solution native d'environ 1 km ; l'affichage est limitĂ© au niveau 6. Les images utilisent les heures d'observation exactes publiĂ©es.", + "GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "Infrarouge grandes longueurs d'onde GOES-19/18, bande 14, rĂ©gional ; mosaĂŻque mondiale grandes longueurs d'onde NESDIS. « Nuages seuls » assombrit tout sauf les sommets nuageux brillants et froids ; c'est un filtre de luminositĂ©, pas un masque de nuages. La couverture et la fraĂźcheur varient selon la rĂ©gion.", + "REGION": "RÉGION", + "IMAGE": "IMAGE", + "FILTER": "FILTRE", + "Cloud filter strength": "IntensitĂ© du filtre de nuages", + "OPACITY": "OPACITÉ", + "Infrared decode failed": "Échec du dĂ©codage infrarouge", + "Weather prefetch unavailable": "PrĂ©chargement mĂ©tĂ©o indisponible", + "Weather tiles unavailable · previous frame retained": "Tuiles indisp. · image prĂ©cĂ©dente conservĂ©e", + "Some weather tiles unavailable": "Certaines tuiles mĂ©tĂ©o indisponibles", + "Malformed weather manifest": "Manifeste mĂ©tĂ©o mal formĂ©", + "Weather request timed out": "DĂ©lai dĂ©passĂ© pour la requĂȘte mĂ©tĂ©o", + "Temperature field unavailable": "Champ de tempĂ©rature indisponible", + "Mean sea level pressure field unavailable": "Champ de pression au niveau de la mer indisponible", + "Wind upstream unavailable": "Source amont du vent indisponible", + "{source} HTTP {status}": "{source} : HTTP {status}", + "Wind": "Vent", + "Wind source unavailable": "Source du vent indisponible", + "Forecast · does not follow history": "PrĂ©vision · ne suit pas l'historique", + "Wind motion": "Mouvement du vent", + "Wind speed": "Vitesse du vent", + "Sea-level pressure": "Pression au niveau de la mer", + "Air temperature · 2 m": "TempĂ©rature de l'air · 2 m", + "Global · 1° grid": "Monde · grille de 1°", + "{model} forecast · {time}": "PrĂ©vision {model} · {time}", + "Loading forecast": "Chargement de la prĂ©vision", + "Preparing flow": "PrĂ©paration du flux", + "Selected field unavailable": "Champ sĂ©lectionnĂ© indisponible", + "Cached forecast · stale": "PrĂ©vision en cache · obsolĂšte", + "ECMWF IFS surface forecast": "PrĂ©vision de surface ECMWF IFS", + "NOAA GFS surface forecast": "PrĂ©vision de surface NOAA GFS", + "Reduced motion": "Animations rĂ©duites", + "Resume": "Reprendre", + "Pause": "Pause", + "Pause visual flow; forecast time does not advance with animation": "Mettre en pause le flux visuel ; l'heure de prĂ©vision n'avance pas avec l'animation", + "None": "Aucun", + "Speed": "Vitesse", + "Pressure": "Pression", + "Temperature": "TempĂ©rature", + "Wind trails with no field shading": "TraĂźnĂ©es de vent sans coloration du champ", + "How hard the surface wind is blowing": "Force du vent en surface", + "Sea-level air pressure: broad highs and lows": "Pression de l'air au niveau de la mer : grands anticyclones et dĂ©pressions", + "Air temperature two meters above the surface": "TempĂ©rature de l'air Ă  deux mĂštres au-dessus de la surface", + "Wind speed units": "UnitĂ©s de vitesse du vent", + "Read wind at map center": "Lire le vent au centre de la carte", + "Read the forecast at the center of the map without changing selection": "Lire la prĂ©vision au centre de la carte sans changer la sĂ©lection", + "{model} forecast · {field} ({unit})": "PrĂ©vision {model} · {field} ({unit})", + "Valid: {time}": "Valide : {time}", + "preparing": "prĂ©paration", + "Issued: {time}": "Émise : {time}", + "Selected field unavailable · wind remains visible": "Champ sĂ©lectionnĂ© indisponible · le vent reste visible", + "{error} · wind remains visible": "{error} · le vent reste visible", + "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "Vent de surface Ă  10 m. Grille mondiale d'environ 1°. Les courbes suivent le champ de vent Ă  10 m, surĂ©levĂ©es de 12 km pour rester visibles ; la hauteur affichĂ©e n'est pas une altitude mĂ©tĂ©orologique. L'Ă©clairage de la vue sert Ă  la lisibilitĂ©. L'animation montre l'Ă©coulement d'une seule prĂ©vision fixe ; elle ne fait pas avancer le temps. Les champs colorĂ©s recouvrent le fond de carte du globe ou les 3D Tiles photorĂ©alistes actives.", + "MODEL": "MODÈLE", + "FIELD": "CHAMP", + "UNITS": "UNITÉS", + "MOTION": "ANIMATION", + "Forecast": "PrĂ©vision", + "N": "N", + "NNE": "NNE", + "NE": "NE", + "ENE": "ENE", + "E": "E", + "ESE": "ESE", + "SE": "SE", + "SSE": "SSE", + "S": "S", + "SSW": "SSO", + "SW": "SO", + "WSW": "OSO", + "W": "O", + "WNW": "ONO", + "NW": "NO", + "NNW": "NNO", + "No surface reading": "Aucune valeur en surface", + "Aim the map center at Earth": "Visez la Terre avec le centre de la carte", + "A location reading needs a loaded forecast and the Earth at the center of the view.": "Une lecture ponctuelle nĂ©cessite une prĂ©vision chargĂ©e et la Terre au centre de la vue.", + "Interpolated model forecast on an approximately 1° grid. Broad weather patterns, not a street-level measurement.": "PrĂ©vision de modĂšle interpolĂ©e sur une grille d'environ 1°. Tendances mĂ©tĂ©o gĂ©nĂ©rales, pas une mesure Ă  l'Ă©chelle de la rue.", + " · calm": " · calme", + " from {direction}": " · secteur {direction}", + "WIND AT {coordinates}": "VENT À {coordinates}", + "{model} · valid {time}": "{model} · valide {time}", + "Wind speed field unavailable": "Champ de vitesse du vent indisponible", + "Globe imagery unavailable": "Imagerie du globe indisponible", + "Globe field image unavailable": "Image du champ sur le globe indisponible", + "Unknown wind model": "ModĂšle de vent inconnu", + "Unknown weather overlay": "Surcouche mĂ©tĂ©o inconnue", + "Wind request timed out": "DĂ©lai dĂ©passĂ© pour la requĂȘte de vent", + "Malformed wind manifest": "Manifeste du vent mal formĂ©", + "Malformed wind grid": "Grille du vent mal formĂ©e", + "Error: {message}": "Erreur : {message}", + "Needs {envVars} — add it in Provider Settings": "NĂ©cessite {envVars} — Ă  ajouter dans les paramĂštres des fournisseurs", + "{label} is unavailable": "{label} est indisponible", + "This map stack": "Ce fond de carte", + "{label} unavailable: {hint}": "{label} indisponible : {hint}", + "Google 3D tiles unavailable — check the key's API restrictions, quota, or network": "Tuiles Google 3D indisponibles — vĂ©rifiez les restrictions d'API de la clĂ©, le quota ou le rĂ©seau", + "Needs {envVars} — add it in Provider Settings — or a Cesium ion token for the ion-hosted route": "NĂ©cessite {envVars} — Ă  ajouter dans les paramĂštres des fournisseurs — ou un jeton Cesium ion pour la variante hĂ©bergĂ©e par ion", + "Exit cockpit to fly to a camera": "Quittez le cockpit pour rejoindre une camĂ©ra", + "Exit cockpit to fly to a location": "Quittez le cockpit pour rejoindre un lieu", + "Exit cockpit to fly to a photo": "Quittez le cockpit pour rejoindre une photo", + "Exit cockpit to fly to a shared view": "Quittez le cockpit pour rejoindre une vue partagĂ©e", + "Exit cockpit to fly to a target": "Quittez le cockpit pour rejoindre une cible", + "Exit cockpit to fly to a vessel": "Quittez le cockpit pour rejoindre un navire", + "Exit cockpit to fly to a fire": "Quittez le cockpit pour rejoindre un incendie", + "Exit cockpit to fly to a route": "Quittez le cockpit pour rejoindre un itinĂ©raire", + "Exit cockpit to fly to a file": "Quittez le cockpit pour rejoindre un fichier", + "Exit cockpit to fly to a scene": "Quittez le cockpit pour rejoindre une scĂšne", + "Exit cockpit to view weather coverage": "Quittez le cockpit pour voir la couverture mĂ©tĂ©o", + "Exit cockpit to fly to a cyclone": "Quittez le cockpit pour rejoindre un cyclone", + "Exit cockpit to fly to an aircraft": "Quittez le cockpit pour rejoindre un aĂ©ronef", + "Exit cockpit to fly to a satellite": "Quittez le cockpit pour rejoindre un satellite", + "Exit cockpit to frame contacts": "Quittez le cockpit pour cadrer les contacts", + "Visible map targets": "Cibles visibles sur la carte", + "Focusing {label}": "Centrage sur {label}", + "Source": "Source", + "Camera ownership changed": "Le contrĂŽle de la camĂ©ra a changĂ©", + "Saved project could not be read; storage preserved. Import a valid file to resume saving.": "Le projet enregistrĂ© est illisible ; le stockage est conservĂ©. Importez un fichier valide pour reprendre l'enregistrement.", + "Ready": "PrĂȘt", + "Scene layer turned off": "Couche de la scĂšne dĂ©sactivĂ©e", + "Stopped": "ArrĂȘtĂ©", + "Scene not saved — existing saved project could not be read. Export edits or import a valid file.": "ScĂšne non enregistrĂ©e — le projet enregistrĂ© est illisible. Exportez vos modifications ou importez un fichier valide.", + "Scene not saved — {reason}": "ScĂšne non enregistrĂ©e — {reason}", + "Scene not saved — browser storage unavailable": "ScĂšne non enregistrĂ©e — stockage du navigateur indisponible", + "Loaded: {scene} / {shot}": "Chargé : {scene} / {shot}", + "Cannot update {scene}: shot inventory changed": "Impossible de mettre Ă  jour {scene} : la liste des plans a changĂ©", + "Cannot update {scene}: evidence beats changed": "Impossible de mettre Ă  jour {scene} : les Ă©tapes de preuve ont changĂ©", + "Cannot update {scene}: shot bindings are incomplete": "Impossible de mettre Ă  jour {scene} : les liaisons des plans sont incomplĂštes", + "Updated {count} shots: {scene}": { + "one": "{count} plan mis Ă  jour : {scene}", + "many": "{count} de plans mis Ă  jour : {scene}", + "other": "{count} plans mis Ă  jour : {scene}" + }, + "Appended {count} shots: {scene}": { + "one": "{count} plan ajouté : {scene}", + "many": "{count} de plans ajoutĂ©s : {scene}", + "other": "{count} plans ajoutĂ©s : {scene}" + }, + "Cannot capture shot: camera not ready": "Capture impossible : camĂ©ra non prĂȘte", + "Captured: {scene} / {shot}": "Capturé : {scene} / {shot}", + "Select a shot first": "SĂ©lectionnez d'abord un plan", + "Updated: {scene} / {shot}": "Mis Ă  jour : {scene} / {shot}", + "Could not leave scene: {scene}": "Impossible de quitter la scĂšne : {scene}", + "Seeked: {scene} / {shot}": "Position atteinte : {scene} / {shot}", + "Seeking scene clock": "DĂ©placement dans l'horloge de la scĂšne", + "Camera unavailable — exit cockpit first": "CamĂ©ra indisponible — quittez d'abord le cockpit", + "No shots to run": "Aucun plan Ă  lancer", + "Scene transition limit reached — load a shot to reset": "Limite de transitions de scĂšne atteinte — chargez un plan pour rĂ©initialiser", + "Export failed: {error}": "Échec de l'exportation : {error}", + "Project exported": "Projet exportĂ©", + "Importing project": "Importation du projet", + "Imported {file}": "Importé : {file}", + "Import failed: {error}": "Échec de l'importation : {error}", + "Import failed (could not read JSON file)": "Échec de l'importation (fichier JSON illisible)", + "Layers refused: {layers}": "Couches refusĂ©es : {layers}", + "Could not exit {mode} — scene layers may be refused": "Impossible de quitter {mode} — les couches de la scĂšne peuvent ĂȘtre refusĂ©es", + "Camera move interrupted": "Mouvement de camĂ©ra interrompu", + "Scene media timed out": "DĂ©lai dĂ©passĂ© pour les mĂ©dias de la scĂšne", + "Action complete": "Action terminĂ©e", + "Action unavailable or cancelled": "Action indisponible ou annulĂ©e", + "Scene actions": "Actions de la scĂšne", + "Select a feature or use Tab and Enter to choose an action.": "SĂ©lectionnez un Ă©lĂ©ment ou utilisez Tab et Enter pour choisir une action.", + "Selected feature: {feature}. Choose an action.": "ÉlĂ©ment sĂ©lectionné : {feature}. Choisissez une action.", + "Running {index}/{total}: {scene} / {shot}": "ExĂ©cution {index}/{total} : {scene} / {shot}", + "Scene run complete": "ScĂšne terminĂ©e", + "Bhote Koshi Evidence Sequence": "SĂ©quence de preuves de la Bhote Koshi", + "Nepal Flood Incident": "Crue au NĂ©pal", + "Global Flights Radar": "Radar mondial des vols", + "Orbital Watch": "Veille orbitale", + "Thermal Threat Board": "Tableau des menaces thermiques", + "City Overload": "Surcharge urbaine", + "Omniscience Pullback": "Recul omniscient", + "Global Incident Context": "Contexte global de l'incident", + "Nepal-Focused Globe Rotation": "Rotation du globe vers le NĂ©pal", + "Bhote Koshi Regional Approach": "Approche rĂ©gionale de la Bhote Koshi", + "Bhote Koshi Nearby Cities": "Villes proches de la Bhote Koshi", + "Bhote Koshi Incident Corridor": "Corridor de l'incident de la Bhote Koshi", + "Bhote Koshi Flood Path": "TracĂ© de la crue de la Bhote Koshi", + "Bhote Koshi Corridor Overview": "Vue d'ensemble du corridor de la Bhote Koshi", + "Bhote Koshi Upper Valley": "Haute vallĂ©e de la Bhote Koshi", + "Upper Valley Collapse": "Effondrement dans la haute vallĂ©e", + "Debris-Dammed Lake": "Lac de barrage formĂ© par les dĂ©bris", + "Nepal-China Border Gate": "Poste frontiĂšre NĂ©pal-Chine", + "Timure Evidence Cluster": "Groupe de preuves de Timure", + "Syabru Besi Passage": "Passage Ă  Syabru Besi", + "Bidur / Trishuli Consequence": "ConsĂ©quences Ă  Bidur / Trishuli", + "Final view": "Vue finale", + "Scene {n}": "ScĂšne {n}", + "Shot {n}": "Plan {n}", + "the title of scene {scene} is empty or longer than {max} characters": "le titre de la scĂšne {scene} est vide ou dĂ©passe {max} caractĂšres", + "the title of shot {shot} in scene {scene} is empty or longer than {max} characters": "le titre du plan {shot} de la scĂšne {scene} est vide ou dĂ©passe {max} caractĂšres", + "the project is larger than 5 MiB": "le projet dĂ©passe 5 Mio", + "the project has too many shots": "le projet contient trop de plans", + "the scene data failed validation": "les donnĂ©es de la scĂšne n'ont pas passĂ© la validation", + "Could not complete this action. Check the file, references and selected assets.": "Impossible de terminer cette action. VĂ©rifiez le fichier, les rĂ©fĂ©rences et les ressources sĂ©lectionnĂ©es.", + "{count} scenes": { + "one": "{count} scĂšne", + "many": "{count} de scĂšnes", + "other": "{count} scĂšnes" + }, + "{count} shots": { + "one": "{count} plan", + "many": "{count} de plans", + "other": "{count} plans" + }, + "{count} data packs": { + "one": "{count} paquet de donnĂ©es", + "many": "{count} de paquets de donnĂ©es", + "other": "{count} paquets de donnĂ©es" + }, + "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}": "{scene} / {pack} : {status}. Fichier : {path}. {attribution} · {license}", + "Unavailable layers: {layers}": "Couches indisponibles : {layers}", + "Uses registered content or linked media. Those external files are not included in a scene bundle. Their original notices still apply.": "Utilise du contenu enregistrĂ© ou des mĂ©dias liĂ©s. Ces fichiers externes ne sont pas inclus dans une archive de scĂšne. Leurs mentions d'origine restent applicables.", + "{bytes} bundled bytes verified. Files stay in memory for this session. Reimport the bundle after reloading the app.": "{bytes} octets de l'archive vĂ©rifiĂ©s. Les fichiers restent en mĂ©moire pour cette session. RĂ©importez l'archive aprĂšs avoir rechargĂ© l'application.", + "Review scene import": "VĂ©rifier l'importation de scĂšne", + "Nothing is loaded or changed until you apply this file.": "Rien n'est chargĂ© ni modifiĂ© tant que vous n'appliquez pas ce fichier.", + "Ready to import": "PrĂȘt Ă  importer", + "Apply replaces the current project. Export your current project first if you want to keep both.": "L'importation remplacera le projet actuel. Exportez d'abord votre projet actuel si vous voulez garder les deux.", + "Apply import": "Appliquer l'importation", + "Import was not applied. The current project may have changed.": "L'importation n'a pas Ă©tĂ© appliquĂ©e. Le projet actuel a peut-ĂȘtre changĂ©.", + "Select a scene and shot first": "SĂ©lectionnez d'abord une scĂšne et un plan", + "Edit scene details": "Modifier les dĂ©tails de la scĂšne", + "Camera positions use degrees and meters above the ellipsoid. Drafts are validated before they replace your saved scene.": "Les positions de camĂ©ra sont en degrĂ©s et en mĂštres au-dessus de l'ellipsoĂŻde. Les brouillons sont validĂ©s avant de remplacer votre scĂšne enregistrĂ©e.", + "Anchors and data packs": "Ancres et paquets de donnĂ©es", + "Shot camera, timing, packs and actions": "CamĂ©ra, minutage, paquets et actions du plan", + "New anchor ID": "ID de la nouvelle ancre", + "Capture camera as anchor": "CrĂ©er une ancre Ă  la position de la camĂ©ra", + "Anchor added to draft": "Ancre ajoutĂ©e au brouillon", + "Set move start to current camera": "Utiliser la vue actuelle comme dĂ©part du mouvement", + "Move added to draft; destination remains the shot camera": "Mouvement ajoutĂ© au brouillon ; la destination reste la camĂ©ra du plan", + "Use ordinary flight": "Utiliser un vol normal", + "Invalid shot JSON": "JSON de plan non valide", + "Apply details": "Appliquer les dĂ©tails", + "Select a scene first": "SĂ©lectionnez d'abord une scĂšne", + "Share selected scene": "Partager la scĂšne sĂ©lectionnĂ©e", + "Scene JSON preserves authored settings and attribution. It does not include asset files. Bundles include only pack files you choose here or previously imported bundle files.": "Le JSON de scĂšne conserve les rĂ©glages de l'auteur et l'attribution. Il n'inclut pas les fichiers de ressources. Les archives n'incluent que les fichiers de paquets choisis ici ou ceux d'archives dĂ©jĂ  importĂ©es.", + "Download scene JSON": "TĂ©lĂ©charger le JSON de scĂšne", + "Choose data-pack files": "Choisir des fichiers de paquet de donnĂ©es", + "Or choose a data-pack folder": "Ou choisir un dossier de paquet de donnĂ©es", + "Download asset bundle": "TĂ©lĂ©charger l'archive de ressources", + "Asset bundle downloaded": "Archive de ressources tĂ©lĂ©chargĂ©e", + "No RTL-SDR device selected": "Aucun appareil RTL-SDR sĂ©lectionnĂ©", + "WebUSB requires desktop Chrome or Edge on localhost/HTTPS": "WebUSB nĂ©cessite Chrome ou Edge sur ordinateur, en localhost/HTTPS", + "RTL-SDR access failed; close other SDR apps and check USB permissions": "AccĂšs au RTL-SDR impossible ; fermez les autres applications SDR et vĂ©rifiez les autorisations USB", + "RTL-SDR connection failed": "Échec de la connexion au RTL-SDR", + "Receiving 1090 MHz ADS-B": "RĂ©ception ADS-B sur 1090 MHz", + "Receiving broadcast FM": "RĂ©ception de la radio FM", + "Connect an RTL-SDR to begin.": "Connectez un RTL-SDR pour commencer.", + "WebUSB is unavailable in this browser": "WebUSB n'est pas disponible dans ce navigateur", + "USB work abandoned after a stalled transfer": "OpĂ©ration USB abandonnĂ©e aprĂšs un transfert bloquĂ©", + "SDR decoder worker failed": "Échec du processus du dĂ©codeur SDR", + "SDR decoder did not start; receiver stopped": "Le dĂ©codeur SDR n'a pas dĂ©marré ; rĂ©cepteur arrĂȘtĂ©", + "SDR decoder stopped responding; receiver stopped": "Le dĂ©codeur SDR ne rĂ©pond plus ; rĂ©cepteur arrĂȘtĂ©", + "SDR decoder fell behind; receiver stopped": "Le dĂ©codeur SDR a pris du retard ; rĂ©cepteur arrĂȘtĂ©", + "WebUSB requires desktop Chrome or Edge": "WebUSB nĂ©cessite Chrome ou Edge sur ordinateur", + "Waiting for an RTL-SDR device
": "En attente d'un appareil RTL-SDR
", + "Browser audio is suspended; press Connect again to resume it": "L'audio du navigateur est suspendu ; appuyez Ă  nouveau sur Connecter pour le reprendre", + "RTL-SDR sample stream stopped": "Flux d'Ă©chantillons RTL-SDR arrĂȘtĂ©", + "Switching to {mode}
": "Passage en {mode}
", + "Browser audio is suspended; select FM again to resume it": "L'audio du navigateur est suspendu ; sĂ©lectionnez Ă  nouveau FM pour le reprendre", + "RTL-SDR gain change failed": "Échec du changement de gain du RTL-SDR", + "Tuned to {mhz} MHz FM": "RĂ©glĂ© sur {mhz} MHz FM", + "Seeking up
": "Recherche vers le haut
", + "Seeking down
": "Recherche vers le bas
", + "Seek stopped": "Recherche arrĂȘtĂ©e", + "Scanning {mhz} MHz
": "Balayage de {mhz} MHz
", + "Found {mhz} MHz · {snr} dB": "TrouvĂ© {mhz} MHz · {snr} dB", + "FM signal found at {mhz} MHz": "Signal FM trouvĂ© sur {mhz} MHz", + "No FM signal found": "Aucun signal FM trouvĂ©", + "Browser location is unavailable": "La position du navigateur est indisponible", + "Receiver location was not granted": "L'accĂšs Ă  la position du rĂ©cepteur n'a pas Ă©tĂ© accordĂ©", + "RTL-SDR disconnected": "RTL-SDR dĂ©connectĂ©", + "Upstream response too large": "RĂ©ponse du serveur amont trop volumineuse", + "Vector tile request timed out": "DĂ©lai dĂ©passĂ© pour les tuiles vectorielles", + "Vector tiles unavailable": "Tuiles vectorielles indisponibles", + "Vector tile metadata unavailable": "MĂ©tadonnĂ©es des tuiles vectorielles indisponibles", + "Zoom in for vector tile coverage": "Zoomez pour charger les tuiles vectorielles", + "Saturation": "Saturation", + "Edge Thickness": "Épaisseur des contours", + "Contrast": "Contraste", + "Grain": "Grain", + "Vignette": "Vignettage", + "Pixelation": "Pixellisation", + "Distortion": "Distorsion", + "Instability": "InstabilitĂ©", + "Density": "DensitĂ©", + "Gain": "Gain", + "Bloom": "Bloom", + "Scanlines": "Lignes de balayage", + "Sensitivity": "SensibilitĂ©", + "WHOT/BHOT": "WHOT/BHOT", + "Ironbow": "Ironbow", + "unsaved CCTV calibration": "la calibration CCTV non enregistrĂ©e", + "the open cockpit": "le cockpit ouvert", + "Switching language reloads the page. This will be lost: {items}. Switch anyway?": "Changer de langue recharge la page. Ceci sera perdu : {items}. Changer quand mĂȘme ?", + "VISUAL PRESETS": "PRÉRÉGLAGES VISUELS", + "LOCATION": "LIEU", + "CONTACTS — nearest planes · vessels · sites": "CONTACTS — avions, navires et sites les plus proches", + "SPACE MISSIONS — launches & orbital assets": "MISSIONS SPATIALES — lancements et objets orbitaux", + "LIVE SIGNALS": "SIGNAUX EN DIRECT", + "Contacts could not complete the requested transition; try again": "Les contacts n'ont pas pu effectuer la transition demandĂ©e ; rĂ©essayez", + "CCTV layer unavailable": "Couche CCTV indisponible", + "Link shared": "Lien partagĂ©", + "Link copied!": "Lien copié !", + "Copy failed": "Échec de la copie", + "Return map to straight-down view": "Remettre la carte en vue verticale", + "Tilt map to oblique view": "Incliner la carte en vue oblique", + "Reset map to north up. Current heading {heading} degrees": "RĂ©orienter la carte nord en haut. Orientation actuelle : {heading} degrĂ©s", + "Tilted view": "Vue inclinĂ©e", + "Straight-down view": "Vue verticale", + "North up": "Nord en haut", + "CCTV calibration saved": "Calibration CCTV enregistrĂ©e", + "HDG": "HDG", + "PITCH": "INCL.", + "FOV": "FOV", + "RANGE": "PORTÉE", + "HGT": "HAUT.", + "ΔN": "ΔN", + "ΔE": "ΔE", + "{value}m": "{value} m", + "CCTV calibration reset": "Calibration CCTV rĂ©initialisĂ©e", + "ADJUST ON": "AJUSTER ON", + "ADJUST": "AJUSTER", + "SNAPSHOT": "INSTANTANÉ", + "LIVE": "DIRECT", + "UPSTREAM": "AMONT", + "SYNTHETIC": "SYNTHÉTIQUE", + "CONFIGURED": "CONFIGURÉ", + "SEED": "CATALOGUE", + "UNKNOWN": "INCONNU", + "OK": "OK", + "ERROR": "ERREUR", + "Live HLS connected": "HLS en direct connectĂ©", + "Live HLS unavailable": "HLS en direct indisponible", + "No stream URL configured": "Aucune URL de flux configurĂ©e", + "Live stream connected": "Flux en direct connectĂ©", + "Snapshot feed connected": "Flux d'instantanĂ©s connectĂ©", + "Media fetch failed": "Échec de la rĂ©cupĂ©ration du mĂ©dia", + "Upstream snapshot active": "InstantanĂ© amont actif", + "Fallback Street View frame": "Image Street View de secours", + "Upstream unavailable": "Source amont indisponible", + "No source configured": "Aucune source configurĂ©e", + "Configured source": "Source configurĂ©e", + "Configured Source": "Source configurĂ©e", + "Synthetic fallback": "Secours synthĂ©tique", + "Upstream HTTP {status}": "Source amont : HTTP {status}", + "Unexpected media type {type}": "Type de mĂ©dia inattendu : {type}", + "SOURCE · UNKNOWN": "SOURCE · INCONNUE", + "FRAME · LOADING": "IMAGE · CHARGEMENT", + "FRAME · UNAVAILABLE": "IMAGE · INDISPONIBLE", + "CALIBRATED": "CALIBRÉE", + "CURATED": "VÉRIFIÉE", + "RAW PRIOR": "ESTIM. INITIALE", + "CCTV ON": "CCTV ON", + "CCTV OFF": "CCTV OFF", + "VIEWSHED ON": "ZONE VISIBLE ON", + "COVERAGE ON": "COUVERTURE ON", + "COVERAGE OFF": "COUVERTURE OFF", + "AUTO HOP ON": "SAUT AUTO ON", + "AUTO HOP OFF": "SAUT AUTO OFF", + "PROJECTION ON": "PROJECTION ON", + "PROJECTION OFF": "PROJECTION OFF", + "CAL · EDITED (UNSAVED)": "CAL · MODIFIÉE (NON ENREGISTRÉE)", + "CAL · {badge}": "CAL · {badge}", + "MONITOR": "MONITEUR", + "OFF": "OFF", + "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · PORTÉE {range} m · {projection}{calBadge} · {provider}{status}", + "{count} cameras loaded · click a camera to activate": { + "one": "{count} camĂ©ra chargĂ©e · cliquer sur une camĂ©ra pour l'activer", + "many": "{count} de camĂ©ras chargĂ©es · cliquer sur une camĂ©ra pour l'activer", + "other": "{count} camĂ©ras chargĂ©es · cliquer sur une camĂ©ra pour l'activer" + }, + "{count} cameras loaded · enable CCTV to activate": { + "one": "{count} camĂ©ra chargĂ©e · activer CCTV pour l'utiliser", + "many": "{count} de camĂ©ras chargĂ©es · activer CCTV pour les utiliser", + "other": "{count} camĂ©ras chargĂ©es · activer CCTV pour les utiliser" + }, + "{count} more cameras outside this view · pan or zoom out": { + "one": "{count} autre camĂ©ra hors de cette vue · dĂ©placer ou dĂ©zoomer", + "many": "{count} d'autres camĂ©ras hors de cette vue · dĂ©placer ou dĂ©zoomer", + "other": "{count} autres camĂ©ras hors de cette vue · dĂ©placer ou dĂ©zoomer" + }, + "Enable CCTV to load camera intersections": "Activez CCTV pour charger les carrefours Ă©quipĂ©s de camĂ©ras", + "Enable CCTV to start camera-linked intelligence summaries.": "Activez CCTV pour lancer les rĂ©sumĂ©s de renseignement liĂ©s aux camĂ©ras.", + "No summary available.": "Aucun rĂ©sumĂ© disponible.", + "loading frames": "chargement des images", + "camera grid ready": "grille de camĂ©ras prĂȘte", + "Clearing selected data layers": "Effacement des couches de donnĂ©es sĂ©lectionnĂ©es", + "Clear selected data layers": "Effacer les couches de donnĂ©es sĂ©lectionnĂ©es", + "CONDITIONS UNKNOWN": "CONDITIONS INCONNUES", + "CLEAR": "DÉGAGÉ", + "PARTLY CLOUDY": "PARTIELLEMENT NUAGEUX", + "OVERCAST": "COUVERT", + "FOG": "BROUILLARD", + "DRIZZLE": "BRUINE", + "RAIN": "PLUIE", + "RAIN SHOWERS": "AVERSES DE PLUIE", + "SNOW SHOWERS": "AVERSES DE NEIGE", + "THUNDERSTORM": "ORAGE", + "MIXED CONDITIONS": "CONDITIONS VARIABLES", + "CYCLE ON": "DÉFIL. ON", + "CYCLE OFF": "DÉFIL. OFF", + "Stop automatic page cycling. Previous, Next, and the SIG/NEWS/LOCAL tabs stay available.": "ArrĂȘter le dĂ©filement automatique des pages. PrĂ©cĂ©dent, Suivant et les onglets SIG/ACTUS/LOCAL restent disponibles.", + "Cycle briefing pages automatically every 9 seconds (Signals → News → Local). Pauses while you hover or focus the panel. Live signal data refreshes continuously either way.": "Faire dĂ©filer automatiquement les pages du briefing toutes les 9 secondes (Signaux → Actus → Local). Pause pendant le survol ou quand le panneau a le focus. Les signaux en direct s'actualisent en continu dans les deux cas.", + "ACQUIRING REGIONAL NEWS": "ACQUISITION DES ACTUS RÉGIONALES", + "REGIONAL NEWS UNAVAILABLE": "ACTUS RÉGIONALES INDISPONIBLES", + "RESOLVING REGION": "IDENTIFICATION DE LA RÉGION", + "REGION UNAVAILABLE": "RÉGION INDISPONIBLE", + "NO RECENT LOCATION MATCHES": "AUCUNE ACTU RÉCENTE POUR CE LIEU", + "{domain} · {age}": "{domain} · {age}", + "{value} KM/H": "{value} KM/H", + "CLOUD {pct}%": "NÉBULOSITÉ {pct} %", + "CLOUD UNKNOWN": "NÉBULOSITÉ INCONNUE", + "{source} · LOCATION QUERY": "{source} · REQUÊTE DE LIEU", + "REGIONAL NEWS": "ACTUS RÉGIONALES", + "{label} · {radius} AIR/SEA WINDOW": "{label} · AIR/MER {radius}", + "{scope} · INSTALLATIONS {coverage}": "{scope} · INSTALLATIONS : {coverage}", + "CONTEXT STANDBY": "CONTEXTE EN VEILLE", + "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "ACTIVER LE CONTEXTE GLOBAL POUR LES PINGS DE PROXIMITÉ", + "CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "CONTACT PERDU · DERNIER RELEVÉ CONNU · PAS UN FEU VERT", + "CONTACT LOST · {subject}": "CONTACT PERDU · {subject}", + "SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "CIBLE ABSENTE DU FLUX · DERNIER RELEVÉ CONSERVÉ", + "{cohort} · {contact}": "{cohort} · {contact}", + "NO AVAILABLE EXAMPLE": "AUCUN EXEMPLE DISPONIBLE", + "{cohort}, Unavailable": "{cohort}, indisponible", + "AHEAD": "DEVANT", + "{side} {angle}": "{side} {angle}", + "L": "G", + "R": "D", + "{count} INPUTS UNKNOWN · NOT AN ALL-CLEAR": { + "one": "{count} ENTRÉE INCONNUE · PAS UN FEU VERT", + "many": "{count} D'ENTRÉES INCONNUES · PAS UN FEU VERT", + "other": "{count} ENTRÉES INCONNUES · PAS UN FEU VERT" + }, + "AVAILABLE INPUTS CURRENT · NOT AN ALL-CLEAR": "ENTRÉES DISPONIBLES À JOUR · PAS UN FEU VERT", + "SQUAWK {code} · {status}": "SQUAWK {code} · {status}", + "ADS-B PRIORITY · {status}": "PRIORITÉ ADS-B · {status}", + "ADS-B EMERGENCY · {status}": "URGENCE ADS-B · {status}", + "AIRCRAFT": "AÉRONEF", + "ACQUIRING SURFACE": "ACQUISITION SURFACE", + "SURFACE FALLBACK": "SECOURS SURFACE", + "STALE FEED": "FLUX OBSOLÈTE", + "LIVE TRACK": "PISTE EN DIRECT", + "COMMERCIAL": "COMMERCIAL", + "{aircraftClass} · {emergency} · {feedState}": "{aircraftClass} · {emergency} · {feedState}", + "{aircraftClass} · {feedState} · COURSE ALIGNED": "{aircraftClass} · {feedState} · ALIGNÉ SUR LA ROUTE", + "ARROW · ESTIMATED DIRECTION": "FLÈCHE · DIRECTION ESTIMÉE", + "ROUTE DATA UNAVAILABLE": "DONNÉES DE ROUTE INDISPONIBLES", + "DEST {bearing}": "DEST {bearing}", + "Disable cockpit weather effects": "DĂ©sactiver les effets mĂ©tĂ©o du cockpit", + "Enable cockpit weather effects": "Activer les effets mĂ©tĂ©o du cockpit", + "ON": "ON", + "Normal": "Normal", + "Night vision": "Vision nocturne", + "Thermal": "Thermique", + "Anime": "Anime", + "Noir": "Noir", + "Current cockpit vision style: {style}. Activate for next style.": "Style de vision actuel du cockpit : {style}. Activer pour le style suivant.", + "Current style: {style} — click for next": "Style actuel : {style} — cliquer pour le suivant", + "Collapse Contact panel": "RĂ©duire le panneau Contact", + "Expand Contact panel": "DĂ©velopper le panneau Contact", + "Collapse contact panel": "RĂ©duire le panneau contact", + "Expand contact panel": "DĂ©velopper le panneau contact", + "Collapse cockpit briefing panel": "RĂ©duire le panneau de briefing du cockpit", + "Expand cockpit briefing panel": "DĂ©velopper le panneau de briefing du cockpit", + "Collapse briefing panel": "RĂ©duire le panneau de briefing", + "Expand briefing panel": "DĂ©velopper le panneau de briefing", + "OBSERVED / MAPPED PINGS": "PINGS OBSERVÉS / CARTOGRAPHIÉS", + "SOURCE-BACKED EVENTS · NO SYNTHETIC NEWS": "ÉVÉNEMENTS SOURCÉS · AUCUNE ACTU SYNTHÉTIQUE", + "LATEST LOCATION-MATCHED REPORTING": "DERNIÈRES ACTUS LIÉES AU LIEU", + "{source} · LOCATION QUERY · RECENT": "{source} · REQUÊTE DE LIEU · RÉCENT", + "LOCAL INFO": "INFOS LOCALES", + "PLACE / CONDITIONS / POSITION": "LIEU / CONDITIONS / POSITION", + "TIME UNKNOWN": "HEURE INCONNUE", + "{count}M AGO": "IL Y A {count} MIN", + "{count}H AGO": "IL Y A {count} H", + "{count}D AGO": "IL Y A {count} J", + "DIR UNKNOWN": "DIR INCONNUE", + "Select flight {title}": "SĂ©lectionner le vol {title}", + "{aircraftClass} · CURRENT": "{aircraftClass} · ACTUEL", + "MILITARY FLIGHT": "VOL MILITAIRE", + "COMMERCIAL FLIGHT": "VOL COMMERCIAL", + "{aircraftClass} · {distance}": "{aircraftClass} · {distance}", + "DISTANCE UNKNOWN": "DISTANCE INCONNUE", + "{count} INPUTS UNKNOWN": { + "one": "{count} ENTRÉE INCONNUE", + "many": "{count} D'ENTRÉES INCONNUES", + "other": "{count} ENTRÉES INCONNUES" + }, + "SOURCE STATUS UNAVAILABLE": "ÉTAT DE LA SOURCE INDISPONIBLE", + "Restore real aircraft": "Restaurer l'aĂ©ronef rĂ©el", + "Reclassify as TR-3B": "Reclasser en TR-3B", + "TRACK ACQUIRED": "PISTE ACQUISE", + "{label} · COURSE {heading}°": "{label} · ROUTE {heading}°", + "Context could not restore every layer; try again": "Le contexte n'a pas pu restaurer toutes les couches ; rĂ©essayez", + "No selected data layers": "Aucune couche de donnĂ©es sĂ©lectionnĂ©e", + "{count} data layers could not be cleared": { + "one": "{count} couche de donnĂ©es n'a pas pu ĂȘtre effacĂ©e", + "many": "{count} de couches de donnĂ©es n'ont pas pu ĂȘtre effacĂ©es", + "other": "{count} couches de donnĂ©es n'ont pas pu ĂȘtre effacĂ©es" + }, + "Cleared {count} data layers": { + "one": "{count} couche de donnĂ©es effacĂ©e", + "many": "{count} de couches de donnĂ©es effacĂ©es", + "other": "{count} couches de donnĂ©es effacĂ©es" + }, + "Selected data layers could not be cleared": "Impossible d'effacer les couches de donnĂ©es sĂ©lectionnĂ©es", + "Space Missions could not complete the requested transition; try again": "Les missions spatiales n'ont pas pu effectuer la transition demandĂ©e ; rĂ©essayez", + "Nearby installations refreshed": "Installations proches actualisĂ©es", + "Nearby installations could not be refreshed; try again": "Impossible d'actualiser les installations proches ; rĂ©essayez", + "Space Missions cancellation could not restore the previous layer state": "L'annulation des missions spatiales n'a pas pu restaurer l'Ă©tat prĂ©cĂ©dent des couches", + "That layer is unavailable in the current Context mode": "Cette couche est indisponible dans le mode Contexte actuel", + "{layerId} could not {action} cleanly": "{layerId} n'a pas pu {action} proprement", + "start": "dĂ©marrer", + "stop": "s'arrĂȘter", + "{mode} could not start because another layer did not stop cleanly": "Impossible de dĂ©marrer {mode} : une autre couche ne s'est pas arrĂȘtĂ©e proprement", + "Space Missions": "Missions spatiales", + "Context": "Contexte", + "Rendered globe frames per second · toggle with `": "Images du globe rendues par seconde · basculer avec `", + "imported map files": "les fichiers importĂ©s sur la carte", + "Ground heights could not be refreshed. Try the file again when the map has loaded.": "Impossible d'actualiser les altitudes du sol. RĂ©essayez avec le fichier une fois la carte chargĂ©e.", + "{count} map objects": { + "one": "{count} objet cartographique", + "many": "{count} d'objets cartographiques", + "other": "{count} objets cartographiques" + }, + ", drawn with its own styles": ", dessinĂ© avec ses propres styles", + "Hide {name}": "Masquer {name}", + "Show {name}": "Afficher {name}", + "Fly to {name}": "Rejoindre {name}", + "Remove {name}": "Retirer {name}", + "At most {count} files at once — remove one first.": "{count} fichiers au maximum Ă  la fois — retirez-en un d'abord.", + "Reading {name}
": "Lecture de {name}
", + "That file could not be read.": "Impossible de lire ce fichier.", + "Added {count} files.": { + "one": "{count} fichier ajoutĂ©.", + "many": "{count} de fichiers ajoutĂ©s.", + "other": "{count} fichiers ajoutĂ©s." + }, + "{count} files could not be added ({name}: {error})": { + "one": "{count} fichier n'a pas pu ĂȘtre ajoutĂ© ({name} : {error})", + "many": "{count} de fichiers n'ont pas pu ĂȘtre ajoutĂ©s ({name} : {error})", + "other": "{count} fichiers n'ont pas pu ĂȘtre ajoutĂ©s ({name} : {error})" + }, + "Some KML content was left out.": "Une partie du contenu KML a Ă©tĂ© ignorĂ©e.", + "Press on the ground, not the sky": "Appuyez sur le sol, pas sur le ciel", + "Drag to size the box": "Faites glisser pour dimensionner la zone", + "light {source} to use your {name} key": "activez {source} pour utiliser votre clĂ© {name}", + "light {source}": "activez {source}", + ", or ": ", ou ", + "{requirement}, or {offer}": "{requirement}, ou {offer}", + "Live Flights": "Vols en direct", + "Military Flights": "Vols militaires", + "Earthquakes (24h)": "SĂ©ismes (24 h)", + "Satellites": "Satellites", + "Space Missions (30d)": "Missions spatiales (30 j)", + "Street Traffic": "Trafic routier", + "CCTV": "CCTV", + "Radio": "Radio", + "Bikeshare": "VĂ©los partagĂ©s", + "Live AIS Vessels": "Navires AIS en direct", + "Mapped Installations": "Installations cartographiĂ©es", + "Global Context": "Contexte global", + "Datacenters": "Centres de donnĂ©es", + "Dams": "Barrages", + "Submarine Cables": "CĂąbles sous-marins", + "FIRMS Active Fires": "Feux actifs FIRMS", + "Local ADS-B": "ADS-B local", + "Transit": "Transports en commun", + "Recent Imagery": "Imagerie rĂ©cente", + "Fire Perimeters": "PĂ©rimĂštres d'incendies", + "GNSS Integrity": "IntĂ©gritĂ© GNSS", + "S2 GhostMaps": "S2 GhostMaps", + "Rain radar": "Radar de pluie", + "Lightning density": "DensitĂ© de foudre", + "Cyclone advisories": "Bulletins cycloniques", + "ALPR Cameras": "CamĂ©ras LAPI", + "Live Vessels": "Navires en direct", + "Bike Share": "VĂ©los partagĂ©s", + "Cameras": "CamĂ©ras", + "Street Level": "Niveau rue", + "Mapped ALPR Cameras": "CamĂ©ras LAPI cartographiĂ©es", + "Data Centers": "Centres de donnĂ©es", + "Active Fires": "Feux actifs", + "Military aircraft": "AĂ©ronefs militaires", + "Vessels": "Navires", + "CCTV + Street View fallback": "CCTV + secours Street View", + "OpenStreetMap + optional Google Maps Places": "OpenStreetMap + Google Maps Places en option", + "GFS / ECMWF IFS · FORECAST": "GFS / ECMWF IFS · PRÉVISION", + "NOAA nowCOAST · OBSERVED": "NOAA nowCOAST · OBSERVÉ", + "NASA FIRMS · LIVE": "NASA FIRMS · DIRECT", + "OSM routing": "ItinĂ©raires OSM", + "data source|Local": "DonnĂ©es locales", + "ENABLING": "ACTIV.", + "DISABLING": "DÉSACT.", + "Movement": "Mouvement", + "Infrastructure": "Infrastructures", + "Events": "ÉvĂ©nements", + "Weather": "MĂ©tĂ©o", + "Utilities": "Outils", + "Other layers": "Autres couches", + "{state} · {source}": "{state} · {source}", + "UNCERTAIN · {source} · lifecycle state requires reconciliation": "INCERTAIN · {source} · Ă©tat Ă  rĂ©tablir", + "{state} · {source} · {detail} · retry {seconds}s": "{state} · {source} · {detail} · nouvel essai dans {seconds} s", + "{state} · {source} · {detail}": "{state} · {source} · {detail}", + "never": "jamais", + "{source} · {loadingLabel}": "{source} · {loadingLabel}", + "{accepted} of {raw} records accepted": "Enregistrements acceptĂ©s : {accepted} sur {raw}", + "incomplete snapshot": "instantanĂ© incomplet", + "{state} · {source} · {detail} · {ago}": "{state} · {source} · {detail} · {ago}", + "{state} · {source} · {ago} · retrying in {seconds}s": "{state} · {source} · {ago} · nouvel essai dans {seconds} s", + "{state} · {source} · {ago}": "{state} · {source} · {ago}", + "{source} · {ago}": "{source} · {ago}", + "UNCERTAIN": "INCERTAIN", + "status chip|UNAVAILABLE": "INDISP.", + "Data source unavailable": "Source de donnĂ©es indisponible", + "{name}: {state}": "{name} : {state}", + "{count}s ago": "il y a {count} s", + "Local FM stopped: internet radio started": "FM locale arrĂȘtĂ©e : la radio Internet a dĂ©marrĂ©", + "IDLE": "INACTIF", + "CONNECTING": "CONNEXION", + "TUNING": "RÉGLAGE", + "STREAMING": "RÉCEPTION", + "UNSUPPORTED": "NON PRIS EN CHARGE", + "idle": "inactif", + "running": "actif", + "suspended": "suspendu", + "closed": "fermĂ©", + "feed status|live": "en direct", + "feed status|stale": "obsolĂšte", + "feed status|unreachable": "injoignable", + "feed status|invalid": "non valide", + "waiting for IQ": "en attente des donnĂ©es IQ", + "{count} messages": { + "one": "{count} message", + "many": "{count} de messages", + "other": "{count} messages" + }, + "DSP {count} blocks": { + "one": "DSP {count} bloc", + "many": "DSP {count} de blocs", + "other": "DSP {count} blocs" + }, + "DSP waiting": "DSP en attente", + "{level} dBFS audio": "audio {level} dBFS", + "audio signal --": "signal audio --", + "audio {state}": "audio {state}", + "{count} HEARD": { + "one": "CAPTÉS : {count}", + "many": "CAPTÉS : {count}", + "other": "CAPTÉS : {count}" + }, + "DISCONNECT": "DÉCONNECTER", + "CONNECT": "CONNECTER", + "LOCATING
": "LOCALISATION
", + "LOCATED": "LOCALISÉ", + "LOCATE": "LOCALISER", + " · read while Local ADS-B is on": " · lus tant qu'ADS-B local est activĂ©", + "Decoder feeds: {feeds}": "Flux du dĂ©codeur : {feeds}", + "Language: {language}": "Langue : {language}", + "Change the interface language": "Changer la langue de l'interface", + "Interface language": "Langue de l'interface", + "Search languages": "Rechercher une langue", + "No matching languages": "Aucune langue correspondante", + "📍 Location: --": "📍 Lieu : --", + "Landmark: --": "RepĂšre : --", + "Searched location": "Lieu recherchĂ©", + "ORBIT": "ORBITE", + "Location not found": "Lieu introuvable", + "Check the spelling and press Enter to search again.": "VĂ©rifiez l'orthographe et appuyez sur Enter pour relancer la recherche.", + "Search failed": "Échec de la recherche", + "Press Enter to try again.": "Appuyez sur Enter pour rĂ©essayer.", + "Detailed outline unavailable": "Contour dĂ©taillĂ© indisponible", + "Fly to a POI first": "Rejoignez d'abord un point d'intĂ©rĂȘt", + "Reset to full globe view": "Revenir Ă  la vue du globe entier", + "Reset cockpit to full globe view": "RĂ©initialiser le cockpit sur la vue du globe entier", + "Resetting to full globe view": "Retour Ă  la vue du globe entier", + "Resetting cockpit to full globe view": "RĂ©initialisation du cockpit sur la vue du globe entier", + "MAP": "CARTE", + "Layers": "Couches", + "Search": "Recherche", + "More": "Plus", + "Panels": "Panneaux", + "panel": "le panneau", + "Expand {name}": "DĂ©velopper {name}", + "Collapse {name}": "RĂ©duire {name}", + "Expand Radio": "DĂ©velopper la Radio", + "Collapse Radio": "RĂ©duire la Radio", + "Expand Radio section": "DĂ©velopper la section Radio", + "Collapse Radio section": "RĂ©duire la section Radio", + "Panel layout updated — positions reset to new defaults": "Disposition des panneaux mise Ă  jour — positions rĂ©initialisĂ©es", + "Austin": "Austin", + "San Francisco": "San Francisco", + "New York": "New York", + "Tokyo": "Tokyo", + "London": "Londres", + "Paris": "Paris", + "Dubai": "DubaĂŻ", + "Washington DC": "Washington", + "Tallinn": "Tallinn", + "Los Angeles": "Los Angeles", + "Collapse Cockpit display options": "RĂ©duire les options d'affichage du cockpit", + "Expand Cockpit display options": "DĂ©velopper les options d'affichage du cockpit", + "Collapse Cockpit Radio controls": "RĂ©duire les commandes Radio du cockpit", + "Expand Cockpit Radio controls": "DĂ©velopper les commandes Radio du cockpit", + "CH {index} / {total}": "CANAL {index} / {total}", + "NO STATIONS": "AUCUNE STATION", + "NO STATION AVAILABLE": "AUCUNE STATION DISPONIBLE", + "{name}, station {index} of {total}": "{name}, station {index} sur {total}", + "No station available": "Aucune station disponible", + "OFF AIR": "HORS ANTENNE", + "STATION UNAVAILABLE": "STATION INDISPONIBLE", + "Station unavailable after directory refresh": "Station indisponible aprĂšs l'actualisation de l'annuaire", + "Radio could not {action} cleanly": "La Radio n'a pas pu {action} proprement", + "SYNC": "SYNCHRO", + "RECONCILE": "RÉTABLIR", + "DISABLE": "DÉSACTIVER", + "ENABLE": "ACTIVER", + "Reconcile Radio — lifecycle uncertain": "RĂ©tablir la Radio — Ă©tat incertain", + "Disable Radio": "DĂ©sactiver la Radio", + "Enable Radio": "Activer la Radio", + "{category} ({count})": "{category} ({count})", + "DIRECTORY BAND": "BANDE DE L'ANNUAIRE", + "{category} BAND": "BANDE {category}", + "NO STATION SELECTED": "AUCUNE STATION SÉLECTIONNÉE", + "Directory metadata only": "MĂ©tadonnĂ©es de l'annuaire seulement", + "Loading station directory
": "Chargement de l'annuaire des stations
", + "Choose a globe marker or use next.": "Choisissez un marqueur sur le globe ou utilisez SUIV.", + "TAGS · {tags}": "TAGS · {tags}", + "Play": "Lire", + "PAUSE": "PAUSE", + "RESUME": "REPRENDRE", + "PLAY": "LIRE", + "selected": "sĂ©lectionnĂ©e", + "nearest": "la plus proche", + "{action} {target} radio station": "{action} : station radio {target}", + "SYNCING": "SYNCHRO", + "READY": "PRÊT", + "station": "station", + " · stale/degraded directory": " · annuaire obsolĂšte/dĂ©gradĂ©", + " · degraded directory": " · annuaire dĂ©gradĂ©", + " · stale directory": " · annuaire obsolĂšte", + " · outside current filter": " · hors du filtre actuel", + "Ready — playback starts only from your action": "PrĂȘt — la lecture ne dĂ©marre qu'Ă  votre demande", + "Radio off": "Radio dĂ©sactivĂ©e", + "Connecting directly to broadcaster
": "Connexion directe au diffuseur
", + "Buffering broadcaster stream
": "Mise en mĂ©moire tampon du flux du diffuseur
", + "Playing {station}": "Lecture de {station}", + "Paused {station}": "{station} en pause", + "Broadcaster stream unavailable": "Flux du diffuseur indisponible", + " · muted during voice interaction": " · coupĂ© pendant l'interaction vocale", + " · restoring volume after voice": " · rĂ©tablissement du volume aprĂšs la voix", + " · static indicates no broadcaster audio": " · le grĂ©sillement indique l'absence de flux du diffuseur", + " · tuning static until broadcaster starts": " · grĂ©sillement pendant le rĂ©glage, jusqu'au dĂ©but de la diffusion", + "Station unavailable after directory refresh — choose another channel": "Station indisponible aprĂšs l'actualisation de l'annuaire — choisissez un autre canal", + "Radio is enabling
": "Activation de la Radio
", + "Radio is disabling
": "DĂ©sactivation de la Radio
", + "Radio lifecycle is uncertain — use Enable or Disable to reconcile": "État de la Radio incertain — utilisez Activer ou DĂ©sactiver pour le rĂ©tablir", + "Clear reading": "Effacer le relevĂ©", + "Earlier observation": "Observation prĂ©cĂ©dente", + "Observed history": "Historique des observations", + "Later observation": "Observation suivante", + "Latest": "DerniĂšre", + "Newest frame per product": "Image la plus rĂ©cente par produit", + "Replay observed history": "Rejouer l'historique des observations", + "Imagery on Esri · Google 3D returns when cleared": "Sur Esri · EFFACER rĂ©tablit Google 3D", + "Point the camera at the ground to use the view": "Orientez la camĂ©ra vers le sol pour utiliser la vue", + "That point cannot anchor a box": "Ce point ne peut pas ancrer une zone", + "Imagery stops at ±{limit}° latitude": "L'imagerie s'arrĂȘte Ă  ±{limit}° de latitude", + "{owner} is using the pointer — close it first": "Pointeur utilisĂ© par : {owner}. Fermez d'abord cet outil", + "Box is {size} wide · limit {limit}": "La zone fait {size} de large · limite {limit}", + "View is {size} wide · limit {limit}": "La vue fait {size} de large · limite {limit}", + "VS BASEMAP": "VS CARTE", + "A / B": "A / B", + "Newest low-cloud day for this box · scene cloud, not box cloud": "Jour peu nuageux le plus rĂ©cent pour cette zone · nuages de la scĂšne, pas de la zone", + "Newest day covering this box · cloudier than 20%": "Jour le plus rĂ©cent couvrant cette zone · plus de 20 % de nuages", + "Newest day with imagery for this box · partial coverage": "Jour le plus rĂ©cent avec des images pour cette zone · couverture partielle", + "Newest daily overview for this box": "Vue quotidienne la plus rĂ©cente pour cette zone", + "newest clear day": "jour dĂ©gagĂ© le plus rĂ©cent", + "newest day (cloudy)": "jour le plus rĂ©cent (nuageux)", + "newest day (partial coverage)": "jour le plus rĂ©cent (couverture partielle)", + "newest overview": "vue quotidienne la plus rĂ©cente", + "No imagery": "Aucune image", + "Loading": "Chargement", + "coverage|full": "complĂšte", + "coverage|partial": "partielle", + "unknown": "inconnue", + "no imagery": "aucune image", + "{percent}% cloud": "{percent} % de nuages", + "{min}–{max}% cloud": "{min}–{max} % de nuages", + "NO BOX": "AUCUNE ZONE", + "SEARCHING": "RECHERCHE", + "{count} DAYS": { + "one": "{count} JOUR", + "many": "{count} DE JOURS", + "other": "{count} JOURS" + }, + "Zoom in or draw a smaller box": "Zoomez ou tracez une zone plus petite", + "Select a box or use the view": "SĂ©lectionnez une zone ou utilisez la vue", + "Searching the last 30 days": "Recherche sur les 30 derniers jours", + "No days to show for this box": "Aucun jour Ă  afficher pour cette zone", + "Drag the divider · SWAP trades sides": "Glissez le sĂ©parateur · INVERSER permute", + "← → preview · A or B pins the focused day": "← → aperçu · A ou B Ă©pingle le jour ciblĂ©", + "← → preview the other side · A or B pins it": "← → aperçu de l'autre cĂŽtĂ© · A ou B l'Ă©pingle", + "S on another day replaces it · × unpins": "S sur un autre jour le remplace · × le dĂ©sĂ©pingle", + "← → preview · S shows the focused day": "← → aperçu · S affiche le jour ciblĂ©", + "ZOOM IN": "ZOOMER", + "Fly in until the view fits the 1,000 km limit": "Rapprochez-vous jusqu'Ă  ce que la vue tienne dans la limite de 1 000 km", + "Imagery days, newest first · arrows move, S or A and B pin": "Jours d'imagerie, du plus rĂ©cent au plus ancien · les flĂšches dĂ©placent, S ou A et B Ă©pinglent", + "On the map": "Sur la carte", + "Mode": "Mode", + "Imagery opacity": "OpacitĂ© de l'imagerie", + "SWAP": "INVERSER", + "Trade the two sides of the divider": "Échanger les deux cĂŽtĂ©s du sĂ©parateur", + "SELECT BOX": "TRACER ZONE", + "Drag a box on the map (Esc cancels)": "Tracez une zone sur la carte (Esc pour annuler)", + "USE VIEW": "CETTE VUE", + "Use the current view as the box": "Utiliser la vue actuelle comme zone", + "Forget the box and its images": "Oublier la zone et ses images", + "START HERE": "COMMENCER ICI", + "Checking": "VĂ©rification", + "PREVIEW": "APERÇU", + "Newest day with imagery for this box": "Jour le plus rĂ©cent avec des images pour cette zone", + "SHOW": "AFFICHER", + "Pin {day} as {slot}": "Épingler {day} en {slot}", + "Show {day}": "Afficher {day}", + "pinned {slot}": "Ă©pinglĂ© en {slot}", + "shown": "affichĂ©", + "preview": "aperçu", + "start here": "commencer ici", + "No box": "Aucune zone", + "Searching": "Recherche", + "Every day is empty here": "Aucune image trouvĂ©e ici", + "Sources off": "Sources dĂ©sactivĂ©es", + "VS": "VS", + "Not set": "Non dĂ©fini", + "Basemap": "Fond de carte", + "Source off": "Source dĂ©sactivĂ©e", + "Unpin {slot}": "DĂ©sĂ©pingler {slot}", + "Unpin the image": "DĂ©sĂ©pingler l'image", + "EXPORT {slot}": "EXP. {slot}", + "EXPORT": "EXPORTER", + "Download {slot} as a PNG": "TĂ©lĂ©charger {slot} en PNG", + "Download the image as a PNG": "TĂ©lĂ©charger l'image en PNG", + "Box {width} × {height} km": "Zone de {width} × {height} km", + "Acquired {time}": "Acquisition : {time}", + "Coverage {coverage}": "Couverture {coverage}", + "START HERE · {reason}": "COMMENCER ICI · {reason}", + "Daily overview shows little detail in a box this small": "La vue quotidienne montre peu de dĂ©tails dans une zone aussi petite", + "Imagery: NASA GIBS and Worldview · HLS (Sentinel-2, Landsat 8/9) and VIIRS": "Imagerie : NASA GIBS et Worldview · HLS (Sentinel‑2, Landsat 8/9) et VIIRS", + "Details": "DĂ©tails", + "Times, coverage, sources": "Heures, couverture, sources", + "HIDE EMPTY DAYS": "MASQUER LES JOURS VIDES", + "SHOW EMPTY DAYS · {count}": "AFFICHER LES JOURS VIDES · {count}", + "Days the probe found empty in this box": "Jours sans image trouvĂ©e dans cette zone", + "image": "image", + "BASEMAP": "FOND DE CARTE", + "The basemap": "Le fond de carte", + "basemap": "fond de carte", + "Recent imagery against the basemap divider": "SĂ©parateur imagerie rĂ©cente / fond de carte", + "Recent imagery A and B divider": "SĂ©parateur A / B de l'imagerie rĂ©cente", + "{before} {left} percent, {after} {right} percent": "{before} {left} pour cent, {after} {right} pour cent", + "Export failed · {error}": "Échec de l'exportation · {error}", + "Scene action failed": "Échec de l'action sur la scĂšne", + "New scene name": "Nom de la nouvelle scĂšne", + "Delete scene \"{scene}\" and all shots?": "Supprimer la scĂšne « {scene} » et tous ses plans ?", + "Delete shot \"{shot}\"?": "Supprimer le plan « {shot} » ?", + "Stopped (Esc)": "ArrĂȘtĂ© (Esc)", + "SPARSE": "ÉPARS", + "BALANCED": "ÉQUILIBRÉ", + "No shots yet. Use CAPTURE SHOT to save current look.": "Aucun plan pour l'instant. Utilisez CAPTURER UN PLAN pour enregistrer le rendu actuel.", + "Double-click to rename": "Double-cliquez pour renommer", + "Shot name": "Nom du plan", + "LOAD": "CHARGER", + "DEL": "SUPPR.", + "{duration}s + {hold}s": "{duration} s + {hold} s", + "Choose files": "Choisir des fichiers", + "{count} files selected": { + "one": "{count} fichier sĂ©lectionnĂ©", + "many": "{count} de fichiers sĂ©lectionnĂ©s", + "other": "{count} fichiers sĂ©lectionnĂ©s" + }, + "No file chosen": "Aucun fichier choisi", + "Cancel": "Annuler", + "EDIT DETAILS": "MODIFIER LES DÉTAILS", + "SHARE SCENE": "PARTAGER LA SCÈNE", + "Shared flight follow expired": "Le suivi du vol partagĂ© a expirĂ©", + "Shared military flight follow expired": "Le suivi du vol militaire partagĂ© a expirĂ©", + "Shared satellite follow expired": "Le suivi du satellite partagĂ© a expirĂ©", + "Shared flight could not be restored — feed unavailable": "Impossible de restaurer le vol partagĂ© — flux indisponible", + "Shared military flight could not be restored — feed unavailable": "Impossible de restaurer le vol militaire partagĂ© — flux indisponible", + "Shared satellite could not be restored — feed unavailable": "Impossible de restaurer le satellite partagĂ© — flux indisponible", + "Shared flight is unavailable": "Le vol partagĂ© est indisponible", + "Shared military flight is unavailable": "Le vol militaire partagĂ© est indisponible", + "Shared satellite is unavailable": "Le satellite partagĂ© est indisponible", + "entity": "entitĂ©", + "Shared {subject} follow expired": "Suivi partagĂ© expiré : {subject}", + "Shared {subject} could not be restored — feed unavailable": "Suivi partagĂ© non restauré : {subject} — flux indisponible", + "Shared {subject} is unavailable": "Partage indisponible : {subject}", + "{id} isn't reporting now — showing where it was last seen": "{id} n'Ă©met pas actuellement — affichage de sa derniĂšre position connue", + "{id} isn't reporting now — showing where it was at {time}": "{id} n'Ă©met pas actuellement — affichage de sa position Ă  {time}", + "This share link can't be opened": "Ce lien de partage ne peut pas ĂȘtre ouvert", + "Shared vessel is unavailable": "Le navire partagĂ© est indisponible", + "ACQUIRING": "ACQUISITION", + "SHARED {subject}": "PARTAGÉ : {subject}", + "subject": "cible", + "LOADING LIVE DATA": "CHARGEMENT DES DONNÉES EN DIRECT", + "LOAD COMPLETE": "CHARGEMENT TERMINÉ", + "LOAD CANCELLED": "CHARGEMENT ANNULÉ", + "LOAD FAILED": "ÉCHEC DU CHARGEMENT", + "LIVE DATA OFF": "DONNÉES EN DIRECT DÉSACTIVÉES", + "MAPPED SITES LOADED": "SITES CARTOGRAPHIÉS CHARGÉS", + "RETRYING MAPPED SITES": "NOUVEL ESSAI : SITES CARTOGRAPHIÉS", + "FETCHING MAPPED SITES": "RÉCUPÉRATION DES SITES CARTOGRAPHIÉS", + "RETRYING ALPR CAMERAS": "NOUVEL ESSAI : CAMÉRAS LAPI", + "FETCHING ALPR CAMERAS": "RÉCUPÉRATION DES CAMÉRAS LAPI", + "OVERPASS TEMPORARILY UNAVAILABLE": "OVERPASS TEMPORAIREMENT INDISPONIBLE", + "OVERPASS RATE-LIMITED": "OVERPASS : LIMITE DE REQUÊTES ATTEINTE", + "OVERPASS TIMED OUT": "OVERPASS : DÉLAI DÉPASSÉ", + "OVERPASS COULD NOT COMPLETE THE QUERY": "OVERPASS N'A PAS PU TERMINER LA REQUÊTE", + "MAP TILES TEMPORARILY UNAVAILABLE": "TUILES DE LA CARTE TEMPORAIREMENT INDISPONIBLES", + "MAPPED NAMES TEMPORARILY UNAVAILABLE": "NOMS CARTOGRAPHIÉS TEMPORAIREMENT INDISPONIBLES", + "TURNING OFF LIVE DATA": "DÉSACTIVATION DES DONNÉES EN DIRECT", + "REFRESHING LIVE DATA": "ACTUALISATION DES DONNÉES EN DIRECT", + "syncing road network": "synchro du rĂ©seau routier", + "retry pending": "nouvel essai en attente", + "retrying in {seconds}s": "nouvel essai dans {seconds} s", + "ALPR cameras": "camĂ©ras LAPI", + "OpenSky OAuth client missing/invalid": "Client OAuth OpenSky absent ou non valide", + "OpenSky OAuth rejected credentials": "OpenSky OAuth a refusĂ© les identifiants", + "OpenSky username/password rejected": "Identifiant ou mot de passe OpenSky refusĂ©", + "OpenSky auth missing": "Authentification OpenSky absente", + "OpenSky auth required": "Authentification OpenSky requise", + "OpenSky auth invalid": "Authentification OpenSky non valide", + "OpenSky auth failed": "Échec de l'authentification OpenSky", + "KartaView answered HTTP {status}": "KartaView a rĂ©pondu HTTP {status}", + "Panoramax answered HTTP {status}": "Panoramax a rĂ©pondu HTTP {status}", + "KartaView refused the request (code {code})": "KartaView a refusĂ© la requĂȘte (code {code})", + "Vector tiles unavailable (HTTP {status})": "Tuiles vectorielles indisponibles (HTTP {status})", + "GNSS feed unavailable (HTTP {status})": "Flux GNSS indisponible (HTTP {status})", + "{count} CelesTrak groups unavailable": { + "one": "{count} groupe CelesTrak indisponible", + "many": "{count} de groupes CelesTrak indisponibles", + "other": "{count} groupes CelesTrak indisponibles" + }, + "{feed} feed unavailable": "Flux {feed} indisponible", + "Source snapshot {minutes} min old": "InstantanĂ© de la source datant de {minutes} min", + "{source} rate limited (anonymous)": "{source} : limite de requĂȘtes atteinte (anonyme)", + "{source} rate limited": "{source} : limite de requĂȘtes atteinte", + "{source} network error": "{source} : erreur rĂ©seau", + "Malformed {source} aircraft rows": "{source} : lignes d'aĂ©ronefs mal formĂ©es", + "Malformed {source} response": "{source} : rĂ©ponse mal formĂ©e", + "entry {n}": "entrĂ©e {n}", + "feeds {names} stale": { + "one": "flux {names} obsolĂšte", + "many": "flux {names} obsolĂštes", + "other": "flux {names} obsolĂštes" + }, + "feeds {names} unreachable": { + "one": "flux {names} injoignable", + "many": "flux {names} injoignables", + "other": "flux {names} injoignables" + }, + "feeds {names} invalid": { + "one": "flux {names} non valide", + "many": "flux {names} non valides", + "other": "flux {names} non valides" + }, + "Loading {feeds}": "Chargement de {feeds}", + "{count} heard": { + "one": "{count} aĂ©ronef captĂ©", + "many": "{count} d'aĂ©ronefs captĂ©s", + "other": "{count} aĂ©ronefs captĂ©s" + }, + "USB {rate} msg/s": "USB {rate} msg/s", + "{rate} msg/s": "{rate} msg/s", + "{count} feeds live": { + "one": "{count} flux en direct", + "many": "{count} de flux en direct", + "other": "{count} flux en direct" + }, + "{feed} {count} ({seconds}s old)": "{feed} {count} (il y a {seconds} s)", + "Street Level toggle failed": "Impossible d'activer ou de dĂ©sactiver Niveau rue", + "Street Level could not start": "Impossible de dĂ©marrer Niveau rue", + "SHRINK": "RÉDUIRE", + "EXPAND": "AGRANDIR", + "Shrink": "RĂ©duire", + "Expand": "Agrandir", + "ANY DATE": "TOUTES DATES", + "LAST 10 YEARS": "10 DERNIÈRES ANNÉES", + "LAST 5 YEARS": "5 DERNIÈRES ANNÉES", + "LAST 3 YEARS": "3 DERNIÈRES ANNÉES", + "LAST 2 YEARS": "2 DERNIÈRES ANNÉES", + "LAST YEAR": "12 DERNIERS MOIS", + "LAST 6 MONTHS": "6 DERNIERS MOIS", + "LAST 3 MONTHS": "3 DERNIERS MOIS", + "LAST MONTH": "30 DERNIERS JOURS", + "LAST {count} DAYS": { + "one": "{count} DERNIER JOUR", + "many": "{count} DERNIERS JOURS", + "other": "{count} DERNIERS JOURS" + }, + "{window} · SINCE {date}": "{window} · DEPUIS LE {date}", + "Turn Street Level off": "DĂ©sactiver Niveau rue", + "Turn Street Level on": "Activer Niveau rue", + "{name} imagery on": "Images {name} activĂ©es", + "{name} imagery off": "Images {name} dĂ©sactivĂ©es", + "Image by {creator}": "Image de {creator}", + " or ": " ou ", + "OPEN {labels}": "OUVRIR {labels}", + "Open {names} at the centre of the view": "Ouvrir {names} au centre de la vue", + "Zoom in to a street to open {names} here": "Zoomez sur une rue pour ouvrir {names} ici", + "Switch Street Level on to draw its coverage.": "Activez Niveau rue pour afficher sa couverture.", + "Every provider is switched off: light a chip to draw its coverage.": "Tous les fournisseurs sont dĂ©sactivĂ©s : activez-en un pour afficher sa couverture.", + "Loading this sequence
": "Chargement de cette sĂ©quence
", + "{n} images in this sequence · Esc clears": { + "one": "{n} image dans cette sĂ©quence · Esc pour effacer", + "many": "{n} d'images dans cette sĂ©quence · Esc pour effacer", + "other": "{n} images dans cette sĂ©quence · Esc pour effacer" + }, + "No sequences in view match the filter": "Aucune sĂ©quence dans la vue ne correspond au filtre", + "No coverage in view": "Aucune couverture dans la vue", + "{n} streets in view · click a line for its nearest photo": { + "one": "{n} rue dans la vue · cliquez sur une ligne pour sa photo la plus proche", + "many": "{n} de rues dans la vue · cliquez sur une ligne pour sa photo la plus proche", + "other": "{n} rues dans la vue · cliquez sur une ligne pour sa photo la plus proche" + }, + "{n} sequences in view · click a line for its nearest photo": { + "one": "{n} sĂ©quence dans la vue · cliquez sur une ligne pour sa photo la plus proche", + "many": "{n} de sĂ©quences dans la vue · cliquez sur une ligne pour sa photo la plus proche", + "other": "{n} sĂ©quences dans la vue · cliquez sur une ligne pour sa photo la plus proche" + }, + "{n} sequences in view · click a line for its photos": { + "one": "{n} sĂ©quence dans la vue · cliquez sur une ligne pour voir ses photos", + "many": "{n} de sĂ©quences dans la vue · cliquez sur une ligne pour voir ses photos", + "other": "{n} sĂ©quences dans la vue · cliquez sur une ligne pour voir ses photos" + }, + "km/h": "km/h", + "m/s": "m/s", + "mph": "mph", + "hPa": "hPa", + "kt": "nd", + "kts": "nd", + "ft": "ft", + "km": "km", + "m": "m", + "h": "h", + "min": "min", + "s": "s", + "dB": "dB", + "Celestial ring — reveal the full globe": "Anneau cĂ©leste — rĂ©vĂ©ler le globe entier", + "Celestial ring — available in Normal style": "Anneau cĂ©leste — disponible en style Normal", + "Detection overlay: {mode}": "Surcouche de dĂ©tection : {mode}", + "Detection overlay: off": "Surcouche de dĂ©tection : dĂ©sactivĂ©e", + "DETECT": "DÉTECT.", + "{time} · {minutes} min ago": "{time} · il y a {minutes} min", + "Active weather": "Couches mĂ©tĂ©o actives", + "LATEST · newest per product": "DERNIÈRE · la plus rĂ©cente par produit", + "Forecast · valid {valid} · issued {issued}": "PrĂ©vision · valide {valid} · Ă©mise {issued}", + "{detail} · Does not follow history": "{detail} · Ne suit pas l'historique", + "Forecast · valid {valid}": "PrĂ©vision · valide {valid}", + "voice|OFF": "OFF", + "voice|CONNECTING": "CONNEXION", + "voice|LISTENING": "ÉCOUTE", + "voice|EXECUTING": "EXÉCUTION", + "voice|ERROR": "ERREUR", + "Voice provider": "Fournisseur vocal", + "Changing provider reconnects voice if it is on.": "Changer de fournisseur reconnecte la voix si elle est activĂ©e.", + "Voice Settings": "ParamĂštres vocaux", + "AI AGENT": "AGENT IA", + "Voice model tier — applies next session": "Niveau du modĂšle vocal — Ă  la prochaine session", + "STD": "STD", + "Estimated session cost": "CoĂ»t estimĂ© de la session", + "Voice control — activate to toggle voice; hold Space to speak": "Commande vocale — activer/dĂ©sactiver ; maintenez Space pour parler", + "ON/OFF": "ON/OFF", + "VOICE STANDBY": "VOIX EN VEILLE", + "VOICE CONTROL": "COMMANDE VOCALE", + "Hold Space to speak · tap Space to activate focused controls": "Maintenez Space pour parler · appuyez sur Space pour activer la commande ciblĂ©e", + "VOICE": "VOIX", + "Preview": "Aperçu", + "Settings": "ParamĂštres", + "Close voice panel": "Fermer le panneau vocal", + "Voice replies appear here.": "Les rĂ©ponses vocales s'affichent ici.", + "Voice assistant": "Assistant vocal", + "Dismiss voice card": "Fermer la fiche vocale", + "YOU": "VOUS", + "THIS": "CECI", + "Plan": "Plan", + "Referenced items": "ÉlĂ©ments citĂ©s", + "NOTES & SOURCES": "NOTES ET SOURCES", + "Show Voice Preview": "Afficher l'aperçu vocal", + "Voice inactivity timeout": "DĂ©lai d'inactivitĂ© vocale", + "Minutes": "Minutes", + "Custom": "PersonnalisĂ©", + "These preferences stay in this browser.": "Ces prĂ©fĂ©rences restent dans ce navigateur.", + "VOICE SYSTEM ERROR": "ERREUR DU SYSTÈME VOCAL", + "DISMISS": "FERMER", + "Check microphone permission and network access, then try again.": "VĂ©rifiez l'autorisation du microphone et l'accĂšs rĂ©seau, puis rĂ©essayez.", + "Gemini returned an oversized audio chunk": "Gemini a renvoyĂ© un fragment audio trop volumineux", + "Gemini returned an unsupported audio format": "Gemini a renvoyĂ© un format audio non pris en charge", + "Gemini returned an invalid audio sample rate": "Gemini a renvoyĂ© une frĂ©quence d'Ă©chantillonnage audio non valide", + "Gemini returned incomplete PCM audio": "Gemini a renvoyĂ© un audio PCM incomplet", + "This browser does not support Gemini microphone audio": "Ce navigateur ne prend pas en charge l'audio du microphone pour Gemini", + "Microphone audio processing failed": "Échec du traitement de l'audio du microphone", + "Gemini audio playback fell behind. Reconnect to continue.": "La lecture audio de Gemini a pris du retard. Reconnectez-vous pour continuer.", + "Gemini token response did not include an ephemeral credential": "La rĂ©ponse de Gemini ne contenait pas d'identifiant temporaire", + "Invalid Gemini connection endpoint": "Point de connexion Gemini non valide", + "Gemini voice could not connect. Try again.": "Impossible de connecter la voix Gemini. RĂ©essayez.", + "Gemini voice requires a same-origin app request": "La voix Gemini exige une requĂȘte de l'application de mĂȘme origine", + "Add a Gemini API key in Provider Settings": "Ajoutez une clĂ© API Gemini dans les paramĂštres des fournisseurs", + "The Gemini Live model configuration is invalid": "La configuration du modĂšle Gemini Live n'est pas valide", + "Gemini voice is starting too often. Try again shortly.": "La voix Gemini dĂ©marre trop souvent. RĂ©essayez dans un instant.", + "Gemini quota is unavailable. Try again later.": "Le quota Gemini est indisponible. RĂ©essayez plus tard.", + "Gemini access was refused. Check the API key and model access.": "L'accĂšs Ă  Gemini a Ă©tĂ© refusĂ©. VĂ©rifiez la clĂ© API et l'accĂšs au modĂšle.", + "Gemini Live is unavailable for the configured model.": "Gemini Live n'est pas disponible pour le modĂšle configurĂ©.", + "Token request is too large": "La demande de jeton est trop volumineuse", + "Use an empty JSON token request": "Utilisez une demande de jeton avec un objet JSON vide", + "Release Space to send": "RelĂąchez Space pour envoyer", + "Hold Space to talk": "Maintenez Space pour parler", + "Voice command context is too large": "Le contexte de la commande vocale est trop volumineux", + "Gemini reliable transport exceeded its queue limit. Start voice again.": "La file d'envoi fiable de Gemini a dĂ©passĂ© sa limite. Relancez la voix.", + "Gemini reliable transport did not drain. Start voice again.": "La file d'envoi fiable de Gemini ne s'est pas vidĂ©e. Relancez la voix.", + "Gemini token request failed (HTTP {status})": "Échec de la demande de jeton Gemini (HTTP {status})", + "Gemini token response did not include a valid model": "La rĂ©ponse de Gemini ne contenait pas de modĂšle valide", + "Gemini token response did not include session settings": "La rĂ©ponse de Gemini ne contenait pas les paramĂštres de session", + "Gemini session settings do not match the input mode": "Les paramĂštres de session Gemini ne correspondent pas au mode de saisie", + "Requesting microphone": "Demande d'accĂšs au microphone", + "Gemini could not submit this input. Start voice again.": "Gemini n'a pas pu envoyer cette saisie. Relancez la voix.", + "Connecting to Gemini": "Connexion Ă  Gemini", + "Ask or command": "Question ou commande", + "Gemini returned an oversized message": "Gemini a renvoyĂ© un message trop volumineux", + "Gemini Live connection failed. Check network access, then start voice again.": "Échec de la connexion Ă  Gemini Live. VĂ©rifiez l'accĂšs au rĂ©seau, puis relancez la voix.", + "Gemini Live connection ended. Start voice again for a new conversation.": "La connexion Ă  Gemini Live est terminĂ©e. Relancez la voix pour une nouvelle conversation.", + "Gemini Live could not start. Start voice again to request a fresh session.": "Gemini Live n'a pas pu dĂ©marrer. Relancez la voix pour demander une nouvelle session.", + "Start voice again for a fresh token and a new conversation.": "Relancez la voix pour obtenir un nouveau jeton et dĂ©marrer une nouvelle conversation.", + "Start voice again to request a fresh session credential.": "Relancez la voix pour demander un nouvel identifiant de session.", + "Microphone permission was denied. Allow microphone access and try again.": "L'autorisation du microphone a Ă©tĂ© refusĂ©e. Autorisez l'accĂšs au microphone et rĂ©essayez.", + "Gemini connection timed out. Try again.": "DĂ©lai de connexion Ă  Gemini dĂ©passĂ©. RĂ©essayez.", + "Gemini voice could not start": "Impossible de dĂ©marrer la voix Gemini", + "Gemini did not finish the interrupted reply. Start voice again.": "Gemini n'a pas terminĂ© la rĂ©ponse interrompue. Relancez la voix.", + "Gemini session expiring; finishing the current reply": "La session Gemini expire ; fin de la rĂ©ponse en cours", + "Gemini rejected the voice session. Start voice again to request a fresh session.": "Gemini a refusĂ© la session vocale. Relancez la voix pour demander une nouvelle session.", + "Start voice again for a fresh session credential. If it repeats, check Gemini model and API access.": "Relancez la voix pour obtenir un nouvel identifiant de session. Si cela se reproduit, vĂ©rifiez le modĂšle Gemini et l'accĂšs Ă  l'API.", + "Gemini action history is full. Start voice again for a fresh session.": "L'historique des actions de Gemini est plein. Relancez la voix pour une nouvelle session.", + "Gemini requested too many simultaneous actions": "Gemini a demandĂ© trop d'actions simultanĂ©es", + "Running command": "Commande en cours", + "Voice text command is too long": "La commande Ă©crite est trop longue", + "Gemini voice is not connected": "La voix Gemini n'est pas connectĂ©e", + "Gemini interrupted input exceeded its buffer or wait limit. Start voice again.": "La saisie interrompue de Gemini a dĂ©passĂ© sa limite de tampon ou d'attente. Relancez la voix.", + "Gemini Live connection is expiring. Start voice again for a new conversation.": "La connexion Ă  Gemini Live expire. Relancez la voix pour une nouvelle conversation.", + "Voice off": "Voix dĂ©sactivĂ©e", + "Gemini voice sessions have a time limit. When a session expires, start voice again for a new conversation.": "Les sessions vocales Gemini sont limitĂ©es dans le temps. Quand une session expire, relancez la voix pour une nouvelle conversation.", + "Stopped by voice": "ArrĂȘtĂ© par la voix", + "Automatic stop is unavailable for this voice connection.": "L'arrĂȘt automatique n'est pas disponible pour cette connexion vocale.", + "Preview is off.": "L'aperçu est dĂ©sactivĂ©.", + "Your choice applies now, but could not be saved.": "Votre choix s'applique maintenant, mais n'a pas pu ĂȘtre enregistrĂ©.", + "WebRTC microphone support unavailable": "Microphone WebRTC non pris en charge", + "VOICE UNAVAILABLE": "VOIX INDISPONIBLE", + "VOICE ACTIVE": "VOIX ACTIVE", + "Voice session could not be started.": "Impossible de dĂ©marrer la session vocale.", + "MINI": "MINI", + "Next session: {pendingId} — this session stays on {modelId}": "Prochaine session : {pendingId} — cette session reste sur {modelId}", + "Voice model: {pendingId} — click to switch to {target}; applies next session": "ModĂšle vocal : {pendingId} — cliquer pour passer Ă  {target} ; Ă  la prochaine session", + "standard": "standard", + "mini": "mini", + "COST UNKNOWN": "COÛT INCONNU", + "ChatGPT OAuth session: {responses} response(s), {input} input and {output} output tokens, {captions} caption transcription(s) reported.": "Session OAuth ChatGPT (donnĂ©es signalĂ©es) : {responses} rĂ©ponse(s), {input} jetons d'entrĂ©e et {output} jetons de sortie, {captions} transcription(s) de sous-titres.", + "USD cost and the API spend cap are unavailable for this auth mode.": "Le coĂ»t en USD et le plafond de dĂ©penses API ne sont pas disponibles avec ce mode d'authentification.", + "Usage is incomplete because a response was still in flight when the session ended.": "L'utilisation est incomplĂšte, car une rĂ©ponse Ă©tait encore en cours Ă  la fin de la session.", + "Estimated session cost on {modelId} — {responses} response(s). Warns at {warn}, ends the session at {cap}.": "CoĂ»t estimĂ© de la session sur {modelId} — {responses} rĂ©ponse(s). Alerte Ă  {warn}, fin de session Ă  {cap}.", + "Estimate is incomplete — a response was still in flight when the session ended, so its usage was never reported.": "L'estimation est incomplĂšte — une rĂ©ponse Ă©tait encore en cours Ă  la fin de la session, son utilisation n'a donc jamais Ă©tĂ© signalĂ©e.", + "STANDARD": "STANDARD", + "{tier} applies next session": "{tier} Ă  la prochaine session", + "Session ended — cost cap {cost}": "Session terminĂ©e — plafond de coĂ»t {cost}", + "MIC": "MIC", + "Radio did not start": "La radio n'a pas dĂ©marrĂ©", + "{n} aircraft": { + "one": "{n} aĂ©ronef", + "many": "{n} d'aĂ©ronefs", + "other": "{n} aĂ©ronefs" + }, + "{n} military aircraft": { + "one": "{n} aĂ©ronef militaire", + "many": "{n} d'aĂ©ronefs militaires", + "other": "{n} aĂ©ronefs militaires" + }, + "{n} ships": { + "one": "{n} navire", + "many": "{n} de navires", + "other": "{n} navires" + }, + "{n} satellites": { + "one": "{n} satellite", + "many": "{n} de satellites", + "other": "{n} satellites" + }, + "{n} launches": { + "one": "{n} lancement", + "many": "{n} de lancements", + "other": "{n} lancements" + }, + "{n} earthquakes": { + "one": "{n} sĂ©isme", + "many": "{n} de sĂ©ismes", + "other": "{n} sĂ©ismes" + }, + "{n} fires": { + "one": "{n} feu", + "many": "{n} de feux", + "other": "{n} feux" + }, + "{n} fire perimeters": { + "one": "{n} pĂ©rimĂštre d'incendie", + "many": "{n} de pĂ©rimĂštres d'incendie", + "other": "{n} pĂ©rimĂštres d'incendie" + }, + "{n} cyclones": { + "one": "{n} cyclone", + "many": "{n} de cyclones", + "other": "{n} cyclones" + }, + "{n} buses": { + "one": "{n} bus", + "many": "{n} de bus", + "other": "{n} bus" + }, + "{n} bike share": { + "one": "{n} station de vĂ©los partagĂ©s", + "many": "{n} de stations de vĂ©los partagĂ©s", + "other": "{n} stations de vĂ©los partagĂ©s" + }, + "{n} flock cameras": { + "one": "{n} camĂ©ra LAPI", + "many": "{n} de camĂ©ras LAPI", + "other": "{n} camĂ©ras LAPI" + }, + "{n} military bases": { + "one": "{n} base militaire", + "many": "{n} de bases militaires", + "other": "{n} bases militaires" + }, + "{n} datacenters": { + "one": "{n} centre de donnĂ©es", + "many": "{n} de centres de donnĂ©es", + "other": "{n} centres de donnĂ©es" + }, + "{n} dams": { + "one": "{n} barrage", + "many": "{n} de barrages", + "other": "{n} barrages" + }, + "{n} air quality": { + "one": "{n} station de qualitĂ© de l'air", + "many": "{n} de stations de qualitĂ© de l'air", + "other": "{n} stations de qualitĂ© de l'air" + }, + "{n} results": { + "one": "{n} rĂ©sultat", + "many": "{n} de rĂ©sultats", + "other": "{n} rĂ©sultats" + }, + "anywhere in the loaded data": "dans toutes les donnĂ©es chargĂ©es", + "in view": "dans la vue", + "within {radius} of the view centre": "dans un rayon de {radius} autour du centre de la vue", + "within {radius} of {place} (Contacts window)": "dans un rayon de {radius} autour de {place} (fenĂȘtre Contacts)", + "within {radius} of {place}": "dans un rayon de {radius} autour de {place}", + "within {radius}": "dans un rayon de {radius}", + "over {region}": "au-dessus de {region}", + "At least {items}": "Au moins {items}", + "{items} {scope}": "{items} {scope}", + "last 24 h": "derniĂšres 24 h", + "past 30 d and upcoming": "30 derniers jours et Ă  venir", + "the flights layer loads by viewport": "la couche des vols se charge selon la vue", + "distance is ground distance, not overhead": "la distance est mesurĂ©e au sol jusqu'au point subsatellite, pas jusqu'au satellite", + "the count is a lower bound because at least one layer reached its retained limit.": "le dĂ©compte est un minimum, car au moins une couche a atteint sa limite de rĂ©tention.", + "{label} off": "Couche dĂ©sactivĂ©e : {label}", + "{label} loading": "{label} : chargement", + "{label} error": "{label} : erreur", + "counted the first {returned} loaded records": "{returned} premiers enregistrements chargĂ©s comptĂ©s", + "counted {returned} of {total} loaded records": "{returned} enregistrements chargĂ©s comptĂ©s sur {total}", + "{layers} just turned on — still loading, counts will rise": "{layers} : activation rĂ©cente — chargement en cours, les dĂ©comptes vont augmenter", + "Contacts panel snapshot at {time} — the same retained cohort supplies the card, speech, and follow-up memory": "InstantanĂ© du panneau Contacts ({time}) — le mĂȘme groupe retenu alimente la fiche, la voix et la mĂ©moire de suivi", + "Contacts panel snapshot — the same retained cohort supplies the card, speech, and follow-up memory": "InstantanĂ© du panneau Contacts — le mĂȘme groupe retenu alimente la fiche, la voix et la mĂ©moire de suivi", + "Fly below {km} km to a covered region": "Descendez sous {km} km au-dessus d'une rĂ©gion couverte", + "No feed here yet · {n} regions available": { + "one": "Pas encore de flux ici · {n} rĂ©gion disponible", + "many": "Pas encore de flux ici · {n} de rĂ©gions disponibles", + "other": "Pas encore de flux ici · {n} rĂ©gions disponibles" + }, + "degraded": "dĂ©gradĂ©", + "stale": "obsolĂšte", + "partial": "partiel", + "fallback": "secours", + "unavailable": "indisponible", + "Not answered: {layers}": "Sans rĂ©ponse : {layers}", + "Toggle voice control": "Activer/dĂ©sactiver la commande vocale", + "Activate to toggle voice": "Activer/dĂ©sactiver la commande vocale", + "Voice active": "Voix active", + "Voice could not be started.": "Impossible de dĂ©marrer la voix.", + "the active voice session": "la session vocale active", + "{value} feet": "{value} pieds", + "Fire · FRP {frp} MW": "Feu · FRP {frp} MW", + "The flights layer is not enabled": "La couche des vols n'est pas activĂ©e", + "The military layer is not enabled": "La couche des vols militaires n'est pas activĂ©e", + "The satellites layer is not enabled": "La couche des satellites n'est pas activĂ©e", + "The ais-live-vessels layer is not enabled": "La couche des navires AIS n'est pas activĂ©e", + "Could not enable the requested layer": "Impossible d'activer la couche demandĂ©e", + "Could not disable the requested layer": "Impossible de dĂ©sactiver la couche demandĂ©e", + "Radio layer unavailable": "Couche radio indisponible", + "Camera navigation is unavailable in the current view": "La navigation de la camĂ©ra n'est pas disponible dans la vue actuelle", + "Camera navigation policy unavailable": "RĂšgle de navigation de la camĂ©ra indisponible", + "Nearest-aircraft selection supports Flights or Military Flights only": "La sĂ©lection de l'aĂ©ronef le plus proche ne fonctionne qu'avec Vols ou Vols militaires", + "Nearest-aircraft selection needs a preset, place name, or latitude and longitude": "La sĂ©lection de l'aĂ©ronef le plus proche nĂ©cessite un prĂ©rĂ©glage, un nom de lieu ou une latitude et une longitude", + "Could not arrive at the requested place": "Impossible d'atteindre le lieu demandĂ©", + "The nearest airborne aircraft could not be selected": "Impossible de sĂ©lectionner l'aĂ©ronef en vol le plus proche", + "No flights within {radius} of the current view": "Aucun vol dans un rayon de {radius} autour de la vue actuelle", + "No military within {radius} of the current view": "Aucun vol militaire dans un rayon de {radius} autour de la vue actuelle", + "No satellites within {radius} of the current view": "Aucun satellite dans un rayon de {radius} autour de la vue actuelle", + "No vessels within {radius} of the current view": "Aucun navire dans un rayon de {radius} autour de la vue actuelle", + "{layer} is enabled on the {source} feed, but no airborne aircraft is loaded in the {place} view yet": "La couche {layer} est activĂ©e sur le flux {source}, mais aucun aĂ©ronef en vol n'est encore chargĂ© dans la vue {place}", + "{layer} is enabled, but no airborne aircraft is loaded in the {place} view yet": "La couche {layer} est activĂ©e, mais aucun aĂ©ronef en vol n'est encore chargĂ© dans la vue {place}", + "{layer} is enabled, but its aircraft feed is unavailable": "La couche {layer} est activĂ©e, mais son flux d'aĂ©ronefs est indisponible", + "{layer} is enabled, but its destination refresh did not complete": "La couche {layer} est activĂ©e, mais son actualisation Ă  destination ne s'est pas terminĂ©e", + "{layer} is enabled, but {source} is unavailable": "La couche {layer} est activĂ©e, mais {source} est indisponible", + "Could not arrive at {place}": "Impossible d'atteindre {place}", + "{name} is no longer loaded": "{name} n'est plus chargĂ©", + "Unknown target layer: {target}": "Couche cible inconnue : {target}", + "nominal": "nominal", + "{label} on": "Couche activĂ©e : {label}", + "Frame aircraft": "Cadrer les aĂ©ronefs", + "Frame military aircraft": "Cadrer les aĂ©ronefs militaires", + "Frame ships": "Cadrer les navires", + "Frame satellites": "Cadrer les satellites", + "Frame contacts": "Cadrer les contacts", + "{count} aircraft in frame": { + "one": "{count} aĂ©ronef dans le cadre", + "many": "{count} d'aĂ©ronefs dans le cadre", + "other": "{count} aĂ©ronefs dans le cadre" + }, + "{count} military aircraft in frame": { + "one": "{count} aĂ©ronef militaire dans le cadre", + "many": "{count} d'aĂ©ronefs militaires dans le cadre", + "other": "{count} aĂ©ronefs militaires dans le cadre" + }, + "{count} ships in frame": { + "one": "{count} navire dans le cadre", + "many": "{count} de navires dans le cadre", + "other": "{count} navires dans le cadre" + }, + "{count} satellites in frame": { + "one": "{count} satellite dans le cadre", + "many": "{count} de satellites dans le cadre", + "other": "{count} satellites dans le cadre" + }, + "{count} contacts in frame": { + "one": "{count} contact dans le cadre", + "many": "{count} de contacts dans le cadre", + "other": "{count} contacts dans le cadre" + }, + "Nearest military aircraft": "AĂ©ronefs militaires les plus proches", + "Nearest ships": "Navires les plus proches", + "Nearest satellites": "Satellites les plus proches", + "Nearest aircraft": "AĂ©ronefs les plus proches", + "{first} and {second}": "{first} et {second}", + "Layer": "Couche", + "there": "lĂ ", + "Camera range {range}": "Distance de la camĂ©ra {range}", + "Within {radius} of the view": "Dans un rayon de {radius} autour de la vue", + "Labels on": "Étiquettes activĂ©es", + "Framing uses the nearest 80 loaded contacts": "Le cadrage utilise les 80 contacts chargĂ©s les plus proches", + "{distance} from {location}": "À {distance} de {location}", + "Altitude {altitude}": "Altitude {altitude}", + "{origin} to {destination}": "De {origin} Ă  {destination}", + "from {origin}": "depuis {origin}", + "to {destination}": "vers {destination}", + "Registration {registration}": "Immatriculation {registration}", + "View state": "État de la vue", + "Marked {count} places": { + "one": "{count} lieu marquĂ©", + "many": "{count} de lieux marquĂ©s", + "other": "{count} lieux marquĂ©s" + }, + "Nothing marked": "Rien de marquĂ©", + "Not found: {places}": "Introuvable : {places}", + "Tracing outlines": "TracĂ© des contours", + "Frame flights": "Cadrer les vols", + "Frame military": "Cadrer les vols militaires", + "Frame vessels": "Cadrer les navires", + "Frame {target}": "Cadrer {target}", + "Zoom out to globe": "DĂ©zoomer jusqu'au globe", + "Open data layers": "Ouvrir les couches de donnĂ©es", + "Open or close a panel": "Ouvrir ou fermer un panneau", + "Change context mode": "Changer le mode de contexte", + "Control cockpit": "Piloter le cockpit", + "Change visual style": "Changer le style visuel", + "Adjust HUD": "RĂ©gler le HUD", + "Adjust cyber sonar": "RĂ©gler le sonar Cyber", + "Adjust detection overlay": "RĂ©gler la surcouche de dĂ©tection", + "Change map stack": "Changer de fond de carte", + "Adjust post-processing": "RĂ©gler le post-traitement", + "Control scene": "Piloter la scĂšne", + "Control CCTV": "Piloter les camĂ©ras CCTV", + "Control radio": "Piloter la radio", + "Track contact": "Suivre le contact", + "Stop tracking": "ArrĂȘter le suivi", + "Clear marks": "Effacer les marques", + "Move camera": "DĂ©placer la camĂ©ra", + "Fly route": "Survoler l'itinĂ©raire", + "Analyst query": "RequĂȘte d'analyse", + "Next ISS pass": "Prochain passage de l'ISS", + "Next satellite pass": "Prochain passage du satellite", + "Mark the map": "Marquer la carte", + "Mark {targets} +{more}": "Marquer : {targets} +{more}", + "Mark {targets}": "Marquer : {targets}", + "Fly to {place}": "Rejoindre {place}", + "Fly to Location": "Rejoindre le lieu", + "Nearest aircraft to {place}": "AĂ©ronef le plus proche de {place}", + "Nearest aircraft to Here": "AĂ©ronef le plus proche d'ici", + "Layer on": "Couche : activĂ©e", + "Layer off": "Couche : dĂ©sactivĂ©e", + "Zoom out": "DĂ©zoomer", + "Zoom in": "Zoomer", + "Read the view": "Lire la vue", + "Check view state": "VĂ©rifier l'Ă©tat de la vue", + "Action": "Action", + "Finding places": "Recherche de lieux", + "Tracing outline": "TracĂ© du contour", + "Looking up place": "Recherche du lieu", + "Flying": "En vol", + "Turning on layer": "Activation de la couche", + "Loading aircraft": "Chargement des aĂ©ronefs", + "Picking nearest": "Choix du plus proche", + "Working": "En cours", + "in progress": "en cours", + "done": "terminĂ©", + "failed": "Ă©chec", + "cancelled": "annulĂ©", + "Outline traced": "Contour tracĂ©", + "Outline unavailable": "Contour indisponible", + "Source: {label}": "Source : {label}", + "WORKING": "EN COURS", + "DONE": "TERMINÉ", + "Recent speech": "Propos rĂ©cents", + "HERE": "ICI", + "Aircraft cockpit view": "Vue cockpit de l'aĂ©ronef", + "LEVEL": "HORIZON", + "Estimated destination direction": "Direction estimĂ©e de la destination", + "DEST ---°": "DEST ---°", + "OPTICAL PLANE · 01": "PLAN OPTIQUE · 01", + "VISOR LOCK · ACTIVE": "VERROU VISIÈRE · ACTIF", + "GROUND SPEED · KTS": "VITESSE SOL · ND", + "ALTITUDE · FT": "ALTITUDE · FT", + "FIRST PERSON": "PREMIÈRE PERSONNE", + "LIVE TRACK · COURSE ALIGNED": "PISTE EN DIRECT · ALIGNÉ SUR LA ROUTE", + "Cockpit vision style": "Style de vision du cockpit", + "Previous cockpit vision style": "Style de vision prĂ©cĂ©dent du cockpit", + "Previous vision style": "Style de vision prĂ©cĂ©dent", + "Current cockpit vision style: NORMAL. Activate for next style.": "Style de vision actuel du cockpit : NORMAL. Activer pour le style suivant.", + "Current style: NORMAL — click for next": "Style actuel : NORMAL — cliquer pour le suivant", + "CURRENT": "ACTUEL", + "Next cockpit vision style": "Style de vision suivant du cockpit", + "Next vision style": "Style de vision suivant", + "Current aircraft heading": "Cap actuel de l'aĂ©ronef", + "GROUND SPEED": "VITESSE SOL", + "KTS": "ND", + "ALTITUDE": "ALTITUDE", + "FT": "FT", + "Contact cockpit summary": "RĂ©sumĂ© cockpit du contact", + "CONTACT": "CONTACT", + "CONTACTS · 250 KM": "CONTACTS · 250 KM", + "Contact navigation": "Navigation des contacts", + "CONTEXT ONLY": "CONTEXTE SEULEMENT", + "Nearby cohort counts": "Nombre de contacts par groupe Ă  proximitĂ©", + "FLT": "VOLS", + "MIL": "MIL", + "SITE": "SITES", + "NEAREST OBSERVED / MAPPED": "PLUS PROCHE OBSERVÉ / CARTOGRAPHIÉ", + "AVAILABLE INPUTS ONLY · NOT AN ALL-CLEAR": "ENTRÉES DISPONIBLES SEULEMENT · PAS UN FEU VERT", + "WX": "MÉTÉO", + "Cockpit briefing carousel": "Carrousel de briefing du cockpit", + "Estimated flight plan": "Plan de vol estimĂ©", + "ESTIMATED FLIGHT PLAN": "PLAN DE VOL ESTIMÉ", + "FROM": "DE", + "TO": "VERS", + "Cockpit briefing controls": "Commandes du briefing du cockpit", + "Previous briefing page": "Page de briefing prĂ©cĂ©dente", + "Next briefing page": "Page de briefing suivante", + "Live signals": "Signaux en direct", + "Latest regional news": "DerniĂšres actualitĂ©s rĂ©gionales", + "Location-based information": "Informations selon le lieu", + "TEMP": "TEMP", + "WIND": "VENT", + "SKY": "CIEL", + "PRECIP": "PRÉCIP", + "MM": "MM", + "Weather data by Open-Meteo.com": "DonnĂ©es mĂ©tĂ©o d'Open-Meteo.com", + "Cockpit briefing pages": "Pages du briefing du cockpit", + "SIG": "SIG", + "Show Live Signals": "Afficher les signaux en direct", + "NEWS": "ACTUS", + "Show Regional News": "Afficher les actus rĂ©gionales", + "LOCAL": "LOCAL", + "Show Local Info": "Afficher les infos locales", + "Cockpit display and Radio controls": "Commandes d'affichage et de Radio du cockpit", + "DISPLAY": "AFFICHAGE", + "Cockpit display options": "Options d'affichage du cockpit", + "RADIO": "RADIO", + "Cockpit compact Radio controls": "Commandes Radio compactes du cockpit", + "Previous filtered radio station": "Station radio filtrĂ©e prĂ©cĂ©dente", + "Play selected radio station": "Écouter la station radio sĂ©lectionnĂ©e", + "Next filtered radio station": "Station radio filtrĂ©e suivante", + "VOLUME": "VOLUME", + "Cockpit Radio volume": "Volume de la Radio du cockpit", + "ESC EXIT": "ESC QUITTER", + "C TOGGLE": "C BASCULER", + "View switcher": "SĂ©lecteur de vue", + "Exit cockpit and return to full globe view": "Quitter le cockpit et revenir Ă  la vue du globe entier", + "RESET": "RÉINIT.", + "Exit cockpit view": "Quitter la vue cockpit", + "EXIT COCKPIT": "QUITTER LE COCKPIT", + "Navigation, voice, and visual preset controls": "Commandes de navigation, de voix et de prĂ©rĂ©glages visuels", + "Expand Visual Presets": "DĂ©velopper les prĂ©rĂ©glages visuels", + "Pin visual presets": "Épingler les prĂ©rĂ©glages visuels", + "Keep visual presets open": "Garder les prĂ©rĂ©glages visuels ouverts", + "Show the globe without a visual filter.": "Afficher le globe sans filtre visuel.", + "Emulate a green phosphor CRT with scanlines and screen curvature.": "Émuler un Ă©cran CRT Ă  phosphore vert avec lignes de balayage et courbure d'Ă©cran.", + "Simulate night-vision goggles with green intensification and a tube vignette.": "Simuler des jumelles de vision nocturne avec intensification verte et vignettage du tube.", + "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "Simuler un contraste thermique de type FLIR. Montez Ironbow pour la couleur.", + "Apply bright cel-shaded color and illustrated outlines.": "Appliquer des couleurs vives en cel-shading et des contours illustrĂ©s.", + "Apply high-contrast monochrome film-noir grading.": "Appliquer un Ă©talonnage film noir monochrome Ă  fort contraste.", + "MAP SOURCE": "SOURCE CARTE", + "Map source": "Source de la carte", + "Style": "Style", + "Expand LOCATION": "DĂ©velopper LIEU", + "Collapse panel": "RĂ©duire le panneau", + "Pin location tray": "Épingler le tiroir des lieux", + "Keep location tray open": "Garder le tiroir des lieux ouvert", + "Search any location": "Rechercher n'importe quel lieu", + "Search location by name or coordinates": "Rechercher un lieu par nom ou coordonnĂ©es", + "Search any location...": "Rechercher un lieu
", + "WEATHER": "MÉTÉO", + "Active weather products": "Produits mĂ©tĂ©o actifs", + "RECENT IMAGERY": "IMAGERIE RÉCENTE", + "Imagery days in the box": "Jours d'imagerie dans la zone", + "CONTEXT": "CONTEXTE", + "Expand panel": "DĂ©velopper le panneau", + "Context mode": "Mode de contexte", + "CONTACTS": "CONTACTS", + "Cycles the nearest contacts of whatever type you select — planes, vessels, installations. Satellites track independently.": "Parcourt les contacts les plus proches du type sĂ©lectionnĂ© — avions, navires, installations. Les satellites sont suivis sĂ©parĂ©ment.", + "SPACE MISSIONS": "MISSIONS SPATIALES", + "SELECT CONTEXT": "CHOISIR UN CONTEXTE", + "Contact Context actions": "Actions du contexte Contact", + "COCKPIT": "COCKPIT", + "SEARCH NEARBY SITES": "CHERCHER SITES PROCHES", + "Reclassify tracked contact as TR-3B": "Reclasser le contact suivi en TR-3B", + "CONTACTS CONTEXT OFF": "CONTEXTE CONTACTS DÉSACTIVÉ", + "SELECT CONTACTS TO LOAD OBSERVED / MAPPED PROXIMITY": "CHOISIR CONTACTS POUR VOIR LES CONTACTS PROCHES OBSERVÉS / CARTOGRAPHIÉS", + "Available Space Missions": "Missions spatiales disponibles", + "AVAILABLE MISSIONS": "MISSIONS DISPONIBLES", + "SELECT A MISSION TO INSPECT": "CHOISIR UNE MISSION À EXAMINER", + "LOADING 30-DAY MISSION INDEX": "CHARGEMENT DE L'INDEX DES MISSIONS À 30 JOURS", + "TAB PREVIEWS · ENTER / SPACE SELECTS": "TAB APERÇU · ENTER / SPACE SÉLECTIONNE", + "Internet radio and local SDR": "Radio Internet et SDR local", + "STATION TAG": "TAG DE STATION", + "Filter stations by station tag": "Filtrer les stations par tag de station", + "All": "Tous", + "Enable Radio, then choose a globe marker or use next.": "Activez la Radio, puis choisissez un marqueur sur le globe ou utilisez SUIV.", + "DRAG TO TUNE": "GLISSER POUR RÉGLER", + "Tune available internet radio stations": "RĂ©gler sur une station de radio Internet disponible", + "ALL · DRAG THE NEEDLE": "TOUTES · DÉPLACER L'AIGUILLE", + "SNAPS TO AVAILABLE STATIONS": "SE CALE SUR LES STATIONS DISPONIBLES", + "Radio playback": "Lecture radio", + "Previous filtered station": "Station filtrĂ©e prĂ©cĂ©dente", + "Play selected station": "Écouter la station sĂ©lectionnĂ©e", + "Next filtered station": "Station filtrĂ©e suivante", + "STOP": "ARRÊT", + "Stop radio playback": "ArrĂȘter la lecture radio", + "Radio volume": "Volume de la radio", + "STATION SITE": "SITE DE LA STATION", + "DIRECTORY: RADIO BROWSER": "ANNUAIRE : RADIO BROWSER", + "Audio connects directly to the broadcaster after you press play. Your IP is visible to that broadcaster.": "Le flux audio se connecte directement au diffuseur dĂšs que vous lancez la lecture. Votre IP est visible par ce diffuseur.", + "Local RTL-SDR receiver": "RĂ©cepteur RTL-SDR local", + "LOCAL RTL-SDR": "RTL-SDR LOCAL", + "Chrome/Edge · WebUSB · one local tuner shared by FM and the Local ADS-B layer.": "Chrome/Edge · WebUSB · un seul tuner local partagĂ© entre la FM et la couche ADS-B local.", + "Use your location for faster ADS-B position decoding": "Utiliser votre position pour dĂ©coder plus vite les positions ADS-B", + "CHANGE DEVICE": "CHANGER", + "Choose a different RTL-SDR or receiver channel": "Choisir un autre RTL-SDR ou un autre canal du rĂ©cepteur", + "RTL-SDR receiver mode": "Mode du rĂ©cepteur RTL-SDR", + "GAIN": "GAIN", + "RTL-SDR tuner gain for the current mode": "Gain du tuner RTL-SDR pour le mode actuel", + "AUTO": "AUTO", + "MSG/S": "MSG/S", + "HEARD": "CAPTÉS", + "POSITIONED": "POSITIONNÉS", + "FM MHZ": "FM MHZ", + "TUNE": "RÉGLER", + "Seek broadcast FM stations": "Rechercher des stations FM", + "◀ SEEK": "◀ RECH.", + "SEEK ▶": "RECH. ▶", + "SDR VOL": "VOL. SDR", + "Local SDR volume": "Volume du SDR local", + "Intelligence HUD (H)": "HUD de renseignement (H)", + "Layout": "Disposition", + "HUD layout": "Disposition du HUD", + "Tactical": "Tactique", + "Minimal": "Minimal", + "Cyber": "Cyber", + "Sonar": "Sonar", + "Cyber sonar contact scanner": "Scanner de contacts du sonar Cyber", + "Rings": "Anneaux", + "Sonar ring count": "Nombre d'anneaux du sonar", + "Range": "PortĂ©e", + "Sonar ring range": "PortĂ©e des anneaux du sonar", + "Power": "Puissance", + "Sonar intensity": "IntensitĂ© du sonar", + "Opacity": "OpacitĂ©", + "Cyber contact and label opacity": "OpacitĂ© des contacts et Ă©tiquettes Cyber", + "Minimum opacity for map dots, icons, models, brackets, and labels between sonar passes": "OpacitĂ© minimale des points, icĂŽnes, modĂšles, cadres de ciblage et Ă©tiquettes de la carte entre deux balayages du sonar", + "Sector": "Secteur", + "Sonar sector width": "Largeur du secteur du sonar", + "Detection Overlay (D)": "Surcouche de dĂ©tection (D)", + "Detection overlay": "Surcouche de dĂ©tection", + "Detection label density": "DensitĂ© des Ă©tiquettes de dĂ©tection", + "Allocation": "Allocation", + "Detection label allocation": "Allocation des Ă©tiquettes de dĂ©tection", + "Elastic": "Élastique", + "Weighted": "PondĂ©rĂ©e", + "Fade": "Fondu", + "Detection fade distance": "Distance de fondu de la dĂ©tection", + "World-overlay fade distance outside the keyhole as a percentage of its radius": "Distance de fondu de la surcouche hors de l'ouverture, en pourcentage de son rayon", + "Outside": "ExtĂ©rieur", + "Detection opacity outside the keyhole": "OpacitĂ© de la dĂ©tection hors de l'ouverture", + "World-overlay label and card opacity beyond the fade distance": "OpacitĂ© des Ă©tiquettes et fiches de la surcouche au-delĂ  de la distance de fondu", + "PARAMETERS": "PARAMÈTRES", + "3D aircraft — flat icons zoomed out, 3D models up close": "AĂ©ronefs 3D — icĂŽnes plates de loin, modĂšles 3D de prĂšs", + "Models": "ModĂšles", + "3D model coverage": "Couverture des modĂšles 3D", + "Proximity": "ProximitĂ©", + "Scope — the circular viewport mask": "Lunette — le masque circulaire de la vue", + "Scope": "Lunette", + "Feather": "Adouci", + "Scope edge feather": "Adoucissement du bord de la lunette", + "Scope edge feather as a percentage of the keyhole radius": "Adoucissement du bord de la lunette, en pourcentage du rayon de l'ouverture", + "Draw on the world — click vertices, double-click or Enter to finish, Esc to cancel": "Dessinez sur le monde — cliquez sur les sommets, double-clic ou Enter pour terminer, Esc pour annuler", + "Shape": "Forme", + "Shape to draw": "Forme Ă  dessiner", + "Area": "Zone", + "Line": "Ligne", + "Pin": "Épingle", + "Label (optional)": "Étiquette (facultative)", + "Label for the drawn shape": "Étiquette de la forme dessinĂ©e", + "Colour of the drawn shape": "Couleur de la forme dessinĂ©e", + "Primary": "Principale", + "Amber": "Ambre", + "Cyan": "Cyan", + "Green": "Vert", + "Red": "Rouge", + "Clear": "Effacer", + "Remove every mark from the board": "Retirer toutes les marques du tableau", + "Show your own GeoJSON, KML, KMZ or GPX files on the globe (or drop them onto it). File bytes stay on this device; overlays can appear in map screenshots shared with voice.": "Affichez vos propres fichiers GeoJSON, KML, KMZ ou GPX sur le globe (ou dĂ©posez-les dessus). Les fichiers restent sur cet appareil ; les surcouches peuvent apparaĂźtre dans les captures de carte partagĂ©es avec la voix.", + "Import": "Importer", + "Choose GeoJSON, KML, KMZ or GPX files": "Choisir des fichiers GeoJSON, KML, KMZ ou GPX", + "Imported files": "Fichiers importĂ©s", + "Celestial": "CĂ©leste", + "Hide UI chrome": "Masquer l'interface", + "Clean UI": "Vue Ă©purĂ©e", + "Bloom / Glow": "Bloom / Lueur", + "Bloom intensity": "IntensitĂ© du bloom", + "Sharpening": "NettetĂ©", + "Sharpen": "NettetĂ©", + "Sharpen intensity": "IntensitĂ© de la nettetĂ©", + "EXIT CLEAN VIEW": "QUITTER LA VUE ÉPURÉE", + "Return UI controls": "RĂ©tablir les commandes de l'interface", + "Initializing photorealistic world...": "Initialisation du monde photorĂ©aliste
", + "DATA LAYERS": "COUCHES", + "ACQUIRING FRAME": "ACQUISITION DE L'IMAGE", + "NEAREST": "LA PLUS PROCHE", + "CCTV camera": "CamĂ©ra CCTV", + "CALIBRATION": "CALIBRATION", + "Drag the camera in the world: rings rotate, arrows move, handles set range/FOV": "Faites glisser la camĂ©ra dans le monde : les anneaux pivotent, les flĂšches dĂ©placent, les poignĂ©es rĂšglent portĂ©e/FOV", + "Camera pose — click a value to type": "Pose de la camĂ©ra — cliquer sur une valeur pour la saisir", + "Heading (compass °) — click to type": "Cap (boussole °) — cliquer pour saisir", + "Pitch (° up/down) — click to type": "Inclinaison (° haut/bas) — cliquer pour saisir", + "Horizontal FOV (°) — click to type": "FOV horizontal (°) — cliquer pour saisir", + "Range / monitor-plane distance (m) — click to type": "PortĂ©e / distance du plan moniteur (m) — cliquer pour saisir", + "Mount height above ground (m) — click to type": "Hauteur de montage au-dessus du sol (m) — cliquer pour saisir", + "North offset from catalog position (m) — click to type": "DĂ©calage nord par rapport Ă  la position du catalogue (m) — cliquer pour saisir", + "East offset from catalog position (m) — click to type": "DĂ©calage est par rapport Ă  la position du catalogue (m) — cliquer pour saisir", + "SAVE CAL": "ENREG. CAL", + "RESET CAL": "RÉINIT. CAL", + "SCENE SUMMARY": "RÉSUMÉ DE SCÈNE", + "STREET LEVEL": "NIVEAU RUE", + "Turn Street Level on or off": "Activer ou dĂ©sactiver Niveau rue", + "Show the street-level view full screen (Esc shrinks it)": "Afficher la vue au niveau de la rue en plein Ă©cran (Esc la rĂ©duit)", + "Image fit": "Ajustement de l'image", + "FIT": "AJUSTER", + "Fit: show the whole photo, with dark bars where its shape differs from the frame": "Ajuster : affiche toute la photo, avec des bandes sombres lĂ  oĂč son format diffĂšre du cadre", + "FILL": "REMPLIR", + "Fill: fill the frame edge to edge, cropping the photo": "Remplir : remplit le cadre bord Ă  bord en recadrant la photo", + "Close the image and deselect it on the map": "Fermer l'image et la dĂ©sĂ©lectionner sur la carte", + "Close the street-level image": "Fermer l'image au niveau de la rue", + "Street-level viewer": "Visionneuse au niveau de la rue", + "Open this image on the provider's site": "Ouvrir cette image sur le site du fournisseur", + "Imagery providers": "Fournisseurs d'images", + "PROVIDERS": "FOURNISSEURS", + "Imagery filters": "Filtres d'images", + "IMAGERY": "IMAGES", + "Panorama filter": "Filtre de panoramas", + "ALL": "TOUTES", + "FLAT": "CLASSIQUES", + "SINCE": "DEPUIS", + "SCENES": "SCÈNES", + "Scene recipe": "Recette de scĂšne", + "NEW": "NOUV.", + "CAPTURE SHOT": "CAPTURER UN PLAN", + "UPDATE SHOT": "MAJ DU PLAN", + "START": "LANCER", + "EXPORT PRESETS": "EXPORTER LES PRÉRÉGLAGES", + "IMPORT": "IMPORTER", + "RUN LOG": "JOURNAL", + "POWER UP": "ALLUMER", + "GROUND STATION · PROVIDER SETTINGS": "STATION AU SOL · PARAMÈTRES DES FOURNISSEURS", + "Close key setup": "Fermer la configuration des clĂ©s", + "Power up the globe": "Allumer le globe", + "The globe already flies keyless. Every key below switches on another real feed — paste one and it's saved into this app's local configuration, then the server restarts itself. Server-side keys stay on this machine; Google Maps and Cesium ion run in the browser and must be provider-restricted. Keys you configured elsewhere are shown but never touched.": "Le globe fonctionne dĂ©jĂ  sans clĂ©. Chaque clĂ© ci-dessous active un flux rĂ©el de plus : collez-en une et elle est enregistrĂ©e dans la configuration locale de l'application, puis le serveur redĂ©marre. Les clĂ©s cĂŽtĂ© serveur restent sur cette machine ; les clĂ©s Google Maps et Cesium ion sont utilisĂ©es dans le navigateur et doivent ĂȘtre restreintes chez leur fournisseur. Les clĂ©s configurĂ©es ailleurs sont affichĂ©es mais jamais modifiĂ©es.", + "SAVE KEYS": "ENREGISTRER LES CLÉS", + "ESC to close": "ESC pour fermer", + "The Google Maps key buys the photorealistic planet — everything else stacks on top.": "La clĂ© Google Maps offre la planĂšte photorĂ©aliste, tout le reste s'y superpose.", + "NO PLACE LEFT BEHIND": "AUCUN LIEU OUBLIÉ", + "ACTIVE STYLE": "STYLE ACTIF", + "Globe actions": "Actions du globe", + "Turn off all selected data layers": "DĂ©sactiver toutes les couches de donnĂ©es sĂ©lectionnĂ©es", + "Copy share link": "Copier le lien de partage", + "Toggle straight-down and tilted map views": "Basculer entre vue verticale et vue inclinĂ©e de la carte", + "Reset map to north up": "RĂ©orienter la carte nord en haut", + "Reset map bearing to north": "RĂ©initialiser l'orientation de la carte vers le nord", + "Reset camera and return to full globe view": "RĂ©initialiser la camĂ©ra et revenir Ă  la vue du globe entier", + "MISSION CONTROL · FIRST LAUNCH": "CENTRE DE CONTRÔLE · PREMIER LANCEMENT", + "Choose your first view": "Choisissez votre premiĂšre vue", + "LIVE CONTACTS": "CONTACTS EN DIRECT", + "Aircraft, vessels and nearby intelligence": "Avions, navires et renseignements Ă  proximitĂ©", + "Launches, spacecraft and orbital context": "Lancements, vaisseaux et contexte orbital", + "EXPLORE MANUALLY": "EXPLORER MANUELLEMENT", + "Begin with a clean globe": "Commencer avec un globe vierge", + "Don't show this again": "Ne plus afficher", + "ESC to dismiss": "ESC pour fermer", + "Tip: the GEV MIC button in the dock lets you talk to the map.": "Astuce : le bouton GEV MIC du dock permet de parler Ă  la carte.", + "Malformed cyclone snapshot": "InstantanĂ© cyclonique mal formĂ©", + "Cyclone request timed out": "DĂ©lai dĂ©passĂ© pour la requĂȘte cyclonique", + "{lower} to {upper}": "{lower} Ă  {upper}", + "Up to {upper}": "Jusqu’à {upper}", + "From {lower}": "À partir de {lower}", + "Informational only · not for flight planning": "À titre informatif uniquement · ne pas utiliser pour la planification de vol", + "Unnamed zone": "Zone sans nom", + "Restricted airspace source unavailable": "Source de l’espace aĂ©rien rĂ©glementĂ© indisponible", + "Prohibited (P)": "Zone interdite (P)", + "Restricted (R)": "Zone rĂ©glementĂ©e (R)", + "FAA prohibited and restricted special-use airspace only, not the UAS Facility Map or UAS flight restrictions. Informational only — not a substitute for official UAS flight-planning tools (B4UFLY / LAANC).": "Uniquement les zones interdites et rĂ©glementĂ©es de la FAA (espace aĂ©rien Ă  usage spĂ©cial), sans la UAS Facility Map ni les restrictions de vol des drones. À titre informatif uniquement — ne remplace pas les outils officiels de planification de vol des drones (B4UFLY / LAANC).", + "Prohibited": "Zone interdite", + "Restricted": "Zone rĂ©glementĂ©e", + "Prohibited & Restricted Airspace": "Zones interdites et rĂ©glementĂ©es" +} diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json new file mode 100644 index 000000000..38339dc14 --- /dev/null +++ b/src/i18n/locales/it.json @@ -0,0 +1,3012 @@ +{ + "Pick a shape, then click the map.": "Scegli una forma, poi fai clic sulla mappa.", + "Enter to place the pin, Esc to cancel.": "Premi Enter per posizionare il segnaposto, Esc per annullare.", + "Click where the pin goes.": "Fai clic dove va il segnaposto.", + "Click {count} more points.": { + "one": "Fai clic su {count} altro punto.", + "many": "Fai clic su altri {count} di punti.", + "other": "Fai clic su altri {count} punti." + }, + "Those points are in a line — move one off it to enclose an area.": "Quei punti sono allineati: spostane uno fuori dalla linea per racchiudere un'area.", + "That line has no length — click somewhere further away.": "Quella linea non ha lunghezza: fai clic piĂč lontano.", + " · {max}-point limit reached": " · raggiunto il limite di {max} punti", + "{measure} · double-click or Enter to finish, Backspace undoes, Esc cancels.{full}": "{measure} · doppio clic o Enter per finire, Backspace torna indietro, Esc annulla.{full}", + "drawings on the map": "disegni sulla mappa", + "That shape already has {count} points — finish it or press Backspace.": "Quella forma ha giĂ  {count} punti: finiscila o premi Backspace.", + "That point is off the globe — click on the world.": "Quel punto Ăš fuori dal globo: fai clic sul mondo.", + "That shape could not be placed.": "Impossibile posizionare quella forma.", + "Could not place the shape: {error}": "Impossibile posizionare la forma: {error}", + "Board cleared.": "Lavagna cancellata.", + "{owner} is using the pointer — close it first.": "Lo strumento {owner} sta usando il puntatore: chiudilo prima.", + "{label} · Detailed outline unavailable": "{label} · Contorno dettagliato non disponibile", + "Flying to Austin, TX...": "Volo verso Austin, TX...", + "Restoring shared view...": "Ripristino della vista condivisa...", + "Configuring viewer...": "Configurazione del visualizzatore...", + "Loading Google 3D Tiles...": "Caricamento di Google 3D Tiles...", + "Loading the keyless globe...": "Caricamento del globo senza chiave...", + "Google 3D Tiles unavailable ({detail}). Loading the keyless globe...": "Google 3D Tiles non disponibile ({detail}). Caricamento del globo senza chiave...", + "Initializing systems...": "Inizializzazione dei sistemi...", + "Space Missions isolates replay data. Exit the mode to enable {layer}.": "La modalitĂ  Missioni spaziali isola i dati del replay. Esci dalla modalitĂ  per attivare {layer}.", + "Data attribution": "Attribuzione dei dati", + "Data provided by:": "Dati forniti da:", + "Close data attribution": "Chiudi le attribuzioni dei dati", + "Light aircraft": "Aereo leggero", + "Glider": "Aliante", + "Turboprop": "Turboelica", + "Airliner": "Aereo di linea", + "Widebody": "Aereo a fusoliera larga", + "Four-engine jet": "Quadrigetto", + "Helicopter": "Elicottero", + "Fast jet": "Jet ad alte prestazioni", + "Business jet": "Business jet", + "Drone": "Drone", + "General emergency": "Emergenza generale", + "Unlawful interference": "Interferenza illecita", + "Radio failure": "Avaria radio", + "Downed aircraft": "Aereo precipitato", + "Minimum fuel": "Carburante minimo", + "Lifeguard (medical priority)": "Lifeguard (prioritĂ  medica)", + "Rasuwagadhi witness video": "Video del testimone a Rasuwagadhi", + "Bhote Koshi valley footage": "Riprese della valle del Bhote Koshi", + "Flood footage": "Riprese dell'alluvione", + "Compilation and casualty claims": "Raccolta di video e dichiarazioni sulle vittime", + "SOURCE GEOCONFIRMED · WORLD-PINNED": "FONTE GEOCONFERMATA · ANCORATA AL MONDO", + "SOURCE CREDITED · LOCATION UNRESOLVED": "FONTE CITATA · POSIZIONE NON DETERMINATA", + "REFERENCE ONLY · CLAIMS UNVERIFIED": "SOLO RIFERIMENTO · DICHIARAZIONI NON VERIFICATE", + "SOURCE GEOCONFIRMED": "FONTE GEOCONFERMATA", + "2021 historical reference versus 2026 post-event imagery; changes are cumulative and include the July 2025 Rasuwagadhi flood. Schematic downstream progression, not modeled arrival time; not an official hazard model.": "Confronto tra il riferimento storico del 2021 e le immagini del 2026 successive all'evento; i cambiamenti sono cumulativi e includono l'alluvione di Rasuwagadhi del luglio 2025. Progressione schematica a valle, senza modellazione dei tempi di arrivo; non Ăš un modello ufficiale di pericolositĂ .", + "Immediate collapse viewpoint": "Punto di osservazione ravvicinato sul crollo", + "Collapse viewpoint": "Punto di osservazione sul crollo", + "Debris-dammed lake": "Lago di sbarramento da detriti", + "Dammed lake": "Lago di sbarramento", + "Second landslide": "Seconda frana", + "Gyirong border gate": "Valico di frontiera di Gyirong", + "Border gate": "Valico di frontiera", + "Timure evidence cluster": "Gruppo di prove di Timure", + "Mailung / Upper Trishuli bridge": "Ponte di Mailung / Upper Trishuli", + "Dandagaun viewpoint restaurant": "Ristorante panoramico di Dandagaun", + "Dandagaun viewpoint": "Punto panoramico di Dandagaun", + "Bidur - Trishuli bridge": "Ponte di Bidur - Trishuli", + "Bidur bridge": "Ponte di Bidur", + "Devighat / Taadi Khola Bridge": "Ponte di Devighat / Taadi Khola", + "Devighat bridge": "Ponte di Devighat", + "Facebook player API did not initialize.": "L'API del player di Facebook non si Ăš inizializzata.", + "Facebook player API could not load.": "Impossibile caricare l'API del player di Facebook.", + "Facebook player API timed out.": "L'API del player di Facebook Ăš andata in timeout.", + "X embed API did not initialize.": "L'API di incorporamento di X non si Ăš inizializzata.", + "X embed could not load.": "Impossibile caricare l'incorporamento di X.", + "X embed timed out.": "L'incorporamento di X Ăš andato in timeout.", + "UNAVAILABLE": "NON DISPONIBILE", + "TIMEOUT": "TIMEOUT", + "BLOCKED": "BLOCCATO", + "SOURCE": "FONTE", + "Facebook embed unavailable. The post may be private, removed, region-restricted, or blocked.": "Incorporamento di Facebook non disponibile. Il post potrebbe essere privato, rimosso, limitato per regione o bloccato.", + "Preloading {provider} media": "Precaricamento dei contenuti {provider}", + "LOADING X POST
": "CARICAMENTO POST DI X
", + "The X post is unavailable or cannot be embedded.": "Il post di X non Ăš disponibile o non puĂČ essere incorporato.", + "X POST · PROVIDER CONTROLS": "POST DI X · CONTROLLI DEL PROVIDER", + "{reason} OPEN ORIGINAL.": "{reason} APRI L'ORIGINALE.", + "X embed unavailable": "Incorporamento di X non disponibile", + "FACEBOOK · PROVIDER CONTROLS": "FACEBOOK · CONTROLLI DEL PROVIDER", + "Facebook embed unavailable": "Incorporamento di Facebook non disponibile", + "AUTOPLAY BLOCKED · USE PROVIDER CONTROLS": "AUTOPLAY BLOCCATO · USA I CONTROLLI DEL PROVIDER", + "Embedded {provider} media for {source}": "Contenuto {provider} incorporato per {source}", + "witness source": "fonte testimoniale", + "Witness source": "Fonte testimoniale", + "{provider} · EMBEDDED SOURCE": "{provider} · FONTE INCORPORATA", + "OPEN ORIGINAL ↗": "APRI L'ORIGINALE ↗", + "{provider} media: {source}": "Contenuto {provider}: {source}", + "{provider} · PROVIDER CONTROLS": "{provider} · CONTROLLI DEL PROVIDER", + "YOUTUBE {state} · OPEN ORIGINAL": "YOUTUBE {state} · APRI L'ORIGINALE", + "INITIATION": "INNESCO", + "DAMMING": "SBARRAMENTO", + "SECONDARY FAILURE": "CEDIMENTO SECONDARIO", + "BORDER ARRIVAL": "ARRIVO AL CONFINE", + "PROPAGATION": "PROPAGAZIONE", + "DOWNSTREAM PASSAGE": "PASSAGGIO A VALLE", + "CONSEQUENCE": "CONSEGUENZA", + "DOWNSTREAM CONSEQUENCE": "CONSEGUENZA A VALLE", + "EVIDENCE": "PROVE", + "{year} HISTORICAL REFERENCE": "RIFERIMENTO STORICO {year}", + "{year} POST-EVENT": "DOPO L'EVENTO {year}", + "{count} GEOLOCATED SOURCE-MAP PLACEMENTS": { + "one": "{count} POSIZIONAMENTO GEOLOCALIZZATO SULLA MAPPA DELLE FONTI", + "many": "{count} DI POSIZIONAMENTI GEOLOCALIZZATI SULLA MAPPA DELLE FONTI", + "other": "{count} POSIZIONAMENTI GEOLOCALIZZATI SULLA MAPPA DELLE FONTI" + }, + "NO PREVIEW": "NESSUNA ANTEPRIMA", + "YouTube source": "Fonte YouTube", + "Facebook source": "Fonte Facebook", + "SOURCE LINK": "LINK ALLA FONTE", + "{publisher} / OPEN": "{publisher} / APRI", + "Bhote Koshi flood reconstruction controls": "Controlli della ricostruzione dell'alluvione del Bhote Koshi", + "EVENT RECONSTRUCTION · 26 AUG 2026": "RICOSTRUZIONE DELL'EVENTO · 26 AGO 2026", + "BHOTE KOSHI OUTBURST FLOOD": "PIENA IMPROVVISA DEL BHOTE KOSHI", + "Close event layer": "Chiudi il livello evento", + "OBSERVED IMAGERY": "IMMAGINI OSSERVATE", + "SCHEMATIC CORRIDOR": "CORRIDOIO SCHEMATICO", + "2021 HISTORICAL REFERENCE / 2026 POST-EVENT": "RIFERIMENTO STORICO 2021 / DOPO L'EVENTO 2026", + "Historical reference and post-event image split": "Confronto tra immagine storica di riferimento e immagine successiva all'evento", + "RECONSTRUCTION CLOCK": "OROLOGIO DELLA RICOSTRUZIONE", + "Schematic downstream progression": "Progressione schematica a valle", + "Story beat navigation": "Navigazione tra le tappe del racconto", + "Previous story beat": "Tappa precedente del racconto", + "CAUSE": "CAUSA", + "CAPTURE TIME UNVERIFIED": "ORA DI ACQUISIZIONE NON VERIFICATA", + "Next story beat": "Tappa successiva del racconto", + "▶ PLAY": "▶ AVVIA", + "Play the next shot and continue through this scene": "Riproduci lo scatto successivo e prosegui con questa scena", + "▶ PLAY SCENE": "▶ AVVIA SCENA", + "◉ CINEMATIC": "◉ CINEMATICA", + "â†ș FULL STORY": "â†ș STORIA COMPLETA", + "↗ OPEN ORIGINAL": "↗ APRI L'ORIGINALE", + "⌖ LOWER GORGE": "⌖ GOLA INFERIORE", + "FIELD REPORTS · {count}": "RAPPORTI DAL CAMPO · {count}", + "GEOLOCATIONS · {credit}": "GEOLOCALIZZAZIONI · {credit}", + "↗ OPEN PUBLIC MAP": "↗ APRI LA MAPPA PUBBLICA", + " Clouds are preserved from the source imagery.": " Le nuvole presenti nelle immagini di origine non sono state rimosse.", + "Rasuwagadhi witness": "Testimone a Rasuwagadhi", + "Open original source for {source}; capture time unverified": "Apri la fonte originale per {source}; ora di acquisizione non verificata", + "Historical reference and post-event image divider": "Divisore tra immagine storica di riferimento e immagine successiva all'evento", + "A historical reference {before} percent, B post-event {after} percent": "A riferimento storico {before} per cento, B dopo l'evento {after} per cento", + "■ RELEASE CAMERA": "■ RILASCIA LA CAMERA", + "Seek Nepal scene clock": "Scorri l'orologio della scena in Nepal", + "NEPAL SCENE CLOCK": "OROLOGIO SCENA NEPAL", + "
 PLAYING SHOT": "
 SCATTO IN CORSO", + "▶ PLAY SHOT": "▶ AVVIA SCATTO", + "Ⅱ PAUSE": "Ⅱ PAUSA", + "â†ș REPLAY CINEMATIC": "â†ș RIVEDI CINEMATICA", + "â†ș REPLAY": "â†ș RIVEDI", + "
 PLAYING SCENE": "
 SCENA IN CORSO", + "Continue {scene} from next shot": "Continua {scene} dallo scatto successivo", + "current scene": "scena attuale", + "Replay the full reconstruction": "Rivedi l'intera ricostruzione", + "SCENE SHOT": "SCATTO DELLA SCENA", + "TIME UNVERIFIED": "ORA NON VERIFICATA", + "{count} SOURCES": { + "one": "{count} FONTE", + "many": "{count} DI FONTI", + "other": "{count} FONTI" + }, + "OUTSIDE IMAGERY SWIPE": "FUORI DAL CONFRONTO IMMAGINI", + "{scene} / AUTHORED SHOT": "{scene} / SCATTO PREDEFINITO", + "NEPAL FLOOD INCIDENT": "ALLUVIONE IN NEPAL", + "Play {shot}": "Riproduci {shot}", + "current scene shot": "scatto della scena attuale", + "Play reconstruction": "Riproduci la ricostruzione", + "Load previous scene shot": "Carica lo scatto precedente della scena", + "Load next scene shot": "Carica lo scatto successivo della scena", + "SCHEMATIC CORRIDOR, NOT MODELED ARRIVAL TIME.": "CORRIDOIO SCHEMATICO: TEMPI DI ARRIVO NON MODELLATI.", + "Rasuwa · 26 Aug 2026": "Rasuwa · 26 ago 2026", + "Event reconstruction": "Ricostruzione dell'evento", + "BHOTE KOSHI FLOOD INCIDENT": "ALLUVIONE DEL BHOTE KOSHI", + "NEPAL · 26 AUG 2026": "NEPAL · 26 AGO 2026", + "USGS INITIAL REPORT": "RAPPORTO INIZIALE USGS", + "26 AUG 2026 · 08:37 NPT": "26 AGO 2026 · 08:37 NPT", + "28.2710° N · 85.5150° E": "28,2710° N · 85,5150° E", + "INITIAL M4.4 · RECLASSIFIED M5.2 LANDSLIDE": "INIZIALE M4,4 · RICLASSIFICATO COME FRANA M5,2", + "USGS EVENT us7000tbwb · OPEN SOURCE": "EVENTO USGS us7000tbwb · APRI LA FONTE", + "Open the USGS initial report for the 26 August 2026 Nepal landslide": "Apri il rapporto iniziale USGS sulla frana del 26 agosto 2026 in Nepal", + "Show the Nepal context callout without a border or country fill": "Mostra il riquadro di contesto sul Nepal senza confine nĂ© riempimento del paese", + "Introduce Nepal, draw its border, then reveal the Bhote Koshi incident": "Presenta il Nepal, traccia il suo confine, poi mostra l'evento del Bhote Koshi", + "CITIES": "CITTÀ", + "Keep the regional incident context and introduce nearby city labels": "Mantieni il contesto regionale dell'evento e mostra le etichette delle cittĂ  vicine", + "PLACES": "LUOGHI", + "Introduce the reconstruction scene key places from trigger to downstream": "Presenta i luoghi chiave della scena ricostruita, dall'innesco fino a valle", + "PATH": "PERCORSO", + "Animate the sourced cyan river-centerline route to Trishuli Bazaar": "Anima il percorso ciano documentato dalle fonti lungo l'asse del fiume fino a Trishuli Bazaar", + "OVERVIEW": "PANORAMICA", + "Keep the completed flood path and location labels visible": "Mantieni visibili il percorso completo dell'alluvione e le etichette dei luoghi", + "RECORD": "SCHEDA", + "Reveal the trigger record while making a slow camera approach": "Mostra la scheda dell'innesco con un lento avvicinamento della camera", + "{speed} kn": "{speed} kn", + "That file is not valid JSON.": "Quel file non Ăš un JSON valido.", + "That JSON file is not GeoJSON.": "Quel file JSON non Ăš GeoJSON.", + "That FeatureCollection has no features list.": "Quella FeatureCollection non ha un elenco di feature.", + "Every GeoJSON feature must have type Feature.": "Ogni feature GeoJSON deve avere type Feature.", + "That GeoJSON has invalid geometries.": "Quel GeoJSON ha geometrie non valide.", + "That GeoJSON contains an unsupported geometry.": "Quel GeoJSON contiene una geometria non supportata.", + "That GeoJSON has invalid coordinates.": "Quel GeoJSON ha coordinate non valide.", + "That file creates more than {limit} map objects (the limit).": "Quel file crea piĂč di {limit} oggetti sulla mappa (il limite).", + "That file has more than {limit} style definitions and image links after cleanup (the limit).": "Quel file ha piĂč di {limit} definizioni di stile e link a immagini dopo la pulizia (il limite).", + "That file has more than {limit} features (the limit).": "Quel file ha piĂč di {limit} feature (il limite).", + "That file has more than {limit} points (the limit) across {features} features.": "Quel file ha piĂč di {limit} punti (il limite) in {features} feature.", + "That file has more than {limit} points (the limit).": "Quel file ha piĂč di {limit} punti (il limite).", + "That KMZ unpacks to more than the import limit.": "Quel KMZ, una volta estratto, supera il limite di importazione.", + "That KMZ is damaged and could not be unpacked.": "Quel KMZ Ăš danneggiato e non Ăš stato possibile estrarlo.", + "That KMZ is not a readable zip archive.": "Quel KMZ non Ăš un archivio zip leggibile.", + "That KMZ uses a zip format this import does not read.": "Quel KMZ usa un formato zip che questa importazione non legge.", + "That KMZ is encrypted.": "Quel KMZ Ăš crittografato.", + "That KMZ uses a compression method this import does not read.": "Quel KMZ usa un metodo di compressione che questa importazione non legge.", + "That KML has invalid geometry bounds.": "Quel KML ha limiti di geometria non validi.", + "That KML has invalid coordinates.": "Quel KML ha coordinate non valide.", + "That GPX file has no document.": "Quel file GPX non ha un documento .", + "That {format} file is not valid XML.": "Quel file {format} non Ăš un XML valido.", + "That file has an unreadable image or exceeds the 16-megapixel image limit.": "Quel file ha un'immagine illeggibile o supera il limite di 16 megapixel per immagine.", + "That KML could not be read.": "Impossibile leggere quel KML.", + "That file has invalid point coordinates.": "Quel file ha coordinate dei punti non valide.", + "Ground heights are not available for that file. Try again when the map has loaded.": "Le quote del terreno non sono disponibili per quel file. Riprova quando la mappa Ăš caricata.", + "That file took too long to read.": "La lettura di quel file ha richiesto troppo tempo.", + "Nothing to import.": "Niente da importare.", + "That file is larger than {size} MiB.": "Quel file supera i {size} MiB.", + "Only GeoJSON, KML, KMZ and GPX files can be imported.": "Si possono importare solo file GeoJSON, KML, KMZ e GPX.", + "That file has nothing to draw.": "Quel file non contiene nulla da disegnare.", + "That KMZ holds no KML document.": "Quel KMZ non contiene alcun documento KML.", + "That {format} file could not be read.": "Impossibile leggere quel file {format}.", + "That file has {count} map objects; the limit is {limit}.": "Quel file ha {count} oggetti sulla mappa; il limite Ăš {limit}.", + "Ground heights could not be read. Try that file again.": "Impossibile leggere le quote del terreno. Riprova con quel file.", + "That file has invalid point graphics.": "Quel file ha simboli dei punti non validi.", + "Overpass rate-limited": "Overpass ha limitato le richieste", + "Overpass timed out": "Overpass Ăš andato in timeout", + "Overpass could not complete the query": "Overpass non ha potuto completare la query", + "Map tiles temporarily unavailable": "Tile della mappa temporaneamente non disponibili", + "Mapped names temporarily unavailable": "Nomi mappati temporaneamente non disponibili", + "Overpass temporarily unavailable": "Overpass temporaneamente non disponibile", + "Retrying mapped sites
": "Nuovo tentativo sui siti mappati
", + "Fetching mapped sites
": "Ricerca dei siti mappati
", + "{reason} — retrying in {seconds}s": "{reason}: nuovo tentativo tra {seconds}s", + "{reason} — retry pending": "{reason}: nuovo tentativo in sospeso", + "Zoom in to search mapped installations": "Ingrandisci per cercare le installazioni mappate", + "Showing cached mapped sites": "Siti mappati in cache", + "Mapped sites not loaded": "Siti mappati non caricati", + "Mapped sites loaded": "Siti mappati caricati", + "Military airfield": "Aeroporto militare", + "Naval base": "Base navale", + "Firing range": "Poligono di tiro", + "Military land": "Terreno militare", + "Mapped installation": "Installazione mappata", + "Military area": "Area militare", + "flight": "volo", + "military flight": "volo militare", + "satellite": "satellite", + "feed unavailable": "feed non disponibile", + "feed stale": "feed obsoleto", + "observed or mapped nearby context": "contesto osservato o mappato nelle vicinanze", + "no observed or mapped objects in current feeds": "nessun oggetto osservato o mappato nei feed attuali", + "Draw": "Disegno", + "Directions": "Indicazioni", + "Recent imagery": "Immagini recenti", + "STATION": "STAZIONE", + "Crewed stations and their visiting vehicles": "Stazioni con equipaggio e veicoli in visita", + "NAV": "NAV", + "GNSS navigation — GPS, GLONASS, Galileo": "Navigazione GNSS — GPS, GLONASS, Galileo", + "GEO": "GEO", + "Geostationary belt — comms and weather, fixed over the equator": "Fascia geostazionaria — satelliti per comunicazioni e meteo, fissi sopra l'equatore", + "VISUAL": "VISIBILI", + "Brightest naked-eye objects — CelesTrak visual group": "Oggetti piĂč luminosi a occhio nudo — gruppo visual di CelesTrak", + "COMMS": "TLC", + "Broadband constellation shell — shown only in DENSE mode": "Shell della costellazione a banda larga — mostrato solo in modalitĂ  DENSO", + "FISHING": "PESCA", + "TOWING": "RIMORCHIO", + "DREDGER": "DRAGA", + "DIVE OPS": "OP. SUBACQUEE", + "MILITARY": "MILITARE", + "SAILING": "VELA", + "PLEASURE": "DIPORTO", + "PILOT": "PILOTINA", + "SAR": "SAR", + "TUG": "RIMORCHIATORE", + "PORT TENDER": "TENDER PORTUALE", + "ANTI-POLLUTION": "ANTINQUINAMENTO", + "LAW ENFORCE": "FORZE DELL'ORDINE", + "MEDICAL": "MEDICA", + "HIGH-SPEED": "ALTA VELOCITÀ", + "PASSENGER": "PASSEGGERI", + "CARGO": "CARGO", + "TANKER": "CISTERNA", + "OTHER": "ALTRO", + "Included in bundle": "Incluso nel pacchetto", + "Missing bundle file — reimport its bundle": "File del pacchetto mancante: reimporta il suo pacchetto", + "Source configured; file checked when loaded": "Fonte configurata; file verificato al caricamento", + "Source unavailable": "Fonte non disponibile", + "ENVIRONMENTAL": "AMBIENTE", + "EARTH WATCH": "OSSERVATORIO TERRA", + "ACTIVE EVENTS": "EVENTI ATTIVI", + "Starting live contacts
": "Avvio dei contatti live
", + "Opening space missions
": "Apertura delle missioni spaziali
", + "Scanning active events
": "Scansione degli eventi attivi
", + "Live earthquakes and active fires, from USGS and NASA": "Terremoti e incendi attivi in tempo reale, da USGS e NASA", + "It feels like a forbidden cockpit—then you realize the sources are public and the data is real.": "Sembra un cockpit proibito, poi capisci che le fonti sono pubbliche e i dati sono reali.", + "Working
": "Operazione in corso
", + "Could not open that mission{detail}. Retry or explore manually.": "Impossibile aprire quella missione{detail}. Riprova o esplora manualmente.", + "This browser is blocking storage, so that could not be saved.": "Questo browser blocca l'archiviazione, quindi non Ăš stato possibile salvare.", + "NORMAL": "NORMALE", + "CRT": "CRT", + "NVG": "NVG", + "FLIR": "FLIR", + "ANIME": "ANIME", + "NOIR": "NOIR", + "SNOW": "NEVE", + "ARCTIC": "ARTICO", + "ANTARCTIC": "ANTARTICO", + "NORTH AMERICA": "NORD AMERICA", + "SOUTH AMERICA": "SUD AMERICA", + "EUROPE": "EUROPA", + "AFRICA": "AFRICA", + "ASIA": "ASIA", + "OCEANIA": "OCEANIA", + "NORTHERN OCEANIC GRID": "GRIGLIA OCEANICA NORD", + "SOUTHERN OCEANIC GRID": "GRIGLIA OCEANICA SUD", + "LOADING": "CARICAMENTO", + "DEGRADED": "DEGRADATO", + "STALE": "OBSOLETO", + "PARTIAL": "PARZIALE", + "FALLBACK": "RISERVA", + "{state} {layers}": "{state} {layers}", + "view band|STREET": "STRADA", + "view band|CITY": "CITTÀ", + "view band|METRO": "METRO", + "view band|REGIONAL": "REGIONALE", + "view band|GLOBAL": "GLOBALE", + "SUMMARY": "RIEPILOGO", + "Awaiting telemetry...": "In attesa di telemetria...", + "REC": "REC", + "AIS: --": "AIS: --", + "N/A": "N/D", + "{mode} {band} {locality} | {region} | ALT {alt} | WINDOW {window} | SUN {sun}° | ONA {ona}° | {zone}": "{mode} {band} {locality} | {region} | ALT {alt} | FINESTRA {window} | SOLE {sun}° | ONA {ona}° | {zone}", + "NEAR {poi} ({city}) {distance}": "VICINO A {poi} ({city}) {distance}", + "SECTOR {lat} {lon}": "SETTORE {lat} {lon}", + "hemisphere|N": "N", + "hemisphere|S": "S", + "hemisphere|E": "E", + "hemisphere|W": "O", + "POWER UP · {count} KEYS WAITING": { + "one": "ACCENDI · {count} CHIAVE IN ATTESA", + "many": "ACCENDI · {count} DI CHIAVI IN ATTESA", + "other": "ACCENDI · {count} CHIAVI IN ATTESA" + }, + "POWERED UP": "ACCESO", + "Provider Settings does not answer proxied requests": "Il pannello Impostazioni provider non risponde alle richieste tramite proxy", + "Provider Settings is disabled while sharing is enabled": "Il pannello Impostazioni provider Ăš disattivato mentre la condivisione Ăš attiva", + "Provider Settings answers only the machine running the server": "Il pannello Impostazioni provider risponde solo alla macchina su cui gira il server", + "Provider Settings answers only local hostnames": "Il pannello Impostazioni provider risponde solo a nomi host locali", + "Provider Settings requires an exact local Origin": "Il pannello Impostazioni provider richiede un'Origin locale esatta", + "Unrecognized Origin refused": "Origin non riconosciuta: richiesta rifiutata", + "Cross-origin requests are refused": "Le richieste cross-origin sono rifiutate", + "Content-Type must be application/json": "Content-Type deve essere application/json", + "Method not allowed": "Metodo non consentito", + "Request too large": "Richiesta troppo grande", + "Invalid JSON": "JSON non valido", + "Body must be a JSON object of {ENV_VAR: value}": "Il corpo deve essere un oggetto JSON {ENV_VAR: value}", + "No keys provided": "Nessuna chiave fornita", + "At most {limit} keys per save": "Al massimo {limit} chiavi per salvataggio", + "Unknown key: {name}": "Chiave sconosciuta: {name}", + "{name} must be a string": "{name} deve essere una stringa", + "{name} is empty": "{name} Ăš vuota", + "{name} is longer than any real key ({limit} max)": "{name} Ăš piĂč lunga di qualsiasi chiave reale (max {limit})", + "{name} may only contain printable characters with no spaces": "{name} puĂČ contenere solo caratteri stampabili senza spazi", + "{name} contains a character that is not valid in a key (#, quotes, $, \\, or backtick)": "{name} contiene un carattere non valido in una chiave (#, virgolette, $, \\ o backtick)", + "{name} is configured outside Provider Settings and can only be changed where it was set": "{name} Ăš configurata fuori da Impostazioni provider e si puĂČ cambiare solo dove Ăš stata impostata", + "The key was not saved: could not restrict the credential file to your account; nothing was saved": "La chiave non Ăš stata salvata: impossibile limitare il file delle credenziali al tuo account; non Ăš stato salvato nulla", + "The key was not saved: the existing configuration could not be read, so nothing was changed": "La chiave non Ăš stata salvata: impossibile leggere la configurazione esistente, quindi non Ăš cambiato nulla", + "Could not write the {store} store": "Impossibile salvare: {store} non Ăš scrivibile", + "Save failed ({status}).": "Salvataggio non riuscito ({status}).", + "OAuth check failed: {detail}": "Verifica OAuth non riuscita: {detail}", + "Could not check ChatGPT sign-in. Try again.": "Impossibile verificare l'accesso a ChatGPT. Riprova.", + "VOICE AUTH · CHATGPT OAUTH": "AUTENTICAZIONE VOCE · CHATGPT OAUTH", + "VOICE AUTH · API KEY": "AUTENTICAZIONE VOCE · CHIAVE API", + "USE API KEY": "USA CHIAVE API", + "USE CHATGPT OAUTH": "USA CHATGPT OAUTH", + "Use OPENAI_API_KEY for the next cloud voice session": "Usa OPENAI_API_KEY per la prossima sessione vocale cloud", + "Use the signed-in local ChatGPT/Codex OAuth session for the next cloud voice session": "Usa la sessione OAuth locale di ChatGPT/Codex con accesso effettuato per la prossima sessione vocale cloud", + "Metered — a billing-enabled account": "A consumo: un account con fatturazione attiva", + "Optional paid token — public access works without one": "Token a pagamento opzionale: l'accesso pubblico funziona anche senza", + "Free key — register, paste, done": "Chiave gratuita: registrati, incolla, fatto", + "browser-side": "lato browser", + "This key runs in the browser by design — restrict it at the provider (see SECURITY.md)": "Questa chiave viene usata nel browser per scelta progettuale: imposta le restrizioni presso il provider (vedi SECURITY.md)", + "configured externally": "configurata esternamente", + "Supplied by your environment, Keychain, or launcher — change it where it was set": "Fornita dal tuo ambiente, dal Portachiavi o dal launcher: cambiala dove Ăš stata impostata", + "MANAGE ↗": "GESTISCI ↗", + "GET KEY ↗": "OTTIENI CHIAVE ↗", + "{envVar} saved — paste to replace": "{envVar} salvata: incolla per sostituirla", + "paste {envVar}": "incolla {envVar}", + "REMOVE": "RIMUOVI", + "Remove {title} from this app's saved keys": "Rimuovi {title} dalle chiavi salvate di questa app", + "unsaved provider keys": "chiavi provider non salvate", + "Project keys: {status}": "Chiavi del progetto: {status}", + "your app configuration": "la configurazione della tua app", + "your local .env": "il tuo .env locale", + "Saving
": "Salvataggio
", + "Save failed: {detail}": "Salvataggio non riuscito: {detail}", + "Paste at least one key first.": "Incolla prima almeno una chiave.", + "Saved to {store}. Restarting — this page reloads itself.": "Salvato ({store}). Riavvio in corso: questa pagina si ricarica da sola.", + "Cloud voice will use OPENAI_API_KEY on the next session.": "La voce cloud userĂ  OPENAI_API_KEY dalla prossima sessione.", + "Checking local ChatGPT OAuth sign-in
": "Verifica dell'accesso OAuth locale a ChatGPT
", + "Could not check ChatGPT sign-in.": "Impossibile verificare l'accesso a ChatGPT.", + "ChatGPT OAuth selected for cloud voice. Your API key stays saved and available.": "ChatGPT OAuth selezionato per la voce cloud. La tua chiave API resta salvata e disponibile.", + "ChatGPT sign-in expired. Opening sign-in again
": "Accesso a ChatGPT scaduto. Riapertura dell'accesso
", + "Opening ChatGPT sign-in in your browser
": "Apertura dell'accesso a ChatGPT nel browser
", + "Could not start ChatGPT sign-in on this machine.": "Impossibile avviare l'accesso a ChatGPT su questa macchina.", + "Finish ChatGPT sign-in in the browser. Waiting for it to complete
": "Completa l'accesso a ChatGPT nel browser. In attesa del completamento
", + "ChatGPT sign-in timed out. Click {button} to try again.": "Tempo scaduto per l'accesso a ChatGPT. Fai clic su {button} per riprovare.", + "ChatGPT sign-in complete. OAuth will be used for the next cloud voice session.": "Accesso a ChatGPT completato. OAuth verrĂ  usato per la prossima sessione vocale cloud.", + "Remove this key from your saved configuration?": "Rimuovere questa chiave dalla configurazione salvata?", + "Removed from {store}. Restarting — this page reloads itself.": "Rimosso ({store}). Riavvio in corso: questa pagina si ricarica da sola.", + "The photorealistic 3D planet, place search + Street View": "Il pianeta 3D fotorealistico, ricerca luoghi + Street View", + "Places context + Street View fallback; optional separate key": "Contesto luoghi + Street View di riserva; chiave separata opzionale", + "Voice control — API key or ChatGPT OAuth": "Controllo vocale: chiave API o ChatGPT OAuth", + "Gemini Live voice control": "Controllo vocale Gemini Live", + "Live ships, worldwide": "Navi live, in tutto il mondo", + "Live active-fire detections": "Rilevamenti live di incendi attivi", + "Real live traffic (keyless runs a simulation)": "Traffico reale live (senza chiave usa una simulazione)", + "Bing imagery map stacks + world terrain": "Stack mappa con immagini Bing + terreno globale", + "More flight-polling credits (anonymous works without)": "PiĂč crediti di polling voli (funziona anche in modo anonimo)", + "Street-level imagery and coverage in the Street Level layer. Free: register an app in the Mapillary developer dashboard and paste its Client Token": "Immagini a livello stradale e copertura nel livello Vista stradale. Gratis: registra un'app nella dashboard sviluppatori di Mapillary e incolla il suo Client Token", + "Public space-missions access needs no key. Leave blank for standard use; paid tokens only raise request limits.": "L'accesso pubblico alle missioni spaziali non richiede chiavi. Lascia vuoto per l'uso normale; i token a pagamento alzano solo i limiti di richieste.", + "Air quality request failed": "Richiesta della qualitĂ  dell'aria non riuscita", + "No readings available": "Nessuna lettura disponibile", + "No current readings": "Nessuna lettura attuale", + "{count} stations reporting": { + "one": "{count} stazione attiva", + "many": "{count} di stazioni attive", + "other": "{count} stazioni attive" + }, + "Highest air-quality readings in view": "Valori di qualitĂ  dell'aria piĂč alti nella vista", + "Low": "Basso", + "Low health risk": "Rischio per la salute basso", + "Moderate": "Moderato", + "Moderate health risk": "Rischio per la salute moderato", + "High": "Alto", + "High health risk": "Rischio per la salute alto", + "Very High": "Molto alto", + "Very High health risk": "Rischio per la salute molto alto", + "Air quality": "QualitĂ  dell'aria", + "Canada only · ECCC AQHI network": "Solo Canada · rete AQHI di ECCC", + "ECCC request timed out": "La richiesta a ECCC Ăš andata in timeout", + "Malformed AQHI station response": "Risposta delle stazioni AQHI non valida", + "No AQHI stations available": "Nessuna stazione AQHI disponibile", + "Malformed AQHI observation response": "Risposta delle osservazioni AQHI non valida", + "Camera source temporarily unavailable": "Fonte delle telecamere temporaneamente non disponibile", + "Mapped camera locations": "Posizioni mappate delle telecamere", + "SHOW NEAREST": "MOSTRA LA PIÙ VICINA", + "Stop following the current object before navigating to a camera": "Smetti di seguire l'oggetto attuale prima di spostarti su una telecamera", + "Move to the nearest loaded camera and show its details": "Spostati sulla telecamera caricata piĂč vicina e mostrane i dettagli", + "Camera badges": "Badge delle telecamere", + "Cyan cameras turn coral when selected. Wedges illustrate mapped direction, not measured coverage. Nearby cameras may be outside the screen.": "Le telecamere ciano diventano corallo quando selezionate. I settori indicano la direzione mappata, non la copertura misurata. Le telecamere vicine possono essere fuori dallo schermo.", + "{count} nearby · {onScreen} on screen": { + "one": "{count} vicina · {onScreen} sullo schermo", + "many": "{count} vicine · {onScreen} sullo schermo", + "other": "{count} vicine · {onScreen} sullo schermo" + }, + "{count} nearby": { + "one": "{count} vicina", + "many": "{count} vicine", + "other": "{count} vicine" + }, + "retrying mapped ALPR cameras": "nuovo tentativo sulle telecamere ALPR mappate", + "loading mapped ALPR cameras": "caricamento delle telecamere ALPR mappate", + "No ALPR data for this area — US and Canada only": "Nessun dato ALPR per quest'area: solo USA e Canada", + "Zoom in to load mapped cameras": "Ingrandisci per caricare le telecamere mappate", + "Showing cached locations": "Posizioni in cache", + "Coverage limited — zoom in": "Copertura limitata: ingrandisci", + "No ALPR data for this area": "Nessun dato ALPR per quest'area", + "None on screen — nearby cameras are outside the view": "Nessuna sullo schermo: le telecamere vicine sono fuori dalla vista", + "ALPR camera": "Telecamera ALPR", + "Camera coverage unavailable": "Copertura telecamere non disponibile", + "OpenStreetMap · community mapped": "OpenStreetMap · mappatura della comunitĂ ", + "Overpass returned an incomplete camera response": "Overpass ha restituito una risposta incompleta sulle telecamere", + "At least {count}": "Almeno {count}", + "CONTEXT READY": "CONTESTO PRONTO", + "GLOBAL CONTEXT OFF": "CONTESTO GLOBALE OFF", + "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "SELEZIONA UN VOLO, UNA NAVE O UN'INSTALLAZIONE MAPPATA", + "ENABLE TO LOAD OBSERVED / MAPPED PROXIMITY": "ATTIVA PER CARICARE I DATI OSSERVATI / MAPPATI NELLE VICINANZE", + "Unavailable": "Non disponibile", + "Focus {label}": "Inquadra {label}", + "Global Context navigation": "Navigazione Contesto globale", + "Previous — prior visited contact in the 250 km window": "Precedente — contatto visitato in precedenza nella finestra di 250 km", + "PREVIOUS": "PREC", + "FOCUS": "FOCUS", + "Next — nearest unvisited contact in the 250 km window": "Successivo — contatto non visitato piĂč vicino nella finestra di 250 km", + "NEXT": "SUCC", + "Named areas ({n})": "Aree con nome ({n})", + "{distance} FLIGHT / VESSEL WINDOW": "FINESTRA VOLI / NAVI {distance}", + "Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "Contesto mappato/osservato da fonti aperte. Trasmissioni mancanti, aree di mappa non caricate o siti non mappati non sono prova di assenza.", + "mapped matches within {km} km of the subject": "corrispondenze mappate entro {km} km dal soggetto", + "none mapped within {km} km; not a complete 250 km survey": "nessuna mappata entro {km} km; non Ăš un rilevamento completo di 250 km", + "mapped matches from the loaded viewport": "corrispondenze mappate dalla vista caricata", + "viewport feed is not a complete 250 km survey": "il feed della vista non Ăš un rilevamento completo di 250 km", + "HDG {value}°": "HDG {value}°", + "BRG {value}°": "BRG {value}°", + "BRG —": "BRG —", + "CRS {value}°": "CRS {value}°", + "CURRENT VIEWPORT ONLY": "SOLO VISTA ATTUALE", + "WITHIN {km} KM": "ENTRO {km} KM", + "Flights": "Voli", + "Military flights": "Voli militari", + "AIS vessels": "Navi AIS", + "Mapped installations": "Installazioni mappate", + "syncing {count} city feeds...": "sincronizzazione di {count} feed cittĂ ...", + "scanning nearby systems...": "scansione dei sistemi vicini...", + "GBFS fetch error": "Errore di recupero GBFS", + "Station {id}": "Stazione {id}", + "Station": "Stazione", + "đŸšČ {bikes} avail · {docks} docks · {capacity} cap": "đŸšČ {bikes} disp · {docks} stalli · {capacity} tot", + "⚠ Not installed": "⚠ Non installata", + "⚠ Not renting": "⚠ Noleggio non attivo", + "⚠ Not returning": "⚠ Restituzione non attiva", + "HDG {value}° (ESTIMATED)": "HDG {value}° (STIMATO)", + "{count} CAMERAS STANDING BY · NO CAMERA SELECTED · CLICK A CAMERA TO ACTIVATE": "TELECAMERE IN ATTESA: {count} · NESSUNA TELECAMERA SELEZIONATA · CLIC SU UNA TELECAMERA PER ATTIVARLA", + "No cameras available in catalog.": "Nessuna telecamera disponibile nel catalogo.", + "{city} CCTV": "CCTV {city}", + "FOV {value}° (DATASHEET)": "FOV {value}° (SCHEDA TECNICA)", + "FOV {value}°": "FOV {value}°", + "SPEC FOV {span}° (CAPABILITY)": "FOV SPEC {span}° (CAPACITÀ)", + "COVERAGE {value}kmÂČ": "COPERTURA {value}kmÂČ", + "OVERLAP {count} cams": "SOVRAPP. {count} cam", + "ISOLATED VIEW": "VISTA ISOLATA", + "PROJ MONITOR": "PROIEZ. MONITOR", + "PROJ OFF": "PROIEZ. OFF", + "VIEWSHED": "VIEWSHED", + "CAL {value}": "CAL {value}", + "SRC {value}": "FONTE {value}", + "{value} CONTEXT": "CONTESTO {value}", + "{spec} · SPECS: CCTV-DATABASE.COM": "{spec} · SPECIFICHE: CCTV-DATABASE.COM", + "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "Atlantico e Pacifico settentrionale orientale/centrale; non Ăš una copertura mondiale dei cicloni.", + "Cyclone advisories unavailable": "Bollettini sui cicloni non disponibili", + "Cyclone data unavailable": "Dati sui cicloni non disponibili", + "Potential tropical cyclone": "Potenziale ciclone tropicale", + "Post-tropical cyclone": "Ciclone post-tropicale", + "Hurricane": "Uragano", + "Tropical storm": "Tempesta tropicale", + "Tropical depression": "Depressione tropicale", + "Subtropical storm": "Tempesta subtropicale", + "Subtropical depression": "Depressione subtropicale", + "Track and cone match this advisory": "Traccia e cono corrispondono a questo bollettino", + "Track/cone awaiting advisory {number}": "Traccia/cono in attesa del bollettino {number}", + "Track/cone unavailable": "Traccia/cono non disponibili", + "Cached advisory · stale source": "Bollettino in cache · fonte obsoleta", + "Loading advisories
": "Caricamento dei bollettini
", + "{count} active storms": { + "one": "{count} tempesta attiva", + "many": "{count} di tempeste attive", + "other": "{count} tempeste attive" + }, + "Position as of {time}": "Posizione aggiornata al {time}", + "Maximum sustained wind: {wind} · Pressure: {pressure}": "Vento massimo sostenuto: {wind} · Pressione: {pressure}", + "{name} · {classification} · Advisory {number} · issued {time}": "{name} · {classification} · Bollettino {number} · emesso {time}", + "No active NHC/CPHC systems": "Nessun sistema NHC/CPHC attivo", + "Advisories unavailable": "Bollettini non disponibili", + "Cyclones · NHC / CPHC": "Cicloni · NHC / CPHC", + "Atlantic · E/C Pacific": "Atlantico · Pacifico E/C", + "{storms} · {name} selected": "{storms} · selezione: {name}", + "Official advisory ↗": "Bollettino ufficiale ↗", + "Active NHC and CPHC cyclone advisories": "Bollettini attivi sui cicloni di NHC e CPHC", + "Wind unavailable": "Vento non disponibile", + "Advisory center / forecast track": "Centro del ciclone da bollettino / traccia prevista", + "Center-track uncertainty cone": "Cono di incertezza della traccia del centro", + "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "Seleziona una tempesta sulla mappa, o scegline una nell'elenco per selezionarla e spostare la camera. Fai clic su un punto vuoto della mappa per annullare la selezione. Contesto dai bollettini NOAA NHC/CPHC. Il cono descrive l'incertezza sulla traccia prevista del centro, non le dimensioni della tempesta nĂ© l'intera area di pericolo. Le etichette dei punti di previsione indicano le scadenze di previsione in ore fornite dalla fonte, non orari calcolati dall'emissione del bollettino. La geometria segue la superficie; l'altezza non Ăš la quota meteorologica. Consulta il bollettino ufficiale.", + "DRIVE": "AUTO", + "Drive": "In auto", + "WALK": "A PIEDI", + "Walk": "A piedi", + "BIKE": "BICI", + "Bike": "In bici", + "rate limited": "limite di richieste raggiunto", + "routing service is rate limited": "il servizio di percorsi ha raggiunto il limite di richieste", + "routing busy — too many routes at once": "servizio di percorsi occupato: troppi percorsi contemporaneamente", + "route proxy error": "errore del proxy dei percorsi", + "route leg too long": "tratta del percorso troppo lunga", + "route too long": "percorso troppo lungo", + "{error} — try again in a moment": "{error}: riprova tra un momento", + "Routing is rate limited — try again in a moment": "Il calcolo del percorso ha raggiunto il limite di richieste: riprova tra un momento", + "Routing unavailable (HTTP {status})": "Calcolo del percorso non disponibile (HTTP {status})", + "Routing unavailable": "Calcolo del percorso non disponibile", + "direction|left": "a sinistra", + "direction|right": "a destra", + "direction|slightly left": "leggermente a sinistra", + "direction|slightly right": "leggermente a destra", + "direction|sharply left": "nettamente a sinistra", + "direction|sharply right": "nettamente a destra", + "direction|straight": "dritto", + "direction|around": "in senso opposto", + "fork direction|left": "a sinistra", + "fork direction|right": "a destra", + "fork direction|slightly left": "leggermente a sinistra", + "fork direction|slightly right": "leggermente a destra", + "fork direction|sharply left": "nettamente a sinistra", + "fork direction|sharply right": "nettamente a destra", + "fork direction|straight": "dritto", + "lane direction|left": "di sinistra", + "lane direction|right": "di destra", + "lane direction|slightly left": "di sinistra", + "lane direction|slightly right": "di destra", + "lane direction|sharply left": "all'estrema sinistra", + "lane direction|sharply right": "all'estrema destra", + "lane direction|straight": "per proseguire dritto", + "ordinal|{number}st": "{number}ÂȘ", + "ordinal|{number}nd": "{number}ÂȘ", + "ordinal|{number}rd": "{number}ÂȘ", + "ordinal|{number}th": "{number}ÂȘ", + "Head out on {road}": "Parti su {road}", + "Head out": "Parti", + "Arrive at your destination, on the left": "Arrivo a destinazione, sulla sinistra", + "Arrive at your destination, on the right": "Arrivo a destinazione, sulla destra", + "Arrive at your destination": "Arrivo a destinazione", + "Make a U-turn onto {road}": "Fai inversione a U su {road}", + "Make a U-turn": "Fai inversione a U", + "Continue straight onto {road}": "Prosegui dritto su {road}", + "Continue straight": "Prosegui dritto", + "Turn {direction} onto {road}": "Svolta {direction} su {road}", + "Turn {direction}": "Svolta {direction}", + "Turn onto {road}": "Svolta su {road}", + "maneuver|Turn": "Svolta", + "Continue {direction} onto {road}": "Prosegui {direction} su {road}", + "Continue {direction}": "Prosegui {direction}", + "At the end of the road, turn {direction} onto {road}": "Alla fine della strada, svolta {direction} su {road}", + "At the end of the road, turn {direction}": "Alla fine della strada, svolta {direction}", + "At the end of the road, continue onto {road}": "Alla fine della strada, prosegui su {road}", + "At the end of the road, continue": "Alla fine della strada, prosegui", + "Keep {direction} at the fork onto {road}": "Al bivio, prosegui {direction} verso {road}", + "Keep {direction} at the fork": "Al bivio, prosegui {direction}", + "Continue at the fork onto {road}": "Al bivio, prosegui verso {road}", + "Continue at the fork": "Al bivio, prosegui", + "Merge {direction} onto {road}": "Immettiti {direction} su {road}", + "Merge {direction}": "Immettiti {direction}", + "Merge onto {road}": "Immettiti su {road}", + "maneuver|Merge": "Immettiti", + "Take the ramp on the {direction} onto {road}": "Prendi la rampa {direction} verso {road}", + "Take the ramp on the {direction}": "Prendi la rampa {direction}", + "Take the ramp {direction} onto {road}": "Prendi la rampa {direction} verso {road}", + "Take the ramp {direction}": "Prendi la rampa {direction}", + "Take the ramp onto {road}": "Prendi la rampa verso {road}", + "Take the ramp": "Prendi la rampa", + "Take the exit on the {direction} onto {road}": "Prendi l'uscita {direction} verso {road}", + "Take the exit on the {direction}": "Prendi l'uscita {direction}", + "Take the exit {direction} onto {road}": "Prendi l'uscita {direction} verso {road}", + "Take the exit {direction}": "Prendi l'uscita {direction}", + "Take the exit onto {road}": "Prendi l'uscita verso {road}", + "Take the exit": "Prendi l'uscita", + "At the roundabout, take the {exit} exit onto {road}": "Alla rotonda, prendi la {exit} uscita verso {road}", + "At the roundabout, take the {exit} exit": "Alla rotonda, prendi la {exit} uscita", + "Enter the roundabout onto {road}": "Entra nella rotonda verso {road}", + "Enter the roundabout": "Entra nella rotonda", + "At the roundabout, turn {direction} onto {road}": "Alla rotonda, svolta {direction} su {road}", + "At the roundabout, turn {direction}": "Alla rotonda, svolta {direction}", + "At the roundabout, continue onto {road}": "Alla rotonda, prosegui su {road}", + "At the roundabout, continue": "Alla rotonda, prosegui", + "Exit the roundabout onto {road}": "Esci dalla rotonda su {road}", + "Exit the roundabout": "Esci dalla rotonda", + "Use the {direction} lane onto {road}": "Usa la corsia {direction} verso {road}", + "Use the {direction} lane": "Usa la corsia {direction}", + "Continue onto {road}": "Prosegui su {road}", + "maneuver|Continue": "Prosegui", + "{mode} — reroute for {modeLower}": "{mode} — ricalcola il percorso {modeLower}", + "CLICK MAP": "CLIC SULLA MAPPA", + "SET A": "IMPOSTA A", + "Click a spot on the globe to place A (click again to cancel)": "Fai clic su un punto del globo per posizionare A (clic di nuovo per annullare)", + "Then click the globe to place the start": "Poi fai clic sul globo per posizionare la partenza", + "SET B": "IMPOSTA B", + "Click a spot on the globe to place B (click again to cancel)": "Fai clic su un punto del globo per posizionare B (clic di nuovo per annullare)", + "Then click the globe to place the destination": "Poi fai clic sul globo per posizionare la destinazione", + "Swap A and B": "Scambia A e B", + "FLY ···": "VOLA ···", + "FLYING": "IN VOLO", + "FLY": "VOLA", + "Fly the camera along the route": "Fai volare la camera lungo il percorso", + "Place A and B first": "Posiziona prima A e B", + "action|CLEAR": "CANCELLA", + "Remove the route and both markers": "Rimuovi il percorso ed entrambi i marcatori", + "press Escape twice to leave Draw": "premi Esc due volte per uscire da Disegno", + "{name} is active — turn {name} off, then set {endpoint}": "Lo strumento {name} Ăš attivo: disattiva {name}, poi imposta {endpoint}", + "{name} is active — {leave}, then set {endpoint}": "Lo strumento {name} Ăš attivo: {leave}, poi imposta {endpoint}", + "Only the first {count} turns of this route are shown": "Sono mostrate solo le prime {count} svolte di questo percorso", + "Turn-by-turn directions": "Indicazioni passo passo", + "Another map tool is using clicks — close it, then SET A again": "Un altro strumento della mappa sta usando i clic: chiudilo, poi IMPOSTA A di nuovo", + "Routing
": "Calcolo del percorso
", + "No route found": "Nessun percorso trovato", + "{distance} · {duration} · {mode} · first {count} turns": "{distance} · {duration} · {mode} · prime {count} svolte", + "{distance} · {duration} · {mode}": "{distance} · {duration} · {mode}", + "Click the globe to place {endpoint}": "Fai clic sul globo per posizionare {endpoint}", + "SET B, then click the globe": "IMPOSTA B, poi fai clic sul globo", + "SET A, then click the globe": "IMPOSTA A, poi fai clic sul globo", + "Step {step} of {total} · then {leg}": "Passo {step} di {total} · poi {leg}", + "Step {step} of {total}": "Passo {step} di {total}", + "Then: {instruction}": "Poi: {instruction}", + "No route found between A and B": "Nessun percorso trovato tra A e B", + "Routing failed: {error}": "Calcolo del percorso non riuscito: {error}", + "Routing timed out": "Il calcolo del percorso Ăš andato in timeout", + "Routing unavailable — no response from the routing service": "Calcolo del percorso non disponibile: nessuna risposta dal servizio", + "Earthquake source unavailable": "Fonte dei terremoti non disponibile", + "Focus fire detection {title}, {details}": "Inquadra il rilevamento d'incendio {title}, {details}", + "live feed unavailable": "feed live non disponibile", + "{value} conf": "{value} conf", + "{value} ago": "{value} fa", + "sensor n/a": "sensore n/d", + "FIRE · {frp} MW": "INCENDIO · {frp} MW", + "NIGHT": "NOTTE", + "â–Č {frp} MW": "â–Č {frp} MW", + "FIRE": "INCENDIO", + "FIRES": "INCENDI", + "max {value} MW": "max {value} MW", + "new {value}": "ultimo: {value} fa", + "{value}°N": "{value}°N", + "{value}°S": "{value}°S", + "{value}°E": "{value}°E", + "{value}°W": "{value}°O", + "just now": "adesso", + "<1m ago": "<1 min fa", + "{count}m ago": "{count} min fa", + "{count}h ago": "{count} h fa", + "fire confidence|high": "alta", + "fire confidence|nominal": "nominale", + "fire confidence|low": "bassa", + "age|<1h": "<1 h", + "age|{count}h": "{count} h", + "age|{count}d": "{count} g", + "STALE · cached {age}": "OBSOLETO · in cache {age}", + "refreshing...": "aggiornamento...", + "loading...": "caricamento...", + "KEY REQUIRED": "CHIAVE RICHIESTA", + "LIVE · updated {age}": "LIVE · aggiornato {age}", + "Source snapshot time unavailable": "Ora dello snapshot della fonte non disponibile", + "Live data unavailable": "Dati live non disponibili", + "Intel Picture": "Quadro intelligence", + "Kinetic 30d": "Cinetico 30 g", + "Border Crisis": "Crisi di confine", + "Iran Picture": "Quadro Iran", + "Iran Kinetic": "Iran cinetico", + "Yemen FLOT": "FLOT Yemen", + "Latest Drop": "Ultima pubblicazione", + "GhostMaps file could not be read": "Impossibile leggere il file GhostMaps", + "{count} source links ↗ · click card to open the first": { + "one": "{count} link alla fonte ↗ · clic sulla scheda per aprirlo", + "many": "{count} di link alle fonti ↗ · clic sulla scheda per aprire il primo", + "other": "{count} link alle fonti ↗ · clic sulla scheda per aprire il primo" + }, + "S2 · {name}": "S2 · {name}", + "Report": "Rapporto", + "Open the source for {title}": "Apri la fonte di {title}", + "GhostMaps catalog unavailable": "Catalogo GhostMaps non disponibile", + "LIVE · GitHub {commit} · {message} · checked every {seconds}s": "LIVE · GitHub {commit} · {message} · controllato ogni {seconds}s", + "GitHub {commit} · {message} · reconnecting for live updates": "GitHub {commit} · {message} · riconnessione per gli aggiornamenti live", + "Connecting to the S2 GhostMaps repository
": "Connessione al repository S2 GhostMaps
", + "{count} placemarks": { + "one": "{count} segnaposto", + "many": "{count} di segnaposto", + "other": "{count} segnaposto" + }, + "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 pubblica questi prodotti KMZ su GitHub. I nuovi caricamenti vengono rilevati in pochi secondi e sostituiscono automaticamente l'edizione precedente. Fai clic su un marcatore per il suo rapporto.", + "Malformed GhostMaps catalog": "Catalogo GhostMaps non valido", + "Low-accuracy score < 2%": "Indice di bassa precisione < 2%", + "Low-accuracy score 2–10%": "Indice di bassa precisione 2–10%", + "Low-accuracy score > 10%": "Indice di bassa precisione > 10%", + "GNSS integrity source unavailable": "Fonte di integritĂ  GNSS non disponibile", + "Regional sample · 250 nm radius · cells from visited views over 30 min": "Campione regionale · raggio di 250 NM · celle dalle viste visitate negli ultimi 30 min", + "Retrying automatically at {time} UTC": "Nuovo tentativo automatico alle {time} UTC", + "Retrying automatically after provider cooldown": "Nuovo tentativo automatico dopo la pausa del provider", + "Updates automatically after pan or zoom and once a minute. The public feed covers a 250-nautical-mile circle around the view centre; zooming out does not make it a worldwide snapshot. Blank cells are outside sampled coverage or have insufficient observations.": "Si aggiorna automaticamente dopo uno spostamento o uno zoom e una volta al minuto. Il feed pubblico copre un cerchio di 250 miglia nautiche attorno al centro della vista; allontanare lo zoom non lo rende un'istantanea mondiale. Le celle vuote sono fuori dalla copertura campionata o hanno osservazioni insufficienti.", + "Low-accuracy score = 100 × max(0, bad − 1) / total: one aircraft is discounted, so this is not the raw share. Cells need {aircraft} aircraft over {minutes} minutes. Navigation-integrity anomalies are not a detection of jamming or spoofing.": "Indice di bassa precisione = 100 × max(0, anomali − 1) / totale: dal conteggio degli aerei anomali si sottrae un aereo, quindi non Ăš la percentuale grezza. Le celle richiedono {aircraft} aerei in {minutes} minuti. Le anomalie di integritĂ  della navigazione non costituiscono un rilevamento di jamming o spoofing.", + "GNSS snapshot needs a view anchor": "Lo snapshot GNSS richiede un punto di riferimento della vista", + "GNSS feed rate limited (HTTP 429)": "Limite di richieste del feed GNSS raggiunto (HTTP 429)", + "Malformed GNSS integrity snapshot": "Snapshot di integritĂ  GNSS non valido", + "GNSS integrity snapshot has no observation time": "Lo snapshot di integritĂ  GNSS non ha un'ora di osservazione", + "installation class|AIRFIELD": "AEROPORTO", + "installation class|NAVAL BASE": "BASE NAVALE", + "installation class|RANGE": "POLIGONO", + "installation class|MILITARY LAND": "TERRENO MILITARE", + "installation class|BASE": "BASE", + "installation class|BARRACKS": "CASERMA", + "installation class|TRAINING AREA": "AREA ADDESTRAMENTO", + "installation class|PLACES CANDIDATE": "CANDIDATO PLACES", + "installation class|INSTALLATION": "INSTALLAZIONE", + "No mapped sites within {km} km of the contact": "Nessun sito mappato entro {km} km dal contatto", + "{count} mapped sites within {km} km of the contact": { + "one": "{count} sito mappato entro {km} km dal contatto", + "many": "{count} di siti mappati entro {km} km dal contatto", + "other": "{count} siti mappati entro {km} km dal contatto" + }, + "No mapped sites in view": "Nessun sito mappato nella vista", + "{count} mapped sites in view": { + "one": "{count} sito mappato nella vista", + "many": "{count} di siti mappati nella vista", + "other": "{count} siti mappati nella vista" + }, + "loading mapped installation context": "caricamento del contesto dell'installazione mappata", + "Too many mapped sites in view to list them all": "Troppi siti mappati nella vista per elencarli tutti", + "Installation context unavailable": "Contesto delle installazioni non disponibile", + "MAPPED INSTALLATION": "INSTALLAZIONE MAPPATA", + "Unknown": "Sconosciuto", + "LAUNCH SITE · {site}": "SITO DI LANCIO · {site}", + "LAUNCH SITE": "SITO DI LANCIO", + "T−{time} · {mission}": "T−{time} · {mission}", + "LAUNCH STANDBY": "LANCIO IN ATTESA", + "LIFTOFF · {mission}": "DECOLLO · {mission}", + "ASCENT REPLAY · {mission}": "REPLAY SALITA · {mission}", + "ASCENT ESTIMATE · {mission}": "STIMA SALITA · {mission}", + "STAGE RE-ENTRY / RECOVERY · {mission}": "RIENTRO / RECUPERO STADI · {mission}", + "ORBIT REPLAY · {mission}": "REPLAY ORBITA · {mission}", + "PAUSED · {title}": "IN PAUSA · {title}", + "UNSPECIFIED": "NON SPECIFICATO", + "+{count} additional payload records": "Record payload aggiuntivi: +{count}", + "PAYLOAD DATA UNAVAILABLE": "DATI PAYLOAD NON DISPONIBILI", + "{value} KM DOWNRANGE": "{value} KM DOWNRANGE", + "POSITION UNAVAILABLE": "POSIZIONE NON DISPONIBILE", + "FLIGHT {count}": "VOLO {count}", + "REUSED": "RIUTILIZZATO", + "NO STAGE RE-ENTRY / RECOVERY DATA": "NESSUN DATO DI RIENTRO / RECUPERO DEGLI STADI", + "{count} / 30D": "{count} / 30G", + "NO MISSIONS AVAILABLE IN THE CURRENT 30-DAY WINDOW": "NESSUNA MISSIONE DISPONIBILE NELLA FINESTRA ATTUALE DI 30 GIORNI", + "DATE UNAVAILABLE": "DATA NON DISPONIBILE", + "UNSPECIFIED OPERATOR": "OPERATORE NON SPECIFICATO", + "Select {mission}": "Seleziona {mission}", + "{value} KM": "{value} KM", + "{value} KM/S": "{value} KM/S", + "Selected Space Mission": "Missione spaziale selezionata", + "SELECTED SPACE MISSION": "MISSIONE SPAZIALE SELEZIONATA", + "Show all missions": "Mostra tutte le missioni", + "Deselect mission": "Deseleziona la missione", + "MISSION": "MISSIONE", + "STATUS · ": "STATO · ", + "LAUNCH SITE · ": "SITO DI LANCIO · ", + "LAUNCH TIME · ": "ORA DI LANCIO · ", + "ORBIT · ": "ORBITA · ", + "ASCENT PATH · ": "TRAIETTORIA DI SALITA · ", + "CURRENT DISTANCE FROM EARTH · ": "DISTANZA ATTUALE DALLA TERRA · ", + "SATELLITE SPEED · ": "VELOCITÀ SATELLITE · ", + "PAYLOAD": "PAYLOAD", + "NAME": "NOME", + "TYPE": "TIPO", + "DESTINATION": "DESTINAZIONE", + "STAGE / RE-ENTRY / RECOVERY": "STADIO / RIENTRO / RECUPERO", + "STAGE": "STADIO", + "STATUS": "STATO", + "FINAL POSITION": "POSIZIONE FINALE", + "REPLAY SPEED": "VELOCITÀ REPLAY", + "Replay speed multiplier": "Moltiplicatore di velocitĂ  del replay", + "REPLAY ASCENT": "RIVEDI SALITA", + "Previous mission": "Missione precedente", + "PREV": "PREC", + "Next mission": "Missione successiva", + "SHOW ALL / DESELECT": "MOSTRA TUTTE / DESELEZIONA", + "Pause replay": "Metti in pausa il replay", + "Cancel replay": "Annulla il replay", + "EST. DOWNRANGE": "DOWNRANGE STIM.", + "PLANNED · ": "PREVISTA · ", + "SUPPLIED TRAJECTORY POINTS": "PUNTI DI TRAIETTORIA FORNITI", + "RECONSTRUCTED ESTIMATE": "STIMA RICOSTRUITA", + "Replay the estimated ascent with a following camera": "Rivedi la salita stimata con una camera che segue il razzo", + "Resume replay": "Riprendi il replay", + "T minus {seconds}": "T meno {seconds}", + "Preparing launch site": "Preparazione del sito di lancio", + "Liftoff": "Decollo", + "Ascent replay": "Replay della salita", + "Orbit replay": "Replay dell'orbita", + ", paused": ", in pausa", + "Malformed launch snapshot": "Snapshot dei lanci non valido", + "Heard by your receiver": "Ricevuto dal tuo ricevitore", + "1090 MHz": "1090 MHz", + "978 MHz UAT": "978 MHz UAT", + "browser SDR": "SDR nel browser", + "decoder feed": "feed del decoder", + "Your RTL-SDR receiver and decoder feed": "Il tuo ricevitore RTL-SDR e il feed del decoder", + "Your decoder feed": "Il tuo feed del decoder", + "Your RTL-SDR receiver": "Il tuo ricevitore RTL-SDR", + "NO CALLSIGN": "NESSUN NOMINATIVO", + "ALT {altitude} FT · GS {speed} KT · TRK {track}": "ALT {altitude} FT · GS {speed} KT · TRK {track}", + "V/S {rate}": "V/S {rate}", + "V/S {rate} FPM": "V/S {rate} FPM", + "POSITION {age}": "POSIZIONE {age}", + "POSITION {seconds} S AGO": "POSIZIONE {seconds} S FA", + "{count} MSGS": { + "one": "{count} MSG", + "many": "{count} DI MSG", + "other": "{count} MSG" + }, + "Decoder feeds": "Feed dei decoder", + "WebUSB + decoder feeds": "WebUSB + feed dei decoder", + "opening receiver": "apertura del ricevitore", + "checking decoder feeds": "verifica dei feed dei decoder", + "WebUSB needs desktop Chrome or Edge": "WebUSB richiede Chrome o Edge desktop", + "connect a receiver in Radio": "collega un ricevitore in Radio", + "receiver is in FM mode": "il ricevitore Ăš in modalitĂ  FM", + "listening": "in ascolto", + "USB error": "errore USB", + "Alt unknown": "Quota sconosciuta", + "Type unknown": "Tipo sconosciuto", + "Reg unknown": "Matricola sconosciuta", + "Operator unknown": "Operatore sconosciuto", + "${amount}K": "{amount} mila $", + "${amount}M": "{amount} mln $", + "${amount}B": "{amount} mld $", + "fire cause|Human": "umana", + "fire cause|Natural": "naturale", + "fire cause|Undetermined": "indeterminata", + "fire cause|Unknown": "sconosciuta", + "fire behavior|Minimal": "Minimo", + "fire behavior|Moderate": "Moderato", + "fire behavior|Active": "Attivo", + "fire behavior|Extreme": "Estremo", + "Type {level} Incident": "Evento di tipo {level}", + "age|{count}m": "{count} min", + "{acres} ac": { + "one": "{acres} acro", + "many": "{acres} di acri", + "other": "{acres} acri" + }, + "{percent}% contained": "contenuto al {percent}%", + "containment unknown": "contenimento sconosciuto", + "{cause} cause": "causa {cause}", + "{personnel} personnel": { + "one": "{personnel} addetto", + "many": "{personnel} di addetti", + "other": "{personnel} addetti" + }, + "{county} County": "Contea di {county}", + "{cost} to date": "{cost} finora", + "discovered {age} ago": "scoperto {age} fa", + "updated {age} ago": "aggiornato {age} fa", + "part of {complex}": "parte di {complex}", + "InciWeb ↗ · click card to open": "InciWeb ↗ · clic sulla scheda per aprirlo", + "FIRE · {name}": "INCENDIO · {name}", + "Unnamed incident": "Incendio senza nome", + "Open {title} on InciWeb": "Apri {title} su InciWeb", + "Perimeter source unavailable": "Fonte dei perimetri non disponibile", + "Not contained or unknown": "Non contenuto o dato non disponibile", + "Under 50% contained": "Contenuto a meno del 50%", + "50–99% contained": "Contenuto al 50–99%", + "Fully contained": "Completamente contenuto", + "Colour shows reported containment. Perimeters are simplified to about 100 m.": "Il colore indica il contenimento riportato. I perimetri sono semplificati a circa 100 m.", + "Malformed perimeter snapshot": "Snapshot dei perimetri non valido", + "radio tag|All": "Tutti", + "News": "Notizie", + "Talk": "Talk", + "Weather / Emergency": "Meteo / Emergenza", + "Public Safety": "Sicurezza pubblica", + "Aviation / Marine": "Aviazione / Nautica", + "Traffic / Transit": "Traffico / Trasporti", + "Music": "Musica", + "Other": "Altro", + "Directory refresh degraded; showing the previous station catalog.": "Aggiornamento dell'elenco degradato; viene mostrato il catalogo stazioni precedente.", + "Radio directory coverage is degraded.": "La copertura dell'elenco radio Ăš degradata.", + "Directory refresh failed; showing the previous station catalog.": "Aggiornamento dell'elenco non riuscito; viene mostrato il catalogo stazioni precedente.", + "Radio directory is temporarily unavailable.": "L'elenco radio Ăš temporaneamente non disponibile.", + "radio|NEWS": "NOTIZIE", + "radio|TALK": "TALK", + "radio|WEATHER": "METEO", + "radio|SAFETY": "SICUREZZA", + "radio|AIR / SEA": "ARIA / MARE", + "radio|TRANSIT": "TRASPORTI", + "radio|MUSIC": "MUSICA", + "radio|OTHER": "ALTRO", + "Broadcaster stream is unavailable or blocked by the browser.": "Il flusso dell'emittente non Ăš disponibile o Ăš bloccato dal browser.", + "Playback requires a direct click or tap.": "La riproduzione richiede un clic o un tocco diretto.", + "Broadcaster stream could not be started.": "Impossibile avviare il flusso dell'emittente.", + "Alternative": "Alternative", + "Ambient": "Ambient", + "Blues": "Blues", + "Classical": "Classica", + "Country": "Country", + "Dance": "Dance", + "Electronic": "Elettronica", + "Folk": "Folk", + "Funk": "Funk", + "Hip-Hop": "Hip-Hop", + "House": "House", + "Indie": "Indie", + "Jazz": "Jazz", + "Latin": "Latina", + "Metal": "Metal", + "Oldies": "Oldies", + "Pop": "Pop", + "Punk": "Punk", + "R&B": "R&B", + "Reggae": "Reggae", + "Rock": "Rock", + "Soul": "Soul", + "Techno": "Techno", + "Trance": "Trance", + "World": "World", + "overview": "panoramica", + "cloud unknown": "nuvolositĂ  sconosciuta", + "{percent}% scene cloud": "{percent}% di nuvole nella scena", + "{min}–{max}% scene cloud": "{min}–{max}% di nuvole nella scena", + "Comparison in use by another scene": "Confronto in uso da un'altra scena", + "Esri map unavailable · no swipe": "Mappa Esri non disponibile · niente confronto", + "Swipe needs a globe map": "Il confronto richiede una mappa del globo", + "Imagery stays on Esri · CLEAR to use Google 3D": "Le immagini restano su Esri · CANCELLA per usare Google 3D", + "Imagery catalog unavailable": "Catalogo immagini non disponibile", + "Catalog truncated · a newer clear day may exist": "Catalogo troncato · potrebbe esistere un giorno sereno piĂč recente", + "{label} catalog unavailable · {detail}": "Catalogo {label} non disponibile · {detail}", + "Daily overview for today may still be empty until the pass": "La panoramica giornaliera di oggi potrebbe restare vuota fino al passaggio", + "Box and images cleared": "Riquadro e immagini cancellati", + "MORE DETAIL · 30 m": "PIÙ DETTAGLIO · 30 m", + "Sentinel-2 and Landsat via HLS, 30 m, every 2–6 days": "Sentinel-2 e Landsat tramite HLS, 30 m, ogni 2–6 giorni", + "DAILY OVERVIEW · 250 m": "PANORAMICA GIORNALIERA · 250 m", + "VIIRS daily mosaic, 250 m, follows broad changes; little detail under 25 km": "Mosaico giornaliero VIIRS, 250 m, mostra i cambiamenti su vasta scala; pochi dettagli sotto i 25 km", + "Sentinel-2": "Sentinel-2", + "Sentinel-2 via HLS": "Sentinel-2 tramite HLS", + "Landsat 8/9": "Landsat 8/9", + "Landsat 8/9 via HLS": "Landsat 8/9 tramite HLS", + "Daily overview": "Panoramica giornaliera", + "Box edges must be finite": "Le coordinate dei bordi del riquadro devono essere numeri finiti", + "Longitudes must be within ±180°": "Le longitudini devono essere entro ±180°", + "Select one side of the dateline": "Seleziona un solo lato della linea del cambio di data", + "Box must enclose an area": "Il riquadro deve racchiudere un'area", + "Add the full Starlink broadband shell (thousands of extra points)": "Aggiungi l'intero shell Starlink a banda larga (migliaia di punti in piĂč)", + "Loading the Starlink shell
": "Caricamento dello shell Starlink
", + "Starlink {detail} — click to retry": "Starlink {detail}: clic per riprovare", + "load failed": "caricamento non riuscito", + "Showing the full Starlink shell — click for the core catalog only": "Shell Starlink completo visualizzato: clic per mostrare solo il catalogo principale", + "DENSE ···": "DENSO ···", + "DENSE ✕": "DENSO ✕", + "DENSE": "DENSO", + "CelesTrak unreachable": "CelesTrak irraggiungibile", + "DOCKED · {name} · +{extra}": "AGGANCIATO · {name} · +{extra}", + "DOCKED · {name}": "AGGANCIATO · {name}", + "{name} needs the Google 3D map: choose it under MAP SOURCE": "{name} richiede la mappa Google 3D: sceglila in FONTE MAPPA", + "zoom in to a street to open {name}": "ingrandisci su una strada per aprire {name}", + "loading coverage...": "caricamento della copertura...", + "No street-level imagery within {radius} m of that point": "Nessuna immagine a livello stradale entro {radius} m da quel punto", + "No street-level imagery within {radius} m of the view centre": "Nessuna immagine a livello stradale entro {radius} m dal centro della vista", + "Zoom in to see street-level coverage": "Ingrandisci per vedere la copertura a livello stradale", + "Point the camera at the ground for street-level coverage": "Punta la camera verso il suolo per la copertura a livello stradale", + "Coverage tile failed": "Caricamento del tile di copertura non riuscito", + "The photo could not be loaded": "Impossibile caricare la foto", + "{name} photo. ← and → step along the sequence. On a 360° photo, drag or use Shift+← →, ↑ ↓ to look around, and + − to zoom": "Foto {name}. ← e → scorrono la sequenza. Su una foto a 360°, trascina o usa Shift+← →, ↑ ↓ per guardarti intorno, e + − per lo zoom", + "{name} street-level photo": "Foto a livello stradale {name}", + "Previous photo in this sequence (←)": "Foto precedente in questa sequenza (←)", + "Next photo in this sequence (→)": "Foto successiva in questa sequenza (→)", + "Aim the middle of the view at a street to look for imagery there": "Punta il centro della vista su una strada per cercare immagini lĂŹ", + "KEY REJECTED": "CHIAVE RIFIUTATA", + "GOOGLE_MAPS_API_KEY is not set": "GOOGLE_MAPS_API_KEY non Ăš impostata", + "The Google Maps JavaScript API could not load": "Impossibile caricare la Google Maps JavaScript API", + "Google Street View": "Google Street View", + "GOOGLE STREET VIEW": "GOOGLE STREET VIEW", + "Google refused GOOGLE_MAPS_API_KEY for Street View — check that the Maps JavaScript API is enabled for it and this site is an allowed referrer": "Google ha rifiutato GOOGLE_MAPS_API_KEY per Street View: verifica che la Maps JavaScript API sia abilitata per la chiave e che questo sito sia un referrer consentito", + "Street View did not answer — check the network, and that the Maps JavaScript API is enabled for GOOGLE_MAPS_API_KEY": "Street View non ha risposto: controlla la rete e che la Maps JavaScript API sia abilitata per GOOGLE_MAPS_API_KEY", + "click a street to open Street View": "fai clic su una strada per aprire Street View", + "Street View has no imagery for this place": "Street View non ha immagini per questo luogo", + "KartaView has no position for this photo": "KartaView non ha una posizione per questa foto", + "The KartaView photo could not be loaded": "Impossibile caricare la foto KartaView", + "zoom in to see KartaView coverage": "ingrandisci per vedere la copertura KartaView", + "no KartaView photos in view": "nessuna foto KartaView nella vista", + "KartaView is rate-limiting requests — they resume on their own": "KartaView sta limitando le richieste: riprenderanno da sole", + "KartaView’s photos here are archived and cannot be shown": "Le foto KartaView qui sono archiviate e non possono essere mostrate", + "KartaView did not filter this area in time — move the map to ask again": "KartaView non ha filtrato quest'area in tempo: sposta la mappa per riprovare", + "None of KartaView’s photos here pass the imagery filter": "Nessuna delle foto KartaView qui supera il filtro delle immagini", + "KartaView did not answer in time — try again": "KartaView non ha risposto in tempo: riprova", + "KartaView could not be reached — check the network": "KartaView non Ăš raggiungibile: controlla la rete", + "KartaView sent an answer that could not be read": "KartaView ha inviato una risposta illeggibile", + "KartaView is rate-limiting requests": "KartaView sta limitando le richieste", + "KartaView sent too much data": "KartaView ha inviato troppi dati", + "KartaView is rate-limiting requests — try again in a moment": "KartaView sta limitando le richieste: riprova tra un momento", + "KartaView has no such photo": "KartaView non ha questa foto", + "Mapillary rejected MAPILLARY_CLIENT_TOKEN — replace it in Provider Settings": "Mapillary ha rifiutato MAPILLARY_CLIENT_TOKEN: sostituiscilo in Impostazioni provider", + "Coverage requests are being rate-limited — they resume on their own": "Le richieste di copertura sono limitate: riprenderanno da sole", + "The Panoramax photo could not be loaded": "Impossibile caricare la foto Panoramax", + "Panoramax is busy — coverage resumes on its own": "Panoramax Ăš occupato: la copertura riprenderĂ  da sola", + "no Panoramax photos in view": "nessuna foto Panoramax nella vista", + "no Panoramax photos here match the filters": "nessuna foto Panoramax qui corrisponde ai filtri", + "Panoramax sent a map tile that could not be read": "Panoramax ha inviato un tile della mappa illeggibile", + "This Panoramax photo is no longer available": "Questa foto Panoramax non Ăš piĂč disponibile", + "zoom in to see Panoramax coverage": "ingrandisci per vedere la copertura Panoramax", + "Panoramax did not answer in time — try again": "Panoramax non ha risposto in tempo: riprova", + "Panoramax could not be reached — check the connection": "Panoramax non Ăš raggiungibile: controlla la connessione", + "Panoramax sent too much data": "Panoramax ha inviato troppi dati", + "Panoramax is busy": "Panoramax Ăš occupato", + "Panoramax sent an unreadable answer": "Panoramax ha inviato una risposta illeggibile", + "Sequence images unavailable": "Immagini della sequenza non disponibili", + "No street-level imagery providers configured": "Nessun provider di immagini a livello stradale configurato", + "(by upload date)": "(per data di caricamento)", + "Open the Street Level panel to view imagery": "Apri il pannello Vista stradale per vedere le immagini", + "Image could not be opened": "Impossibile aprire l'immagine", + "TeleGeography load failed": "Caricamento TeleGeography non riuscito", + "UNAVAILABLE · {source} · Roads unavailable": "NON DISPONIBILE · {source} · Strade non disponibili", + "Roads: {source}": "Strade: {source}", + "TomTom roads unavailable while the traffic service is unreachable": "Strade TomTom non disponibili mentre il servizio traffico Ăš irraggiungibile", + "Hybrid unavailable while the traffic service is unreachable": "ModalitĂ  Ibrido non disponibile mentre il servizio traffico Ăš irraggiungibile", + "TomTom roads need a TomTom key": "Le strade TomTom richiedono una chiave TomTom", + "Hybrid needs a TomTom key": "La modalitĂ  Ibrido richiede una chiave TomTom", + "Local surface still loading": "Superficie locale ancora in caricamento", + "Partial coverage": "Copertura parziale", + "Detailed roads unavailable": "Strade dettagliate non disponibili", + "Reduced detail coverage": "Copertura con dettaglio ridotto", + "TomTom roads only, each with its live flow": "Solo strade TomTom, ognuna con il suo flusso live", + "TomTom roads only, each with its live flow (needs a TomTom key)": "Solo strade TomTom, ognuna con il suo flusso live (richiede una chiave TomTom)", + "OpenStreetMap roads, with TomTom flow matched when available": "Strade OpenStreetMap, con il flusso TomTom abbinato quando disponibile", + "TomTom roads first; OpenStreetMap fills the rest, simulated": "Prima le strade TomTom; OpenStreetMap completa il resto, simulato", + "TomTom roads first; OpenStreetMap fills the rest, simulated (needs a TomTom key)": "Prima le strade TomTom; OpenStreetMap completa il resto, simulato (richiede una chiave TomTom)", + "Hybrid": "Ibrido", + "TomTom key unavailable": "Chiave TomTom non disponibile", + "TomTom daily budget reached": "Budget giornaliero TomTom esaurito", + "TomTom upstream unreachable": "Servizio TomTom irraggiungibile", + "TomTom flow unavailable": "Flusso TomTom non disponibile", + "SIMULATED — {reason}": "SIMULATO: {reason}", + "Syncing flow · Roads: {source}": "Sincronizzazione flusso · Strade: {source}", + "LIVE · Roads: {source} · Roads without flow hidden": "LIVE · Strade: {source} · Strade senza flusso nascoste", + "LIVE · Roads: {source} · No flow roads in view": "LIVE · Strade: {source} · Nessuna strada con flusso in vista", + "LIVE · Roads: {source} · Flow {percent}%": "LIVE · Strade: {source} · Flusso {percent}%", + "SIMULATED · Roads: {source} · Flow {percent}%": "SIMULATO · Strade: {source} · Flusso {percent}%", + "STALE · Roads: {source} · Flow: cached TomTom tiles": "OBSOLETO · Strade: {source} · Flusso: tile TomTom in cache", + "Syncing flow · Roads: OpenStreetMap · Flow: TomTom · Unmatched: simulated": "Sincronizzazione flusso · Strade: OpenStreetMap · Flusso: TomTom · Non abbinate: simulate", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov · Unmatched: simulated": "LIVE · Strade: OpenStreetMap · Flusso: TomTom · {percent}% cop. · Non abbinate: simulate", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov": "LIVE · Strade: OpenStreetMap · Flusso: TomTom · {percent}% cop.", + "SIMULATED · Roads: OpenStreetMap · Flow: TomTom (no matches)": "SIMULATO · Strade: OpenStreetMap · Flusso: TomTom (nessuna corrispondenza)", + "SIMULATED — traffic service unreachable": "SIMULATO: servizio traffico irraggiungibile", + "SIMULATED — add TomTom key for live": "SIMULATO: aggiungi la chiave TomTom per i dati live", + "OpenFreeMap tiles rate-limited": "Tile OpenFreeMap con limite di richieste", + "OpenFreeMap tiles timed out": "Tile OpenFreeMap in timeout", + "OpenFreeMap tiles unavailable": "Tile OpenFreeMap non disponibili", + "occupancy|empty": "vuoto", + "occupancy|many seats available": "molti posti disponibili", + "occupancy|few seats available": "pochi posti disponibili", + "occupancy|standing room only": "solo posti in piedi", + "occupancy|crushed standing room only": "solo posti in piedi, affollato", + "occupancy|full": "pieno", + "occupancy|not accepting passengers": "non accetta passeggeri", + "occupancy|not boardable": "non Ăš possibile salire", + "Route {route}": "Linea {route}", + "Vehicle {vehicle}": "Veicolo {vehicle}", + "vehicle motion|Stopped": "Fermo", + "No recent fix": "Nessuna posizione recente", + "Waiting for update": "In attesa di aggiornamento", + "Moving": "In movimento", + "reported {speed} km/h": "{speed} km/h riportati", + "reported hdg {heading}°": "direzione {heading}° riportata", + "Last report: stopped at stop {stop}": "Ultima segnalazione: fermo alla fermata {stop}", + "Last report: arriving at stop {stop}": "Ultima segnalazione: in arrivo alla fermata {stop}", + "Last report: next stop {stop}": "Ultima segnalazione: prossima fermata {stop}", + "Shown at street level · depth not in the feed": "Mostrato a livello stradale · profonditĂ  non presente nel feed", + "Reported {seconds} s ago": "Riportato {seconds} s fa", + "Reported {minutes} min ago": "Riportato {minutes} min fa", + "shown {seconds} s behind": "mostrato con {seconds} s di ritardo", + "{reported} (feed time)": "{reported} (ora del feed)", + "Available trail: {minutes} min (limited)": "Scia disponibile: {minutes} min (limitata)", + "Available trail: {minutes} min": "Scia disponibile: {minutes} min", + "Bus": "Autobus", + "Tram": "Tram", + "Subway": "Metropolitana", + "Train": "Treno", + "Ferry": "Traghetto", + "Transit vehicle": "Veicolo del trasporto pubblico", + "AIS: {name}": "AIS: {name}", + "{type} SPD: {speed} HDG: {heading}": "{type} VEL: {speed} HDG: {heading}", + "VESSEL": "NAVE", + "{speed}KT": "{speed}KT", + "{heading}DEG": "{heading}°", + "POS: LIVE": "POS: LIVE", + "POS: {time}Z": "POS: {time}Z", + "AIS live load failed": "Caricamento AIS live non riuscito", + "awaiting first AIS position
": "in attesa della prima posizione AIS
", + "awaiting usable AIS positions
": "in attesa di posizioni AIS utilizzabili
", + "awaiting first AIS message
": "in attesa del primo messaggio AIS
", + "AISSTREAM_API_KEY not set": "AISSTREAM_API_KEY non impostata", + "live feed unsupported": "feed live non supportato", + "connecting to feed
": "connessione al feed
", + "feed disconnected": "feed disconnesso", + "feed down": "feed inattivo", + "feed idle": "feed fermo", + "API key rejected — check AISSTREAM_API_KEY": "Chiave API rifiutata: controlla AISSTREAM_API_KEY", + "feed silent {seconds}s — no AIS data": "feed silenzioso da {seconds}s: nessun dato AIS", + "feed silent — no AIS data": "feed silenzioso: nessun dato AIS", + "feed down — retrying slowly (attempt {attempt})": "feed inattivo: nuovi tentativi lenti (tentativo {attempt})", + "reconnecting to feed
 (attempt {attempt})": "riconnessione al feed
 (tentativo {attempt})", + "feed down — retrying slowly": "feed inattivo: nuovi tentativi lenti", + "reconnecting to feed
": "riconnessione al feed
", + "Focus vessel {name}, MMSI {mmsi}": "Inquadra la nave {name}, MMSI {mmsi}", + "Hidden by this map source · choose a globe map": "Nascosto da questa fonte mappa · scegli una mappa del globo", + "Weather image HTTP {status}": "Immagine meteo HTTP {status}", + "Weather HTTP {status}": "Meteo HTTP {status}", + "Frame unavailable; previous observation retained": "Fotogramma non disponibile; mantenuta l'osservazione precedente", + "Weather imagery unavailable": "Immagini meteo non disponibili", + "Weather source unavailable; previous observation retained": "Fonte meteo non disponibile; mantenuta l'osservazione precedente", + "Weather unavailable": "Meteo non disponibile", + "No frame within {gap} min of {time}": "Nessun fotogramma entro {gap} min da {time}", + "No frame within {gap} h of {time}": "Nessun fotogramma entro {gap} h da {time}", + "{hours}h {minutes}m ago": "{hours} h {minutes} min fa", + "{minutes}m ago": "{minutes} min fa", + "{state} · {time} · {lag}": "{state} · {time} · {lag}", + "Observed": "Osservato", + "History": "Storico", + "Observation unavailable": "Osservazione non disponibile", + "Waiting for observation": "In attesa dell'osservazione", + "{detail} · synced": "{detail} · sincronizzato", + "{detail} · nearest": "{detail} · piĂč vicino", + "RADAR REFLECTIVITY · dBZ": "RIFLETTIVITÀ RADAR · dBZ", + "LIGHTNING DENSITY · 15 min accumulation": "DENSITÀ DI FULMINI · accumulo di 15 min", + "GLOBAL INFRARED · hourly": "INFRAROSSO GLOBALE · orario", + "GOES INFRARED · ~5 min": "INFRAROSSO GOES · ~5 min", + "{state}: {time}": "{state}: {time}", + "Latest observation": "Ultima osservazione", + "frame {index}/{total}": "fotogramma {index}/{total}", + "loading": "caricamento", + "Observation: unavailable": "Osservazione: non disponibile", + "Contiguous US · gaps ≠ no rain": "USA contigui · lacune ≠ assenza di pioggia", + "Americas + Pacific · not individual strikes": "Americhe + Pacifico · non singoli fulmini", + "Color: strikes/kmÂČ/min ×10Âł": "Colore: fulmini/kmÂČ/min ×10Âł", + "60°S–60°N · typically 2–3 h delayed": "60°S–60°N · di solito 2–3 h di ritardo", + "North America · infrared imagery": "Nord America · immagini all'infrarosso", + "Reduced motion · history playback unavailable": "Movimento ridotto · riproduzione dello storico non disponibile", + "Reduced motion · manual history available": "Movimento ridotto · storico manuale disponibile", + "Rain radar · US": "Radar pioggia · USA", + "Lightning density · 15 min": "DensitĂ  di fulmini · 15 min", + "Satellite clouds": "Nuvole da satellite", + "Americas + Pacific": "Americhe + Pacifico", + "Global · 60°S–60°N": "Globale · 60°S–60°N", + "North America": "Nord America", + "Source observations delayed": "Osservazioni della fonte in ritardo", + "Stale source": "Fonte obsoleta", + "Loading next frame
": "Caricamento del fotogramma successivo
", + "Map center outside coverage": "Centro della mappa fuori copertura", + "strikes/kmÂČ/min ×10Âł": "fulmini/kmÂČ/min ×10Âł", + "N. America": "Nord America", + "Global": "Globale", + "Hourly global mosaic; usually 2–3 hours delayed": "Mosaico globale orario; di solito 2–3 ore di ritardo", + "GOES regional clouds; approximately 5-minute updates": "Nuvole regionali GOES; aggiornamenti circa ogni 5 minuti", + "Clouds only": "Solo nuvole", + "Apply the full cloud brightness key; 100% filter strength": "Applica al massimo il filtro basato sulla luminositĂ  delle nuvole; intensitĂ  del filtro 100%", + "Full": "Completa", + "Show the complete infrared image; 0% filter strength": "Mostra l'intera immagine all'infrarosso; intensitĂ  del filtro 0%", + "Soft": "Tenue", + "Vivid": "Vivida", + "Image opacity; does not alter the observed values": "OpacitĂ  dell'immagine; non altera i valori osservati", + "View US radar": "Vedi il radar USA", + "View Americas & Pacific": "Vedi Americhe e Pacifico", + "View coverage": "Vedi la copertura", + "{value} strikes/kmÂČ/min ×10Âł (15-minute density)": "{value} fulmini/kmÂČ/min ×10Âł (densitĂ  su 15 minuti)", + "{value} dBZ radar reflectivity": "{value} dBZ di riflettivitĂ  radar", + "STALE · cached source metadata": "OBSOLETO · metadati della fonte in cache", + "Map center is outside source coverage": "Il centro della mappa Ăš fuori dalla copertura della fonte", + "NOAA/NWS 15-minute lightning density derived from Vaisala NLDN/GLD360. Coverage 110°E across the Pacific/Americas to 0°, 25°S–80°N. Not a live strike count, global coverage or a safety warning.": "DensitĂ  di fulmini a 15 minuti NOAA/NWS derivata da Vaisala NLDN/GLD360. Copertura da 110°E attraverso il Pacifico e le Americhe fino a 0°, 25°S–80°N. Non Ăš un conteggio live dei fulmini, nĂ© una copertura globale nĂ© un avviso di sicurezza.", + "NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "Gli echi radar NOAA MRMS indicano la distribuzione delle precipitazioni, non l'intensitĂ  della pioggia, un avviso di tempesta o una previsione. Risoluzione nativa della fonte circa 1 km; la visualizzazione Ăš limitata al livello 6. I fotogrammi usano gli orari esatti di osservazione dichiarati.", + "GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "Infrarosso a onda lunga GOES-19/18 Banda 14 regionale; mosaico globale a onda lunga NESDIS. Solo nuvole attenua tutto tranne le sommitĂ  nuvolose fredde e luminose; Ăš un filtro di luminositĂ , non una maschera delle nuvole. Copertura e aggiornamento variano per regione.", + "REGION": "REGIONE", + "IMAGE": "IMMAGINE", + "FILTER": "FILTRO", + "Cloud filter strength": "IntensitĂ  del filtro nuvole", + "OPACITY": "OPACITÀ", + "Infrared decode failed": "Decodifica dell'infrarosso non riuscita", + "Weather prefetch unavailable": "Precaricamento meteo non disponibile", + "Weather tiles unavailable · previous frame retained": "Tile meteo non disponibili · mantenuto il fotogramma precedente", + "Some weather tiles unavailable": "Alcuni tile meteo non sono disponibili", + "Malformed weather manifest": "Manifest meteo non valido", + "Weather request timed out": "La richiesta meteo Ăš andata in timeout", + "Temperature field unavailable": "Campo di temperatura non disponibile", + "Mean sea level pressure field unavailable": "Campo di pressione al livello del mare non disponibile", + "Wind upstream unavailable": "Servizio del vento non disponibile", + "{source} HTTP {status}": "{source} HTTP {status}", + "Wind": "Vento", + "Wind source unavailable": "Fonte del vento non disponibile", + "Forecast · does not follow history": "Previsione · non segue lo storico", + "Wind motion": "Movimento del vento", + "Wind speed": "VelocitĂ  del vento", + "Sea-level pressure": "Pressione al livello del mare", + "Air temperature · 2 m": "Temperatura dell'aria · 2 m", + "Global · 1° grid": "Globale · griglia di 1°", + "{model} forecast · {time}": "Previsione {model} · {time}", + "Loading forecast": "Caricamento della previsione", + "Preparing flow": "Preparazione del flusso", + "Selected field unavailable": "Campo selezionato non disponibile", + "Cached forecast · stale": "Previsione in cache · obsoleta", + "ECMWF IFS surface forecast": "Previsione di superficie ECMWF IFS", + "NOAA GFS surface forecast": "Previsione di superficie NOAA GFS", + "Reduced motion": "Movimento ridotto", + "Resume": "Riprendi", + "Pause": "Pausa", + "Pause visual flow; forecast time does not advance with animation": "Metti in pausa il flusso visivo; l'ora della previsione non avanza con l'animazione", + "None": "Nessuno", + "Speed": "VelocitĂ ", + "Pressure": "Pressione", + "Temperature": "Temperatura", + "Wind trails with no field shading": "Scie del vento senza ombreggiatura del campo", + "How hard the surface wind is blowing": "Quanto forte soffia il vento in superficie", + "Sea-level air pressure: broad highs and lows": "Pressione atmosferica al livello del mare: aree di alta e bassa pressione", + "Air temperature two meters above the surface": "Temperatura dell'aria a due metri dalla superficie", + "Wind speed units": "UnitĂ  della velocitĂ  del vento", + "Read wind at map center": "Leggi il vento al centro della mappa", + "Read the forecast at the center of the map without changing selection": "Leggi la previsione al centro della mappa senza cambiare la selezione", + "{model} forecast · {field} ({unit})": "Previsione {model} · {field} ({unit})", + "Valid: {time}": "Valida: {time}", + "preparing": "preparazione", + "Issued: {time}": "Emessa: {time}", + "Selected field unavailable · wind remains visible": "Campo selezionato non disponibile · il vento resta visibile", + "{error} · wind remains visible": "{error} · il vento resta visibile", + "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "Vento in superficie a 10 m. Griglia globale di circa 1°. Le curve seguono il campo del vento a 10 m, sollevate di 12 km per visibilitĂ ; l'altezza visualizzata non Ăš la quota meteorologica. L'illuminazione della vista serve alla leggibilitĂ . L'animazione mostra il flusso di una singola previsione fissa; non fa avanzare il tempo. I campi colorati ricoprono la mappa di base del globo o i 3D Tiles fotorealistici attivi.", + "MODEL": "MODELLO", + "FIELD": "CAMPO", + "UNITS": "UNITÀ", + "MOTION": "MOVIMENTO", + "Forecast": "Previsione", + "N": "N", + "NNE": "NNE", + "NE": "NE", + "ENE": "ENE", + "E": "E", + "ESE": "ESE", + "SE": "SE", + "SSE": "SSE", + "S": "S", + "SSW": "SSO", + "SW": "SO", + "WSW": "OSO", + "W": "O", + "WNW": "ONO", + "NW": "NO", + "NNW": "NNO", + "No surface reading": "Nessuna lettura in superficie", + "Aim the map center at Earth": "Punta il centro della mappa sulla Terra", + "A location reading needs a loaded forecast and the Earth at the center of the view.": "Una lettura sul luogo richiede una previsione caricata e la Terra al centro della vista.", + "Interpolated model forecast on an approximately 1° grid. Broad weather patterns, not a street-level measurement.": "Previsione del modello interpolata su una griglia di circa 1°. Andamenti meteo generali, non una misura a livello stradale.", + " · calm": " · calma", + " from {direction}": " da {direction}", + "WIND AT {coordinates}": "VENTO A {coordinates}", + "{model} · valid {time}": "{model} · valida {time}", + "Wind speed field unavailable": "Campo della velocitĂ  del vento non disponibile", + "Globe imagery unavailable": "Immagini del globo non disponibili", + "Globe field image unavailable": "Immagine del campo sul globo non disponibile", + "Unknown wind model": "Modello del vento sconosciuto", + "Unknown weather overlay": "Overlay meteo sconosciuto", + "Wind request timed out": "La richiesta del vento Ăš andata in timeout", + "Malformed wind manifest": "Manifest del vento non valido", + "Malformed wind grid": "Griglia del vento non valida", + "Error: {message}": "Errore: {message}", + "Needs {envVars} — add it in Provider Settings": "Richiede {envVars}: aggiungila in Impostazioni provider", + "{label} is unavailable": "{label} non Ăš disponibile", + "This map stack": "Questo stack mappa", + "{label} unavailable: {hint}": "{label} non disponibile: {hint}", + "Google 3D tiles unavailable — check the key's API restrictions, quota, or network": "Google 3D Tiles non disponibili: controlla le restrizioni API della chiave, la quota o la rete", + "Needs {envVars} — add it in Provider Settings — or a Cesium ion token for the ion-hosted route": "Richiede {envVars}: aggiungila in Impostazioni provider, oppure un token Cesium ion per il percorso ospitato da ion", + "Exit cockpit to fly to a camera": "Esci dal cockpit per volare a una telecamera", + "Exit cockpit to fly to a location": "Esci dal cockpit per volare a un luogo", + "Exit cockpit to fly to a photo": "Esci dal cockpit per volare a una foto", + "Exit cockpit to fly to a shared view": "Esci dal cockpit per volare a una vista condivisa", + "Exit cockpit to fly to a target": "Esci dal cockpit per volare a un obiettivo", + "Exit cockpit to fly to a vessel": "Esci dal cockpit per volare a una nave", + "Exit cockpit to fly to a fire": "Esci dal cockpit per volare a un incendio", + "Exit cockpit to fly to a route": "Esci dal cockpit per volare a un percorso", + "Exit cockpit to fly to a file": "Esci dal cockpit per volare a un file", + "Exit cockpit to fly to a scene": "Esci dal cockpit per volare a una scena", + "Exit cockpit to view weather coverage": "Esci dal cockpit per vedere la copertura meteo", + "Exit cockpit to fly to a cyclone": "Esci dal cockpit per volare a un ciclone", + "Exit cockpit to fly to an aircraft": "Esci dal cockpit per volare a un aereo", + "Exit cockpit to fly to a satellite": "Esci dal cockpit per volare a un satellite", + "Exit cockpit to frame contacts": "Esci dal cockpit per inquadrare i contatti", + "Visible map targets": "Obiettivi mappa visibili", + "Focusing {label}": "Focus su {label}", + "Source": "Fonte", + "Camera ownership changed": "Il controllo della camera Ăš cambiato", + "Saved project could not be read; storage preserved. Import a valid file to resume saving.": "Impossibile leggere il progetto salvato; archivio conservato. Importa un file valido per riprendere i salvataggi.", + "Ready": "Pronto", + "Scene layer turned off": "Livello della scena disattivato", + "Stopped": "Fermato", + "Scene not saved — existing saved project could not be read. Export edits or import a valid file.": "Scena non salvata: impossibile leggere il progetto salvato esistente. Esporta le modifiche o importa un file valido.", + "Scene not saved — {reason}": "Scena non salvata: {reason}", + "Scene not saved — browser storage unavailable": "Scena non salvata: archiviazione del browser non disponibile", + "Loaded: {scene} / {shot}": "Caricato: {scene} / {shot}", + "Cannot update {scene}: shot inventory changed": "Impossibile aggiornare {scene}: l'elenco degli scatti Ăš cambiato", + "Cannot update {scene}: evidence beats changed": "Impossibile aggiornare {scene}: le tappe delle prove sono cambiate", + "Cannot update {scene}: shot bindings are incomplete": "Impossibile aggiornare {scene}: i collegamenti degli scatti sono incompleti", + "Updated {count} shots: {scene}": { + "one": "Aggiornato {count} scatto: {scene}", + "many": "Aggiornati {count} di scatti: {scene}", + "other": "Aggiornati {count} scatti: {scene}" + }, + "Appended {count} shots: {scene}": { + "one": "Aggiunto {count} scatto: {scene}", + "many": "Aggiunti {count} di scatti: {scene}", + "other": "Aggiunti {count} scatti: {scene}" + }, + "Cannot capture shot: camera not ready": "Impossibile catturare lo scatto: camera non pronta", + "Captured: {scene} / {shot}": "Catturato: {scene} / {shot}", + "Select a shot first": "Seleziona prima uno scatto", + "Updated: {scene} / {shot}": "Aggiornato: {scene} / {shot}", + "Could not leave scene: {scene}": "Impossibile uscire dalla scena: {scene}", + "Seeked: {scene} / {shot}": "Posizionato: {scene} / {shot}", + "Seeking scene clock": "Spostamento sull'orologio della scena", + "Camera unavailable — exit cockpit first": "Camera non disponibile: esci prima dal cockpit", + "No shots to run": "Nessuno scatto da eseguire", + "Scene transition limit reached — load a shot to reset": "Limite di transizioni della scena raggiunto: carica uno scatto per azzerarlo", + "Export failed: {error}": "Esportazione non riuscita: {error}", + "Project exported": "Progetto esportato", + "Importing project": "Importazione del progetto", + "Imported {file}": "Importato {file}", + "Import failed: {error}": "Importazione non riuscita: {error}", + "Import failed (could not read JSON file)": "Importazione non riuscita (impossibile leggere il file JSON)", + "Layers refused: {layers}": "Livelli rifiutati: {layers}", + "Could not exit {mode} — scene layers may be refused": "Impossibile uscire da {mode}: i livelli della scena potrebbero essere rifiutati", + "Camera move interrupted": "Movimento della camera interrotto", + "Scene media timed out": "I contenuti della scena sono andati in timeout", + "Action complete": "Azione completata", + "Action unavailable or cancelled": "Azione non disponibile o annullata", + "Scene actions": "Azioni della scena", + "Select a feature or use Tab and Enter to choose an action.": "Seleziona un elemento o usa Tab e Enter per scegliere un'azione.", + "Selected feature: {feature}. Choose an action.": "Elemento selezionato: {feature}. Scegli un'azione.", + "Running {index}/{total}: {scene} / {shot}": "Esecuzione {index}/{total}: {scene} / {shot}", + "Scene run complete": "Esecuzione della scena completata", + "Bhote Koshi Evidence Sequence": "Sequenza delle prove del Bhote Koshi", + "Nepal Flood Incident": "Alluvione in Nepal", + "Global Flights Radar": "Radar voli globale", + "Orbital Watch": "Sorveglianza orbitale", + "Thermal Threat Board": "Quadro minacce termiche", + "City Overload": "Sovraccarico urbano", + "Omniscience Pullback": "Allontanamento onnisciente", + "Global Incident Context": "Contesto globale dell'evento", + "Nepal-Focused Globe Rotation": "Rotazione del globo sul Nepal", + "Bhote Koshi Regional Approach": "Avvicinamento regionale al Bhote Koshi", + "Bhote Koshi Nearby Cities": "CittĂ  vicine al Bhote Koshi", + "Bhote Koshi Incident Corridor": "Corridoio dell'evento del Bhote Koshi", + "Bhote Koshi Flood Path": "Percorso dell'alluvione del Bhote Koshi", + "Bhote Koshi Corridor Overview": "Panoramica del corridoio del Bhote Koshi", + "Bhote Koshi Upper Valley": "Alta valle del Bhote Koshi", + "Upper Valley Collapse": "Crollo nell'alta valle", + "Debris-Dammed Lake": "Lago di sbarramento da detriti", + "Nepal-China Border Gate": "Valico di frontiera Nepal-Cina", + "Timure Evidence Cluster": "Gruppo di prove di Timure", + "Syabru Besi Passage": "Passaggio a Syabru Besi", + "Bidur / Trishuli Consequence": "Conseguenze a Bidur / Trishuli", + "Final view": "Vista finale", + "Scene {n}": "Scena {n}", + "Shot {n}": "Scatto {n}", + "the title of scene {scene} is empty or longer than {max} characters": "il titolo della scena {scene} Ăš vuoto o supera i {max} caratteri", + "the title of shot {shot} in scene {scene} is empty or longer than {max} characters": "il titolo dello scatto {shot} nella scena {scene} Ăš vuoto o supera i {max} caratteri", + "the project is larger than 5 MiB": "il progetto supera i 5 MiB", + "the project has too many shots": "il progetto ha troppi scatti", + "the scene data failed validation": "i dati della scena non hanno superato la validazione", + "Could not complete this action. Check the file, references and selected assets.": "Impossibile completare questa azione. Controlla il file, i riferimenti e le risorse selezionate.", + "{count} scenes": { + "one": "{count} scena", + "many": "{count} di scene", + "other": "{count} scene" + }, + "{count} shots": { + "one": "{count} scatto", + "many": "{count} di scatti", + "other": "{count} scatti" + }, + "{count} data packs": { + "one": "{count} pacchetto dati", + "many": "{count} di pacchetti dati", + "other": "{count} pacchetti dati" + }, + "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}": "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}", + "Unavailable layers: {layers}": "Livelli non disponibili: {layers}", + "Uses registered content or linked media. Those external files are not included in a scene bundle. Their original notices still apply.": "La scena usa contenuti registrati o media collegati. Quei file esterni non sono inclusi nel pacchetto della scena. Restano valide le loro note legali originali.", + "{bytes} bundled bytes verified. Files stay in memory for this session. Reimport the bundle after reloading the app.": "{bytes} byte nel pacchetto verificati. I file restano in memoria per questa sessione. Reimporta il pacchetto dopo aver ricaricato l'app.", + "Review scene import": "Rivedi l'importazione della scena", + "Nothing is loaded or changed until you apply this file.": "Nulla viene caricato o modificato finchĂ© non applichi questo file.", + "Ready to import": "Pronto per l'importazione", + "Apply replaces the current project. Export your current project first if you want to keep both.": "L'importazione sostituirĂ  il progetto attuale. Esporta prima il progetto attuale se vuoi conservarli entrambi.", + "Apply import": "Applica importazione", + "Import was not applied. The current project may have changed.": "L'importazione non Ăš stata applicata. Il progetto attuale potrebbe essere cambiato.", + "Select a scene and shot first": "Seleziona prima una scena e uno scatto", + "Edit scene details": "Modifica i dettagli della scena", + "Camera positions use degrees and meters above the ellipsoid. Drafts are validated before they replace your saved scene.": "Le posizioni della camera usano gradi e metri sopra l'ellissoide. Le bozze vengono validate prima di sostituire la scena salvata.", + "Anchors and data packs": "Ancore e pacchetti dati", + "Shot camera, timing, packs and actions": "Camera, tempi, pacchetti e azioni dello scatto", + "New anchor ID": "ID nuova ancora", + "Capture camera as anchor": "Salva la posizione della camera come ancora", + "Anchor added to draft": "Ancora aggiunta alla bozza", + "Set move start to current camera": "Usa la vista attuale come inizio del movimento", + "Move added to draft; destination remains the shot camera": "Movimento aggiunto alla bozza; la destinazione resta la camera dello scatto", + "Use ordinary flight": "Usa il volo normale", + "Invalid shot JSON": "JSON dello scatto non valido", + "Apply details": "Applica i dettagli", + "Select a scene first": "Seleziona prima una scena", + "Share selected scene": "Condividi la scena selezionata", + "Scene JSON preserves authored settings and attribution. It does not include asset files. Bundles include only pack files you choose here or previously imported bundle files.": "Il JSON della scena conserva le impostazioni definite dall'autore e l'attribuzione. Non include i file delle risorse. I pacchetti includono solo i file dei pacchetti dati scelti qui o i file di pacchetti importati in precedenza.", + "Download scene JSON": "Scarica il JSON della scena", + "Choose data-pack files": "Scegli i file del pacchetto dati", + "Or choose a data-pack folder": "Oppure scegli una cartella del pacchetto dati", + "Download asset bundle": "Scarica il pacchetto di risorse", + "Asset bundle downloaded": "Pacchetto di risorse scaricato", + "No RTL-SDR device selected": "Nessun dispositivo RTL-SDR selezionato", + "WebUSB requires desktop Chrome or Edge on localhost/HTTPS": "WebUSB richiede Chrome o Edge desktop su localhost/HTTPS", + "RTL-SDR access failed; close other SDR apps and check USB permissions": "Accesso a RTL-SDR non riuscito; chiudi le altre app SDR e controlla i permessi USB", + "RTL-SDR connection failed": "Connessione a RTL-SDR non riuscita", + "Receiving 1090 MHz ADS-B": "Ricezione ADS-B a 1090 MHz", + "Receiving broadcast FM": "Ricezione FM broadcast", + "Connect an RTL-SDR to begin.": "Collega un RTL-SDR per iniziare.", + "WebUSB is unavailable in this browser": "WebUSB non Ăš disponibile in questo browser", + "USB work abandoned after a stalled transfer": "Operazione USB abbandonata dopo un trasferimento bloccato", + "SDR decoder worker failed": "Errore del worker del decoder SDR", + "SDR decoder did not start; receiver stopped": "Il decoder SDR non si Ăš avviato; ricevitore fermato", + "SDR decoder stopped responding; receiver stopped": "Il decoder SDR ha smesso di rispondere; ricevitore fermato", + "SDR decoder fell behind; receiver stopped": "Il decoder SDR Ăš rimasto indietro; ricevitore fermato", + "WebUSB requires desktop Chrome or Edge": "WebUSB richiede Chrome o Edge desktop", + "Waiting for an RTL-SDR device
": "In attesa di un dispositivo RTL-SDR
", + "Browser audio is suspended; press Connect again to resume it": "L'audio del browser Ăš sospeso; premi di nuovo Connetti per riprenderlo", + "RTL-SDR sample stream stopped": "Flusso di campioni RTL-SDR interrotto", + "Switching to {mode}
": "Passaggio a {mode}
", + "Browser audio is suspended; select FM again to resume it": "L'audio del browser Ăš sospeso; seleziona di nuovo FM per riprenderlo", + "RTL-SDR gain change failed": "Modifica del guadagno RTL-SDR non riuscita", + "Tuned to {mhz} MHz FM": "Sintonizzato su {mhz} MHz FM", + "Seeking up
": "Ricerca verso l'alto
", + "Seeking down
": "Ricerca verso il basso
", + "Seek stopped": "Ricerca interrotta", + "Scanning {mhz} MHz
": "Scansione di {mhz} MHz
", + "Found {mhz} MHz · {snr} dB": "Trovato {mhz} MHz · {snr} dB", + "FM signal found at {mhz} MHz": "Segnale FM trovato a {mhz} MHz", + "No FM signal found": "Nessun segnale FM trovato", + "Browser location is unavailable": "La posizione del browser non Ăš disponibile", + "Receiver location was not granted": "Accesso alla posizione del ricevitore non concesso", + "RTL-SDR disconnected": "RTL-SDR disconnesso", + "Upstream response too large": "Risposta del servizio upstream troppo grande", + "Vector tile request timed out": "La richiesta dei tile vettoriali Ăš andata in timeout", + "Vector tiles unavailable": "Tile vettoriali non disponibili", + "Vector tile metadata unavailable": "Metadati dei tile vettoriali non disponibili", + "Zoom in for vector tile coverage": "Ingrandisci per la copertura dei tile vettoriali", + "Saturation": "Saturazione", + "Edge Thickness": "Spessore dei bordi", + "Contrast": "Contrasto", + "Grain": "Grana", + "Vignette": "Vignettatura", + "Pixelation": "Pixelizzazione", + "Distortion": "Distorsione", + "Instability": "InstabilitĂ ", + "Density": "DensitĂ ", + "Gain": "Guadagno", + "Bloom": "Bloom", + "Scanlines": "Scanline", + "Sensitivity": "SensibilitĂ ", + "WHOT/BHOT": "WHOT/BHOT", + "Ironbow": "Ironbow", + "unsaved CCTV calibration": "calibrazione CCTV non salvata", + "the open cockpit": "il cockpit aperto", + "Switching language reloads the page. This will be lost: {items}. Switch anyway?": "Cambiare lingua ricarica la pagina. Perderai: {items}. Cambiare comunque?", + "VISUAL PRESETS": "PRESET VISIVI", + "LOCATION": "POSIZIONE", + "CONTACTS — nearest planes · vessels · sites": "CONTATTI — aerei · navi · siti piĂč vicini", + "SPACE MISSIONS — launches & orbital assets": "MISSIONI SPAZIALI — lanci e asset orbitali", + "LIVE SIGNALS": "SEGNALI LIVE", + "Contacts could not complete the requested transition; try again": "Impossibile completare la transizione richiesta per Contatti; riprova", + "CCTV layer unavailable": "Livello CCTV non disponibile", + "Link shared": "Link condiviso", + "Link copied!": "Link copiato!", + "Copy failed": "Copia non riuscita", + "Return map to straight-down view": "Riporta la mappa alla vista dall'alto", + "Tilt map to oblique view": "Inclina la mappa in vista obliqua", + "Reset map to north up. Current heading {heading} degrees": "Orienta la mappa a nord. Direzione attuale {heading} gradi", + "Tilted view": "Vista inclinata", + "Straight-down view": "Vista dall'alto", + "North up": "Nord in alto", + "CCTV calibration saved": "Calibrazione CCTV salvata", + "HDG": "HDG", + "PITCH": "INCL.", + "FOV": "FOV", + "RANGE": "PORTATA", + "HGT": "ALT.", + "ΔN": "ΔN", + "ΔE": "ΔE", + "{value}m": "{value} m", + "CCTV calibration reset": "Calibrazione CCTV ripristinata", + "ADJUST ON": "REGOLAZ. ON", + "ADJUST": "REGOLAZ.", + "SNAPSHOT": "SNAPSHOT", + "LIVE": "LIVE", + "UPSTREAM": "UPSTREAM", + "SYNTHETIC": "SINTETICO", + "CONFIGURED": "CONFIGURATO", + "SEED": "CATALOGO", + "UNKNOWN": "SCONOSCIUTO", + "OK": "OK", + "ERROR": "ERRORE", + "Live HLS connected": "HLS live connesso", + "Live HLS unavailable": "HLS live non disponibile", + "No stream URL configured": "Nessun URL di stream configurato", + "Live stream connected": "Stream live connesso", + "Snapshot feed connected": "Feed di snapshot connesso", + "Media fetch failed": "Recupero dei media non riuscito", + "Upstream snapshot active": "Snapshot upstream attivo", + "Fallback Street View frame": "Fotogramma Street View di riserva", + "Upstream unavailable": "Upstream non disponibile", + "No source configured": "Nessuna fonte configurata", + "Configured source": "Fonte configurata", + "Configured Source": "Fonte configurata", + "Synthetic fallback": "Riserva sintetica", + "Upstream HTTP {status}": "Upstream HTTP {status}", + "Unexpected media type {type}": "Tipo di media inatteso {type}", + "SOURCE · UNKNOWN": "FONTE · SCONOSCIUTA", + "FRAME · LOADING": "FOTOGRAMMA · CARICAMENTO", + "FRAME · UNAVAILABLE": "FOTOGRAMMA · NON DISPONIBILE", + "CALIBRATED": "CALIBRATA", + "CURATED": "CURATA", + "RAW PRIOR": "STIMA GREZZA", + "CCTV ON": "CCTV ON", + "CCTV OFF": "CCTV OFF", + "VIEWSHED ON": "VIEWSHED ON", + "COVERAGE ON": "COPERTURA ON", + "COVERAGE OFF": "COPERTURA OFF", + "AUTO HOP ON": "AUTO HOP ON", + "AUTO HOP OFF": "AUTO HOP OFF", + "PROJECTION ON": "PROIEZIONE ON", + "PROJECTION OFF": "PROIEZIONE OFF", + "CAL · EDITED (UNSAVED)": "CAL · MODIFICATA (NON SALVATA)", + "CAL · {badge}": "CAL · {badge}", + "MONITOR": "MONITOR", + "OFF": "OFF", + "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · PORTATA {range}m · {projection}{calBadge} · {provider}{status}", + "{count} cameras loaded · click a camera to activate": { + "one": "{count} telecamera caricata · clic su una telecamera per attivarla", + "many": "{count} di telecamere caricate · clic su una telecamera per attivarla", + "other": "{count} telecamere caricate · clic su una telecamera per attivarla" + }, + "{count} cameras loaded · enable CCTV to activate": { + "one": "{count} telecamera caricata · attiva CCTV per attivarla", + "many": "{count} di telecamere caricate · attiva CCTV per attivarle", + "other": "{count} telecamere caricate · attiva CCTV per attivarle" + }, + "{count} more cameras outside this view · pan or zoom out": { + "one": "Altra {count} telecamera fuori da questa vista · sposta o riduci lo zoom", + "many": "Altre {count} di telecamere fuori da questa vista · sposta o riduci lo zoom", + "other": "Altre {count} telecamere fuori da questa vista · sposta o riduci lo zoom" + }, + "Enable CCTV to load camera intersections": "Attiva CCTV per caricare le telecamere agli incroci", + "Enable CCTV to start camera-linked intelligence summaries.": "Attiva CCTV per avviare i riepiloghi intelligence collegati alle telecamere.", + "No summary available.": "Nessun riepilogo disponibile.", + "loading frames": "caricamento fotogrammi", + "camera grid ready": "griglia telecamere pronta", + "Clearing selected data layers": "Disattivazione dei livelli dati selezionati", + "Clear selected data layers": "Disattiva i livelli dati selezionati", + "CONDITIONS UNKNOWN": "CONDIZIONI SCONOSCIUTE", + "CLEAR": "SERENO", + "PARTLY CLOUDY": "POCO NUVOLOSO", + "OVERCAST": "COPERTO", + "FOG": "NEBBIA", + "DRIZZLE": "PIOVIGGINE", + "RAIN": "PIOGGIA", + "RAIN SHOWERS": "ROVESCI DI PIOGGIA", + "SNOW SHOWERS": "ROVESCI DI NEVE", + "THUNDERSTORM": "TEMPORALE", + "MIXED CONDITIONS": "CONDIZIONI MISTE", + "CYCLE ON": "CICLO ON", + "CYCLE OFF": "CICLO OFF", + "Stop automatic page cycling. Previous, Next, and the SIG/NEWS/LOCAL tabs stay available.": "Ferma lo scorrimento automatico delle pagine. Precedente, Successiva e le schede SIG/NOTIZIE/LOCALE restano disponibili.", + "Cycle briefing pages automatically every 9 seconds (Signals → News → Local). Pauses while you hover or focus the panel. Live signal data refreshes continuously either way.": "Scorri automaticamente le pagine del briefing ogni 9 secondi (Segnali → Notizie → Locale). Lo scorrimento si interrompe quando passi sul pannello o lo selezioni. I dati dei segnali live si aggiornano comunque di continuo.", + "ACQUIRING REGIONAL NEWS": "ACQUISIZIONE NOTIZIE REGIONALI", + "REGIONAL NEWS UNAVAILABLE": "NOTIZIE REGIONALI NON DISPONIBILI", + "RESOLVING REGION": "IDENTIFICAZIONE REGIONE", + "REGION UNAVAILABLE": "REGIONE NON DISPONIBILE", + "NO RECENT LOCATION MATCHES": "NESSUNA CORRISPONDENZA RECENTE PER POSIZIONE", + "{domain} · {age}": "{domain} · {age}", + "{value} KM/H": "{value} KM/H", + "CLOUD {pct}%": "NUVOLE {pct}%", + "CLOUD UNKNOWN": "NUVOLE N/D", + "{source} · LOCATION QUERY": "{source} · QUERY PER POSIZIONE", + "REGIONAL NEWS": "NOTIZIE REGIONALI", + "{label} · {radius} AIR/SEA WINDOW": "{label} · ARIA/MARE {radius}", + "{scope} · INSTALLATIONS {coverage}": "{scope} · SITI {coverage}", + "CONTEXT STANDBY": "CONTESTO IN ATTESA", + "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "ATTIVA IL CONTESTO GLOBALE PER I PING DI PROSSIMITÀ", + "CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "CONTATTO PERSO · ULTIMA LETTURA NOTA · NON È UN VIA LIBERA", + "CONTACT LOST · {subject}": "CONTATTO PERSO · {subject}", + "SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "IL SOGGETTO NON È PIÙ NEL FEED · LETTURA FERMA ALL'ULTIMO VALORE NOTO", + "{cohort} · {contact}": "{cohort} · {contact}", + "NO AVAILABLE EXAMPLE": "NESSUN ESEMPIO DISPONIBILE", + "{cohort}, Unavailable": "{cohort}, non disponibile", + "AHEAD": "DAVANTI", + "{side} {angle}": "{side} {angle}", + "L": "S", + "R": "D", + "{count} INPUTS UNKNOWN · NOT AN ALL-CLEAR": { + "one": "{count} INPUT SCONOSCIUTO · NON È UN VIA LIBERA", + "many": "{count} DI INPUT SCONOSCIUTI · NON È UN VIA LIBERA", + "other": "{count} INPUT SCONOSCIUTI · NON È UN VIA LIBERA" + }, + "AVAILABLE INPUTS CURRENT · NOT AN ALL-CLEAR": "INPUT DISPONIBILI AGGIORNATI · NON È UN VIA LIBERA", + "SQUAWK {code} · {status}": "SQUAWK {code} · {status}", + "ADS-B PRIORITY · {status}": "PRIORITÀ ADS-B · {status}", + "ADS-B EMERGENCY · {status}": "EMERGENZA ADS-B · {status}", + "AIRCRAFT": "AEREO", + "ACQUIRING SURFACE": "ACQUISIZIONE SUPERFICIE", + "SURFACE FALLBACK": "SUPERFICIE DI RISERVA", + "STALE FEED": "FEED OBSOLETO", + "LIVE TRACK": "TRACCIA LIVE", + "COMMERCIAL": "COMMERCIALE", + "{aircraftClass} · {emergency} · {feedState}": "{aircraftClass} · {emergency} · {feedState}", + "{aircraftClass} · {feedState} · COURSE ALIGNED": "{aircraftClass} · {feedState} · ROTTA ALLINEATA", + "ARROW · ESTIMATED DIRECTION": "FRECCIA · DIREZIONE STIMATA", + "ROUTE DATA UNAVAILABLE": "DATI ROTTA NON DISPONIBILI", + "DEST {bearing}": "DEST {bearing}", + "Disable cockpit weather effects": "Disattiva gli effetti meteo del cockpit", + "Enable cockpit weather effects": "Attiva gli effetti meteo del cockpit", + "ON": "ON", + "Normal": "Normale", + "Night vision": "Visione notturna", + "Thermal": "Termico", + "Anime": "Anime", + "Noir": "Noir", + "Current cockpit vision style: {style}. Activate for next style.": "Stile di visione attuale del cockpit: {style}. Attiva per lo stile successivo.", + "Current style: {style} — click for next": "Stile attuale: {style}. Clic per il successivo", + "Collapse Contact panel": "Comprimi il pannello Contatto", + "Expand Contact panel": "Espandi il pannello Contatto", + "Collapse contact panel": "Comprimi il pannello contatto", + "Expand contact panel": "Espandi il pannello contatto", + "Collapse cockpit briefing panel": "Comprimi il pannello briefing del cockpit", + "Expand cockpit briefing panel": "Espandi il pannello briefing del cockpit", + "Collapse briefing panel": "Comprimi il pannello briefing", + "Expand briefing panel": "Espandi il pannello briefing", + "OBSERVED / MAPPED PINGS": "PING OSSERVATI / MAPPATI", + "SOURCE-BACKED EVENTS · NO SYNTHETIC NEWS": "EVENTI DA FONTI · NESSUNA NOTIZIA SINTETICA", + "LATEST LOCATION-MATCHED REPORTING": "ULTIME NOTIZIE PER POSIZIONE", + "{source} · LOCATION QUERY · RECENT": "{source} · QUERY PER POSIZIONE · RECENTI", + "LOCAL INFO": "INFO LOCALI", + "PLACE / CONDITIONS / POSITION": "LUOGO / CONDIZIONI / POSIZIONE", + "TIME UNKNOWN": "ORA SCONOSCIUTA", + "{count}M AGO": "{count} MIN FA", + "{count}H AGO": "{count} H FA", + "{count}D AGO": "{count} G FA", + "DIR UNKNOWN": "DIR SCONOSCIUTA", + "Select flight {title}": "Seleziona il volo {title}", + "{aircraftClass} · CURRENT": "{aircraftClass} · ATTUALE", + "MILITARY FLIGHT": "VOLO MILITARE", + "COMMERCIAL FLIGHT": "VOLO COMMERCIALE", + "{aircraftClass} · {distance}": "{aircraftClass} · {distance}", + "DISTANCE UNKNOWN": "DISTANZA SCONOSCIUTA", + "{count} INPUTS UNKNOWN": { + "one": "{count} INPUT SCONOSCIUTO", + "many": "{count} DI INPUT SCONOSCIUTI", + "other": "{count} INPUT SCONOSCIUTI" + }, + "SOURCE STATUS UNAVAILABLE": "STATO FONTE NON DISPONIBILE", + "Restore real aircraft": "Ripristina l'aereo reale", + "Reclassify as TR-3B": "Riclassifica come TR-3B", + "TRACK ACQUIRED": "TRACCIA ACQUISITA", + "{label} · COURSE {heading}°": "{label} · ROTTA {heading}°", + "Context could not restore every layer; try again": "Il Contesto non ha potuto ripristinare tutti i livelli; riprova", + "No selected data layers": "Nessun livello dati selezionato", + "{count} data layers could not be cleared": { + "one": "{count} livello dati non Ăš stato disattivato", + "many": "{count} di livelli dati non sono stati disattivati", + "other": "{count} livelli dati non sono stati disattivati" + }, + "Cleared {count} data layers": { + "one": "Disattivato {count} livello dati", + "many": "Disattivati {count} di livelli dati", + "other": "Disattivati {count} livelli dati" + }, + "Selected data layers could not be cleared": "Impossibile disattivare i livelli dati selezionati", + "Space Missions could not complete the requested transition; try again": "Impossibile completare la transizione richiesta per Missioni spaziali; riprova", + "Nearby installations refreshed": "Installazioni vicine aggiornate", + "Nearby installations could not be refreshed; try again": "Impossibile aggiornare le installazioni vicine; riprova", + "Space Missions cancellation could not restore the previous layer state": "L'annullamento di Missioni spaziali non ha potuto ripristinare lo stato precedente dei livelli", + "That layer is unavailable in the current Context mode": "Quel livello non Ăš disponibile nella modalitĂ  Contesto attuale", + "{layerId} could not {action} cleanly": "{layerId} non ha potuto {action} correttamente", + "start": "avviarsi", + "stop": "fermarsi", + "{mode} could not start because another layer did not stop cleanly": "Impossibile avviare {mode}: un altro livello non si Ăš fermato correttamente", + "Space Missions": "Missioni spaziali", + "Context": "Contesto", + "Rendered globe frames per second · toggle with `": "Fotogrammi al secondo del globo · attiva/disattiva con `", + "imported map files": "file di mappa importati", + "Ground heights could not be refreshed. Try the file again when the map has loaded.": "Impossibile aggiornare le quote del terreno. Riprova con il file quando la mappa Ăš caricata.", + "{count} map objects": { + "one": "{count} oggetto sulla mappa", + "many": "{count} di oggetti sulla mappa", + "other": "{count} oggetti sulla mappa" + }, + ", drawn with its own styles": ", disegnato con i propri stili", + "Hide {name}": "Nascondi {name}", + "Show {name}": "Mostra {name}", + "Fly to {name}": "Vola su {name}", + "Remove {name}": "Rimuovi {name}", + "At most {count} files at once — remove one first.": "Al massimo {count} file alla volta: rimuovine uno prima.", + "Reading {name}
": "Lettura di {name}
", + "That file could not be read.": "Impossibile leggere quel file.", + "Added {count} files.": { + "one": "Aggiunto {count} file.", + "many": "Aggiunti {count} di file.", + "other": "Aggiunti {count} file." + }, + "{count} files could not be added ({name}: {error})": { + "one": "Impossibile aggiungere {count} file ({name}: {error})", + "many": "Impossibile aggiungere {count} di file ({name}: {error})", + "other": "Impossibile aggiungere {count} file ({name}: {error})" + }, + "Some KML content was left out.": "Una parte del contenuto KML Ăš stata esclusa.", + "Press on the ground, not the sky": "Premi sul terreno, non sul cielo", + "Drag to size the box": "Trascina per dimensionare il riquadro", + "light {source} to use your {name} key": "attiva {source} per usare la tua chiave {name}", + "light {source}": "attiva {source}", + ", or ": ", oppure ", + "{requirement}, or {offer}": "{requirement}, oppure {offer}", + "Live Flights": "Voli live", + "Military Flights": "Voli militari", + "Earthquakes (24h)": "Terremoti (24 h)", + "Satellites": "Satelliti", + "Space Missions (30d)": "Missioni spaziali (30 g)", + "Street Traffic": "Traffico stradale", + "CCTV": "CCTV", + "Radio": "Radio", + "Bikeshare": "Bike sharing", + "Live AIS Vessels": "Navi AIS live", + "Mapped Installations": "Installazioni mappate", + "Global Context": "Contesto globale", + "Datacenters": "Data center", + "Dams": "Dighe", + "Submarine Cables": "Cavi sottomarini", + "FIRMS Active Fires": "Incendi attivi FIRMS", + "Local ADS-B": "ADS-B locale", + "Transit": "Trasporto pubblico", + "Recent Imagery": "Immagini recenti", + "Fire Perimeters": "Perimetri degli incendi", + "GNSS Integrity": "IntegritĂ  GNSS", + "S2 GhostMaps": "S2 GhostMaps", + "Rain radar": "Radar pioggia", + "Lightning density": "DensitĂ  di fulmini", + "Cyclone advisories": "Bollettini sui cicloni", + "ALPR Cameras": "Telecamere ALPR", + "Live Vessels": "Navi live", + "Bike Share": "Bike sharing", + "Cameras": "Telecamere", + "Street Level": "Vista stradale", + "Mapped ALPR Cameras": "Telecamere ALPR mappate", + "Data Centers": "Data center", + "Active Fires": "Incendi attivi", + "Military aircraft": "Aerei militari", + "Vessels": "Navi", + "CCTV + Street View fallback": "CCTV + Street View di riserva", + "OpenStreetMap + optional Google Maps Places": "OpenStreetMap + Google Maps Places opzionale", + "GFS / ECMWF IFS · FORECAST": "GFS / ECMWF IFS · PREVISIONE", + "NOAA nowCOAST · OBSERVED": "NOAA nowCOAST · OSSERVATO", + "NASA FIRMS · LIVE": "NASA FIRMS · LIVE", + "OSM routing": "Percorsi OSM", + "data source|Local": "Dati locali", + "ENABLING": "AVVIO", + "DISABLING": "ARRESTO", + "Movement": "Movimento", + "Infrastructure": "Infrastrutture", + "Events": "Eventi", + "Weather": "Meteo", + "Utilities": "Strumenti", + "Other layers": "Altri livelli", + "{state} · {source}": "{state} · {source}", + "UNCERTAIN · {source} · lifecycle state requires reconciliation": "INCERTO · {source} · lo stato del ciclo di vita richiede riconciliazione", + "{state} · {source} · {detail} · retry {seconds}s": "{state} · {source} · {detail} · nuovo tentativo tra {seconds}s", + "{state} · {source} · {detail}": "{state} · {source} · {detail}", + "never": "mai", + "{source} · {loadingLabel}": "{source} · {loadingLabel}", + "{accepted} of {raw} records accepted": "Record accettati: {accepted} su {raw}", + "incomplete snapshot": "snapshot incompleto", + "{state} · {source} · {detail} · {ago}": "{state} · {source} · {detail} · {ago}", + "{state} · {source} · {ago} · retrying in {seconds}s": "{state} · {source} · {ago} · nuovo tentativo tra {seconds}s", + "{state} · {source} · {ago}": "{state} · {source} · {ago}", + "{source} · {ago}": "{source} · {ago}", + "UNCERTAIN": "INCERTO", + "status chip|UNAVAILABLE": "NON DISPONIBILE", + "Data source unavailable": "Fonte dati non disponibile", + "{name}: {state}": "{name}: {state}", + "{count}s ago": "{count} s fa", + "Local FM stopped: internet radio started": "FM locale fermata: radio internet avviata", + "IDLE": "INATTIVO", + "CONNECTING": "CONNESSIONE", + "TUNING": "SINTONIA", + "STREAMING": "IN STREAMING", + "UNSUPPORTED": "NON SUPPORTATO", + "idle": "inattivo", + "running": "in esecuzione", + "suspended": "sospeso", + "closed": "chiuso", + "feed status|live": "live", + "feed status|stale": "obsoleto", + "feed status|unreachable": "irraggiungibile", + "feed status|invalid": "non valido", + "waiting for IQ": "in attesa di IQ", + "{count} messages": { + "one": "{count} messaggio", + "many": "{count} di messaggi", + "other": "{count} messaggi" + }, + "DSP {count} blocks": { + "one": "DSP {count} blocco", + "many": "DSP {count} di blocchi", + "other": "DSP {count} blocchi" + }, + "DSP waiting": "DSP in attesa", + "{level} dBFS audio": "audio {level} dBFS", + "audio signal --": "segnale audio --", + "audio {state}": "audio {state}", + "{count} HEARD": { + "one": "{count} RICEVUTO", + "many": "{count} RICEVUTI", + "other": "{count} RICEVUTI" + }, + "DISCONNECT": "DISCONNETTI", + "CONNECT": "CONNETTI", + "LOCATING
": "LOCALIZZAZIONE
", + "LOCATED": "LOCALIZZATO", + "LOCATE": "LOCALIZZA", + " · read while Local ADS-B is on": " · letto mentre ADS-B locale Ăš attivo", + "Decoder feeds: {feeds}": "Feed dei decoder: {feeds}", + "Language: {language}": "Lingua: {language}", + "Change the interface language": "Cambia la lingua dell'interfaccia", + "Interface language": "Lingua dell'interfaccia", + "Search languages": "Cerca lingue", + "No matching languages": "Nessuna lingua corrispondente", + "📍 Location: --": "📍 Posizione: --", + "Landmark: --": "Punto di interesse: --", + "Searched location": "Luogo cercato", + "ORBIT": "ORBITA", + "Location not found": "Luogo non trovato", + "Check the spelling and press Enter to search again.": "Controlla l'ortografia e premi Enter per cercare di nuovo.", + "Search failed": "Ricerca non riuscita", + "Press Enter to try again.": "Premi Enter per riprovare.", + "Detailed outline unavailable": "Contorno dettagliato non disponibile", + "Fly to a POI first": "Vola prima a un punto di interesse", + "Reset to full globe view": "Ripristina la vista del globo intero", + "Reset cockpit to full globe view": "Ripristina il cockpit alla vista del globo intero", + "Resetting to full globe view": "Ripristino della vista del globo intero", + "Resetting cockpit to full globe view": "Ripristino del cockpit alla vista del globo intero", + "MAP": "MAPPA", + "Layers": "Livelli", + "Search": "Cerca", + "More": "Altro", + "Panels": "Pannelli", + "panel": "pannello", + "Expand {name}": "Espandi {name}", + "Collapse {name}": "Comprimi {name}", + "Expand Radio": "Espandi Radio", + "Collapse Radio": "Comprimi Radio", + "Expand Radio section": "Espandi la sezione Radio", + "Collapse Radio section": "Comprimi la sezione Radio", + "Panel layout updated — positions reset to new defaults": "Layout dei pannelli aggiornato: posizioni ripristinate ai nuovi valori predefiniti", + "Austin": "Austin", + "San Francisco": "San Francisco", + "New York": "New York", + "Tokyo": "Tokyo", + "London": "Londra", + "Paris": "Parigi", + "Dubai": "Dubai", + "Washington DC": "Washington DC", + "Tallinn": "Tallinn", + "Los Angeles": "Los Angeles", + "Collapse Cockpit display options": "Comprimi le opzioni display del cockpit", + "Expand Cockpit display options": "Espandi le opzioni display del cockpit", + "Collapse Cockpit Radio controls": "Comprimi i controlli Radio del cockpit", + "Expand Cockpit Radio controls": "Espandi i controlli Radio del cockpit", + "CH {index} / {total}": "CH {index} / {total}", + "NO STATIONS": "NESSUNA STAZIONE", + "NO STATION AVAILABLE": "NESSUNA STAZIONE DISPONIBILE", + "{name}, station {index} of {total}": "{name}, stazione {index} di {total}", + "No station available": "Nessuna stazione disponibile", + "OFF AIR": "FUORI ONDA", + "STATION UNAVAILABLE": "STAZIONE NON DISPONIBILE", + "Station unavailable after directory refresh": "Stazione non disponibile dopo l'aggiornamento dell'elenco", + "Radio could not {action} cleanly": "La Radio non ha potuto {action} correttamente", + "SYNC": "SYNC", + "RECONCILE": "RICONCILIA", + "DISABLE": "DISATTIVA", + "ENABLE": "ATTIVA", + "Reconcile Radio — lifecycle uncertain": "Riconcilia la Radio: ciclo di vita incerto", + "Disable Radio": "Disattiva la Radio", + "Enable Radio": "Attiva la Radio", + "{category} ({count})": "{category} ({count})", + "DIRECTORY BAND": "BANDA ELENCO", + "{category} BAND": "BANDA {category}", + "NO STATION SELECTED": "NESSUNA STAZIONE SELEZIONATA", + "Directory metadata only": "Solo metadati dell'elenco", + "Loading station directory
": "Caricamento dell'elenco stazioni
", + "Choose a globe marker or use next.": "Scegli un marcatore sul globo o passa alla successiva.", + "TAGS · {tags}": "TAG · {tags}", + "Play": "Riproduci", + "PAUSE": "PAUSA", + "RESUME": "RIPRENDI", + "PLAY": "PLAY", + "selected": "selezionata", + "nearest": "piĂč vicina", + "{action} {target} radio station": "{action}: stazione radio {target}", + "SYNCING": "SYNC IN CORSO", + "READY": "PRONTA", + "station": "stazione", + " · stale/degraded directory": " · elenco obsoleto/degradato", + " · degraded directory": " · elenco degradato", + " · stale directory": " · elenco obsoleto", + " · outside current filter": " · fuori dal filtro attuale", + "Ready — playback starts only from your action": "Pronta: premi PLAY per avviare la riproduzione", + "Radio off": "Radio spenta", + "Connecting directly to broadcaster
": "Connessione diretta all'emittente
", + "Buffering broadcaster stream
": "Buffering del flusso dell'emittente
", + "Playing {station}": "In riproduzione: {station}", + "Paused {station}": "In pausa: {station}", + "Broadcaster stream unavailable": "Flusso dell'emittente non disponibile", + " · muted during voice interaction": " · silenziata durante l'interazione vocale", + " · restoring volume after voice": " · ripristino del volume dopo la voce", + " · static indicates no broadcaster audio": " · il rumore indica assenza di audio dall'emittente", + " · tuning static until broadcaster starts": " · rumore di sintonia fino all'avvio dell'emittente", + "Station unavailable after directory refresh — choose another channel": "Stazione non disponibile dopo l'aggiornamento dell'elenco: scegli un altro canale", + "Radio is enabling
": "Attivazione della Radio
", + "Radio is disabling
": "Disattivazione della Radio
", + "Radio lifecycle is uncertain — use Enable or Disable to reconcile": "Il ciclo di vita della Radio Ăš incerto: usa Attiva o Disattiva per riconciliare", + "Clear reading": "Cancella la lettura", + "Earlier observation": "Osservazione precedente", + "Observed history": "Storico osservato", + "Later observation": "Osservazione successiva", + "Latest": "PiĂč recente", + "Newest frame per product": "Fotogramma piĂč recente per prodotto", + "Replay observed history": "Rivedi lo storico osservato", + "Imagery on Esri · Google 3D returns when cleared": "Immagini su Esri · Google 3D torna con CANCELLA", + "Point the camera at the ground to use the view": "Punta la camera verso il suolo per usare la vista", + "That point cannot anchor a box": "Quel punto non puĂČ ancorare un riquadro", + "Imagery stops at ±{limit}° latitude": "Le immagini si fermano a ±{limit}° di latitudine", + "{owner} is using the pointer — close it first": "Lo strumento {owner} sta usando il puntatore: chiudilo prima", + "Box is {size} wide · limit {limit}": "Il riquadro Ăš largo {size} · limite {limit}", + "View is {size} wide · limit {limit}": "La vista Ăš larga {size} · limite {limit}", + "VS BASEMAP": "VS MAPPA BASE", + "A / B": "A / B", + "Newest low-cloud day for this box · scene cloud, not box cloud": "Giorno piĂč recente con poche nuvole per questo riquadro · nuvole della scena, non del riquadro", + "Newest day covering this box · cloudier than 20%": "Giorno piĂč recente che copre questo riquadro · nuvole oltre il 20%", + "Newest day with imagery for this box · partial coverage": "Giorno piĂč recente con immagini per questo riquadro · copertura parziale", + "Newest daily overview for this box": "Panoramica giornaliera piĂč recente per questo riquadro", + "newest clear day": "giorno sereno piĂč recente", + "newest day (cloudy)": "giorno piĂč recente (nuvoloso)", + "newest day (partial coverage)": "giorno piĂč recente (copertura parziale)", + "newest overview": "panoramica piĂč recente", + "No imagery": "Nessuna immagine", + "Loading": "Caricamento", + "coverage|full": "completa", + "coverage|partial": "parziale", + "unknown": "sconosciuta", + "no imagery": "nessuna immagine", + "{percent}% cloud": "{percent}% di nuvole", + "{min}–{max}% cloud": "{min}–{max}% di nuvole", + "NO BOX": "NESSUN RIQUADRO", + "SEARCHING": "RICERCA", + "{count} DAYS": { + "one": "{count} GIORNO", + "many": "{count} DI GIORNI", + "other": "{count} GIORNI" + }, + "Zoom in or draw a smaller box": "Ingrandisci o disegna un riquadro piĂč piccolo", + "Select a box or use the view": "Seleziona un riquadro o usa la vista", + "Searching the last 30 days": "Ricerca negli ultimi 30 giorni", + "No days to show for this box": "Nessun giorno da mostrare per questo riquadro", + "Drag the divider · SWAP trades sides": "Trascina il divisore · SCAMBIA inverte i lati", + "← → preview · A or B pins the focused day": "← → anteprima · A o B fissa il giorno selezionato", + "← → preview the other side · A or B pins it": "← → anteprima dell'altro lato · A o B lo fissa", + "S on another day replaces it · × unpins": "S su un altro giorno lo sostituisce · × lo sblocca", + "← → preview · S shows the focused day": "← → anteprima · S mostra il giorno selezionato", + "ZOOM IN": "INGRANDISCI", + "Fly in until the view fits the 1,000 km limit": "Avvicinati finchĂ© la vista rientra nel limite di 1.000 km", + "Imagery days, newest first · arrows move, S or A and B pin": "Giorni con immagini, dal piĂč recente · le frecce spostano, S o A e B fissano", + "On the map": "Sulla mappa", + "Mode": "ModalitĂ ", + "Imagery opacity": "OpacitĂ  delle immagini", + "SWAP": "SCAMBIA", + "Trade the two sides of the divider": "Inverti i due lati del divisore", + "SELECT BOX": "SELEZIONA", + "Drag a box on the map (Esc cancels)": "Trascina un riquadro sulla mappa (Esc annulla)", + "USE VIEW": "USA VISTA", + "Use the current view as the box": "Usa la vista attuale come riquadro", + "Forget the box and its images": "Cancella il riquadro e le sue immagini", + "START HERE": "INIZIA DA QUI", + "Checking": "Verifica", + "PREVIEW": "ANTEPRIMA", + "Newest day with imagery for this box": "Giorno piĂč recente con immagini per questo riquadro", + "SHOW": "MOSTRA", + "Pin {day} as {slot}": "Fissa {day} come {slot}", + "Show {day}": "Mostra {day}", + "pinned {slot}": "fissato {slot}", + "shown": "mostrato", + "preview": "anteprima", + "start here": "inizia da qui", + "No box": "Nessun riquadro", + "Searching": "Ricerca", + "Every day is empty here": "Qui tutti i giorni sono vuoti", + "Sources off": "Fonti disattivate", + "VS": "VS", + "Not set": "Nessuna immagine", + "Basemap": "Mappa di base", + "Source off": "Fonte disattivata", + "Unpin {slot}": "Sblocca {slot}", + "Unpin the image": "Sblocca l'immagine", + "EXPORT {slot}": "ESP. {slot}", + "EXPORT": "ESPORTA", + "Download {slot} as a PNG": "Scarica {slot} come PNG", + "Download the image as a PNG": "Scarica l'immagine come PNG", + "Box {width} × {height} km": "Riquadro {width} × {height} km", + "Acquired {time}": "Acquisita {time}", + "Coverage {coverage}": "Copertura {coverage}", + "START HERE · {reason}": "INIZIA DA QUI · {reason}", + "Daily overview shows little detail in a box this small": "La panoramica giornaliera mostra pochi dettagli in un riquadro cosĂŹ piccolo", + "Imagery: NASA GIBS and Worldview · HLS (Sentinel-2, Landsat 8/9) and VIIRS": "Immagini: NASA GIBS e Worldview · HLS (Sentinel-2, Landsat 8/9) e VIIRS", + "Details": "Dettagli", + "Times, coverage, sources": "Orari, copertura, fonti", + "HIDE EMPTY DAYS": "NASCONDI GIORNI VUOTI", + "SHOW EMPTY DAYS · {count}": "MOSTRA GIORNI VUOTI · {count}", + "Days the probe found empty in this box": "Giorni che la verifica ha trovato vuoti in questo riquadro", + "image": "immagine", + "BASEMAP": "MAPPA DI BASE", + "The basemap": "La mappa di base", + "basemap": "mappa di base", + "Recent imagery against the basemap divider": "Divisore tra immagini recenti e mappa di base", + "Recent imagery A and B divider": "Divisore tra immagini recenti A e B", + "{before} {left} percent, {after} {right} percent": "{before} {left} per cento, {after} {right} per cento", + "Export failed · {error}": "Esportazione non riuscita · {error}", + "Scene action failed": "Azione sulla scena non riuscita", + "New scene name": "Nome della nuova scena", + "Delete scene \"{scene}\" and all shots?": "Eliminare la scena \"{scene}\" e tutti i suoi scatti?", + "Delete shot \"{shot}\"?": "Eliminare lo scatto \"{shot}\"?", + "Stopped (Esc)": "Fermato (Esc)", + "SPARSE": "RADO", + "BALANCED": "BILANCIATO", + "No shots yet. Use CAPTURE SHOT to save current look.": "Ancora nessuno scatto. Usa CATTURA SCATTO per salvare l'aspetto attuale.", + "Double-click to rename": "Doppio clic per rinominare", + "Shot name": "Nome dello scatto", + "LOAD": "CARICA", + "DEL": "ELIM", + "{duration}s + {hold}s": "{duration}s + {hold}s", + "Choose files": "Scegli i file", + "{count} files selected": { + "one": "{count} file selezionato", + "many": "{count} di file selezionati", + "other": "{count} file selezionati" + }, + "No file chosen": "Nessun file scelto", + "Cancel": "Annulla", + "EDIT DETAILS": "MODIFICA DETTAGLI", + "SHARE SCENE": "CONDIVIDI SCENA", + "Shared flight follow expired": "Il tracciamento condiviso del volo Ăš scaduto", + "Shared military flight follow expired": "Il tracciamento condiviso del volo militare Ăš scaduto", + "Shared satellite follow expired": "Il tracciamento condiviso del satellite Ăš scaduto", + "Shared flight could not be restored — feed unavailable": "Impossibile ripristinare il volo condiviso: feed non disponibile", + "Shared military flight could not be restored — feed unavailable": "Impossibile ripristinare il volo militare condiviso: feed non disponibile", + "Shared satellite could not be restored — feed unavailable": "Impossibile ripristinare il satellite condiviso: feed non disponibile", + "Shared flight is unavailable": "Il volo condiviso non Ăš disponibile", + "Shared military flight is unavailable": "Il volo militare condiviso non Ăš disponibile", + "Shared satellite is unavailable": "Il satellite condiviso non Ăš disponibile", + "entity": "elemento", + "Shared {subject} follow expired": "Il tracciamento condiviso di {subject} Ăš scaduto", + "Shared {subject} could not be restored — feed unavailable": "Impossibile ripristinare la condivisione di {subject}: feed non disponibile", + "Shared {subject} is unavailable": "La condivisione di {subject} non Ăš disponibile", + "{id} isn't reporting now — showing where it was last seen": "{id} non sta trasmettendo ora: viene mostrata l'ultima posizione nota", + "{id} isn't reporting now — showing where it was at {time}": "{id} non sta trasmettendo ora: viene mostrata l'ultima posizione nota ({time})", + "This share link can't be opened": "Impossibile aprire questo link di condivisione", + "Shared vessel is unavailable": "La nave condivisa non Ăš disponibile", + "ACQUIRING": "ACQUISIZIONE", + "SHARED {subject}": "CONDIVISO: {subject}", + "subject": "soggetto", + "LOADING LIVE DATA": "CARICAMENTO DATI LIVE", + "LOAD COMPLETE": "CARICAMENTO COMPLETATO", + "LOAD CANCELLED": "CARICAMENTO ANNULLATO", + "LOAD FAILED": "CARICAMENTO NON RIUSCITO", + "LIVE DATA OFF": "DATI LIVE DISATTIVATI", + "MAPPED SITES LOADED": "SITI MAPPATI CARICATI", + "RETRYING MAPPED SITES": "NUOVO TENTATIVO SITI MAPPATI", + "FETCHING MAPPED SITES": "RICERCA SITI MAPPATI", + "RETRYING ALPR CAMERAS": "NUOVO TENTATIVO TELECAMERE ALPR", + "FETCHING ALPR CAMERAS": "RICERCA TELECAMERE ALPR", + "OVERPASS TEMPORARILY UNAVAILABLE": "OVERPASS TEMPORANEAMENTE NON DISPONIBILE", + "OVERPASS RATE-LIMITED": "OVERPASS HA LIMITATO LE RICHIESTE", + "OVERPASS TIMED OUT": "OVERPASS IN TIMEOUT", + "OVERPASS COULD NOT COMPLETE THE QUERY": "OVERPASS NON HA POTUTO COMPLETARE LA QUERY", + "MAP TILES TEMPORARILY UNAVAILABLE": "TILE DELLA MAPPA TEMPORANEAMENTE NON DISPONIBILI", + "MAPPED NAMES TEMPORARILY UNAVAILABLE": "NOMI MAPPATI TEMPORANEAMENTE NON DISPONIBILI", + "TURNING OFF LIVE DATA": "DISATTIVAZIONE DATI LIVE", + "REFRESHING LIVE DATA": "AGGIORNAMENTO DATI LIVE", + "syncing road network": "sincronizzazione rete stradale", + "retry pending": "nuovo tentativo in sospeso", + "retrying in {seconds}s": "nuovo tentativo tra {seconds}s", + "ALPR cameras": "telecamere ALPR", + "OpenSky OAuth client missing/invalid": "Client OAuth di OpenSky mancante/non valido", + "OpenSky OAuth rejected credentials": "OAuth di OpenSky ha rifiutato le credenziali", + "OpenSky username/password rejected": "Nome utente/password di OpenSky rifiutati", + "OpenSky auth missing": "Autenticazione OpenSky mancante", + "OpenSky auth required": "Autenticazione OpenSky richiesta", + "OpenSky auth invalid": "Autenticazione OpenSky non valida", + "OpenSky auth failed": "Autenticazione OpenSky non riuscita", + "KartaView answered HTTP {status}": "KartaView ha risposto HTTP {status}", + "Panoramax answered HTTP {status}": "Panoramax ha risposto HTTP {status}", + "KartaView refused the request (code {code})": "KartaView ha rifiutato la richiesta (codice {code})", + "Vector tiles unavailable (HTTP {status})": "Tile vettoriali non disponibili (HTTP {status})", + "GNSS feed unavailable (HTTP {status})": "Feed GNSS non disponibile (HTTP {status})", + "{count} CelesTrak groups unavailable": { + "one": "{count} gruppo CelesTrak non disponibile", + "many": "{count} di gruppi CelesTrak non disponibili", + "other": "{count} gruppi CelesTrak non disponibili" + }, + "{feed} feed unavailable": "feed {feed} non disponibile", + "Source snapshot {minutes} min old": "Snapshot della fonte vecchio di {minutes} min", + "{source} rate limited (anonymous)": "{source}: limite di richieste (anonimo)", + "{source} rate limited": "{source}: limite di richieste", + "{source} network error": "{source}: errore di rete", + "Malformed {source} aircraft rows": "Righe degli aerei di {source} non valide", + "Malformed {source} response": "Risposta di {source} non valida", + "entry {n}": "voce {n}", + "feeds {names} stale": { + "one": "feed {names} obsoleto", + "many": "feed {names} obsoleti", + "other": "feed {names} obsoleti" + }, + "feeds {names} unreachable": { + "one": "feed {names} irraggiungibile", + "many": "feed {names} irraggiungibili", + "other": "feed {names} irraggiungibili" + }, + "feeds {names} invalid": { + "one": "feed {names} non valido", + "many": "feed {names} non validi", + "other": "feed {names} non validi" + }, + "Loading {feeds}": "Caricamento di {feeds}", + "{count} heard": { + "one": "{count} ricevuto", + "many": "{count} ricevuti", + "other": "{count} ricevuti" + }, + "USB {rate} msg/s": "USB {rate} msg/s", + "{rate} msg/s": "{rate} msg/s", + "{count} feeds live": { + "one": "{count} feed live", + "many": "{count} di feed live", + "other": "{count} feed live" + }, + "{feed} {count} ({seconds}s old)": "{feed} {count} ({seconds}s fa)", + "Street Level toggle failed": "Impossibile attivare o disattivare il livello Vista stradale", + "Street Level could not start": "Impossibile avviare Vista stradale", + "SHRINK": "RIDUCI", + "EXPAND": "ESPANDI", + "Shrink": "Riduci", + "Expand": "Espandi", + "ANY DATE": "QUALSIASI DATA", + "LAST 10 YEARS": "ULTIMI 10 ANNI", + "LAST 5 YEARS": "ULTIMI 5 ANNI", + "LAST 3 YEARS": "ULTIMI 3 ANNI", + "LAST 2 YEARS": "ULTIMI 2 ANNI", + "LAST YEAR": "ULTIMO ANNO", + "LAST 6 MONTHS": "ULTIMI 6 MESI", + "LAST 3 MONTHS": "ULTIMI 3 MESI", + "LAST MONTH": "ULTIMO MESE", + "LAST {count} DAYS": { + "one": "ULTIMO {count} GIORNO", + "many": "ULTIMI {count} DI GIORNI", + "other": "ULTIMI {count} GIORNI" + }, + "{window} · SINCE {date}": "{window} · DAL {date}", + "Turn Street Level off": "Disattiva Vista stradale", + "Turn Street Level on": "Attiva Vista stradale", + "{name} imagery on": "Immagini {name} attive", + "{name} imagery off": "Immagini {name} disattivate", + "Image by {creator}": "Immagine di {creator}", + " or ": " o ", + "OPEN {labels}": "APRI {labels}", + "Open {names} at the centre of the view": "Apri {names} al centro della vista", + "Zoom in to a street to open {names} here": "Ingrandisci su una strada per aprire {names} qui", + "Switch Street Level on to draw its coverage.": "Attiva Vista stradale per disegnarne la copertura.", + "Every provider is switched off: light a chip to draw its coverage.": "Tutti i provider sono disattivati: attivane uno per visualizzarne la copertura.", + "Loading this sequence
": "Caricamento di questa sequenza
", + "{n} images in this sequence · Esc clears": { + "one": "{n} immagine in questa sequenza · Esc cancella", + "many": "{n} di immagini in questa sequenza · Esc cancella", + "other": "{n} immagini in questa sequenza · Esc cancella" + }, + "No sequences in view match the filter": "Nessuna sequenza nella vista corrisponde al filtro", + "No coverage in view": "Nessuna copertura nella vista", + "{n} streets in view · click a line for its nearest photo": { + "one": "{n} strada nella vista · clic su una linea per la foto piĂč vicina", + "many": "{n} di strade nella vista · clic su una linea per la foto piĂč vicina", + "other": "{n} strade nella vista · clic su una linea per la foto piĂč vicina" + }, + "{n} sequences in view · click a line for its nearest photo": { + "one": "{n} sequenza nella vista · clic su una linea per la foto piĂč vicina", + "many": "{n} di sequenze nella vista · clic su una linea per la foto piĂč vicina", + "other": "{n} sequenze nella vista · clic su una linea per la foto piĂč vicina" + }, + "{n} sequences in view · click a line for its photos": { + "one": "{n} sequenza nella vista · clic su una linea per le sue foto", + "many": "{n} di sequenze nella vista · clic su una linea per le sue foto", + "other": "{n} sequenze nella vista · clic su una linea per le sue foto" + }, + "km/h": "km/h", + "m/s": "m/s", + "mph": "mph", + "hPa": "hPa", + "kt": "kn", + "kts": "kn", + "ft": "ft", + "km": "km", + "m": "m", + "h": "h", + "min": "min", + "s": "s", + "dB": "dB", + "Celestial ring — reveal the full globe": "Anello celeste — mostra il globo intero", + "Celestial ring — available in Normal style": "Anello celeste — disponibile nello stile Normale", + "Detection overlay: {mode}": "Overlay di rilevamento: {mode}", + "Detection overlay: off": "Overlay di rilevamento: disattivato", + "DETECT": "RILEV.", + "{time} · {minutes} min ago": "{time} · {minutes} min fa", + "Active weather": "Meteo attivo", + "LATEST · newest per product": "ULTIMO · il piĂč recente per prodotto", + "Forecast · valid {valid} · issued {issued}": "Previsione · valida {valid} · emessa {issued}", + "{detail} · Does not follow history": "{detail} · Non segue lo storico", + "Forecast · valid {valid}": "Previsione · valida {valid}", + "voice|OFF": "OFF", + "voice|CONNECTING": "CONNESSIONE", + "voice|LISTENING": "IN ASCOLTO", + "voice|EXECUTING": "ESECUZIONE", + "voice|ERROR": "ERRORE", + "Voice provider": "Provider vocale", + "Changing provider reconnects voice if it is on.": "Cambiare provider riconnette la voce se Ăš attiva.", + "Voice Settings": "Impostazioni voce", + "AI AGENT": "AGENTE IA", + "Voice model tier — applies next session": "Livello del modello vocale: si applica alla prossima sessione", + "STD": "STD", + "Estimated session cost": "Costo stimato della sessione", + "Voice control — activate to toggle voice; hold Space to speak": "Controllo vocale: attiva per abilitare o disabilitare la voce; tieni premuto Space per parlare", + "ON/OFF": "ON/OFF", + "VOICE STANDBY": "VOCE IN ATTESA", + "VOICE CONTROL": "CONTROLLO VOCALE", + "Hold Space to speak · tap Space to activate focused controls": "Tieni premuto Space per parlare · premi Space per attivare il controllo selezionato", + "VOICE": "VOCE", + "Preview": "Anteprima", + "Settings": "Impostazioni", + "Close voice panel": "Chiudi il pannello voce", + "Voice replies appear here.": "Le risposte vocali appaiono qui.", + "Voice assistant": "Assistente vocale", + "Dismiss voice card": "Chiudi la scheda voce", + "YOU": "TU", + "THIS": "QUESTO", + "Plan": "Piano", + "Referenced items": "Elementi citati", + "NOTES & SOURCES": "NOTE E FONTI", + "Show Voice Preview": "Mostra l'anteprima voce", + "Voice inactivity timeout": "Timeout di inattivitĂ  della voce", + "Minutes": "Minuti", + "Custom": "Personalizzato", + "These preferences stay in this browser.": "Queste preferenze restano in questo browser.", + "VOICE SYSTEM ERROR": "ERRORE SISTEMA VOCALE", + "DISMISS": "CHIUDI", + "Check microphone permission and network access, then try again.": "Controlla il permesso del microfono e l'accesso alla rete, poi riprova.", + "Gemini returned an oversized audio chunk": "Gemini ha restituito un blocco audio troppo grande", + "Gemini returned an unsupported audio format": "Gemini ha restituito un formato audio non supportato", + "Gemini returned an invalid audio sample rate": "Gemini ha restituito una frequenza di campionamento audio non valida", + "Gemini returned incomplete PCM audio": "Gemini ha restituito audio PCM incompleto", + "This browser does not support Gemini microphone audio": "Questo browser non supporta l'audio del microfono per Gemini", + "Microphone audio processing failed": "Elaborazione dell'audio del microfono non riuscita", + "Gemini audio playback fell behind. Reconnect to continue.": "La riproduzione audio di Gemini Ăš rimasta indietro. Riconnetti per continuare.", + "Gemini token response did not include an ephemeral credential": "La risposta del token Gemini non includeva una credenziale temporanea", + "Invalid Gemini connection endpoint": "Endpoint di connessione Gemini non valido", + "Gemini voice could not connect. Try again.": "Impossibile connettere la voce Gemini. Riprova.", + "Gemini voice requires a same-origin app request": "La voce Gemini richiede una richiesta dall'app con la stessa origine", + "Add a Gemini API key in Provider Settings": "Aggiungi una chiave API Gemini in Impostazioni provider", + "The Gemini Live model configuration is invalid": "La configurazione del modello Gemini Live non Ăš valida", + "Gemini voice is starting too often. Try again shortly.": "La voce Gemini si sta avviando troppo spesso. Riprova tra poco.", + "Gemini quota is unavailable. Try again later.": "La quota Gemini non Ăš disponibile. Riprova piĂč tardi.", + "Gemini access was refused. Check the API key and model access.": "L'accesso a Gemini Ăš stato rifiutato. Controlla la chiave API e l'accesso al modello.", + "Gemini Live is unavailable for the configured model.": "Gemini Live non Ăš disponibile per il modello configurato.", + "Token request is too large": "La richiesta del token Ăš troppo grande", + "Use an empty JSON token request": "Usa una richiesta di token JSON vuota", + "Release Space to send": "Rilascia Space per inviare", + "Hold Space to talk": "Tieni premuto Space per parlare", + "Voice command context is too large": "Il contesto del comando vocale Ăš troppo grande", + "Gemini reliable transport exceeded its queue limit. Start voice again.": "Il trasporto affidabile di Gemini ha superato il limite della coda. Riavvia la voce.", + "Gemini reliable transport did not drain. Start voice again.": "Il trasporto affidabile di Gemini non si Ăš svuotato. Riavvia la voce.", + "Gemini token request failed (HTTP {status})": "Richiesta del token Gemini non riuscita (HTTP {status})", + "Gemini token response did not include a valid model": "La risposta del token Gemini non includeva un modello valido", + "Gemini token response did not include session settings": "La risposta del token Gemini non includeva le impostazioni della sessione", + "Gemini session settings do not match the input mode": "Le impostazioni della sessione Gemini non corrispondono alla modalitĂ  di input", + "Requesting microphone": "Richiesta microfono", + "Gemini could not submit this input. Start voice again.": "Gemini non ha potuto inviare questo input. Riavvia la voce.", + "Connecting to Gemini": "Connessione a Gemini", + "Ask or command": "Chiedi o dai un comando", + "Gemini returned an oversized message": "Gemini ha restituito un messaggio troppo grande", + "Gemini Live connection failed. Check network access, then start voice again.": "Connessione a Gemini Live non riuscita. Controlla l'accesso alla rete, poi riavvia la voce.", + "Gemini Live connection ended. Start voice again for a new conversation.": "Connessione a Gemini Live terminata. Riavvia la voce per una nuova conversazione.", + "Gemini Live could not start. Start voice again to request a fresh session.": "Gemini Live non si Ăš avviato. Riavvia la voce per richiedere una nuova sessione.", + "Start voice again for a fresh token and a new conversation.": "Riavvia la voce per un nuovo token e una nuova conversazione.", + "Start voice again to request a fresh session credential.": "Riavvia la voce per richiedere una nuova credenziale di sessione.", + "Microphone permission was denied. Allow microphone access and try again.": "Il permesso del microfono Ăš stato negato. Consenti l'accesso al microfono e riprova.", + "Gemini connection timed out. Try again.": "La connessione a Gemini Ăš andata in timeout. Riprova.", + "Gemini voice could not start": "Impossibile avviare la voce Gemini", + "Gemini did not finish the interrupted reply. Start voice again.": "Gemini non ha completato la risposta interrotta. Riavvia la voce.", + "Gemini session expiring; finishing the current reply": "Sessione Gemini in scadenza; completamento della risposta in corso", + "Gemini rejected the voice session. Start voice again to request a fresh session.": "Gemini ha rifiutato la sessione vocale. Riavvia la voce per richiedere una nuova sessione.", + "Start voice again for a fresh session credential. If it repeats, check Gemini model and API access.": "Riavvia la voce per una nuova credenziale di sessione. Se si ripete, controlla il modello Gemini e l'accesso API.", + "Gemini action history is full. Start voice again for a fresh session.": "La cronologia delle azioni di Gemini Ăš piena. Riavvia la voce per una nuova sessione.", + "Gemini requested too many simultaneous actions": "Gemini ha richiesto troppe azioni simultanee", + "Running command": "Comando in esecuzione", + "Voice text command is too long": "Il comando vocale testuale Ăš troppo lungo", + "Gemini voice is not connected": "La voce Gemini non Ăš connessa", + "Gemini interrupted input exceeded its buffer or wait limit. Start voice again.": "L'input interrotto di Gemini ha superato il limite di buffer o di attesa. Riavvia la voce.", + "Gemini Live connection is expiring. Start voice again for a new conversation.": "La connessione a Gemini Live sta scadendo. Riavvia la voce per una nuova conversazione.", + "Voice off": "Voce disattivata", + "Gemini voice sessions have a time limit. When a session expires, start voice again for a new conversation.": "Le sessioni vocali Gemini hanno un limite di tempo. Quando una sessione scade, riavvia la voce per una nuova conversazione.", + "Stopped by voice": "Fermato dalla voce", + "Automatic stop is unavailable for this voice connection.": "L'arresto automatico non Ăš disponibile per questa connessione vocale.", + "Preview is off.": "L'anteprima Ăš disattivata.", + "Your choice applies now, but could not be saved.": "La tua scelta vale da subito, ma non Ăš stato possibile salvarla.", + "WebRTC microphone support unavailable": "Supporto microfono WebRTC non disponibile", + "VOICE UNAVAILABLE": "VOCE NON DISPONIBILE", + "VOICE ACTIVE": "VOCE ATTIVA", + "Voice session could not be started.": "Impossibile avviare la sessione vocale.", + "MINI": "MINI", + "Next session: {pendingId} — this session stays on {modelId}": "Prossima sessione: {pendingId}. Questa sessione resta su {modelId}", + "Voice model: {pendingId} — click to switch to {target}; applies next session": "Modello vocale: {pendingId}. Clic per passare a {target}; si applica alla prossima sessione", + "standard": "standard", + "mini": "mini", + "COST UNKNOWN": "COSTO SCONOSCIUTO", + "ChatGPT OAuth session: {responses} response(s), {input} input and {output} output tokens, {captions} caption transcription(s) reported.": "Sessione ChatGPT OAuth. Risposte: {responses}; token di input: {input}; token di output: {output}; trascrizioni dei sottotitoli riportate: {captions}.", + "USD cost and the API spend cap are unavailable for this auth mode.": "Il costo in USD e il limite di spesa API non sono disponibili per questa modalitĂ  di autenticazione.", + "Usage is incomplete because a response was still in flight when the session ended.": "L'utilizzo Ăš incompleto perchĂ© una risposta era ancora in corso quando la sessione Ăš terminata.", + "Estimated session cost on {modelId} — {responses} response(s). Warns at {warn}, ends the session at {cap}.": "Costo stimato della sessione su {modelId}. Risposte: {responses}. Avviso a {warn}; la sessione termina a {cap}.", + "Estimate is incomplete — a response was still in flight when the session ended, so its usage was never reported.": "Stima incompleta: una risposta era ancora in corso quando la sessione Ăš terminata, quindi il suo utilizzo non Ăš mai stato riportato.", + "STANDARD": "STANDARD", + "{tier} applies next session": "{tier} si applica alla prossima sessione", + "Session ended — cost cap {cost}": "Sessione terminata: limite di costo {cost}", + "MIC": "MIC", + "Radio did not start": "La radio non si Ăš avviata", + "{n} aircraft": { + "one": "{n} aereo", + "many": "{n} di aerei", + "other": "{n} aerei" + }, + "{n} military aircraft": { + "one": "{n} aereo militare", + "many": "{n} di aerei militari", + "other": "{n} aerei militari" + }, + "{n} ships": { + "one": "{n} nave", + "many": "{n} di navi", + "other": "{n} navi" + }, + "{n} satellites": { + "one": "{n} satellite", + "many": "{n} di satelliti", + "other": "{n} satelliti" + }, + "{n} launches": { + "one": "{n} lancio", + "many": "{n} di lanci", + "other": "{n} lanci" + }, + "{n} earthquakes": { + "one": "{n} terremoto", + "many": "{n} di terremoti", + "other": "{n} terremoti" + }, + "{n} fires": { + "one": "{n} incendio", + "many": "{n} di incendi", + "other": "{n} incendi" + }, + "{n} fire perimeters": { + "one": "{n} perimetro di incendio", + "many": "{n} di perimetri di incendi", + "other": "{n} perimetri di incendi" + }, + "{n} cyclones": { + "one": "{n} ciclone", + "many": "{n} di cicloni", + "other": "{n} cicloni" + }, + "{n} buses": { + "one": "{n} autobus", + "many": "{n} di autobus", + "other": "{n} autobus" + }, + "{n} bike share": { + "one": "{n} stazione bike sharing", + "many": "{n} di stazioni bike sharing", + "other": "{n} stazioni bike sharing" + }, + "{n} flock cameras": { + "one": "{n} telecamera Flock", + "many": "{n} di telecamere Flock", + "other": "{n} telecamere Flock" + }, + "{n} military bases": { + "one": "{n} base militare", + "many": "{n} di basi militari", + "other": "{n} basi militari" + }, + "{n} datacenters": { + "one": "{n} data center", + "many": "{n} di data center", + "other": "{n} data center" + }, + "{n} dams": { + "one": "{n} diga", + "many": "{n} di dighe", + "other": "{n} dighe" + }, + "{n} air quality": { + "one": "{n} stazione qualitĂ  dell'aria", + "many": "{n} di stazioni qualitĂ  dell'aria", + "other": "{n} stazioni qualitĂ  dell'aria" + }, + "{n} results": { + "one": "{n} risultato", + "many": "{n} di risultati", + "other": "{n} risultati" + }, + "anywhere in the loaded data": "ovunque nei dati caricati", + "in view": "nella vista", + "within {radius} of the view centre": "entro {radius} dal centro della vista", + "within {radius} of {place} (Contacts window)": "entro {radius} da {place} (finestra Contatti)", + "within {radius} of {place}": "entro {radius} da {place}", + "within {radius}": "entro {radius}", + "over {region}": "sopra {region}", + "At least {items}": "Almeno {items}", + "{items} {scope}": "{items} {scope}", + "last 24 h": "ultime 24 h", + "past 30 d and upcoming": "ultimi 30 g e in programma", + "the flights layer loads by viewport": "il livello voli si carica in base alla vista", + "distance is ground distance, not overhead": "la distanza Ăš misurata al suolo fino al punto subsatellitare, non fino al satellite", + "the count is a lower bound because at least one layer reached its retained limit.": "il conteggio Ăš un limite inferiore perchĂ© almeno un livello ha raggiunto il suo limite di conservazione.", + "{label} off": "{label}: disattivato", + "{label} loading": "{label}: in caricamento", + "{label} error": "{label}: errore", + "counted the first {returned} loaded records": "conteggio limitato ai primi record caricati: {returned}", + "counted {returned} of {total} loaded records": "record conteggiati: {returned} su {total} caricati", + "{layers} just turned on — still loading, counts will rise": "Attivazione recente: {layers}. Caricamento ancora in corso: i conteggi aumenteranno", + "Contacts panel snapshot at {time} — the same retained cohort supplies the card, speech, and follow-up memory": "Snapshot del pannello Contatti alle {time}: lo stesso gruppo conservato fornisce la scheda, il parlato e la memoria per le domande successive", + "Contacts panel snapshot — the same retained cohort supplies the card, speech, and follow-up memory": "Snapshot del pannello Contatti: lo stesso gruppo conservato fornisce la scheda, il parlato e la memoria per le domande successive", + "Fly below {km} km to a covered region": "Scendi sotto {km} km su una regione coperta", + "No feed here yet · {n} regions available": { + "one": "Ancora nessun feed qui · {n} regione disponibile", + "many": "Ancora nessun feed qui · {n} di regioni disponibili", + "other": "Ancora nessun feed qui · {n} regioni disponibili" + }, + "degraded": "degradato", + "stale": "obsoleto", + "partial": "parziale", + "fallback": "di riserva", + "unavailable": "non disponibile", + "Not answered: {layers}": "Senza risposta: {layers}", + "Toggle voice control": "Attiva/disattiva il controllo vocale", + "Activate to toggle voice": "Attiva per abilitare o disabilitare la voce", + "Voice active": "Voce attiva", + "Voice could not be started.": "Impossibile avviare la voce.", + "the active voice session": "la sessione vocale attiva", + "{value} feet": "{value} piedi", + "Fire · FRP {frp} MW": "Incendio · FRP {frp} MW", + "The flights layer is not enabled": "Il livello voli non Ăš attivo", + "The military layer is not enabled": "Il livello militare non Ăš attivo", + "The satellites layer is not enabled": "Il livello satelliti non Ăš attivo", + "The ais-live-vessels layer is not enabled": "Il livello ais-live-vessels non Ăš attivo", + "Could not enable the requested layer": "Impossibile attivare il livello richiesto", + "Could not disable the requested layer": "Impossibile disattivare il livello richiesto", + "Radio layer unavailable": "Livello Radio non disponibile", + "Camera navigation is unavailable in the current view": "La navigazione della camera non Ăš disponibile nella vista attuale", + "Camera navigation policy unavailable": "Regole di navigazione della camera non disponibili", + "Nearest-aircraft selection supports Flights or Military Flights only": "La selezione dell'aereo piĂč vicino supporta solo Voli o Voli militari", + "Nearest-aircraft selection needs a preset, place name, or latitude and longitude": "La selezione dell'aereo piĂč vicino richiede un preset, un nome di luogo o latitudine e longitudine", + "Could not arrive at the requested place": "Impossibile arrivare al luogo richiesto", + "The nearest airborne aircraft could not be selected": "Impossibile selezionare l'aereo in volo piĂč vicino", + "No flights within {radius} of the current view": "Nessun volo entro {radius} dalla vista attuale", + "No military within {radius} of the current view": "Nessun aereo militare entro {radius} dalla vista attuale", + "No satellites within {radius} of the current view": "Nessun satellite entro {radius} dalla vista attuale", + "No vessels within {radius} of the current view": "Nessuna nave entro {radius} dalla vista attuale", + "{layer} is enabled on the {source} feed, but no airborne aircraft is loaded in the {place} view yet": "Il livello {layer} Ăš attivo sul feed {source}, ma nessun aereo in volo Ăš ancora caricato nella vista di {place}", + "{layer} is enabled, but no airborne aircraft is loaded in the {place} view yet": "Il livello {layer} Ăš attivo, ma nessun aereo in volo Ăš ancora caricato nella vista di {place}", + "{layer} is enabled, but its aircraft feed is unavailable": "Il livello {layer} Ăš attivo, ma il suo feed di aerei non Ăš disponibile", + "{layer} is enabled, but its destination refresh did not complete": "Il livello {layer} Ăš attivo, ma l'aggiornamento nel luogo di destinazione non Ăš stato completato", + "{layer} is enabled, but {source} is unavailable": "Il livello {layer} Ăš attivo, ma {source} non Ăš disponibile", + "Could not arrive at {place}": "Impossibile arrivare a {place}", + "{name} is no longer loaded": "{name} non Ăš piĂč caricato", + "Unknown target layer: {target}": "Livello obiettivo sconosciuto: {target}", + "nominal": "nominale", + "{label} on": "{label}: attivato", + "Frame aircraft": "Inquadra gli aerei", + "Frame military aircraft": "Inquadra gli aerei militari", + "Frame ships": "Inquadra le navi", + "Frame satellites": "Inquadra i satelliti", + "Frame contacts": "Inquadra i contatti", + "{count} aircraft in frame": { + "one": "{count} aereo inquadrato", + "many": "{count} di aerei inquadrati", + "other": "{count} aerei inquadrati" + }, + "{count} military aircraft in frame": { + "one": "{count} aereo militare inquadrato", + "many": "{count} di aerei militari inquadrati", + "other": "{count} aerei militari inquadrati" + }, + "{count} ships in frame": { + "one": "{count} nave inquadrata", + "many": "{count} di navi inquadrate", + "other": "{count} navi inquadrate" + }, + "{count} satellites in frame": { + "one": "{count} satellite inquadrato", + "many": "{count} di satelliti inquadrati", + "other": "{count} satelliti inquadrati" + }, + "{count} contacts in frame": { + "one": "{count} contatto inquadrato", + "many": "{count} di contatti inquadrati", + "other": "{count} contatti inquadrati" + }, + "Nearest military aircraft": "Aerei militari piĂč vicini", + "Nearest ships": "Navi piĂč vicine", + "Nearest satellites": "Satelliti piĂč vicini", + "Nearest aircraft": "Aerei piĂč vicini", + "{first} and {second}": "{first} e {second}", + "Layer": "Livello", + "there": "lĂŹ", + "Camera range {range}": "Distanza della camera {range}", + "Within {radius} of the view": "Entro {radius} dalla vista", + "Labels on": "Etichette attivate", + "Framing uses the nearest 80 loaded contacts": "L'inquadratura usa gli 80 contatti caricati piĂč vicini", + "{distance} from {location}": "{distance} da {location}", + "Altitude {altitude}": "Altitudine {altitude}", + "{origin} to {destination}": "Da {origin} a {destination}", + "from {origin}": "da {origin}", + "to {destination}": "a {destination}", + "Registration {registration}": "Matricola {registration}", + "View state": "Stato della vista", + "Marked {count} places": { + "one": "Segnato {count} luogo", + "many": "Segnati {count} di luoghi", + "other": "Segnati {count} luoghi" + }, + "Nothing marked": "Nessun luogo segnato", + "Not found: {places}": "Non trovati: {places}", + "Tracing outlines": "Tracciamento dei contorni", + "Frame flights": "Inquadra i voli", + "Frame military": "Inquadra i voli militari", + "Frame vessels": "Inquadra le navi", + "Frame {target}": "Inquadra {target}", + "Zoom out to globe": "Allontana fino al globo", + "Open data layers": "Apri i livelli dati", + "Open or close a panel": "Apri o chiudi un pannello", + "Change context mode": "Cambia la modalitĂ  contesto", + "Control cockpit": "Controlla il cockpit", + "Change visual style": "Cambia lo stile visivo", + "Adjust HUD": "Regola l'HUD", + "Adjust cyber sonar": "Regola il sonar Cyber", + "Adjust detection overlay": "Regola l'overlay di rilevamento", + "Change map stack": "Cambia lo stack mappa", + "Adjust post-processing": "Regola la post-elaborazione", + "Control scene": "Controlla la scena", + "Control CCTV": "Controlla le telecamere CCTV", + "Control radio": "Controlla la radio", + "Track contact": "Traccia il contatto", + "Stop tracking": "Interrompi il tracciamento", + "Clear marks": "Cancella i segni", + "Move camera": "Sposta la camera", + "Fly route": "Vola lungo il percorso", + "Analyst query": "Richiesta di analisi", + "Next ISS pass": "Prossimo passaggio della ISS", + "Next satellite pass": "Prossimo passaggio del satellite", + "Mark the map": "Segna sulla mappa", + "Mark {targets} +{more}": "Segna {targets} +{more}", + "Mark {targets}": "Segna {targets}", + "Fly to {place}": "Vola su {place}", + "Fly to Location": "Vola sul luogo", + "Nearest aircraft to {place}": "Aereo piĂč vicino a {place}", + "Nearest aircraft to Here": "Aereo piĂč vicino a questo punto", + "Layer on": "Livello attivato", + "Layer off": "Livello disattivato", + "Zoom out": "Allontana", + "Zoom in": "Avvicina", + "Read the view": "Leggi la vista", + "Check view state": "Controlla lo stato della vista", + "Action": "Azione", + "Finding places": "Ricerca dei luoghi", + "Tracing outline": "Tracciamento del contorno", + "Looking up place": "Ricerca del luogo", + "Flying": "In volo", + "Turning on layer": "Attivazione del livello", + "Loading aircraft": "Caricamento degli aerei", + "Picking nearest": "Scelta del piĂč vicino", + "Working": "Operazione in corso", + "in progress": "in corso", + "done": "fatto", + "failed": "non riuscito", + "cancelled": "annullato", + "Outline traced": "Contorno tracciato", + "Outline unavailable": "Contorno non disponibile", + "Source: {label}": "Fonte: {label}", + "WORKING": "IN CORSO", + "DONE": "FATTO", + "Recent speech": "Parlato recente", + "HERE": "QUI", + "Aircraft cockpit view": "Vista cockpit dell'aereo", + "LEVEL": "ORIZZONTE", + "Estimated destination direction": "Direzione stimata della destinazione", + "DEST ---°": "DEST ---°", + "OPTICAL PLANE · 01": "PIANO OTTICO · 01", + "VISOR LOCK · ACTIVE": "BLOCCO VISIERA · ATTIVO", + "GROUND SPEED · KTS": "VEL. AL SUOLO · KTS", + "ALTITUDE · FT": "QUOTA · FT", + "FIRST PERSON": "PRIMA PERSONA", + "LIVE TRACK · COURSE ALIGNED": "TRACCIA LIVE · ROTTA ALLINEATA", + "Cockpit vision style": "Stile di visione del cockpit", + "Previous cockpit vision style": "Stile di visione precedente del cockpit", + "Previous vision style": "Stile di visione precedente", + "Current cockpit vision style: NORMAL. Activate for next style.": "Stile di visione attuale del cockpit: NORMALE. Attiva per lo stile successivo.", + "Current style: NORMAL — click for next": "Stile attuale: NORMALE. Clic per il successivo", + "CURRENT": "ATTUALE", + "Next cockpit vision style": "Stile di visione successivo del cockpit", + "Next vision style": "Stile di visione successivo", + "Current aircraft heading": "Prua attuale dell'aereo", + "GROUND SPEED": "VEL. AL SUOLO", + "KTS": "KTS", + "ALTITUDE": "ALTITUDINE", + "FT": "FT", + "Contact cockpit summary": "Riepilogo contatto del cockpit", + "CONTACT": "CONTATTO", + "CONTACTS · 250 KM": "CONTATTI · 250 KM", + "Contact navigation": "Navigazione contatti", + "CONTEXT ONLY": "SOLO CONTESTO", + "Nearby cohort counts": "Conteggi dei gruppi vicini", + "FLT": "VOLI", + "MIL": "MIL", + "SITE": "SITI", + "NEAREST OBSERVED / MAPPED": "PIÙ VICINO OSSERVATO / MAPPATO", + "AVAILABLE INPUTS ONLY · NOT AN ALL-CLEAR": "SOLO INPUT DISPONIBILI · NON È UN VIA LIBERA", + "WX": "METEO", + "Cockpit briefing carousel": "Carosello briefing del cockpit", + "Estimated flight plan": "Piano di volo stimato", + "ESTIMATED FLIGHT PLAN": "PIANO DI VOLO STIMATO", + "FROM": "DA", + "TO": "A", + "Cockpit briefing controls": "Controlli briefing del cockpit", + "Previous briefing page": "Pagina briefing precedente", + "Next briefing page": "Pagina briefing successiva", + "Live signals": "Segnali live", + "Latest regional news": "Ultime notizie regionali", + "Location-based information": "Informazioni basate sulla posizione", + "TEMP": "TEMP", + "WIND": "VENTO", + "SKY": "CIELO", + "PRECIP": "PRECIP", + "MM": "MM", + "Weather data by Open-Meteo.com": "Dati meteo di Open-Meteo.com", + "Cockpit briefing pages": "Pagine del briefing del cockpit", + "SIG": "SIG", + "Show Live Signals": "Mostra Segnali live", + "NEWS": "NOTIZIE", + "Show Regional News": "Mostra Notizie regionali", + "LOCAL": "LOCALE", + "Show Local Info": "Mostra Info locali", + "Cockpit display and Radio controls": "Controlli display e Radio del cockpit", + "DISPLAY": "DISPLAY", + "Cockpit display options": "Opzioni display del cockpit", + "RADIO": "RADIO", + "Cockpit compact Radio controls": "Controlli Radio compatti del cockpit", + "Previous filtered radio station": "Stazione radio filtrata precedente", + "Play selected radio station": "Riproduci la stazione radio selezionata", + "Next filtered radio station": "Stazione radio filtrata successiva", + "VOLUME": "VOLUME", + "Cockpit Radio volume": "Volume Radio del cockpit", + "ESC EXIT": "ESC ESCI", + "C TOGGLE": "C ALTERNA", + "View switcher": "Selettore vista", + "Exit cockpit and return to full globe view": "Esci dal cockpit e torna alla vista del globo intero", + "RESET": "RESET", + "Exit cockpit view": "Esci dalla vista cockpit", + "EXIT COCKPIT": "ESCI DAL COCKPIT", + "Navigation, voice, and visual preset controls": "Controlli di navigazione, voce e preset visivi", + "Expand Visual Presets": "Espandi Preset visivi", + "Pin visual presets": "Fissa i preset visivi", + "Keep visual presets open": "Mantieni aperti i preset visivi", + "Show the globe without a visual filter.": "Mostra il globo senza filtro visivo.", + "Emulate a green phosphor CRT with scanlines and screen curvature.": "Emula un CRT a fosfori verdi con scanline e curvatura dello schermo.", + "Simulate night-vision goggles with green intensification and a tube vignette.": "Simula la visione notturna con intensificazione verde e vignettatura del tubo.", + "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "Simula il contrasto termico in stile FLIR. Alza Ironbow per il colore.", + "Apply bright cel-shaded color and illustrated outlines.": "Applica colori vivaci cel-shaded e contorni illustrati.", + "Apply high-contrast monochrome film-noir grading.": "Applica un color grading noir monocromatico ad alto contrasto.", + "MAP SOURCE": "FONTE MAPPA", + "Map source": "Fonte mappa", + "Style": "Stile", + "Expand LOCATION": "Espandi POSIZIONE", + "Collapse panel": "Comprimi il pannello", + "Pin location tray": "Fissa il pannello posizione", + "Keep location tray open": "Mantieni aperto il pannello posizione", + "Search any location": "Cerca un luogo", + "Search location by name or coordinates": "Cerca un luogo per nome o coordinate", + "Search any location...": "Cerca un luogo...", + "WEATHER": "METEO", + "Active weather products": "Prodotti meteo attivi", + "RECENT IMAGERY": "IMMAGINI RECENTI", + "Imagery days in the box": "Giorni con immagini nel riquadro", + "CONTEXT": "CONTESTO", + "Expand panel": "Espandi il pannello", + "Context mode": "ModalitĂ  contesto", + "CONTACTS": "CONTATTI", + "Cycles the nearest contacts of whatever type you select — planes, vessels, installations. Satellites track independently.": "Scorre i contatti piĂč vicini del tipo selezionato: aerei, navi, installazioni. I satelliti vengono tracciati in modo indipendente.", + "SPACE MISSIONS": "MISSIONI SPAZIALI", + "SELECT CONTEXT": "SELEZIONA CONTESTO", + "Contact Context actions": "Azioni Contesto contatto", + "COCKPIT": "COCKPIT", + "SEARCH NEARBY SITES": "CERCA SITI VICINI", + "Reclassify tracked contact as TR-3B": "Riclassifica il contatto tracciato come TR-3B", + "CONTACTS CONTEXT OFF": "CONTESTO CONTATTI DISATTIVATO", + "SELECT CONTACTS TO LOAD OBSERVED / MAPPED PROXIMITY": "SELEZIONA CONTATTI PER CARICARE I DATI OSSERVATI / MAPPATI NELLE VICINANZE", + "Available Space Missions": "Missioni spaziali disponibili", + "AVAILABLE MISSIONS": "MISSIONI DISPONIBILI", + "SELECT A MISSION TO INSPECT": "SELEZIONA UNA MISSIONE DA ESAMINARE", + "LOADING 30-DAY MISSION INDEX": "CARICAMENTO INDICE MISSIONI A 30 GIORNI", + "TAB PREVIEWS · ENTER / SPACE SELECTS": "TAB: ANTEPRIMA · ENTER / SPACE: SELEZIONA", + "Internet radio and local SDR": "Radio internet e SDR locale", + "STATION TAG": "TAG STAZIONE", + "Filter stations by station tag": "Filtra le stazioni per tag", + "All": "Tutti", + "Enable Radio, then choose a globe marker or use next.": "Attiva la Radio, poi scegli un marcatore sul globo o passa alla successiva.", + "DRAG TO TUNE": "TRASCINA PER SINTONIZZARE", + "Tune available internet radio stations": "Sintonizza le stazioni radio internet disponibili", + "ALL · DRAG THE NEEDLE": "TUTTE · TRASCINA L'AGO", + "SNAPS TO AVAILABLE STATIONS": "SI AGGANCIA ALLE STAZIONI DISPONIBILI", + "Radio playback": "Riproduzione radio", + "Previous filtered station": "Stazione filtrata precedente", + "Play selected station": "Riproduci la stazione selezionata", + "Next filtered station": "Stazione filtrata successiva", + "STOP": "STOP", + "Stop radio playback": "Ferma la riproduzione radio", + "Radio volume": "Volume radio", + "STATION SITE": "SITO STAZIONE", + "DIRECTORY: RADIO BROWSER": "ELENCO: RADIO BROWSER", + "Audio connects directly to the broadcaster after you press play. Your IP is visible to that broadcaster.": "L'audio si collega direttamente all'emittente dopo aver premuto play. Il tuo IP Ăš visibile a quell'emittente.", + "Local RTL-SDR receiver": "Ricevitore RTL-SDR locale", + "LOCAL RTL-SDR": "RTL-SDR LOCALE", + "Chrome/Edge · WebUSB · one local tuner shared by FM and the Local ADS-B layer.": "Chrome/Edge · WebUSB · un sintonizzatore locale condiviso tra FM e il livello ADS-B locale.", + "Use your location for faster ADS-B position decoding": "Usa la tua posizione per decodificare piĂč in fretta le posizioni ADS-B", + "CHANGE DEVICE": "CAMBIA DISPOSITIVO", + "Choose a different RTL-SDR or receiver channel": "Scegli un altro RTL-SDR o canale del ricevitore", + "RTL-SDR receiver mode": "ModalitĂ  del ricevitore RTL-SDR", + "GAIN": "GUADAGNO", + "RTL-SDR tuner gain for the current mode": "Guadagno del sintonizzatore RTL-SDR per la modalitĂ  attuale", + "AUTO": "AUTO", + "MSG/S": "MSG/S", + "HEARD": "RICEVUTI", + "POSITIONED": "POSIZIONATI", + "FM MHZ": "FM MHZ", + "TUNE": "SINTONIZZA", + "Seek broadcast FM stations": "Cerca stazioni FM broadcast", + "◀ SEEK": "◀ CERCA", + "SEEK ▶": "CERCA ▶", + "SDR VOL": "VOL SDR", + "Local SDR volume": "Volume dell'SDR locale", + "Intelligence HUD (H)": "HUD intelligence (H)", + "Layout": "Layout", + "HUD layout": "Layout HUD", + "Tactical": "Tattico", + "Minimal": "Minimale", + "Cyber": "Cyber", + "Sonar": "Sonar", + "Cyber sonar contact scanner": "Scanner di contatti sonar Cyber", + "Rings": "Anelli", + "Sonar ring count": "Numero di anelli del sonar", + "Range": "Portata", + "Sonar ring range": "Portata degli anelli del sonar", + "Power": "Potenza", + "Sonar intensity": "IntensitĂ  del sonar", + "Opacity": "OpacitĂ ", + "Cyber contact and label opacity": "OpacitĂ  di contatti ed etichette Cyber", + "Minimum opacity for map dots, icons, models, brackets, and labels between sonar passes": "OpacitĂ  minima di punti sulla mappa, icone, modelli, riquadri ed etichette tra un passaggio del sonar e l'altro", + "Sector": "Settore", + "Sonar sector width": "Ampiezza del settore del sonar", + "Detection Overlay (D)": "Overlay di rilevamento (D)", + "Detection overlay": "Overlay di rilevamento", + "Detection label density": "DensitĂ  delle etichette di rilevamento", + "Allocation": "Allocazione", + "Detection label allocation": "Allocazione delle etichette di rilevamento", + "Elastic": "Elastica", + "Weighted": "Ponderata", + "Fade": "Dissolvenza", + "Detection fade distance": "Distanza di dissolvenza del rilevamento", + "World-overlay fade distance outside the keyhole as a percentage of its radius": "Distanza di dissolvenza dell'overlay fuori dal foro, come percentuale del suo raggio", + "Outside": "Esterno", + "Detection opacity outside the keyhole": "OpacitĂ  del rilevamento fuori dal foro", + "World-overlay label and card opacity beyond the fade distance": "OpacitĂ  di etichette e schede dell'overlay oltre la distanza di dissolvenza", + "PARAMETERS": "PARAMETRI", + "3D aircraft — flat icons zoomed out, 3D models up close": "Aerei 3D — icone piatte da lontano, modelli 3D da vicino", + "Models": "Modelli", + "3D model coverage": "Copertura dei modelli 3D", + "Proximity": "ProssimitĂ ", + "Scope — the circular viewport mask": "Scope — la maschera circolare della vista", + "Scope": "Scope", + "Feather": "Sfumatura", + "Scope edge feather": "Sfumatura del bordo dello scope", + "Scope edge feather as a percentage of the keyhole radius": "Sfumatura del bordo dello scope, come percentuale del raggio del foro", + "Draw on the world — click vertices, double-click or Enter to finish, Esc to cancel": "Disegna sul mondo: fai clic sui vertici, doppio clic o Enter per finire, Esc per annullare", + "Shape": "Forma", + "Shape to draw": "Forma da disegnare", + "Area": "Area", + "Line": "Linea", + "Pin": "Segnaposto", + "Label (optional)": "Etichetta (opzionale)", + "Label for the drawn shape": "Etichetta della forma disegnata", + "Colour of the drawn shape": "Colore della forma disegnata", + "Primary": "Principale", + "Amber": "Ambra", + "Cyan": "Ciano", + "Green": "Verde", + "Red": "Rosso", + "Clear": "Cancella", + "Remove every mark from the board": "Rimuovi tutti i segni dalla lavagna", + "Show your own GeoJSON, KML, KMZ or GPX files on the globe (or drop them onto it). File bytes stay on this device; overlays can appear in map screenshots shared with voice.": "Mostra sul globo i tuoi file GeoJSON, KML, KMZ o GPX (o trascinali sopra). I dati dei file restano su questo dispositivo; gli overlay possono comparire negli screenshot della mappa condivisi con la voce.", + "Import": "Importa", + "Choose GeoJSON, KML, KMZ or GPX files": "Scegli file GeoJSON, KML, KMZ o GPX", + "Imported files": "File importati", + "Celestial": "Celeste", + "Hide UI chrome": "Nascondi l'interfaccia", + "Clean UI": "UI pulita", + "Bloom / Glow": "Bloom / Bagliore", + "Bloom intensity": "IntensitĂ  del bloom", + "Sharpening": "Nitidezza", + "Sharpen": "Nitidezza", + "Sharpen intensity": "IntensitĂ  della nitidezza", + "EXIT CLEAN VIEW": "ESCI DALLA VISTA PULITA", + "Return UI controls": "Ripristina i controlli UI", + "Initializing photorealistic world...": "Inizializzazione del mondo fotorealistico...", + "DATA LAYERS": "LIVELLI DATI", + "ACQUIRING FRAME": "ACQUISIZIONE FOTOGRAMMA", + "NEAREST": "PIÙ VICINA", + "CCTV camera": "Telecamera CCTV", + "CALIBRATION": "CALIBRAZIONE", + "Drag the camera in the world: rings rotate, arrows move, handles set range/FOV": "Trascina la telecamera nel mondo: gli anelli ruotano, le frecce spostano, i punti di controllo impostano portata/FOV", + "Camera pose — click a value to type": "Posa della telecamera: clic su un valore per digitare", + "Heading (compass °) — click to type": "Direzione (bussola °): clic per digitare", + "Pitch (° up/down) — click to type": "Inclinazione (° su/giĂč): clic per digitare", + "Horizontal FOV (°) — click to type": "FOV orizzontale (°): clic per digitare", + "Range / monitor-plane distance (m) — click to type": "Portata / distanza del piano monitor (m): clic per digitare", + "Mount height above ground (m) — click to type": "Altezza di montaggio dal suolo (m): clic per digitare", + "North offset from catalog position (m) — click to type": "Scostamento a nord dalla posizione a catalogo (m): clic per digitare", + "East offset from catalog position (m) — click to type": "Scostamento a est dalla posizione a catalogo (m): clic per digitare", + "SAVE CAL": "SALVA CAL", + "RESET CAL": "RESET CAL", + "SCENE SUMMARY": "RIEPILOGO SCENA", + "STREET LEVEL": "VISTA STRADALE", + "Turn Street Level on or off": "Attiva o disattiva Vista stradale", + "Show the street-level view full screen (Esc shrinks it)": "Mostra la vista stradale a schermo intero (Esc la riduce)", + "Image fit": "Adattamento immagine", + "FIT": "ADATTA", + "Fit: show the whole photo, with dark bars where its shape differs from the frame": "Adatta: mostra l'intera foto, con bande scure dove la sua forma differisce dal riquadro", + "FILL": "RIEMPI", + "Fill: fill the frame edge to edge, cropping the photo": "Riempi: copri il riquadro da bordo a bordo, ritagliando la foto", + "Close the image and deselect it on the map": "Chiudi l'immagine e deselezionala sulla mappa", + "Close the street-level image": "Chiudi l'immagine a livello stradale", + "Street-level viewer": "Visualizzatore a livello stradale", + "Open this image on the provider's site": "Apri questa immagine sul sito del provider", + "Imagery providers": "Provider di immagini", + "PROVIDERS": "PROVIDER", + "Imagery filters": "Filtri delle immagini", + "IMAGERY": "IMMAGINI", + "Panorama filter": "Filtro panorami", + "ALL": "TUTTE", + "FLAT": "PIATTE", + "SINCE": "DAL", + "SCENES": "SCENE", + "Scene recipe": "Ricetta della scena", + "NEW": "NUOVA", + "CAPTURE SHOT": "CATTURA SCATTO", + "UPDATE SHOT": "AGGIORNA SCATTO", + "START": "AVVIA", + "EXPORT PRESETS": "ESPORTA PRESET", + "IMPORT": "IMPORTA", + "RUN LOG": "LOG ESECUZIONE", + "POWER UP": "ACCENDI", + "GROUND STATION · PROVIDER SETTINGS": "STAZIONE DI TERRA · IMPOSTAZIONI PROVIDER", + "Close key setup": "Chiudi la configurazione delle chiavi", + "Power up the globe": "Accendi il globo", + "The globe already flies keyless. Every key below switches on another real feed — paste one and it's saved into this app's local configuration, then the server restarts itself. Server-side keys stay on this machine; Google Maps and Cesium ion run in the browser and must be provider-restricted. Keys you configured elsewhere are shown but never touched.": "Il globo funziona giĂ  senza chiavi. Ogni chiave qui sotto attiva un altro feed reale: incollane una e verrĂ  salvata nella configurazione locale di questa app, poi il server si riavvia da solo. Le chiavi lato server restano su questa macchina; le chiavi di Google Maps e Cesium ion vengono usate nel browser e richiedono restrizioni configurate presso il provider. Le chiavi configurate altrove vengono mostrate ma mai modificate.", + "SAVE KEYS": "SALVA CHIAVI", + "ESC to close": "ESC per chiudere", + "The Google Maps key buys the photorealistic planet — everything else stacks on top.": "La chiave Google Maps sblocca il pianeta fotorealistico: tutto il resto si aggiunge sopra.", + "NO PLACE LEFT BEHIND": "NESSUN LUOGO ESCLUSO", + "ACTIVE STYLE": "STILE ATTIVO", + "Globe actions": "Azioni del globo", + "Turn off all selected data layers": "Disattiva tutti i livelli dati selezionati", + "Copy share link": "Copia il link di condivisione", + "Toggle straight-down and tilted map views": "Alterna tra vista dall'alto e vista inclinata della mappa", + "Reset map to north up": "Orienta la mappa a nord", + "Reset map bearing to north": "Riporta l'orientamento della mappa a nord", + "Reset camera and return to full globe view": "Ripristina la camera e torna alla vista del globo intero", + "MISSION CONTROL · FIRST LAUNCH": "CONTROLLO MISSIONE · PRIMO AVVIO", + "Choose your first view": "Scegli la tua prima vista", + "LIVE CONTACTS": "CONTATTI LIVE", + "Aircraft, vessels and nearby intelligence": "Aerei, navi e intelligence nelle vicinanze", + "Launches, spacecraft and orbital context": "Lanci, veicoli spaziali e contesto orbitale", + "EXPLORE MANUALLY": "ESPLORA MANUALMENTE", + "Begin with a clean globe": "Inizia con un globo pulito", + "Don't show this again": "Non mostrare piĂč", + "ESC to dismiss": "ESC per chiudere", + "Tip: the GEV MIC button in the dock lets you talk to the map.": "Suggerimento: il pulsante GEV MIC nel dock ti permette di parlare con la mappa.", + "Malformed cyclone snapshot": "Snapshot dei cicloni non valido", + "Cyclone request timed out": "La richiesta dei cicloni Ăš andata in timeout", + "{lower} to {upper}": "da {lower} a {upper}", + "Up to {upper}": "Fino a {upper}", + "From {lower}": "Da {lower}", + "Informational only · not for flight planning": "Solo a scopo informativo · non per la pianificazione del volo", + "Unnamed zone": "Zona senza nome", + "Restricted airspace source unavailable": "Fonte dello spazio aereo regolamentato non disponibile", + "Prohibited (P)": "Zona proibita (P)", + "Restricted (R)": "Zona regolamentata (R)", + "FAA prohibited and restricted special-use airspace only, not the UAS Facility Map or UAS flight restrictions. Informational only — not a substitute for official UAS flight-planning tools (B4UFLY / LAANC).": "Solo zone proibite e regolamentate della FAA (spazio aereo a uso speciale), non la UAS Facility Map nĂ© le restrizioni di volo UAS. Solo a scopo informativo — non sostituisce gli strumenti ufficiali di pianificazione del volo UAS (B4UFLY / LAANC).", + "Prohibited": "Zona proibita", + "Restricted": "Zona regolamentata", + "Prohibited & Restricted Airspace": "Zone proibite e regolamentate" +} diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json new file mode 100644 index 000000000..55630fed5 --- /dev/null +++ b/src/i18n/locales/ja.json @@ -0,0 +1,2872 @@ +{ + "Pick a shape, then click the map.": "ć›łćœąă‚’éžă‚“ă§ă‹ă‚‰ă€ćœ°ć›łă‚’ă‚ŻăƒȘックしどください。", + "Enter to place the pin, Esc to cancel.": "Enteră§ăƒ”ăƒłă‚’é…çœźă€Escă§ă‚­ăƒŁăƒłă‚»ăƒ«ă€‚", + "Click where the pin goes.": "ăƒ”ăƒłă‚’çœźăć Žæ‰€ă‚’ă‚ŻăƒȘックしどください。", + "Click {count} more points.": { + "other": "あべ{count}ç‚čクăƒȘックしどください。" + }, + "Those points are in a line — move one off it to enclose an area.": "ç‚čăŒäž€ç›Žç·šäžŠă«äžŠă‚“ă§ă„ăŸă™ă€‚çŻ„ć›Čをć›Čă‚€ă«ăŻă€ă„ăšă‚Œă‹ăźç‚čă‚’ç·šă‹ă‚‰ć€–ă—ăŠăă ă•ă„ă€‚", + "That line has no length — click somewhere further away.": "ç·šăźé•·ă•ăŒă‚Œăƒ­ă§ă™ă€‚ă‚‚ăŁăšé›ąă‚ŒăŸć Žæ‰€ă‚’ă‚ŻăƒȘックしどください。", + " · {max}-point limit reached": " · 侊限ぼ{max}ç‚čă«é”ă—ăŸă—ăŸ", + "{measure} · double-click or Enter to finish, Backspace undoes, Esc cancels.{full}": "{measure} · ăƒ€ăƒ–ăƒ«ă‚ŻăƒȘăƒƒă‚ŻăŸăŸăŻEnterで漌äș†ă€Backspaceă§ć…ƒă«æˆ»ă™ă€Escă§ă‚­ăƒŁăƒłă‚»ăƒ«ă€‚{full}", + "drawings on the map": "ćœ°ć›łäžŠăźæç”»", + "That shape already has {count} points — finish it or press Backspace.": "ă“ăźć›łćœąăŻă™ă§ă«{count}ç‚čă‚ă‚ŠăŸă™ă€‚ćźŒäș†ă™ă‚‹ă‹ă€Backspaceă‚’æŠŒă—ăŠăă ă•ă„ă€‚", + "That point is off the globe — click on the world.": "そぼç‚čăŻćœ°çƒăźć€–ă§ă™ă€‚ćœ°èĄšă‚’ă‚ŻăƒȘックしどください。", + "That shape could not be placed.": "ć›łćœąă‚’é…çœźă§ăăŸă›ă‚“ă§ă—ăŸă€‚", + "Could not place the shape: {error}": "ć›łćœąă‚’é…çœźă§ăăŸă›ă‚“ă§ă—ăŸïŒš{error}", + "Board cleared.": "ăƒœăƒŒăƒ‰ă‚’æ¶ˆćŽ»ă—ăŸă—ăŸă€‚", + "{owner} is using the pointer — close it first.": "{owner}ăŒăƒă‚€ăƒłă‚żăƒŒă‚’äœżç”šäž­ă§ă™ă€‚ć…ˆă«é–‰ă˜ăŠăă ă•ă„ă€‚", + "{label} · Detailed outline unavailable": "{label} · è©łçŽ°ăȘèŒȘéƒ­ă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "Flying to Austin, TX...": "ăƒ†ă‚­ă‚”ă‚čć·žă‚ȘăƒŒă‚čăƒ†ă‚Łăƒłăžç§»ć‹•äž­â€Š", + "Restoring shared view...": "ć…±æœ‰ăƒ“ăƒ„ăƒŒă‚’ćŸ©ć…ƒäž­â€Š", + "Configuring viewer...": "ăƒ“ăƒ„ăƒŒă‚ąăƒŒă‚’èš­ćźšäž­â€Š", + "Loading Google 3D Tiles...": "Google 3D TilesをèȘ­ăżèŸŒăżäž­â€Š", + "Loading the keyless globe...": "ă‚­ăƒŒäžèŠăźćœ°çƒć„€ă‚’èȘ­ăżèŸŒăżäž­â€Š", + "Google 3D Tiles unavailable ({detail}). Loading the keyless globe...": "Google 3D Tilesă‚’ćˆ©ç”šă§ăăŸă›ă‚“ïŒˆ{detail}ïŒ‰ă€‚ă‚­ăƒŒäžèŠăźćœ°çƒć„€ă‚’èȘ­ăżèŸŒăżäž­â€Š", + "Initializing systems...": "ă‚·ă‚čăƒ†ăƒ ă‚’ćˆæœŸćŒ–äž­â€Š", + "Space Missions isolates replay data. Exit the mode to enable {layer}.": "ćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒłăŻăƒȘăƒ—ăƒŹă‚€ăƒ‡ăƒŒă‚żă‚’ćˆ†é›ąă—ăŠă„ăŸă™ă€‚{layer}ă‚’æœ‰ćŠčă«ă™ă‚‹ă«ăŻă€ă“ăźăƒąăƒŒăƒ‰ă‚’ç”‚äș†ă—ăŠăă ă•ă„ă€‚", + "Data attribution": "ăƒ‡ăƒŒă‚żăźć‡ș慾", + "Data provided by:": "ăƒ‡ăƒŒă‚żæäŸ›ïŒš", + "Close data attribution": "ăƒ‡ăƒŒă‚żć‡ș慾を閉じる", + "Light aircraft": "è»œéŁ›èĄŒæ©Ÿ", + "Glider": "ă‚°ăƒ©ă‚€ăƒ€ăƒŒ", + "Turboprop": "ă‚żăƒŒăƒœăƒ—ăƒ­ăƒƒăƒ—æ©Ÿ", + "Airliner": "æ—…ćźąæ©Ÿ", + "Widebody": "ăƒŻă‚€ăƒ‰ăƒœăƒ‡ă‚Łæ©Ÿ", + "Four-engine jet": "4ç™șă‚žă‚§ăƒƒăƒˆæ©Ÿ", + "Helicopter": "ヘăƒȘă‚łăƒ—ă‚żăƒŒ", + "Fast jet": "é«˜é€Ÿă‚žă‚§ăƒƒăƒˆæ©Ÿ", + "Business jet": "ビゾネă‚čゾェット", + "Drone": "ăƒ‰ăƒ­ăƒŒăƒł", + "General emergency": "緊怄äș‹æ…‹", + "Unlawful interference": "äžæł•ćŠšćźł", + "Radio failure": "é€šäżĄæ©Ÿæ•…éšœ", + "Downed aircraft": "ćąœèœæ©Ÿ", + "Minimum fuel": "ăƒŸăƒ‹ăƒžăƒ ăƒ•ăƒ„ăƒŒă‚šăƒ«", + "Lifeguard (medical priority)": "æ•‘æ€„éŁ›èĄŒïŒˆćŒ»ç™‚ć„Șć…ˆïŒ‰", + "Rasuwagadhi witness video": "Rasuwagadhiăźç›źæ’ƒæ˜ ćƒ", + "Bhote Koshi valley footage": "Bhote Koshiæž“è°·ăźæ˜ ćƒ", + "Flood footage": "æŽȘæ°Žăźæ˜ ćƒ", + "Compilation and casualty claims": "æ˜ ćƒăŸăšă‚ăšæ­»ć‚·è€…ă«é–ąă™ă‚‹äž»ćŒ”", + "SOURCE GEOCONFIRMED · WORLD-PINNED": "ă‚œăƒŒă‚čäœçœźçąșèȘæžˆăż · ćœ°ć›łă«ć›ș漚", + "SOURCE CREDITED · LOCATION UNRESOLVED": "ă‚œăƒŒă‚č明蚘 · äœçœźæœȘç‰č漚", + "REFERENCE ONLY · CLAIMS UNVERIFIED": "ć‚è€ƒæƒ…ć ±ăźăż · äž»ćŒ”ăŻæœȘ怜蚌", + "SOURCE GEOCONFIRMED": "ă‚œăƒŒă‚čäœçœźçąșèȘæžˆăż", + "2021 historical reference versus 2026 post-event imagery; changes are cumulative and include the July 2025 Rasuwagadhi flood. Schematic downstream progression, not modeled arrival time; not an official hazard model.": "2021ćčŽăźéŽćŽ»ć‚ç…§ç”»ćƒăš2026ćčŽăźç™șç”ŸćŸŒç”»ćƒăźæŻ”èŒƒă§ă™ă€‚ć€‰ćŒ–ăŻçŽŻç©çš„ă§ă€2025ćčŽ7æœˆăźRasuwagadhiæŽȘæ°Žă‚’ć«ăżăŸă™ă€‚äž‹æ”ăžăźé€ČèĄŒăŻæšĄćŒć›łă§ă‚ă‚Šă€ćˆ°é”æ™‚ćˆ»ăźăƒąăƒ‡ăƒ«èšˆçź—ă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ć…ŹćŒăźăƒă‚¶ăƒŒăƒ‰ăƒąăƒ‡ăƒ«ă§ă‚‚ă‚ă‚ŠăŸă›ă‚“ă€‚", + "Immediate collapse viewpoint": "ćŽ©ćŁŠćœ°ç‚čç›Žèż‘ăźèŠ–ç‚č", + "Collapse viewpoint": "ćŽ©ćŁŠćœ°ç‚čăźèŠ–ç‚č", + "Debris-dammed lake": "期砂ダムæč–", + "Dammed lake": "期砂ダムæč–", + "Second landslide": "珏2ぼ朰すăčり", + "Gyirong border gate": "Gyirongć›œćąƒă‚ČăƒŒăƒˆ", + "Border gate": "ć›œćąƒă‚ČăƒŒăƒˆ", + "Timure evidence cluster": "TimureăźèšŒæ‹ çŸ€", + "Mailung / Upper Trishuli bridge": "Mailung / Upper Trishuli橋", + "Dandagaun viewpoint restaurant": "Dandagaunć±•æœ›ăƒŹă‚čトラン", + "Dandagaun viewpoint": "Dandagaunć±•æœ›ćœ°ç‚č", + "Bidur - Trishuli bridge": "Bidur - Trishuli橋", + "Bidur bridge": "Bidur橋", + "Devighat / Taadi Khola Bridge": "Devighat / Taadi Khola橋", + "Devighat bridge": "Devighat橋", + "Facebook player API did not initialize.": "Facebookăƒ—ăƒŹăƒŒăƒ€ăƒŒAPIăŒćˆæœŸćŒ–ă•ă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚", + "Facebook player API could not load.": "Facebookăƒ—ăƒŹăƒŒăƒ€ăƒŒAPIをèȘ­ăżèŸŒă‚ăŸă›ă‚“ă§ă—ăŸă€‚", + "Facebook player API timed out.": "Facebookăƒ—ăƒŹăƒŒăƒ€ăƒŒAPIăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸă€‚", + "X embed API did not initialize.": "XćŸ‹ă‚èŸŒăżAPIăŒćˆæœŸćŒ–ă•ă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚", + "X embed could not load.": "XćŸ‹ă‚èŸŒăżă‚’èȘ­ăżèŸŒă‚ăŸă›ă‚“ă§ă—ăŸă€‚", + "X embed timed out.": "XćŸ‹ă‚èŸŒăżăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸă€‚", + "UNAVAILABLE": "ćˆ©ç”šäžćŻ", + "TIMEOUT": "ă‚żă‚€ăƒ ă‚ąă‚Šăƒˆ", + "BLOCKED": "ブロック", + "SOURCE": "ă‚œăƒŒă‚č", + "Facebook embed unavailable. The post may be private, removed, region-restricted, or blocked.": "FacebookăźćŸ‹ă‚èŸŒăżă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚æŠ•çšżăŒéžć…Źé–‹ă€ć‰Šé™€æžˆăżă€ćœ°ćŸŸćˆ¶é™äž­ă€ăŸăŸăŻăƒ–ăƒ­ăƒƒă‚Żă•ă‚ŒăŠă„ă‚‹ćŻèƒœæ€§ăŒă‚ă‚ŠăŸă™ă€‚", + "Preloading {provider} media": "{provider}ぼメディケをäș‹ć‰èȘ­ăżèŸŒăżäž­", + "LOADING X POST
": "XăźæŠ•çšżă‚’èȘ­ăżèŸŒăżäž­â€Š", + "The X post is unavailable or cannot be embedded.": "こぼXăźæŠ•çšżăŻćˆ©ç”šă§ăăȘă„ă‹ă€ćŸ‹ă‚èŸŒăżă§ăăŸă›ă‚“ă€‚", + "X POST · PROVIDER CONTROLS": "XăźæŠ•çšż · æäŸ›ć…ƒă§æ“äœœ", + "{reason} OPEN ORIGINAL.": "{reason}ć…ƒăźæŠ•çšżă‚’é–‹ă„ăŠăă ă•ă„ă€‚", + "X embed unavailable": "XăźćŸ‹ă‚èŸŒăżă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚", + "FACEBOOK · PROVIDER CONTROLS": "Facebook · æäŸ›ć…ƒă§æ“äœœ", + "Facebook embed unavailable": "FacebookăźćŸ‹ă‚èŸŒăżă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚", + "AUTOPLAY BLOCKED · USE PROVIDER CONTROLS": "è‡Ș拕憍生ブロック · æäŸ›ć…ƒă§æ“äœœ", + "Embedded {provider} media for {source}": "{source}ăźćŸ‹ă‚èŸŒăż{provider}メディケ", + "witness source": "ç›źæ’ƒă‚œăƒŒă‚č", + "Witness source": "ç›źæ’ƒă‚œăƒŒă‚č", + "{provider} · EMBEDDED SOURCE": "{provider} · ćŸ‹ă‚èŸŒăżă‚œăƒŒă‚č", + "OPEN ORIGINAL ↗": "ć…ƒăźæŠ•çšżă‚’é–‹ă ↗", + "{provider} media: {source}": "{provider}ăƒĄăƒ‡ă‚Łă‚ąïŒš{source}", + "{provider} · PROVIDER CONTROLS": "{provider} · æäŸ›ć…ƒă§æ“äœœ", + "YOUTUBE {state} · OPEN ORIGINAL": "YouTube {state} · ć…ƒăźæŠ•çšżă‚’é–‹ă", + "INITIATION": "ç™ș生", + "DAMMING": "ă›ăæ­ąă‚", + "SECONDARY FAILURE": "äșŒæŹĄćŽ©ćŁŠ", + "BORDER ARRIVAL": "ć›œćąƒćˆ°é”", + "PROPAGATION": "䌝播", + "DOWNSTREAM PASSAGE": "䞋攁通過", + "CONSEQUENCE": "ćœ±éŸż", + "DOWNSTREAM CONSEQUENCE": "äž‹æ”ăžăźćœ±éŸż", + "EVIDENCE": "蚌拠", + "{year} HISTORICAL REFERENCE": "{year}ćčŽ éŽćŽ»ć‚ç…§", + "{year} POST-EVENT": "{year}ćčŽ ç™șç”ŸćŸŒ", + "{count} GEOLOCATED SOURCE-MAP PLACEMENTS": { + "other": "ă‚œăƒŒă‚čăƒžăƒƒăƒ—äžŠăźäœçœźç‰č漚 {count}ä»¶" + }, + "NO PREVIEW": "ăƒ—ăƒŹăƒ“ăƒ„ăƒŒăȘし", + "YouTube source": "YouTubeă‚œăƒŒă‚č", + "Facebook source": "Facebookă‚œăƒŒă‚č", + "SOURCE LINK": "ă‚œăƒŒă‚čăƒȘンク", + "{publisher} / OPEN": "{publisher} / 開く", + "Bhote Koshi flood reconstruction controls": "Bhote KoshiæŽȘæ°Žć†çŸăźæ“äœœ", + "EVENT RECONSTRUCTION · 26 AUG 2026": "ă‚€ăƒ™ăƒłăƒˆć†çŸ · 2026ćčŽ8月26æ—„", + "BHOTE KOSHI OUTBURST FLOOD": "BHOTE KOSHIæ±ș棊æŽȘæ°Ž", + "Close event layer": "ă‚€ăƒ™ăƒłăƒˆăƒŹă‚€ăƒ€ăƒŒă‚’é–‰ă˜ă‚‹", + "OBSERVED IMAGERY": "èŠłæžŹç”»ćƒ", + "SCHEMATIC CORRIDOR": "æšĄćŒçš„ăȘæ”è·Ż", + "2021 HISTORICAL REFERENCE / 2026 POST-EVENT": "2021ćčŽ éŽćŽ»ć‚ç…§ / 2026ćčŽ ç™șç”ŸćŸŒ", + "Historical reference and post-event image split": "éŽćŽ»ć‚ç…§ç”»ćƒăšç™șç”ŸćŸŒç”»ćƒăźćˆ†ć‰ČèĄšç€ș", + "RECONSTRUCTION CLOCK": "ć†çŸă‚Żăƒ­ăƒƒă‚Ż", + "Schematic downstream progression": "äž‹æ”ăžăźé€ČèĄŒïŒˆæšĄćŒïŒ‰", + "Story beat navigation": "ă‚čăƒˆăƒŒăƒȘăƒŒćŒș戇りぼナビă‚ČăƒŒă‚·ăƒ§ăƒł", + "Previous story beat": "才ぼă‚čăƒˆăƒŒăƒȘăƒŒćŒș戇り", + "CAUSE": "掟曠", + "CAPTURE TIME UNVERIFIED": "æ’źćœ±æ™‚ćˆ»æœȘ怜蚌", + "Next story beat": "æŹĄăźă‚čăƒˆăƒŒăƒȘăƒŒćŒș戇り", + "▶ PLAY": "▶ 憍生", + "Play the next shot and continue through this scene": "æŹĄăźă‚·ăƒ§ăƒƒăƒˆă‚’ć†ç”Ÿă—ă€ă“ăźă‚·ăƒŒăƒłă‚’æœ€ćŸŒăŸă§ç¶šă‘ăŸă™", + "▶ PLAY SCENE": "▶ ă‚·ăƒŒăƒłć†ç”Ÿ", + "◉ CINEMATIC": "◉ ă‚·ăƒăƒžăƒ†ă‚Łăƒƒă‚Ż", + "â†ș FULL STORY": "â†ș 慹ă‚čăƒˆăƒŒăƒȘăƒŒ", + "↗ OPEN ORIGINAL": "↗ ć…ƒăźæŠ•çšżă‚’é–‹ă", + "⌖ LOWER GORGE": "⌖ äž‹æ”ćłĄè°·", + "FIELD REPORTS · {count}": "çŸćœ°ć ±ć‘Š · {count}", + "GEOLOCATIONS · {credit}": "äœçœźç‰č漚 · {credit}", + "↗ OPEN PUBLIC MAP": "↗ 慬開マップを開く", + " Clouds are preserved from the source imagery.": "é›ČăŻć…ƒç”»ćƒăźăŸăŸæź‹ă—ăŠă„ăŸă™ă€‚", + "Rasuwagadhi witness": "Rasuwagadhiăźç›źæ’ƒè€…", + "Open original source for {source}; capture time unverified": "{source}ăźć…ƒă‚œăƒŒă‚čă‚’é–‹ăïŒˆæ’źćœ±æ™‚ćˆ»æœȘ怜蚌", + "Historical reference and post-event image divider": "éŽćŽ»ć‚ç…§ç”»ćƒăšç™șç”ŸćŸŒç”»ćƒăźćąƒç•Œç·š", + "A historical reference {before} percent, B post-event {after} percent": "AïŒˆéŽćŽ»ć‚ç…§ïŒ‰{before}%、Bç™șç”ŸćŸŒïŒ‰{after}%", + "■ RELEASE CAMERA": "■ ă‚«ăƒĄăƒ©ă‚’è§Łæ”Ÿ", + "Seek Nepal scene clock": "ăƒăƒ‘ăƒŒăƒ«ăźă‚·ăƒŒăƒłă‚Żăƒ­ăƒƒă‚Żă‚’ă‚·ăƒŒă‚Ż", + "NEPAL SCENE CLOCK": "ăƒăƒ‘ăƒŒăƒ« ă‚·ăƒŒăƒłă‚Żăƒ­ăƒƒă‚Ż", + "
 PLAYING SHOT": "
 ă‚·ăƒ§ăƒƒăƒˆć†ç”Ÿäž­", + "▶ PLAY SHOT": "▶ ă‚·ăƒ§ăƒƒăƒˆć†ç”Ÿ", + "Ⅱ PAUSE": "Ⅱ äž€æ™‚ćœæ­ą", + "â†ș REPLAY CINEMATIC": "â†ș ă‚·ăƒăƒžăƒ†ă‚Łăƒƒă‚Żă‚’ć†ç”Ÿ", + "â†ș REPLAY": "â†ș ăƒȘăƒ—ăƒŹă‚€", + "
 PLAYING SCENE": "
 ă‚·ăƒŒăƒłć†ç”Ÿäž­", + "Continue {scene} from next shot": "æŹĄăźă‚·ăƒ§ăƒƒăƒˆă‹ă‚‰{scene}ă‚’ç¶šèĄŒ", + "current scene": "çŸćœšăźă‚·ăƒŒăƒł", + "Replay the full reconstruction": "ć†çŸć…šäœ“ă‚’ăƒȘăƒ—ăƒŹă‚€", + "SCENE SHOT": "ă‚·ăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆ", + "TIME UNVERIFIED": "æ’źćœ±æ™‚ćˆ»æœȘ怜蚌", + "{count} SOURCES": { + "other": "ă‚œăƒŒă‚č {count}ä»¶" + }, + "OUTSIDE IMAGERY SWIPE": "ç”»ćƒæŻ”èŒƒăźçŻ„ć›Č怖", + "{scene} / AUTHORED SHOT": "{scene} / äœœæˆæžˆăżă‚·ăƒ§ăƒƒăƒˆ", + "NEPAL FLOOD INCIDENT": "ăƒăƒ‘ăƒŒăƒ«æŽȘæ°Žă‚€ăƒłă‚·ăƒ‡ăƒłăƒˆ", + "Play {shot}": "{shot}を憍生", + "current scene shot": "çŸćœšăźă‚·ăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆ", + "Play reconstruction": "ć†çŸă‚’ć†ç”Ÿ", + "Load previous scene shot": "ć‰ăźă‚·ăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆă‚’èȘ­ăżèŸŒă‚€", + "Load next scene shot": "æŹĄăźă‚·ăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆă‚’èȘ­ăżèŸŒă‚€", + "SCHEMATIC CORRIDOR, NOT MODELED ARRIVAL TIME.": "æšĄćŒçš„ăȘæ”è·Żă§ă‚ă‚Šă€ćˆ°é”æ™‚ćˆ»ăźăƒąăƒ‡ăƒ«èšˆçź—ă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚", + "Rasuwa · 26 Aug 2026": "Rasuwa · 2026ćčŽ8月26æ—„", + "Event reconstruction": "ă‚€ăƒ™ăƒłăƒˆć†çŸ", + "BHOTE KOSHI FLOOD INCIDENT": "BHOTE KOSHIæŽȘæ°Žă‚€ăƒłă‚·ăƒ‡ăƒłăƒˆ", + "NEPAL · 26 AUG 2026": "ăƒăƒ‘ăƒŒăƒ« · 2026ćčŽ8月26æ—„", + "USGS INITIAL REPORT": "USGSćˆæœŸć ±ć‘Š", + "26 AUG 2026 · 08:37 NPT": "2026ćčŽ8月26æ—„ · 08:37 NPT", + "28.2710° N · 85.5150° E": "ćŒ—ç·Ż28.2710° · 東甌85.5150°", + "INITIAL M4.4 · RECLASSIFIED M5.2 LANDSLIDE": "ćˆæœŸ M4.4 · M5.2ぼ朰すăčă‚Šă«ć†ćˆ†éĄž", + "USGS EVENT us7000tbwb · OPEN SOURCE": "USGSă‚€ăƒ™ăƒłăƒˆ us7000tbwb · ă‚œăƒŒă‚čを開く", + "Open the USGS initial report for the 26 August 2026 Nepal landslide": "2026ćčŽ8月26æ—„ăźăƒăƒ‘ăƒŒăƒ«ćœ°ă™ăčりに閹するUSGSćˆæœŸć ±ć‘Šă‚’é–‹ă", + "Show the Nepal context callout without a border or country fill": "ć›œćąƒç·šă‚„ć›œăźćĄ—ă‚Šă€ă¶ă—ăȘă—ă§ă€ăƒăƒ‘ăƒŒăƒ«ăźèȘŹæ˜Žăƒ©ăƒ™ăƒ«ă‚’èĄšç€ș", + "Introduce Nepal, draw its border, then reveal the Bhote Koshi incident": "ăƒăƒ‘ăƒŒăƒ«ă‚’çŽčä»‹ă—ăŠć›œćąƒă‚’æăă€Bhote Koshiăźă‚€ăƒłă‚·ăƒ‡ăƒłăƒˆă‚’èĄšç€ș", + "CITIES": "éƒœćž‚", + "Keep the regional incident context and introduce nearby city labels": "ćœ°ćŸŸăźă‚€ăƒłă‚·ăƒ‡ăƒłăƒˆæƒ…ć ±ă‚’æź‹ă—ăŸăŸăŸă€ć‘šèŸșéƒœćž‚ăźăƒ©ăƒ™ăƒ«ă‚’èĄšç€ș", + "PLACES": "㜰ç‚č", + "Introduce the reconstruction scene key places from trigger to downstream": "ć†çŸă‚·ăƒŒăƒłăźäž»èŠćœ°ç‚čを、ç™ș生朰ç‚čă‹ă‚‰äž‹æ”ăŸă§é †ă«çŽč介", + "PATH": "ç”Œè·Ż", + "Animate the sourced cyan river-centerline route to Trishuli Bazaar": "ć‡ș慞にćŸșă„ăă‚·ă‚ąăƒłăźæČłé“äž­ćżƒç·šă‚’Trishuli BazaarăŸă§ă‚ąăƒ‹ăƒĄăƒŒă‚·ăƒ§ăƒłèĄšç€ș", + "OVERVIEW": "æŠ‚èŠł", + "Keep the completed flood path and location labels visible": "ćźŒæˆă—ăŸæŽȘæ°Žç”Œè·Żăšćœ°ç‚čăƒ©ăƒ™ăƒ«ă‚’èĄšç€șă—ăŸăŸăŸă«ă™ă‚‹", + "RECORD": "蚘éŒČ", + "Reveal the trigger record while making a slow camera approach": "ă‚«ăƒĄăƒ©ă‚’ă‚†ăŁăă‚Šèż‘ă„ă‘ăȘがら、ç™ș生蚘éŒČă‚’èĄšç€ș", + "{speed} kn": "{speed} kn", + "That file is not valid JSON.": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ăŻæœ‰ćŠčăȘJSONă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚", + "That JSON file is not GeoJSON.": "こぼJSONăƒ•ă‚Ąă‚€ăƒ«ăŻGeoJSONă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚", + "That FeatureCollection has no features list.": "こぼFeatureCollectionにはfeaturesăƒȘă‚čăƒˆăŒă‚ă‚ŠăŸă›ă‚“ă€‚", + "Every GeoJSON feature must have type Feature.": "GeoJSONぼすăčăŠăźăƒ•ă‚ŁăƒŒăƒăƒŁăƒŒăŻtypeがFeatureă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚", + "That GeoJSON has invalid geometries.": "こぼGeoJSONには焥ćŠčăȘゾă‚ȘュトăƒȘăŒă‚ă‚ŠăŸă™ă€‚", + "That GeoJSON contains an unsupported geometry.": "こぼGeoJSONă«ăŻćŻŸćżœă—ăŠă„ăȘいゾă‚ȘュトăƒȘăŒć«ăŸă‚ŒăŠă„ăŸă™ă€‚", + "That GeoJSON has invalid coordinates.": "こぼGeoJSONには焥ćŠčăȘćș§æš™ăŒă‚ă‚ŠăŸă™ă€‚", + "That file creates more than {limit} map objects (the limit).": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ă‹ă‚‰äœœæˆă•ă‚Œă‚‹ćœ°ć›łă‚Șブゾェクトが侊限ぼ{limit}ć€‹ă‚’è¶…ăˆăŠă„ăŸă™ă€‚", + "That file has more than {limit} style definitions and image links after cleanup (the limit).": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ăŻă€ă‚ŻăƒȘăƒŒăƒłă‚ąăƒƒăƒ—ćŸŒă‚‚ă‚čă‚żă‚€ăƒ«ćźšçŸ©ăšç”»ćƒăƒȘンクが侊限ぼ{limit}ć€‹ă‚’è¶…ăˆăŠă„ăŸă™ă€‚", + "That file has more than {limit} features (the limit).": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ăźăƒ•ă‚ŁăƒŒăƒăƒŁăƒŒăŒäžŠé™ăź{limit}ć€‹ă‚’è¶…ăˆăŠă„ăŸă™ă€‚", + "That file has more than {limit} points (the limit) across {features} features.": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ăźç‚čが侊限ぼ{limit}ć€‹ă‚’è¶…ăˆăŠă„ăŸă™ïŒˆăƒ•ă‚ŁăƒŒăƒăƒŁăƒŒæ•°ïŒš{features}ïŒ‰ă€‚", + "That file has more than {limit} points (the limit).": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ăźç‚čが侊限ぼ{limit}ć€‹ă‚’è¶…ăˆăŠă„ăŸă™ă€‚", + "That KMZ unpacks to more than the import limit.": "こぼKMZăŻć±•é–‹ă™ă‚‹ăšă‚€ăƒłăƒăƒŒăƒˆäžŠé™ă‚’è¶…ăˆăŸă™ă€‚", + "That KMZ is damaged and could not be unpacked.": "こぼKMZăŻç Žæă—ăŠă„ă‚‹ăŸă‚ă€ć±•é–‹ă§ăăŸă›ă‚“ă§ă—ăŸă€‚", + "That KMZ is not a readable zip archive.": "こぼKMZはèȘ­ăżć–ă‚ŠćŻèƒœăȘzipă‚ąăƒŒă‚«ă‚€ăƒ–ă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚", + "That KMZ uses a zip format this import does not read.": "こぼKMZăŻă€ă“ăźă‚€ăƒłăƒăƒŒăƒˆă§èȘ­ăżć–ă‚ŒăȘいzipćœąćŒă‚’äœżç”šă—ăŠă„ăŸă™ă€‚", + "That KMZ is encrypted.": "こぼKMZăŻæš—ć·ćŒ–ă•ă‚ŒăŠă„ăŸă™ă€‚", + "That KMZ uses a compression method this import does not read.": "こぼKMZăŻă€ă“ăźă‚€ăƒłăƒăƒŒăƒˆă§èȘ­ăżć–ă‚ŒăȘい朧羼æ–čćŒă‚’äœżç”šă—ăŠă„ăŸă™ă€‚", + "That KML has invalid geometry bounds.": "こぼKMLぼゾă‚ȘュトăƒȘ範ć›Čが無ćŠčです。", + "That KML has invalid coordinates.": "こぼKMLには焥ćŠčăȘćș§æš™ăŒă‚ă‚ŠăŸă™ă€‚", + "That GPX file has no document.": "こぼGPXăƒ•ă‚Ąă‚€ăƒ«ă«ăŻăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆăŒă‚ă‚ŠăŸă›ă‚“ă€‚", + "That {format} file is not valid XML.": "こぼ{format}ăƒ•ă‚Ąă‚€ăƒ«ăŻæœ‰ćŠčăȘXMLă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚", + "That file has an unreadable image or exceeds the 16-megapixel image limit.": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ă«ăŻèȘ­ăżć–ă‚ŒăȘă„ç”»ćƒăŒă‚ă‚‹ă‹ă€ç”»ćƒăŒ1,600äž‡ç”»çŽ ăźäžŠé™ă‚’è¶…ăˆăŠă„ăŸă™ă€‚", + "That KML could not be read.": "こぼKMLをèȘ­ăżć–ă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚", + "That file has invalid point coordinates.": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ă«ăŻç„ĄćŠčăȘç‚čćș§æš™ăŒă‚ă‚ŠăŸă™ă€‚", + "Ground heights are not available for that file. Try again when the map has loaded.": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ăźćœ°èĄšé«˜ă‚’ć–ćŸ—ă§ăăŸă›ă‚“ă€‚ćœ°ć›łăźèȘ­ăżèŸŒăżćŸŒă«ă‚‚う䞀ćșŠăŠè©Šă—ăă ă•ă„ă€‚", + "That file took too long to read.": "ăƒ•ă‚Ąă‚€ăƒ«ăźèȘ­ăżć–ă‚Šă«æ™‚é–“ăŒă‹ă‹ă‚Šă™ăŽăŸă—ăŸă€‚", + "Nothing to import.": "ă‚€ăƒłăƒăƒŒăƒˆă™ă‚‹ă‚‚ăźăŒă‚ă‚ŠăŸă›ă‚“ă€‚", + "That file is larger than {size} MiB.": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ăŻ{size} MiBă‚’è¶…ăˆăŠă„ăŸă™ă€‚", + "Only GeoJSON, KML, KMZ and GPX files can be imported.": "ă‚€ăƒłăƒăƒŒăƒˆă§ăă‚‹ăźăŻGeoJSON、KML、KMZ、GPXăƒ•ă‚Ąă‚€ăƒ«ăźăżă§ă™ă€‚", + "That file has nothing to draw.": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ă«ăŻæç”»ă§ăă‚‹ć†…ćźčăŒă‚ă‚ŠăŸă›ă‚“ă€‚", + "That KMZ holds no KML document.": "こぼKMZにはKMLăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆăŒć«ăŸă‚ŒăŠă„ăŸă›ă‚“ă€‚", + "That {format} file could not be read.": "こぼ{format}ăƒ•ă‚Ąă‚€ăƒ«ă‚’èȘ­ăżć–ă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚", + "That file has {count} map objects; the limit is {limit}.": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ăźćœ°ć›łă‚Șブゾェクトは{count}怋です。侊限は{limit}怋です。", + "Ground heights could not be read. Try that file again.": "ćœ°èĄšé«˜ă‚’èȘ­ăżć–ă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚ă‚‚ă†äž€ćșŠă“ăźăƒ•ă‚Ąă‚€ăƒ«ă‚’ăŠè©Šă—ăă ă•ă„ă€‚", + "That file has invalid point graphics.": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ă«ăŻç„ĄćŠčăȘăƒă‚€ăƒłăƒˆă‚°ăƒ©ăƒ•ă‚Łăƒƒă‚ŻăŒă‚ă‚ŠăŸă™ă€‚", + "Overpass rate-limited": "OverpassăŒăƒŹăƒŒăƒˆćˆ¶é™äž­", + "Overpass timed out": "OverpassăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸ", + "Overpass could not complete the query": "OverpassがクスăƒȘを漌äș†ă§ăăŸă›ă‚“ă§ă—ăŸ", + "Map tiles temporarily unavailable": "ćœ°ć›łă‚żă‚€ăƒ«ăŒäž€æ™‚çš„ă«ćˆ©ç”šă§ăăŸă›ă‚“", + "Mapped names temporarily unavailable": "æ–œèš­ćă‚’äž€æ™‚çš„ă«ć–ćŸ—ă§ăăŸă›ă‚“", + "Overpass temporarily unavailable": "OverpassăŒäž€æ™‚çš„ă«ćˆ©ç”šă§ăăŸă›ă‚“", + "Retrying mapped sites
": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­ă‚’ć†è©ŠèĄŒäž­â€Š", + "Fetching mapped sites
": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­ă‚’ć–ćŸ—äž­â€Š", + "{reason} — retrying in {seconds}s": "{reason}{seconds}ç§’ćŸŒă«ć†è©ŠèĄŒ", + "{reason} — retry pending": "{reason}ïŒšć†è©ŠèĄŒćŸ…ăĄ", + "Zoom in to search mapped installations": "ă‚șăƒŒăƒ ă‚€ăƒłă—ăŠă€ăƒžăƒƒăƒ—æžˆăżæ–œèš­ă‚’æ€œçŽąă—ăŠăă ă•ă„", + "Showing cached mapped sites": "ă‚­ăƒŁăƒƒă‚·ăƒ„ăźăƒžăƒƒăƒ—æžˆăżæ–œèš­ă‚’èĄšç€șäž­", + "Mapped sites not loaded": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­ăŻæœȘèȘ­èŸŒă§ă™", + "Mapped sites loaded": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­ă‚’èȘ­ăżèŸŒăżăŸă—ăŸ", + "Military airfield": "è»ç”šéŁ›èĄŒć Ž", + "Naval base": "攷軍ćŸș㜰", + "Firing range": "ć°„æ’ƒć Ž", + "Military land": "è»ç”šćœ°", + "Mapped installation": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­", + "Military area": "軍äș‹ćŒș㟟", + "flight": "ăƒ•ăƒ©ă‚€ăƒˆ", + "military flight": "軍甚機", + "satellite": "èĄ›æ˜Ÿ", + "feed unavailable": "ăƒ•ă‚ŁăƒŒăƒ‰ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "feed stale": "ăƒ•ă‚ŁăƒŒăƒ‰æ›Žæ–°é…ć»¶", + "observed or mapped nearby context": "èŠłæžŹăŸăŸăŻăƒžăƒƒăƒ—æžˆăżăźć‘šèŸșコンテキă‚čト", + "no observed or mapped objects in current feeds": "çŸćœšăźăƒ•ă‚ŁăƒŒăƒ‰ă«èŠłæžŹăŸăŸăŻăƒžăƒƒăƒ—æžˆăżăźćŻŸè±ĄăȘし", + "Draw": "描画", + "Directions": "ăƒ«ăƒŒăƒˆæĄˆć†…", + "Recent imagery": "æœ€èż‘ăźèĄ›æ˜Ÿç”»ćƒ", + "STATION": "漇漙ă‚čăƒ†ăƒŒă‚·ăƒ§ăƒł", + "Crewed stations and their visiting vehicles": "有äșș漇漙ă‚čăƒ†ăƒŒă‚·ăƒ§ăƒłăšă€ăă“ă‚’èšȘă‚Œă‚‹ćź‡ćź™æ©Ÿ", + "NAV": "æžŹäœ", + "GNSS navigation — GPS, GLONASS, Galileo": "GNSSæžŹäœïŒˆGPS、GLONASS、Galileo", + "GEO": "GEO", + "Geostationary belt — comms and weather, fixed over the equator": "é™æ­ąè»Œé“ćžŻïŒšé€šäżĄăšæ°—è±Ąă€è”€é“äžŠç©șにć›ș漚", + "VISUAL": "ćŻèŠ–", + "Brightest naked-eye objects — CelesTrak visual group": "è‚‰çœŒă§èŠ‹ăˆă‚‹ç‰čă«æ˜Žă‚‹ă„èĄ›æ˜ŸïŒˆCelesTrak visuală‚°ăƒ«ăƒŒăƒ—ïŒ‰", + "COMMS": "通信", + "Broadband constellation shell — shown only in DENSE mode": "ăƒ–ăƒ­ăƒŒăƒ‰ăƒăƒłăƒ‰ă‚łăƒłă‚čăƒ†ăƒŹăƒŒă‚·ăƒ§ăƒłăźă‚·ă‚§ăƒ«ïŒšé«˜ćŻ†ćșŠăƒąăƒŒăƒ‰ă§ăźăżèĄšç€ș", + "FISHING": "持èˆč", + "TOWING": "æ›łèˆȘ", + "DREDGER": "攚枫èˆč", + "DIVE OPS": "朜氎䜜愭", + "MILITARY": "軍甚", + "SAILING": "澆èˆč", + "PLEASURE": "ăƒ—ăƒŹă‚žăƒŁăƒŒăƒœăƒŒăƒˆ", + "PILOT": "æ°Žć…ˆèˆč", + "SAR": "æœçŽąæ•‘ćŠ©", + "TUG": "ă‚żă‚°ăƒœăƒŒăƒˆ", + "PORT TENDER": "æžŻæčŸäœœæ„­èˆč", + "ANTI-POLLUTION": "汚染é˜Č陀èˆč", + "LAW ENFORCE": "æł•ćŸ·èĄŒèˆč", + "MEDICAL": "ćŒ»ç™‚", + "HIGH-SPEED": "高速èˆč", + "PASSENGER": "æ—…ćźąèˆč", + "CARGO": "èȚ物èˆč", + "TANKER": "ă‚żăƒłă‚«ăƒŒ", + "OTHER": "ăăźä»–", + "Included in bundle": "ăƒăƒłăƒ‰ăƒ«ă«ć«ăŸă‚ŒăŠă„ăŸă™", + "Missing bundle file — reimport its bundle": "ăƒăƒłăƒ‰ăƒ«ăƒ•ă‚Ąă‚€ăƒ«ăŒă‚ă‚ŠăŸă›ă‚“ă€‚ăƒăƒłăƒ‰ăƒ«ă‚’ć†ă‚€ăƒłăƒăƒŒăƒˆă—ăŠăă ă•ă„", + "Source configured; file checked when loaded": "ă‚œăƒŒă‚čèš­ćźšæžˆăżă€‚ăƒ•ă‚Ąă‚€ăƒ«ăŻèȘ­ăżèŸŒăżæ™‚にçąșèȘă—ăŸă™", + "Source unavailable": "ă‚œăƒŒă‚čă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "ENVIRONMENTAL": "環汃", + "EARTH WATCH": "ćœ°çƒç›ŁèŠ–", + "ACTIVE EVENTS": "ç™șç”Ÿäž­ăźă‚€ăƒ™ăƒłăƒˆ", + "Starting live contacts
": "ăƒ©ă‚€ăƒ–ă‚łăƒłă‚żă‚Żăƒˆă‚’é–‹ć§‹äž­â€Š", + "Opening space missions
": "ćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒłă‚’é–‹ă„ăŠă„ăŸă™â€Š", + "Scanning active events
": "ç™șç”Ÿäž­ăźă‚€ăƒ™ăƒłăƒˆă‚’ă‚čキャン侭
", + "Live earthquakes and active fires, from USGS and NASA": "USGSずNASAă«ă‚ˆă‚‹ćœ°éœ‡ăšç«çœăźăƒ©ă‚€ăƒ–æƒ…ć ±", + "It feels like a forbidden cockpit—then you realize the sources are public and the data is real.": "çŠæ–­ăźă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăźă‚ˆă†ă§ă™ăŒă€æƒ…ć ±æșăŻă™ăčăŠć…Źé–‹ă•ă‚ŒăŠăŠă‚Šă€ăƒ‡ăƒŒă‚żăŻæœŹç‰©ă§ă™ă€‚", + "Working
": "懩理侭
", + "Could not open that mission{detail}. Retry or explore manually.": "ăƒŸăƒƒă‚·ăƒ§ăƒłă‚’é–‹ă‘ăŸă›ă‚“ă§ă—ăŸ{detail}ă€‚ć†è©ŠèĄŒă™ă‚‹ă‹ă€æ‰‹ć‹•ă§æŽąçŽąă—ăŠăă ă•ă„ă€‚", + "This browser is blocking storage, so that could not be saved.": "ă“ăźăƒ–ăƒ©ă‚Šă‚¶ăƒŒăŻă‚čăƒˆăƒŹăƒŒă‚žă‚’ăƒ–ăƒ­ăƒƒă‚Żă—ăŠă„ă‚‹ăŸă‚ă€äżć­˜ă§ăăŸă›ă‚“ă§ă—ăŸă€‚", + "NORMAL": "æš™æș–", + "CRT": "CRT", + "NVG": "NVG", + "FLIR": "FLIR", + "ANIME": "ケニメ", + "NOIR": "ăƒŽăƒŻăƒŒăƒ«", + "SNOW": "é›Ș", + "ARCTIC": "ćŒ—æ„”ćœ", + "ANTARCTIC": "ć—æ„”ćœ", + "NORTH AMERICA": "ćŒ—ç±ł", + "SOUTH AMERICA": "ć—ç±ł", + "EUROPE": "ăƒšăƒŒăƒ­ăƒƒăƒ‘", + "AFRICA": "ケフăƒȘă‚«", + "ASIA": "ケゾケ", + "OCEANIA": "ă‚Șă‚»ă‚ąăƒ‹ă‚ą", + "NORTHERN OCEANIC GRID": "ćŒ—éƒšæ”·æŽ‹ă‚°ăƒȘッド", + "SOUTHERN OCEANIC GRID": "ć—éƒšæ”·æŽ‹ă‚°ăƒȘッド", + "LOADING": "èȘ­èŸŒäž­", + "DEGRADED": "性胜䜎䞋", + "STALE": "æ›Žæ–°é…ć»¶", + "PARTIAL": "郹戆的", + "FALLBACK": "ăƒ•ă‚©ăƒŒăƒ«ăƒăƒƒă‚Ż", + "{state} {layers}": "{state} {layers}", + "view band|STREET": "èĄ—è·Ż", + "view band|CITY": "ćž‚èĄ—", + "view band|METRO": "éƒœćž‚ćœ", + "view band|REGIONAL": "㜰㟟", + "view band|GLOBAL": "慹球", + "SUMMARY": "抂芁", + "Awaiting telemetry...": "テレメトăƒȘăƒŒćŸ…ăĄâ€Š", + "REC": "REC", + "AIS: --": "AIS: --", + "N/A": "䞍明", + "{mode} {band} {locality} | {region} | ALT {alt} | WINDOW {window} | SUN {sun}° | ONA {ona}° | {zone}": "{mode} {band} {locality} | {region} | ALT {alt} | 範ć›Č {window} | SUN {sun}° | ONA {ona}° | {zone}", + "NEAR {poi} ({city}) {distance}": "{poi}{city}ïŒ‰ä»˜èż‘ {distance}", + "SECTOR {lat} {lon}": "ă‚»ă‚Żă‚żăƒŒ {lat} {lon}", + "hemisphere|N": "N", + "hemisphere|S": "S", + "hemisphere|E": "E", + "hemisphere|W": "W", + "POWER UP · {count} KEYS WAITING": { + "other": "ăƒ‘ăƒŻăƒŒă‚ąăƒƒăƒ— · ă‚­ăƒŒćŸ…æ©Ÿ {count}ä»¶" + }, + "POWERED UP": "ăƒ‘ăƒŻăƒŒă‚ąăƒƒăƒ—æžˆăż", + "Provider Settings does not answer proxied requests": "ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźšăŻăƒ—ăƒ­ă‚­ă‚·ç”Œç”±ăźăƒȘクスă‚čăƒˆă«ćżœç­”ă—ăŸă›ă‚“", + "Provider Settings is disabled while sharing is enabled": "ć…±æœ‰ăŒæœ‰ćŠčăȘé–“ă€ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźšăŻç„ĄćŠčです", + "Provider Settings answers only the machine running the server": "ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźšăŻă€ă‚”ăƒŒăƒăƒŒă‚’ćźŸèĄŒă—ăŠă„ă‚‹ăƒžă‚·ăƒłă«ăźăżćżœç­”ă—ăŸă™", + "Provider Settings answers only local hostnames": "ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźšăŻăƒ­ăƒŒă‚«ăƒ«ăźăƒ›ă‚čăƒˆćă«ăźăżćżœç­”ă—ăŸă™", + "Provider Settings requires an exact local Origin": "ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźšă«ăŻćźŒć…šă«äž€è‡Žă™ă‚‹ăƒ­ăƒŒă‚«ăƒ«ăźOriginăŒćż…èŠă§ă™", + "Unrecognized Origin refused": "èȘè­˜ă§ăăȘいOrigină‚’æ‹’ćŠă—ăŸă—ăŸ", + "Cross-origin requests are refused": "クロă‚čă‚ȘăƒȘゾンぼăƒȘクスă‚čăƒˆăŻæ‹’ćŠă•ă‚ŒăŸă™", + "Content-Type must be application/json": "Content-Typeはapplication/jsonă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™", + "Method not allowed": "èš±ćŻă•ă‚ŒăŠă„ăȘă„ăƒĄă‚œăƒƒăƒ‰ă§ă™", + "Request too large": "ăƒȘクスă‚čăƒˆăŒć€§ăă™ăŽăŸă™", + "Invalid JSON": "無ćŠčăȘJSONです", + "Body must be a JSON object of {ENV_VAR: value}": "æœŹæ–‡ăŻ{ENV_VAR: value}ćœąćŒăźJSONă‚Șăƒ–ă‚žă‚§ă‚Żăƒˆă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™", + "No keys provided": "ă‚­ăƒŒăŒæŒ‡ćźšă•ă‚ŒăŠă„ăŸă›ă‚“", + "At most {limit} keys per save": "1ć›žă«äżć­˜ă§ăă‚‹ă‚­ăƒŒăŻæœ€ć€§{limit}怋です", + "Unknown key: {name}": "䞍明ăȘă‚­ăƒŒïŒš{name}", + "{name} must be a string": "{name}ăŻæ–‡ć­—ćˆ—ă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™", + "{name} is empty": "{name}がç©șです", + "{name} is longer than any real key ({limit} max)": "{name}ăŻćźŸćœšă™ă‚‹ă©ăźă‚­ăƒŒă‚ˆă‚Šă‚‚é•·ăăȘăŁăŠă„ăŸă™ïŒˆæœ€ć€§{limit}æ–‡ć­—ïŒ‰", + "{name} may only contain printable characters with no spaces": "{name}にはç©șç™œă‚’ć«ăŸăȘă„ć°ć­—ćŻèƒœæ–‡ć­—ăźăżäœżç”šă§ăăŸă™", + "{name} contains a character that is not valid in a key (#, quotes, $, \\, or backtick)": "{name}ă«ă‚­ăƒŒă§äœżç”šă§ăăȘă„æ–‡ć­—ïŒˆ#ă€ćŒ•ç”šçŹŠă€$、\\ă€ăƒăƒƒă‚Żă‚Żă‚©ăƒŒăƒˆïŒ‰ăŒć«ăŸă‚ŒăŠă„ăŸă™", + "{name} is configured outside Provider Settings and can only be changed where it was set": "{name}ăŻăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźšăźć€–ă§èš­ćźšă•ă‚ŒăŠă„ă‚‹ăŸă‚ă€èš­ćźšă—ăŸć Žæ‰€ă§ăźăżć€‰æ›Žă§ăăŸă™", + "The key was not saved: could not restrict the credential file to your account; nothing was saved": "ă‚­ăƒŒăŻäżć­˜ă•ă‚ŒăŸă›ă‚“ă§ă—ăŸïŒšèȘèšŒæƒ…ć ±ăƒ•ă‚Ąă‚€ăƒ«ăžăźă‚ąă‚Żă‚»ă‚čă‚’ăŠäœżă„ăźă‚ąă‚«ă‚Šăƒłăƒˆă«ćˆ¶é™ă§ăăȘă‹ăŁăŸăŸă‚ă€äœ•ă‚‚äżć­˜ă•ă‚ŒăŠă„ăŸă›ă‚“", + "The key was not saved: the existing configuration could not be read, so nothing was changed": "ă‚­ăƒŒăŻäżć­˜ă•ă‚ŒăŸă›ă‚“ă§ă—ăŸïŒšæ—ąć­˜ăźèš­ćźšă‚’èȘ­ăżć–ă‚ŒăȘă‹ăŁăŸăŸă‚ă€äœ•ă‚‚ć€‰æ›Žă•ă‚ŒăŠă„ăŸă›ă‚“", + "Could not write the {store} store": "{store}ă‚čăƒˆă‚ąă«æ›žăèŸŒă‚ăŸă›ă‚“ă§ă—ăŸ", + "Save failed ({status}).": "äżć­˜ă«ć€±æ•—ă—ăŸă—ăŸïŒˆ{status}ïŒ‰ă€‚", + "OAuth check failed: {detail}": "OAuthたçąșèȘă«ć€±æ•—ă—ăŸă—ăŸïŒš{detail}", + "Could not check ChatGPT sign-in. Try again.": "ChatGPTăźă‚”ă‚€ăƒłă‚€ăƒłçŠ¶æ…‹ă‚’çąșèȘă§ăăŸă›ă‚“ă§ă—ăŸă€‚ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„ă€‚", + "VOICE AUTH · CHATGPT OAUTH": "éŸłćŁ°æ©ŸèƒœăźèȘèšŒ · ChatGPT OAuth", + "VOICE AUTH · API KEY": "éŸłćŁ°æ©ŸèƒœăźèȘèšŒ · APIă‚­ăƒŒ", + "USE API KEY": "APIă‚­ăƒŒă‚’äœżç”š", + "USE CHATGPT OAUTH": "ChatGPT OAuthă‚’äœżç”š", + "Use OPENAI_API_KEY for the next cloud voice session": "æŹĄć›žăźă‚Żăƒ©ă‚Šăƒ‰éŸłćŁ°ă‚»ăƒƒă‚·ăƒ§ăƒłă§OPENAI_API_KEYă‚’äœżç”š", + "Use the signed-in local ChatGPT/Codex OAuth session for the next cloud voice session": "æŹĄć›žăźă‚Żăƒ©ă‚Šăƒ‰éŸłćŁ°ă‚»ăƒƒă‚·ăƒ§ăƒłă§ă€ă“ăźăƒžă‚·ăƒłă§ă‚”ă‚€ăƒłă‚€ăƒłæžˆăżăźChatGPT/Codex OAuthă‚»ăƒƒă‚·ăƒ§ăƒłă‚’äœżç”š", + "Metered — a billing-enabled account": "ćŸ“é‡èȘČé‡‘ïŒšè«‹æ±‚ăŒæœ‰ćŠčăȘă‚ąă‚«ă‚ŠăƒłăƒˆăŒćż…èŠ", + "Optional paid token — public access works without one": "ä»»æ„ăźæœ‰æ–™ăƒˆăƒŒă‚ŻăƒłïŒšăȘăăŠă‚‚ć…Źé–‹ă‚ąă‚Żă‚»ă‚čă§ćˆ©ç”šćŻèƒœ", + "Free key — register, paste, done": "ç„Ąæ–™ă‚­ăƒŒïŒšç™»éŒČしどèČŒă‚Šä»˜ă‘ă‚‹ă ă‘", + "browser-side": "ăƒ–ăƒ©ă‚Šă‚¶ăƒŒćŽ", + "This key runs in the browser by design — restrict it at the provider (see SECURITY.md)": "ă“ăźă‚­ăƒŒăŻä»•æ§˜äžŠăƒ–ăƒ©ă‚Šă‚¶ăƒŒă§ć‹•äœœă—ăŸă™ă€‚ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒćŽă§ćˆ©ç”šćˆ¶é™ă‚’èš­ćźšă—ăŠăă ă•ă„ïŒˆSECURITY.mdă‚’ć‚ç…§ïŒ‰", + "configured externally": "ć€–éƒšă§èš­ćźšæžˆăż", + "Supplied by your environment, Keychain, or launcher — change it where it was set": "ç’°ćąƒć€‰æ•°ă€ă‚­ăƒŒăƒă‚§ăƒŒăƒłă€ăŸăŸăŻăƒ©ăƒłăƒăƒŁăƒŒă‹ă‚‰æäŸ›ă•ă‚ŒăŠă„ăŸă™ă€‚èš­ćźšă—ăŸć Žæ‰€ă§ć€‰æ›Žă—ăŠăă ă•ă„", + "MANAGE ↗": "缡理 ↗", + "GET KEY ↗": "ă‚­ăƒŒă‚’ć–ćŸ— ↗", + "{envVar} saved — paste to replace": "{envVar}ăŻäżć­˜æžˆăżïŒšèČŒă‚Šä»˜ă‘ă‚‹ăšçœźăæ›ăˆăŸă™", + "paste {envVar}": "{envVar}をèČŒă‚Šä»˜ă‘", + "REMOVE": "扊陀", + "Remove {title} from this app's saved keys": "{title}をこぼケプăƒȘăźäżć­˜æžˆăżă‚­ăƒŒă‹ă‚‰ć‰Šé™€", + "unsaved provider keys": "æœȘäżć­˜ăźăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒă‚­ăƒŒ", + "Project keys: {status}": "ăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆăźă‚­ăƒŒïŒš{status}", + "your app configuration": "ケプăƒȘăźèš­ćźš", + "your local .env": "ăƒ­ăƒŒă‚«ăƒ«ăź .env", + "Saving
": "保歘侭
", + "Save failed: {detail}": "äżć­˜ă«ć€±æ•—ă—ăŸă—ăŸïŒš{detail}", + "Paste at least one key first.": "ăŸăšă€ă‚­ăƒŒă‚’1぀仄䞊èČŒă‚Šä»˜ă‘ăŠăă ă•ă„ă€‚", + "Saved to {store}. Restarting — this page reloads itself.": "{store}ă«äżć­˜ă—ăŸă—ăŸă€‚ć†è”·ć‹•äž­ă§ă™ă€‚ă“ăźăƒšăƒŒă‚žăŻè‡Ș拕で憍èȘ­ăżèŸŒăżă•ă‚ŒăŸă™ă€‚", + "Cloud voice will use OPENAI_API_KEY on the next session.": "æŹĄć›žăźă‚»ăƒƒă‚·ăƒ§ăƒłă‹ă‚‰ă€ă‚Żăƒ©ă‚Šăƒ‰éŸłćŁ°ăŻOPENAI_API_KEYă‚’äœżç”šă—ăŸă™ă€‚", + "Checking local ChatGPT OAuth sign-in
": "ă“ăźăƒžă‚·ăƒłăźChatGPT OAuthă‚”ă‚€ăƒłă‚€ăƒłă‚’çąșèȘäž­â€Š", + "Could not check ChatGPT sign-in.": "ChatGPTăźă‚”ă‚€ăƒłă‚€ăƒłçŠ¶æ…‹ă‚’çąșèȘă§ăăŸă›ă‚“ă§ă—ăŸă€‚", + "ChatGPT OAuth selected for cloud voice. Your API key stays saved and available.": "ă‚Żăƒ©ă‚Šăƒ‰éŸłćŁ°ă«ChatGPT OAuthă‚’éžæŠžă—ăŸă—ăŸă€‚APIă‚­ăƒŒăŻäżć­˜ă•ă‚ŒăŸăŸăŸäœżç”šă§ăăŸă™ă€‚", + "ChatGPT sign-in expired. Opening sign-in again
": "ChatGPTăźă‚”ă‚€ăƒłă‚€ăƒłăŒæœŸé™ćˆ‡ă‚Œă§ă™ă€‚ă‚”ă‚€ăƒłă‚€ăƒłă‚’ć†ćșŠé–‹ă„ăŠă„ăŸă™â€Š", + "Opening ChatGPT sign-in in your browser
": "ăƒ–ăƒ©ă‚Šă‚¶ăƒŒă§ChatGPTăźă‚”ă‚€ăƒłă‚€ăƒłă‚’é–‹ă„ăŠă„ăŸă™â€Š", + "Could not start ChatGPT sign-in on this machine.": "ă“ăźăƒžă‚·ăƒłă§ChatGPTăźă‚”ă‚€ăƒłă‚€ăƒłă‚’é–‹ć§‹ă§ăăŸă›ă‚“ă§ă—ăŸă€‚", + "Finish ChatGPT sign-in in the browser. Waiting for it to complete
": "ăƒ–ăƒ©ă‚Šă‚¶ăƒŒă§ChatGPTăźă‚”ă‚€ăƒłă‚€ăƒłă‚’ćźŒäș†ă—ăŠăă ă•ă„ă€‚ćźŒäș†ă‚’ćŸ…ăŁăŠă„ăŸă™â€Š", + "ChatGPT sign-in timed out. Click {button} to try again.": "ChatGPTăźă‚”ă‚€ăƒłă‚€ăƒłăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸă€‚ïŒ»{button}ïŒœă‚’ă‚ŻăƒȘックしどもう侀ćșŠăŠè©Šă—ăă ă•ă„ă€‚", + "ChatGPT sign-in complete. OAuth will be used for the next cloud voice session.": "ChatGPTăźă‚”ă‚€ăƒłă‚€ăƒłăŒćźŒäș†ă—ăŸă—ăŸă€‚æŹĄć›žăźă‚Żăƒ©ă‚Šăƒ‰éŸłćŁ°ă‚»ăƒƒă‚·ăƒ§ăƒłă§ăŻOAuthă‚’äœżç”šă—ăŸă™ă€‚", + "Remove this key from your saved configuration?": "ă“ăźă‚­ăƒŒă‚’äżć­˜æžˆăżăźèš­ćźšă‹ă‚‰ć‰Šé™€ă—ăŸă™ă‹ïŒŸ", + "Removed from {store}. Restarting — this page reloads itself.": "{store}ă‹ă‚‰ć‰Šé™€ă—ăŸă—ăŸă€‚ć†è”·ć‹•äž­ă§ă™ă€‚ă“ăźăƒšăƒŒă‚žăŻè‡Ș拕で憍èȘ­ăżèŸŒăżă•ă‚ŒăŸă™ă€‚", + "The photorealistic 3D planet, place search + Street View": "ăƒ•ă‚©ăƒˆăƒȘă‚ąăƒ«ăȘ3Dćœ°çƒă€ć Žæ‰€æ€œçŽą + ă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒ", + "Places context + Street View fallback; optional separate key": "Placesぼコンテキă‚čト + ă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒăźä»Łæ›żă€‚ćˆ„ăźă‚­ăƒŒă‚‚æŒ‡ćźšćŻ", + "Voice control — API key or ChatGPT OAuth": "éŸłćŁ°ă‚łăƒłăƒˆăƒ­ăƒŒăƒ«ïŒšAPIă‚­ăƒŒăŸăŸăŻChatGPT OAuth", + "Gemini Live voice control": "Gemini LiveéŸłćŁ°ă‚łăƒłăƒˆăƒ­ăƒŒăƒ«", + "Live ships, worldwide": "侖界侭ぼèˆčèˆ¶ă‚’ăƒ©ă‚€ăƒ–èĄšç€ș", + "Live active-fire detections": "ç«çœăźăƒ©ă‚€ăƒ–æ€œçŸ„", + "Real live traffic (keyless runs a simulation)": "ćźŸéš›ăźăƒ©ă‚€ăƒ–äș€é€šæƒ…ć ±ïŒˆă‚­ăƒŒăȘă—ăŻă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒłïŒ‰", + "Bing imagery map stacks + world terrain": "Bingç”»ćƒăźăƒžăƒƒăƒ—ă‚čタック + ć…šçƒćœ°ćœą", + "More flight-polling credits (anonymous works without)": "èˆȘç©șæ©Ÿăƒ‡ăƒŒă‚żăźć–ćŸ—æž ă‚’æ‹Ąć€§ïŒˆèȘèšŒăȘă—ă§ă‚‚ćˆ©ç”šćŻïŒ‰", + "Street-level imagery and coverage in the Street Level layer. Free: register an app in the Mapillary developer dashboard and paste its Client Token": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ăƒŹă‚€ăƒ€ăƒŒăźă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ç”»ćƒăšă‚«ăƒăƒŒçŻ„ć›Čă€‚ç„Ąæ–™ïŒšMapillary開ç™șè€…ăƒ€ăƒƒă‚·ăƒ„ăƒœăƒŒăƒ‰ă§ă‚ąăƒ—ăƒȘă‚’ç™»éŒČし、そぼClient TokenをèČŒă‚Šä»˜ă‘ăŠăă ă•ă„", + "Public space-missions access needs no key. Leave blank for standard use; paid tokens only raise request limits.": "ć…Źé–‹ăźćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒłăƒ‡ăƒŒă‚żă«ă‚­ăƒŒăŻäžèŠă§ă™ă€‚é€šćžžăźćˆ©ç”šă§ăŻç©șæŹ„ăźăŸăŸă«ă—ăŠăă ă•ă„ă€‚æœ‰æ–™ăƒˆăƒŒă‚ŻăƒłăŻăƒȘクスă‚čăƒˆäžŠé™ă‚’ćŒ•ăäžŠă’ă‚‹ă ă‘ă§ă™ă€‚", + "Air quality request failed": "ć€§æ°—èłȘたăƒȘクスă‚čăƒˆă«ć€±æ•—ă—ăŸă—ăŸ", + "No readings available": "æžŹćźšć€€ăŒă‚ă‚ŠăŸă›ă‚“", + "No current readings": "çŸćœšăźæžŹćźšć€€ăŒă‚ă‚ŠăŸă›ă‚“", + "{count} stations reporting": { + "other": "{count}ć±€ăŒć ±ć‘Šäž­" + }, + "Highest air-quality readings in view": "èĄšç€ș範ć›Čć†…ă§ć€§æ°—èłȘăźć€€ăŒæœ€ă‚‚é«˜ă„ć±€", + "Low": "䜎", + "Low health risk": "恄ćș·ăƒȘă‚čă‚ŻïŒšäœŽ", + "Moderate": "äž­", + "Moderate health risk": "恄ćș·ăƒȘă‚čă‚ŻïŒšäž­", + "High": "高", + "High health risk": "恄ćș·ăƒȘă‚čă‚ŻïŒšé«˜", + "Very High": "éžćžžă«é«˜ă„", + "Very High health risk": "恄ćș·ăƒȘă‚čă‚ŻïŒšéžćžžă«é«˜ă„", + "Air quality": "ć€§æ°—èłȘ", + "Canada only · ECCC AQHI network": "ă‚«ăƒŠăƒ€ăźăż · ECCC AQHIèŠłæžŹç¶Č", + "ECCC request timed out": "ECCCたăƒȘクスă‚čăƒˆăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸ", + "Malformed AQHI station response": "AQHIć±€ăźćżœç­”ćœąćŒăŒäžæ­Łă§ă™", + "No AQHI stations available": "ćˆ©ç”šă§ăă‚‹AQHIć±€ăŒă‚ă‚ŠăŸă›ă‚“", + "Malformed AQHI observation response": "AQHIèŠłæžŹăźćżœç­”ćœąćŒăŒäžæ­Łă§ă™", + "Camera source temporarily unavailable": "ă‚«ăƒĄăƒ©ăźă‚œăƒŒă‚čăŒäž€æ™‚çš„ă«ćˆ©ç”šă§ăăŸă›ă‚“", + "Mapped camera locations": "ăƒžăƒƒăƒ—æžˆăżăźă‚«ăƒĄăƒ©äœçœź", + "SHOW NEAREST": "æœ€ćŻ„ă‚Šă‚’èĄšç€ș", + "Stop following the current object before navigating to a camera": "ă‚«ăƒĄăƒ©ăžç§»ć‹•ă™ă‚‹ć‰ă«ă€çŸćœšăźćŻŸè±ĄăźèżœćŸ“ă‚’ćœæ­ąă—ăŠăă ă•ă„", + "Move to the nearest loaded camera and show its details": "èȘ­ăżèŸŒăżæžˆăżăźæœ€ćŻ„ă‚Šăźă‚«ăƒĄăƒ©ăžç§»ć‹•ă—ăŠè©łçŽ°ă‚’èĄšç€ș", + "Camera badges": "ă‚«ăƒĄăƒ©ăƒăƒƒă‚ž", + "Cyan cameras turn coral when selected. Wedges illustrate mapped direction, not measured coverage. Nearby cameras may be outside the screen.": "ă‚·ă‚ąăƒłăźă‚«ăƒĄăƒ©ăŻéžæŠžă™ă‚‹ăšă‚łăƒŒăƒ©ăƒ«ă«ć€‰ă‚ă‚ŠăŸă™ă€‚æ‰‡ćœąăŻăƒžăƒƒăƒ—ă•ă‚ŒăŸć‘ăă‚’ç€șă™ă‚‚ăźă§ă€ćźŸæžŹăźă‚«ăƒăƒŒçŻ„ć›Čă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ć‘šèŸșăźă‚«ăƒĄăƒ©ăŒç”»éąć€–ă«ă‚ă‚‹ć ŽćˆăŒă‚ă‚ŠăŸă™ă€‚", + "{count} nearby · {onScreen} on screen": { + "other": "摹èŸș{count}揰 · ç”»éąć†…{onScreen}揰" + }, + "{count} nearby": { + "other": "摹èŸș{count}揰" + }, + "retrying mapped ALPR cameras": "ăƒžăƒƒăƒ—æžˆăżăźALPRă‚«ăƒĄăƒ©ă‚’ć†è©ŠèĄŒäž­", + "loading mapped ALPR cameras": "ăƒžăƒƒăƒ—æžˆăżăźALPRă‚«ăƒĄăƒ©ă‚’èȘ­ăżèŸŒăżäž­", + "No ALPR data for this area — US and Canada only": "こぼ朰柟ぼALPRăƒ‡ăƒŒă‚żăŻă‚ă‚ŠăŸă›ă‚“ïŒˆç±łć›œăšă‚«ăƒŠăƒ€ăźăżïŒ‰", + "Zoom in to load mapped cameras": "ă‚șăƒŒăƒ ă‚€ăƒłă—ăŠăƒžăƒƒăƒ—æžˆăżăźă‚«ăƒĄăƒ©ă‚’èȘ­ăżèŸŒăż", + "Showing cached locations": "ă‚­ăƒŁăƒƒă‚·ăƒ„ăźäœçœźă‚’èĄšç€șäž­", + "Coverage limited — zoom in": "ă‚«ăƒăƒŒçŻ„ć›ČăŒé™ă‚‰ă‚ŒăŠă„ăŸă™ă€‚ă‚șăƒŒăƒ ă‚€ăƒłă—ăŠăă ă•ă„", + "No ALPR data for this area": "こぼ朰柟ぼALPRăƒ‡ăƒŒă‚żăŻă‚ă‚ŠăŸă›ă‚“", + "None on screen — nearby cameras are outside the view": "ç”»éąć†…ă«ăȘă—ïŒšć‘šèŸșăźă‚«ăƒĄăƒ©ăŻèĄšç€ș範ć›Č怖です", + "ALPR camera": "ALPRă‚«ăƒĄăƒ©", + "Camera coverage unavailable": "ă‚«ăƒĄăƒ©ăźă‚«ăƒăƒŒçŻ„ć›Čă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "OpenStreetMap · community mapped": "OpenStreetMap · ă‚łăƒŸăƒ„ăƒ‹ăƒ†ă‚Łäœœæˆ", + "Overpass returned an incomplete camera response": "Overpassから侍漌慹ăȘă‚«ăƒĄăƒ©ăƒ‡ăƒŒă‚żăŒèż”ă•ă‚ŒăŸă—ăŸ", + "At least {count}": "{count}仄䞊", + "CONTEXT READY": "コンテキă‚čトæș–ć‚™ćźŒäș†", + "GLOBAL CONTEXT OFF": "ă‚°ăƒ­ăƒŒăƒăƒ«ă‚łăƒłăƒ†ă‚­ă‚čト ă‚Șフ", + "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "ăƒ•ăƒ©ă‚€ăƒˆă€èˆčèˆ¶ă€ăŸăŸăŻăƒžăƒƒăƒ—æžˆăżæ–œèš­ă‚’éžæŠž", + "ENABLE TO LOAD OBSERVED / MAPPED PROXIMITY": "有ćŠčă«ă—ăŠă€èŠłæžŹ / ăƒžăƒƒăƒ—æžˆăżăźèż‘æŽ„æƒ…ć ±ă‚’èȘ­ăżèŸŒăż", + "Unavailable": "ćˆ©ç”šäžćŻ", + "Focus {label}": "{label}ă«ăƒ•ă‚©ăƒŒă‚«ă‚č", + "Global Context navigation": "ă‚°ăƒ­ăƒŒăƒăƒ«ă‚łăƒłăƒ†ă‚­ă‚čトナビă‚ČăƒŒă‚·ăƒ§ăƒł", + "Previous — prior visited contact in the 250 km window": "ć‰ăžïŒš250 kmćœć†…ă§ç›Žć‰ă«èšȘれたコンタクト", + "PREVIOUS": "才ま", + "FOCUS": "ăƒ•ă‚©ăƒŒă‚«ă‚č", + "Next — nearest unvisited contact in the 250 km window": "æŹĄăžïŒš250 kmćœć†…ă§æœ€ă‚‚èż‘ă„æœȘèšȘ敏ぼコンタクト", + "NEXT": "æŹĄăž", + "Named areas ({n})": "ćć‰ä»˜ăă‚šăƒȘă‚ąïŒˆ{n}", + "{distance} FLIGHT / VESSEL WINDOW": "ăƒ•ăƒ©ă‚€ăƒˆ / èˆčèˆ¶ăźçŻ„ć›Č {distance}", + "Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "ć…Źé–‹æƒ…ć ±ă«ćŸșă„ăăƒžăƒƒăƒ—æžˆăż/èŠłæžŹæžˆăżăźă‚łăƒłăƒ†ă‚­ă‚čăƒˆă§ă™ă€‚äœçœźé€äżĄăźæŹ èœă€æœȘèȘ­èŸŒăźćœ°ć›łçŻ„ć›Čă€ćœ°ć›łă«æœȘ登éŒČăźæ–œèš­ăŻă€ćŻŸè±ĄăŒć­˜ćœšă—ăȘă„èšŒæ‹ ă«ăŻăȘă‚ŠăŸă›ă‚“ă€‚", + "mapped matches within {km} km of the subject": "ćŻŸè±Ąăź{km} km朏憅ぼè©Čćœ“æ–œèš­", + "none mapped within {km} km; not a complete 250 km survey": "{km} kmä»„ć†…ă«ăƒžăƒƒăƒ—æžˆăżæ–œèš­ăȘă—ïŒˆ250 kmぼ漌慹ăȘèȘżæŸ»ă§ăŻă‚ă‚ŠăŸă›ă‚“ïŒ‰", + "mapped matches from the loaded viewport": "èȘ­ăżèŸŒăżæžˆăżăźèĄšç€ș範ć›Č憅ぼè©Čćœ“æ–œèš­", + "viewport feed is not a complete 250 km survey": "èĄšç€ș範ć›Čăźăƒ•ă‚ŁăƒŒăƒ‰ăŻ250 kmぼ漌慹ăȘèȘżæŸ»ă§ăŻă‚ă‚ŠăŸă›ă‚“", + "HDG {value}°": "HDG {value}°", + "BRG {value}°": "BRG {value}°", + "BRG —": "BRG —", + "CRS {value}°": "CRS {value}°", + "CURRENT VIEWPORT ONLY": "çŸćœšăźèĄšç€ș範ć›Čたみ", + "WITHIN {km} KM": "{km} km仄憅", + "Flights": "ăƒ•ăƒ©ă‚€ăƒˆ", + "Military flights": "軍甚機", + "AIS vessels": "AISèˆč舶", + "Mapped installations": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­", + "syncing {count} city feeds...": "{count}éƒœćž‚ăźăƒ•ă‚ŁăƒŒăƒ‰ă‚’ćŒæœŸäž­â€Š", + "scanning nearby systems...": "摹èŸșăźă‚·ă‚§ă‚ąă‚”ă‚€ă‚Żăƒ«ă‚’æ€œçŽąäž­â€Š", + "GBFS fetch error": "GBFSć–ćŸ—ă‚šăƒ©ăƒŒ", + "Station {id}": "ă‚čăƒ†ăƒŒă‚·ăƒ§ăƒł {id}", + "Station": "ă‚čăƒ†ăƒŒă‚·ăƒ§ăƒł", + "đŸšČ {bikes} avail · {docks} docks · {capacity} cap": "đŸšČ èČžć‡ș揯 {bikes}揰 · èż”ćŽćŻ {docks}揰 · 揎ćźč {capacity}揰", + "⚠ Not installed": "⚠ æœȘèš­çœź", + "⚠ Not renting": "⚠ èČžć‡șćœæ­ąäž­", + "⚠ Not returning": "⚠ èż”ćŽäžćŻ", + "HDG {value}° (ESTIMATED)": "HDG {value}Â°ïŒˆæŽšćźšïŒ‰", + "{count} CAMERAS STANDING BY · NO CAMERA SELECTED · CLICK A CAMERA TO ACTIVATE": "{count}ć°ăźă‚«ăƒĄăƒ©ăŒćŸ…æ©Ÿäž­ · ă‚«ăƒĄăƒ©æœȘ遞択 · ă‚«ăƒĄăƒ©ă‚’ă‚ŻăƒȘăƒƒă‚Żă—ăŠæœ‰ćŠč挖", + "No cameras available in catalog.": "ă‚«ă‚żăƒ­ă‚°ă«ćˆ©ç”šă§ăă‚‹ă‚«ăƒĄăƒ©ăŒă‚ă‚ŠăŸă›ă‚“ă€‚", + "{city} CCTV": "{city} CCTV", + "FOV {value}° (DATASHEET)": "FOV {value}Â°ïŒˆăƒ‡ăƒŒă‚żă‚·ăƒŒăƒˆïŒ‰", + "FOV {value}°": "FOV {value}°", + "SPEC FOV {span}° (CAPABILITY)": "仕様FOV {span}Â°ïŒˆćŻŸćżœç”»è§’ïŒ‰", + "COVERAGE {value}kmÂČ": "ă‚«ăƒăƒŒçŻ„ć›Č {value}kmÂČ", + "OVERLAP {count} cams": "重耇 {count}揰", + "ISOLATED VIEW": "重耇ăȘし", + "PROJ MONITOR": "æŠ•ćœ± ăƒąăƒ‹ă‚żăƒŒ", + "PROJ OFF": "æŠ•ćœ± ă‚Șフ", + "VIEWSHED": "ćŻèŠ–ćŸŸ", + "CAL {value}": "CAL {value}", + "SRC {value}": "SRC {value}", + "{value} CONTEXT": "{value}コンテキă‚čト", + "{spec} · SPECS: CCTV-DATABASE.COM": "{spec} · 仕様CCTV-DATABASE.COM", + "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "ć€§è„żæŽ‹ăšćŒ—ć€ȘćčłæŽ‹æ±éƒšăƒ»äž­éƒšăźăżă§ă™ă€‚ć…šäž–ç•Œăźă‚”ă‚€ă‚Żăƒ­ăƒłă‚’ç¶ČçŸ…ă™ă‚‹ă‚‚ăźă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚", + "Cyclone advisories unavailable": "ă‚”ă‚€ă‚Żăƒ­ăƒłæƒ…ć ±ă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "Cyclone data unavailable": "ă‚”ă‚€ă‚Żăƒ­ăƒłăƒ‡ăƒŒă‚żă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "Potential tropical cyclone": "ă‚”ă‚€ă‚Żăƒ­ăƒłćŒ–ăźăŠăă‚ŒăŒă‚ă‚‹æ“Ÿäč±", + "Post-tropical cyclone": "ç†±ćžŻæ€§ă‚’ć€±ăŁăŸă‚”ă‚€ă‚Żăƒ­ăƒł", + "Hurricane": "ハăƒȘă‚±ăƒŒăƒł", + "Tropical storm": "ç†±ćžŻæšŽéąšé›š", + "Tropical depression": "ç†±ćžŻäœŽæ°—ćœ§", + "Subtropical storm": "äșœç†±ćžŻæšŽéąšé›š", + "Subtropical depression": "äșœç†±ćžŻäœŽæ°—ćœ§", + "Track and cone match this advisory": "é€Čè·Żăšäșˆć ±ć††ăŻă“ăźæƒ…ć ±ăšäž€è‡Žă—ăŠă„ăŸă™", + "Track/cone awaiting advisory {number}": "é€Čè·Ż/äșˆć ±ć††ăŻçŹŹ{number}ć ±ćŸ…ăĄ", + "Track/cone unavailable": "é€Čè·Ż/äșˆć ±ć††ă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "Cached advisory · stale source": "ă‚­ăƒŁăƒƒă‚·ăƒ„ăźă‚”ă‚€ă‚Żăƒ­ăƒłæƒ…ć ± · ă‚œăƒŒă‚进޿–°é…ć»¶", + "Loading advisories
": "ă‚”ă‚€ă‚Żăƒ­ăƒłæƒ…ć ±ă‚’èȘ­ăżèŸŒăżäž­â€Š", + "{count} active storms": { + "other": "ç™șç”Ÿäž­ăźă‚”ă‚€ă‚Żăƒ­ăƒł {count}怋" + }, + "Position as of {time}": "{time}時ç‚čăźäœçœź", + "Maximum sustained wind: {wind} · Pressure: {pressure}": "æœ€ć€§æŒç¶šéąšé€ŸïŒš{wind} · æ°—ćœ§ïŒš{pressure}", + "{name} · {classification} · Advisory {number} · issued {time}": "{name} · {classification} · 珏{number}ć ± · {time}ç™șèĄš", + "No active NHC/CPHC systems": "NHC/CPHCăŒç›ŁèŠ–äž­ăźă‚”ă‚€ă‚Żăƒ­ăƒłăŻă‚ă‚ŠăŸă›ă‚“", + "Advisories unavailable": "ă‚”ă‚€ă‚Żăƒ­ăƒłæƒ…ć ±ă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "Cyclones · NHC / CPHC": "ă‚”ă‚€ă‚Żăƒ­ăƒł · NHC / CPHC", + "Atlantic · E/C Pacific": "ć€§è„żæŽ‹ · 東郚/䞭郚ć€ȘćčłæŽ‹", + "{storms} · {name} selected": "{storms} · {name}ă‚’éžæŠžäž­", + "Official advisory ↗": "ć…ŹćŒæƒ…ć ± ↗", + "Active NHC and CPHC cyclone advisories": "ç™ș生侭ぼNHCおよびCPHCă‚”ă‚€ă‚Żăƒ­ăƒłæƒ…ć ±", + "Wind unavailable": "éąšăźăƒ‡ăƒŒă‚żă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "Advisory center / forecast track": "ç™șèĄšæ™‚ăźäž­ćżƒ / äșˆć ±é€Čè·Ż", + "Center-track uncertainty cone": "䞭濃é€Čè·Żăźäșˆć ±ć††", + "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "ćœ°ć›łäžŠă§ă‚”ă‚€ă‚Żăƒ­ăƒłă‚’éžæŠžă™ă‚‹ă‹ă€ăƒȘă‚čăƒˆă‹ă‚‰éžă¶ăšă€ăăźă‚”ă‚€ă‚Żăƒ­ăƒłăŒéžæŠžă•ă‚ŒăŠă‚«ăƒĄăƒ©ăŒç§»ć‹•ă—ăŸă™ă€‚ćœ°ć›łăźäœ•ă‚‚ăȘă„ć Žæ‰€ă‚’ă‚ŻăƒȘăƒƒă‚Żă™ă‚‹ăšéžæŠžă‚’è§Łé™€ă—ăŸă™ă€‚NOAA NHC/CPHCăźæƒ…ć ±ă«ćŸșă„ăèĄšç€șです。äșˆć ±ć††ăŻäșˆć ±ă•ă‚Œă‚‹äž­ćżƒé€Čè·Żăźäžçąșかさをç€șă™ă‚‚ăźă§ă€ă‚”ă‚€ă‚Żăƒ­ăƒłăźć€§ăă•ă‚„ć±é™ș範ć›Čć…šäœ“ă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚äșˆć ±ç‚čăźăƒ©ăƒ™ăƒ«ăŻă‚œăƒŒă‚čたäșˆć ±æ™‚間で、ç™șèĄšæ™‚ćˆ»ă‹ă‚‰èšˆçź—ă—ăŸæ™‚ćˆ»ă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ć›łćœąăŻćœ°èĄšă«æČżăŁăŠèĄšç€șă•ă‚Œă€é«˜ă•ăŻæ°—è±ĄäžŠăźé«˜ćșŠă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ć…ŹćŒæƒ…ć ±ă‚’çąșèȘă—ăŠăă ă•ă„ă€‚", + "DRIVE": "車", + "Drive": "車", + "WALK": "ćŸ’æ­©", + "Walk": "ćŸ’æ­©", + "BIKE": "è‡Șè»ąè»Š", + "Bike": "è‡Șè»ąè»Š", + "rate limited": "ăƒŹăƒŒăƒˆćˆ¶é™äž­", + "routing service is rate limited": "ăƒ«ăƒŒăƒˆæ€œçŽąă‚”ăƒŒăƒ“ă‚čăŒăƒŹăƒŒăƒˆćˆ¶é™äž­ă§ă™", + "route leg too long": "ćŒșé–“ăŒé•·ă™ăŽăŸă™", + "route too long": "ăƒ«ăƒŒăƒˆăŒé•·ă™ăŽăŸă™", + "{error} — try again in a moment": "{error}。しばらくしどからもう侀ćșŠăŠè©Šă—ăă ă•ă„", + "Routing is rate limited — try again in a moment": "ăƒ«ăƒŒăƒˆæ€œçŽąăŒăƒŹăƒŒăƒˆćˆ¶é™äž­ă§ă™ă€‚ă—ă°ă‚‰ăă—ăŠă‹ă‚‰ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„", + "Routing unavailable (HTTP {status})": "ăƒ«ăƒŒăƒˆæ€œçŽąă‚’ćˆ©ç”šă§ăăŸă›ă‚“ïŒˆHTTP {status}", + "Routing unavailable": "ăƒ«ăƒŒăƒˆæ€œçŽąă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "direction|left": "ć·Š", + "direction|right": "揳", + "direction|slightly left": "æ–œă‚ć·Š", + "direction|slightly right": "æ–œă‚ćł", + "direction|sharply left": "怄角ćșŠă§ć·Š", + "direction|sharply right": "怄角ćșŠă§ćł", + "direction|straight": "ăŸăŁă™ă", + "direction|around": "ććŻŸæ–č搑", + "fork direction|left": "ć·Š", + "fork direction|right": "揳", + "fork direction|slightly left": "ă‚„ă‚„ć·Š", + "fork direction|slightly right": "やや揳", + "fork direction|sharply left": "怄角ćșŠă§ć·Š", + "fork direction|sharply right": "怄角ćșŠă§ćł", + "fork direction|straight": "目é€Č", + "lane direction|left": "ć·Š", + "lane direction|right": "揳", + "lane direction|slightly left": "ă‚„ă‚„ć·Š", + "lane direction|slightly right": "やや揳", + "lane direction|sharply left": "怄角ćșŠă§ć·Š", + "lane direction|sharply right": "怄角ćșŠă§ćł", + "lane direction|straight": "目é€Č", + "ordinal|{number}st": "{number}ç•Ș盼", + "ordinal|{number}nd": "{number}ç•Ș盼", + "ordinal|{number}rd": "{number}ç•Ș盼", + "ordinal|{number}th": "{number}ç•Ș盼", + "Head out on {road}": "{road}からć‡șç™ș", + "Head out": "ć‡șç™ș", + "Arrive at your destination, on the left": "ç›źçš„ćœ°ă«ćˆ°ç€ïŒˆć·ŠćŽïŒ‰", + "Arrive at your destination, on the right": "ç›źçš„ćœ°ă«ćˆ°ç€ïŒˆćłćŽïŒ‰", + "Arrive at your destination": "ç›źçš„ćœ°ă«ćˆ°ç€", + "Make a U-turn onto {road}": "Uă‚żăƒŒăƒłă—ăŠ{road}に慄る", + "Make a U-turn": "Uă‚żăƒŒăƒł", + "Continue straight onto {road}": "目é€Čしど{road}に慄る", + "Continue straight": "目é€Č", + "Turn {direction} onto {road}": "{direction}にæ›Čがっど{road}に慄る", + "Turn {direction}": "{direction}にæ›Čがる", + "Turn onto {road}": "æ›Čがっど{road}に慄る", + "maneuver|Turn": "æ›Čがる", + "Continue {direction} onto {road}": "{direction}にé€Čんで{road}に慄る", + "Continue {direction}": "{direction}にé€Čむ", + "At the end of the road, turn {direction} onto {road}": "çȘăćœ“ăŸă‚Šă‚’{direction}にæ›Čがっど{road}に慄る", + "At the end of the road, turn {direction}": "çȘăćœ“ăŸă‚Šă‚’{direction}にæ›Čがる", + "At the end of the road, continue onto {road}": "çȘăćœ“ăŸă‚Šă‹ă‚‰{road}に慄る", + "At the end of the road, continue": "çȘăćœ“ăŸă‚Šă‚’ăăźăŸăŸé€Čむ", + "Keep {direction} at the fork onto {road}": "戆ćȐを{direction}æ–č搑まé€Čんで{road}に慄る", + "Keep {direction} at the fork": "戆ćȐを{direction}æ–č搑まé€Čむ", + "Continue at the fork onto {road}": "戆ćȐをé€Čんで{road}に慄る", + "Continue at the fork": "戆ćČă‚’ăăźăŸăŸé€Čむ", + "Merge {direction} onto {road}": "{direction}ă«ćˆæ”ă—ăŠ{road}に慄る", + "Merge {direction}": "{direction}ă«ćˆæ”", + "Merge onto {road}": "{road}ă«ćˆæ”", + "maneuver|Merge": "ćˆæ”", + "Take the ramp on the {direction} onto {road}": "{direction}ćŽăźăƒ©ăƒłăƒ—ă‹ă‚‰{road}に慄る", + "Take the ramp on the {direction}": "{direction}ćŽăźăƒ©ăƒłăƒ—ă«ć…„ă‚‹", + "Take the ramp {direction} onto {road}": "ăƒ©ăƒłăƒ—ă‚’{direction}にé€Čんで{road}に慄る", + "Take the ramp {direction}": "ăƒ©ăƒłăƒ—ă‚’{direction}にé€Čむ", + "Take the ramp onto {road}": "ăƒ©ăƒłăƒ—ă‹ă‚‰{road}に慄る", + "Take the ramp": "ăƒ©ăƒłăƒ—ă«ć…„ă‚‹", + "Take the exit on the {direction} onto {road}": "{direction}恎たć‡ș揣から{road}にć‡șる", + "Take the exit on the {direction}": "{direction}恎たć‡ș揣をć‡șる", + "Take the exit {direction} onto {road}": "ć‡ș揣を{direction}にé€Čんで{road}にć‡șる", + "Take the exit {direction}": "ć‡ș揣を{direction}にć‡șる", + "Take the exit onto {road}": "ć‡ș揣から{road}にć‡șる", + "Take the exit": "ć‡ș揣をć‡șる", + "At the roundabout, take the {exit} exit onto {road}": "ăƒ­ăƒŒă‚żăƒȘăƒŒă§{exit}たć‡ș揣から{road}にć‡șる", + "At the roundabout, take the {exit} exit": "ăƒ­ăƒŒă‚żăƒȘăƒŒă§{exit}たć‡ș揣をć‡șる", + "Enter the roundabout onto {road}": "ăƒ­ăƒŒă‚żăƒȘăƒŒă«ć…„ăŁăŠ{road}ぞé€Čむ", + "Enter the roundabout": "ăƒ­ăƒŒă‚żăƒȘăƒŒă«ć…„ă‚‹", + "At the roundabout, turn {direction} onto {road}": "ăƒ­ăƒŒă‚żăƒȘăƒŒă§{direction}にæ›Čがっど{road}に慄る", + "At the roundabout, turn {direction}": "ăƒ­ăƒŒă‚żăƒȘăƒŒă§{direction}にæ›Čがる", + "At the roundabout, continue onto {road}": "ăƒ­ăƒŒă‚żăƒȘăƒŒă‹ă‚‰{road}に慄る", + "At the roundabout, continue": "ăƒ­ăƒŒă‚żăƒȘăƒŒă‚’ăăźăŸăŸé€Čむ", + "Exit the roundabout onto {road}": "ăƒ­ăƒŒă‚żăƒȘăƒŒă‚’ć‡șお{road}に慄る", + "Exit the roundabout": "ăƒ­ăƒŒă‚żăƒȘăƒŒă‚’ć‡șる", + "Use the {direction} lane onto {road}": "{direction}è»Šç·šă‚’é€šăŁăŠ{road}に慄る", + "Use the {direction} lane": "{direction}è»Šç·šă‚’é€šèĄŒ", + "Continue onto {road}": "ăăźăŸăŸ{road}に慄る", + "maneuver|Continue": "ăăźăŸăŸé€Čむ", + "{mode} — reroute for {modeLower}": "{mode}{modeLower}ă§ăƒ«ăƒŒăƒˆă‚’ć†æ€œçŽą", + "CLICK MAP": "朰曳をクăƒȘック", + "SET A": "Aă‚’èš­ćźš", + "Click a spot on the globe to place A (click again to cancel)": "朰球侊ぼ朰ç‚čをクăƒȘックしどAă‚’é…çœźïŒˆă‚‚ă†äž€ćșŠă‚ŻăƒȘăƒƒă‚Żă§ă‚­ăƒŁăƒłă‚»ăƒ«ïŒ‰", + "Then click the globe to place the start": "æŹĄă«ćœ°çƒă‚’ă‚ŻăƒȘックしどć‡șç™șćœ°ă‚’é…çœź", + "SET B": "Bă‚’èš­ćźš", + "Click a spot on the globe to place B (click again to cancel)": "朰球侊ぼ朰ç‚čをクăƒȘックしどBă‚’é…çœźïŒˆă‚‚ă†äž€ćșŠă‚ŻăƒȘăƒƒă‚Żă§ă‚­ăƒŁăƒłă‚»ăƒ«ïŒ‰", + "Then click the globe to place the destination": "æŹĄă«ćœ°çƒă‚’ă‚ŻăƒȘăƒƒă‚Żă—ăŠç›źçš„ćœ°ă‚’é…çœź", + "Swap A and B": "AずBă‚’ć…„ă‚Œæ›żăˆ", + "FLY ···": "éŁ›èĄŒ ···", + "FLYING": "éŁ›èĄŒäž­", + "FLY": "éŁ›èĄŒ", + "Fly the camera along the route": "ăƒ«ăƒŒăƒˆă«æČżăŁăŠă‚«ăƒĄăƒ©ă‚’éŁ›èĄŒ", + "Place A and B first": "ć…ˆă«AずBă‚’é…çœźă—ăŠăă ă•ă„", + "action|CLEAR": "æ¶ˆćŽ»", + "Remove the route and both markers": "ăƒ«ăƒŒăƒˆăšäžĄæ–čăźăƒžăƒŒă‚«ăƒŒă‚’ć‰Šé™€", + "press Escape twice to leave Draw": "Escを2ć›žæŠŒă—ăŠæç”»ă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "{name} is active — turn {name} off, then set {endpoint}": "{name}ă‚’äœżç”šäž­ă§ă™ă€‚{name}をă‚Șăƒ•ă«ă—ăŠă‹ă‚‰{endpoint}ă‚’èš­ćźšă—ăŠăă ă•ă„", + "{name} is active — {leave}, then set {endpoint}": "{name}ă‚’äœżç”šäž­ă§ă™ă€‚ć…ˆă«{leave}ă€‚ăăźćŸŒă€{endpoint}ă‚’èš­ćźšă—ăŠăă ă•ă„", + "Only the first {count} turns of this route are shown": "ă“ăźăƒ«ăƒŒăƒˆăŻæœ€ćˆăź{count}ä»¶ăźæĄˆć†…ăźăżèĄšç€șă—ăŠă„ăŸă™", + "Turn-by-turn directions": "ă‚żăƒŒăƒłăƒă‚€ă‚żăƒŒăƒłăźăƒ«ăƒŒăƒˆæĄˆć†…", + "Another map tool is using clicks — close it, then SET A again": "ćˆ„ăźćœ°ć›łăƒ„ăƒŒăƒ«ăŒă‚ŻăƒȘăƒƒă‚Żă‚’äœżç”šäž­ă§ă™ă€‚ăăźăƒ„ăƒŒăƒ«ă‚’é–‰ă˜ăŠă‹ă‚‰ă€ă‚‚ă†äž€ćșŠïŒ»Aă‚’èš­ćźšïŒœă‚’æŠŒă—ăŠăă ă•ă„", + "Routing
": "ăƒ«ăƒŒăƒˆæ€œçŽąäž­â€Š", + "No route found": "ăƒ«ăƒŒăƒˆăŒèŠ‹ă€ă‹ă‚ŠăŸă›ă‚“", + "{distance} · {duration} · {mode} · first {count} turns": "{distance} · {duration} · {mode} · æœ€ćˆăź{count}ä»¶ăźæĄˆć†…", + "{distance} · {duration} · {mode}": "{distance} · {duration} · {mode}", + "Click the globe to place {endpoint}": "朰球をクăƒȘックしど{endpoint}ă‚’é…çœź", + "SET B, then click the globe": "Bă‚’èš­ćźšïŒœă‚’æŠŒă—ăŠă‹ă‚‰ćœ°çƒă‚’ă‚ŻăƒȘック", + "SET A, then click the globe": "Aă‚’èš­ćźšïŒœă‚’æŠŒă—ăŠă‹ă‚‰ćœ°çƒă‚’ă‚ŻăƒȘック", + "Step {step} of {total} · then {leg}": "ă‚čテップ {step}/{total} · æŹĄă«{leg}", + "Step {step} of {total}": "ă‚čテップ {step}/{total}", + "Then: {instruction}": "æŹĄïŒš{instruction}", + "No route found between A and B": "AずBăźé–“ă«ăƒ«ăƒŒăƒˆăŒèŠ‹ă€ă‹ă‚ŠăŸă›ă‚“", + "Routing failed: {error}": "ăƒ«ăƒŒăƒˆæ€œçŽąă«ć€±æ•—ă—ăŸă—ăŸïŒš{error}", + "Routing timed out": "ăƒ«ăƒŒăƒˆæ€œçŽąăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸ", + "Routing unavailable — no response from the routing service": "ăƒ«ăƒŒăƒˆæ€œçŽąă‚’ćˆ©ç”šă§ăăŸă›ă‚“ïŒšăƒ«ăƒŒăƒˆæ€œçŽąă‚”ăƒŒăƒ“ă‚čă‹ă‚‰ćżœç­”ăŒă‚ă‚ŠăŸă›ă‚“", + "Earthquake source unavailable": "ćœ°éœ‡ăźă‚œăƒŒă‚čă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Focus fire detection {title}, {details}": "火灜怜矄{title}ă«ăƒ•ă‚©ăƒŒă‚«ă‚č{details}", + "live feed unavailable": "ăƒ©ă‚€ăƒ–ăƒ•ă‚ŁăƒŒăƒ‰ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "{value} conf": "äżĄé ŒćșŠ {value}", + "{value} ago": "{value}才", + "sensor n/a": "ă‚»ăƒłă‚”ăƒŒäžæ˜Ž", + "FIRE · {frp} MW": "火灜 · {frp} MW", + "NIGHT": "ć€œé–“", + "â–Č {frp} MW": "â–Č {frp} MW", + "FIRE": "火灜", + "FIRES": "火灜", + "max {value} MW": "æœ€ć€§ {value} MW", + "new {value}": "新芏 {value}", + "{value}°N": "{value}°N", + "{value}°S": "{value}°S", + "{value}°E": "{value}°E", + "{value}°W": "{value}°W", + "just now": "ăŸăŁăŸä»Š", + "<1m ago": "1ćˆ†ä»„ć†…", + "{count}m ago": "{count}戆才", + "{count}h ago": "{count}æ™‚é–“ć‰", + "fire confidence|high": "高", + "fire confidence|nominal": "äž­", + "fire confidence|low": "䜎", + "age|<1h": "1æ™‚é–“ä»„ć†…", + "age|{count}h": "{count}時間", + "age|{count}d": "{count}æ—„", + "STALE · cached {age}": "æ›Žæ–°é…ć»¶ · ă‚­ăƒŁăƒƒă‚·ăƒ„ {age}", + "refreshing...": "曎新䞭 ", + "loading...": "èȘ­èŸŒäž­â€Š", + "KEY REQUIRED": "ă‚­ăƒŒăŒćż…èŠ", + "LIVE · updated {age}": "ăƒ©ă‚€ăƒ– · 曎新 {age}", + "Source snapshot time unavailable": "ă‚œăƒŒă‚čたă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆæ™‚ćˆ»ă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "Live data unavailable": "ăƒ©ă‚€ăƒ–ăƒ‡ăƒŒă‚żă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Intel Picture": "æƒ…ć‹ąć›ł", + "Kinetic 30d": "30æ—„é–“ăźè»äș‹èĄŒć‹•", + "Border Crisis": "ć›œćąƒć±æ©Ÿ", + "Iran Picture": "ă‚€ăƒ©ăƒłæƒ…ć‹ąć›ł", + "Iran Kinetic": "ă‚€ăƒ©ăƒłăźè»äș‹èĄŒć‹•", + "Yemen FLOT": "ă‚€ă‚šăƒĄăƒłć‰ç·šïŒˆFLOT", + "Latest Drop": "æœ€æ–°ăźć…Źé–‹", + "GhostMaps file could not be read": "GhostMapsăƒ•ă‚Ąă‚€ăƒ«ă‚’èȘ­ăżć–ă‚ŒăŸă›ă‚“ă§ă—ăŸ", + "{count} source links ↗ · click card to open the first": { + "other": "ă‚œăƒŒă‚čăƒȘンク{count}ä»¶ ↗ · ă‚«ăƒŒăƒ‰ă‚’ă‚ŻăƒȘăƒƒă‚Żă§æœ€ćˆăźăƒȘンクを開く" + }, + "S2 · {name}": "S2 · {name}", + "Report": "ăƒŹăƒăƒŒăƒˆ", + "Open the source for {title}": "{title}ăźă‚œăƒŒă‚čを開く", + "GhostMaps catalog unavailable": "GhostMapsă‚«ă‚żăƒ­ă‚°ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "LIVE · GitHub {commit} · {message} · checked every {seconds}s": "ăƒ©ă‚€ăƒ– · GitHub {commit} · {message} · {seconds}秒ごずにçąșèȘ", + "GitHub {commit} · {message} · reconnecting for live updates": "GitHub {commit} · {message} · ăƒ©ă‚€ăƒ–æ›Žæ–°ăźăŸă‚ć†æŽ„ç¶šäž­", + "Connecting to the S2 GhostMaps repository
": "S2 GhostMapsăƒȘポゾトăƒȘă«æŽ„ç¶šäž­â€Š", + "{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はこれらぼKMZプロダクトをGitHubă§ć…Źé–‹ă—ăŠă„ăŸă™ă€‚æ–°ă—ă„ă‚ąăƒƒăƒ—ăƒ­ăƒŒăƒ‰ăŻæ•°ç§’ä»„ć†…ă«æ€œć‡șă•ă‚Œă€ä»„ć‰ăźç‰ˆăšè‡Șć‹•çš„ă«çœźăæ›ă‚ă‚ŠăŸă™ă€‚ăƒžăƒŒă‚«ăƒŒă‚’ă‚ŻăƒȘăƒƒă‚Żă™ă‚‹ăšăƒŹăƒăƒŒăƒˆă‚’èĄšç€șă—ăŸă™ă€‚", + "Malformed GhostMaps catalog": "GhostMapsă‚«ă‚żăƒ­ă‚°ăźćœąćŒăŒäžæ­Łă§ă™", + "Low-accuracy score < 2%": "䜎çČŸćșŠă‚čコケ < 2%", + "Low-accuracy score 2–10%": "䜎çČŸćșŠă‚čコケ 2–10%", + "Low-accuracy score > 10%": "䜎çČŸćșŠă‚čコケ > 10%", + "GNSS integrity source unavailable": "GNSSă‚€ăƒłăƒ†ă‚°ăƒȘăƒ†ă‚Łăźă‚œăƒŒă‚čă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Regional sample · 250 nm radius · cells from visited views over 30 min": "ćœ°ćŸŸă‚”ăƒłăƒ—ăƒ« · ćŠćŸ„250攷里 · 30ćˆ†ä»„ć†…ă«èĄšç€șă—ăŸăƒ“ăƒ„ăƒŒăźă‚»ăƒ«", + "Retrying automatically at {time} UTC": "{time} UTCにè‡Șć‹•ă§ć†è©ŠèĄŒă—ăŸă™", + "Retrying automatically after provider cooldown": "ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒăźă‚ŻăƒŒăƒ«ăƒ€ă‚ŠăƒłćŸŒă«è‡Șć‹•ă§ć†è©ŠèĄŒă—ăŸă™", + "Updates automatically after pan or zoom and once a minute. The public feed covers a 250-nautical-mile circle around the view centre; zooming out does not make it a worldwide snapshot. Blank cells are outside sampled coverage or have insufficient observations.": "パンやă‚șăƒŒăƒ ăźćŸŒă€ăŠă‚ˆăł1ćˆ†ă”ăšă«è‡Șć‹•ă§æ›Žæ–°ă•ă‚ŒăŸă™ă€‚ć…Źé–‹ăƒ•ă‚ŁăƒŒăƒ‰ăŻèĄšç€șäž­ćżƒă‹ă‚‰ćŠćŸ„250æ”·é‡Œăźć††ă‚’ă‚«ăƒăƒŒă—ăŸă™ă€‚ă‚șăƒŒăƒ ă‚ąă‚Šăƒˆă—ăŠă‚‚ć…šäž–ç•Œăźă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆă«ăŻăȘă‚ŠăŸă›ă‚“ă€‚ç©șç™œăźă‚»ăƒ«ăŻă€ă‚”ăƒłăƒ—ăƒȘング範ć›Čć€–ă‹èŠłæžŹăŒäžććˆ†ă§ă™ă€‚", + "Low-accuracy score = 100 × max(0, bad − 1) / total: one aircraft is discounted, so this is not the raw share. Cells need {aircraft} aircraft over {minutes} minutes. Navigation-integrity anomalies are not a detection of jamming or spoofing.": "䜎çČŸćșŠă‚čコケ = 100 × max(0, bad − 1) / totalèˆȘç©ș機1æ©Ÿćˆ†ă‚’ć·źă—ćŒ•ăăŸă‚ă€ć˜çŽ”ăȘć‰Čćˆă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ă‚»ăƒ«ă«ăŻ{minutes}戆間で{aircraft}æ©ŸăźèˆȘç©șæ©ŸăŒćż…èŠă§ă™ă€‚èˆȘæł•ă‚€ăƒłăƒ†ă‚°ăƒȘăƒ†ă‚Łăźç•°ćžžăŻă€ćŠšćźłïŒˆă‚žăƒŁăƒŸăƒłă‚°ïŒ‰ă‚„ăȘă‚Šă™ăŸă—ïŒˆă‚čăƒ—ăƒŒăƒ•ă‚Łăƒłă‚°ïŒ‰ă‚’æ€œć‡șă—ăŸă“ăšă‚’æ„ć‘łă—ăŸă›ă‚“ă€‚", + "GNSS snapshot needs a view anchor": "GNSSă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆă«ăŻăƒ“ăƒ„ăƒŒăźă‚ąăƒłă‚«ăƒŒăŒćż…èŠă§ă™", + "GNSS feed rate limited (HTTP 429)": "GNSSăƒ•ă‚ŁăƒŒăƒ‰ăŒăƒŹăƒŒăƒˆćˆ¶é™äž­ă§ă™ïŒˆHTTP 429", + "Malformed GNSS integrity snapshot": "GNSSă‚€ăƒłăƒ†ă‚°ăƒȘティぼă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆăźćœąćŒăŒäžæ­Łă§ă™", + "GNSS integrity snapshot has no observation time": "GNSSă‚€ăƒłăƒ†ă‚°ăƒȘティぼă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆă«èŠłæžŹæ™‚ćˆ»ăŒă‚ă‚ŠăŸă›ă‚“", + "installation class|AIRFIELD": "éŁ›èĄŒć Ž", + "installation class|NAVAL BASE": "攷軍ćŸș㜰", + "installation class|RANGE": "ć°„æ’ƒć Ž", + "installation class|MILITARY LAND": "è»ç”šćœ°", + "installation class|BASE": "ćŸș㜰", + "installation class|BARRACKS": "ć…”èˆŽ", + "installation class|TRAINING AREA": "蚓緎ćŒș㟟", + "installation class|PLACES CANDIDATE": "Placesć€™èŁœ", + "installation class|INSTALLATION": "斜蚭", + "No mapped sites within {km} km of the contact": "コンタクトから{km} kmä»„ć†…ă«ăƒžăƒƒăƒ—æžˆăżæ–œèš­ăŻă‚ă‚ŠăŸă›ă‚“", + "{count} mapped sites within {km} km of the contact": { + "other": "コンタクトから{km} kmä»„ć†…ăźăƒžăƒƒăƒ—æžˆăżæ–œèš­ {count}ă‹æ‰€" + }, + "No mapped sites in view": "èĄšç€ș範ć›Čć†…ă«ăƒžăƒƒăƒ—æžˆăżæ–œèš­ăŻă‚ă‚ŠăŸă›ă‚“", + "{count} mapped sites in view": { + "other": "èĄšç€ș範ć›Čć†…ăźăƒžăƒƒăƒ—æžˆăżæ–œèš­ {count}ă‹æ‰€" + }, + "loading mapped installation context": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­ăźă‚łăƒłăƒ†ă‚­ă‚čトをèȘ­ăżèŸŒăżäž­", + "Too many mapped sites in view to list them all": "èĄšç€ș範ć›Čć†…ăźăƒžăƒƒăƒ—æžˆăżæ–œèš­ăŒć€šă™ăŽăŠă€ă™ăčăŠă‚’äž€èŠ§èĄšç€șă§ăăŸă›ă‚“", + "Installation context unavailable": "æ–œèš­ăźæƒ…ć ±ă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "MAPPED INSTALLATION": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­", + "Unknown": "䞍明", + "LAUNCH SITE · {site}": "氄栮 · {site}", + "LAUNCH SITE": "氄栮", + "T−{time} · {mission}": "T−{time} · {mission}", + "LAUNCH STANDBY": "æ‰“ăĄäžŠă’ćŸ…æ©Ÿ", + "LIFTOFF · {mission}": "ăƒȘフトă‚Șフ · {mission}", + "ASCENT REPLAY · {mission}": "䞊昇ăƒȘăƒ—ăƒŹă‚€ · {mission}", + "ASCENT ESTIMATE · {mission}": "äžŠæ˜‡æŽšćźš · {mission}", + "STAGE RE-ENTRY / RECOVERY · {mission}": "æź”ăźć†çȘć…„ / 曞揎 · {mission}", + "ORBIT REPLAY · {mission}": "軌道ăƒȘăƒ—ăƒŹă‚€ · {mission}", + "PAUSED · {title}": "äž€æ™‚ćœæ­ą · {title}", + "UNSPECIFIED": "æœȘæŒ‡ćźš", + "+{count} additional payload records": "èżœćŠ ăźăƒšă‚€ăƒ­ăƒŒăƒ‰èš˜éŒČ +{count}ä»¶", + "PAYLOAD DATA UNAVAILABLE": "ăƒšă‚€ăƒ­ăƒŒăƒ‰ăƒ‡ăƒŒă‚żăȘし", + "{value} KM DOWNRANGE": "ダォンレンゾ {value} km", + "POSITION UNAVAILABLE": "äœçœźă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "FLIGHT {count}": "{count}ć›žç›źăźéŁ›èĄŒ", + "REUSED": "ć†äœżç”š", + "NO STAGE RE-ENTRY / RECOVERY DATA": "æź”ăźć†çȘć…„ / ć›žćŽăƒ‡ăƒŒă‚żăȘし", + "{count} / 30D": "{count} / 30æ—„", + "NO MISSIONS AVAILABLE IN THE CURRENT 30-DAY WINDOW": "çŸćœšăź30æ—„é–“ă«è©Čćœ“ă™ă‚‹ăƒŸăƒƒă‚·ăƒ§ăƒłăŻă‚ă‚ŠăŸă›ă‚“", + "DATE UNAVAILABLE": "旄付䞍明", + "UNSPECIFIED OPERATOR": "運甚者æœȘæŒ‡ćźš", + "Select {mission}": "{mission}ă‚’éžæŠž", + "{value} KM": "{value} km", + "{value} KM/S": "{value} km/s", + "Selected Space Mission": "éžæŠžäž­ăźćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒł", + "SELECTED SPACE MISSION": "éžæŠžäž­ăźćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒł", + "Show all missions": "すăčăŠăźăƒŸăƒƒă‚·ăƒ§ăƒłă‚’èĄšç€ș", + "Deselect mission": "ăƒŸăƒƒă‚·ăƒ§ăƒłăźéžæŠžă‚’è§Łé™€", + "MISSION": "ăƒŸăƒƒă‚·ăƒ§ăƒł", + "STATUS · ": "ă‚čăƒ†ăƒŒă‚żă‚č · ", + "LAUNCH SITE · ": "氄栮 · ", + "LAUNCH TIME · ": "æ‰“ăĄäžŠă’æ™‚ćˆ» · ", + "ORBIT · ": "軌道 · ", + "ASCENT PATH · ": "äžŠæ˜‡ç”Œè·Ż · ", + "CURRENT DISTANCE FROM EARTH · ": "çŸćœšăźćœ°çƒă‹ă‚‰ăźè·é›ą · ", + "SATELLITE SPEED · ": "èĄ›æ˜Ÿé€ŸćșŠ Â· ", + "PAYLOAD": "ăƒšă‚€ăƒ­ăƒŒăƒ‰", + "NAME": "損称", + "TYPE": "皟戄", + "DESTINATION": "盼的朰", + "STAGE / RE-ENTRY / RECOVERY": "æź” / 憍çȘć…„ / 曞揎", + "STAGE": "æź”", + "STATUS": "ă‚čăƒ†ăƒŒă‚żă‚č", + "FINAL POSITION": "æœ€ç”‚äœçœź", + "REPLAY SPEED": "ăƒȘăƒ—ăƒŹă‚€é€ŸćșŠ", + "Replay speed multiplier": "ăƒȘăƒ—ăƒŹă‚€é€ŸćșŠăźć€çއ", + "REPLAY ASCENT": "äžŠæ˜‡ă‚’ăƒȘăƒ—ăƒŹă‚€", + "Previous mission": "ć‰ăźăƒŸăƒƒă‚·ăƒ§ăƒł", + "PREV": "才ま", + "Next mission": "æŹĄăźăƒŸăƒƒă‚·ăƒ§ăƒł", + "SHOW ALL / DESELECT": "すăčăŠèĄšç€ș / éžæŠžè§Łé™€", + "Pause replay": "ăƒȘăƒ—ăƒŹă‚€ă‚’äž€æ™‚ćœæ­ą", + "Cancel replay": "ăƒȘăƒ—ăƒŹă‚€ă‚’äž­æ­ą", + "EST. DOWNRANGE": "æŽšćźšăƒ€ă‚ŠăƒłăƒŹăƒłă‚ž", + "PLANNED · ": "蚈画 · ", + "SUPPLIED TRAJECTORY POINTS": "æäŸ›ă•ă‚ŒăŸè»Œé“ç‚č", + "RECONSTRUCTED ESTIMATE": "ć†æ§‹æˆă«ă‚ˆă‚‹æŽšćźš", + "Replay the estimated ascent with a following camera": "èżœćŸ“ă‚«ăƒĄăƒ©ă§ă€æŽšćźšă•ă‚ŒăŸäžŠæ˜‡ă‚’ăƒȘăƒ—ăƒŹă‚€ă—ăŸă™", + "Resume replay": "ăƒȘăƒ—ăƒŹă‚€ă‚’ć†é–‹", + "T minus {seconds}": "æ‰“ăĄäžŠă’{seconds}秒才", + "Preparing launch site": "氄栮をæș–悙䞭", + "Liftoff": "ăƒȘフトă‚Șフ", + "Ascent replay": "䞊昇ăƒȘăƒ—ăƒŹă‚€", + "Orbit replay": "軌道ăƒȘăƒ—ăƒŹă‚€", + ", paused": "ă€äž€æ™‚ćœæ­ąäž­", + "Malformed launch snapshot": "æ‰“ăĄäžŠă’ă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆăźćœąćŒăŒäžæ­Łă§ă™", + "Heard by your receiver": "ć—äżĄæ©Ÿă§ć—äżĄ", + "1090 MHz": "1090 MHz", + "978 MHz UAT": "978 MHz UAT", + "browser SDR": "ăƒ–ăƒ©ă‚Šă‚¶ăƒŒSDR", + "decoder feed": "ăƒ‡ă‚łăƒŒăƒ€ăƒŒăƒ•ă‚ŁăƒŒăƒ‰", + "Your RTL-SDR receiver and decoder feed": "ăŠäœżă„ăźRTL-SDRć—äżĄæ©Ÿăšăƒ‡ă‚łăƒŒăƒ€ăƒŒăƒ•ă‚ŁăƒŒăƒ‰", + "Your decoder feed": "ăŠäœżă„ăźăƒ‡ă‚łăƒŒăƒ€ăƒŒăƒ•ă‚ŁăƒŒăƒ‰", + "Your RTL-SDR receiver": "ăŠäœżă„ăźRTL-SDRć—äżĄæ©Ÿ", + "NO CALLSIGN": "ă‚łăƒŒăƒ«ă‚”ă‚€ăƒłăȘし", + "ALT {altitude} FT · GS {speed} KT · TRK {track}": "高ćșŠ {altitude} ft · ćŻŸćœ°é€ŸćșŠ {speed} kt · ćŻŸćœ°é‡è·Ż {track}", + "V/S {rate}": "昇降率 {rate}", + "V/S {rate} FPM": "昇降率 {rate} ft/min", + "POSITION {age}": "äœçœź {age}", + "POSITION {seconds} S AGO": "äœçœź {seconds}秒才", + "{count} MSGS": { + "other": "ăƒĄăƒƒă‚»ăƒŒă‚ž {count}ä»¶" + }, + "Decoder feeds": "ăƒ‡ă‚łăƒŒăƒ€ăƒŒăƒ•ă‚ŁăƒŒăƒ‰", + "WebUSB + decoder feeds": "WebUSB + ăƒ‡ă‚łăƒŒăƒ€ăƒŒăƒ•ă‚ŁăƒŒăƒ‰", + "opening receiver": "ć—äżĄæ©Ÿă‚’é–‹ă„ăŠă„ăŸă™", + "checking decoder feeds": "ăƒ‡ă‚łăƒŒăƒ€ăƒŒăƒ•ă‚ŁăƒŒăƒ‰ă‚’çąșèȘäž­", + "WebUSB needs desktop Chrome or Edge": "WebUSBă«ăŻăƒ‡ă‚čクトップ版ChromeăŸăŸăŻEdgeăŒćż…èŠă§ă™", + "connect a receiver in Radio": "ăƒ©ă‚žă‚Șă§ć—äżĄæ©Ÿă‚’æŽ„ç¶šă—ăŠăă ă•ă„", + "receiver is in FM mode": "ć—äżĄæ©ŸăŻFMăƒąăƒŒăƒ‰ă§ă™", + "listening": "揗信侭", + "USB error": "USBă‚šăƒ©ăƒŒ", + "Alt unknown": "高ćșŠäžæ˜Ž", + "Type unknown": "æ©Ÿçšźäžæ˜Ž", + "Reg unknown": "登éŒČèš˜ć·äžæ˜Ž", + "Operator unknown": "運èˆȘ者䞍明", + "${amount}K": "${amount}K", + "${amount}M": "${amount}M", + "${amount}B": "${amount}B", + "fire cause|Human": "äșșç‚ș", + "fire cause|Natural": "è‡Ș然", + "fire cause|Undetermined": "æœȘçąș漚", + "fire cause|Unknown": "䞍明", + "fire behavior|Minimal": "ćŸźćŒ±", + "fire behavior|Moderate": "侭繋ćșŠ", + "fire behavior|Active": "掻ç™ș", + "fire behavior|Extreme": "æ„”ă‚ăŠæŽ»ç™ș", + "Type {level} Incident": "ă‚żă‚€ăƒ—{level}ă‚€ăƒłă‚·ăƒ‡ăƒłăƒˆ", + "age|{count}m": "{count}戆", + "{acres} ac": { + "other": "{acres}ă‚šăƒŒă‚«ăƒŒ" + }, + "{percent}% contained": "ć°ă˜èŸŒă‚çŽ‡ {percent}%", + "containment unknown": "ć°ă˜èŸŒă‚çŽ‡äžæ˜Ž", + "{cause} cause": "ćŽŸć› ïŒš{cause}", + "{personnel} personnel": { + "other": "äșș擡{personnel}äșș" + }, + "{county} County": "{county}郥", + "{cost} to date": "ă“ă‚ŒăŸă§ăźèȻ甚 {cost}", + "discovered {age} ago": "{age}ć‰ă«ç™ș芋", + "updated {age} ago": "{age}ć‰ă«æ›Žæ–°", + "part of {complex}": "{complex}ぼ侀郹", + "InciWeb ↗ · click card to open": "InciWeb ↗ · ă‚«ăƒŒăƒ‰ă‚’ă‚ŻăƒȘックで開く", + "FIRE · {name}": "火灜 · {name}", + "Unnamed incident": "損称æœȘèš­ćźšăźç«çœ", + "Open {title} on InciWeb": "InciWebで{title}を開く", + "Perimeter source unavailable": "ć»¶ç„ŒçŻ„ć›Čăźă‚œăƒŒă‚čă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Not contained or unknown": "ć°ă˜èŸŒă‚çŽ‡0%ăŸăŸăŻäžæ˜Ž", + "Under 50% contained": "ć°ă˜èŸŒă‚çŽ‡50%æœȘæș€", + "50–99% contained": "ć°ă˜èŸŒă‚çŽ‡50–99%", + "Fully contained": "ć°ă˜èŸŒă‚çŽ‡100%", + "Colour shows reported containment. Perimeters are simplified to about 100 m.": "è‰ČăŻć ±ć‘Šă•ă‚ŒăŸć°ă˜èŸŒă‚çŽ‡ă‚’ç€șă—ăŸă™ă€‚ć»¶ç„ŒçŻ„ć›ČたèŒȘ郭は箄100 mたçČŸćșŠă§ç°Ąç•„ćŒ–ă•ă‚ŒăŠă„ăŸă™ă€‚", + "Malformed perimeter snapshot": "ć»¶ç„ŒçŻ„ć›Čă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆăźćœąćŒăŒäžæ­Łă§ă™", + "radio tag|All": "すăčお", + "News": "ăƒ‹ăƒ„ăƒŒă‚č", + "Talk": "ăƒˆăƒŒă‚Ż", + "Weather / Emergency": "æ°—è±Ą / 緊怄", + "Public Safety": "è­ŠćŻŸăƒ»æ¶ˆé˜Č", + "Aviation / Marine": "èˆȘç©ș / æ”·äș‹", + "Traffic / Transit": "äș€é€š / ć…Źć…±äș€é€š", + "Music": "éŸłæ„œ", + "Other": "ăăźä»–", + "Directory refresh degraded; showing the previous station catalog.": "ディレクトăƒȘăźæ›Žæ–°ăŒäžćźŒć…šă§ă™ă€‚ć‰ć›žăźć±€ă‚«ă‚żăƒ­ă‚°ă‚’èĄšç€șă—ăŠă„ăŸă™ă€‚", + "Radio directory coverage is degraded.": "ăƒ©ă‚žă‚ȘディレクトăƒȘăźă‚«ăƒăƒŒçŻ„ć›Čが侍漌慹です。", + "Directory refresh failed; showing the previous station catalog.": "ディレクトăƒȘăźæ›Žæ–°ă«ć€±æ•—ă—ăŸă—ăŸă€‚ć‰ć›žăźć±€ă‚«ă‚żăƒ­ă‚°ă‚’èĄšç€șă—ăŠă„ăŸă™ă€‚", + "Radio directory is temporarily unavailable.": "ăƒ©ă‚žă‚ȘディレクトăƒȘăŻäž€æ™‚çš„ă«ćˆ©ç”šă§ăăŸă›ă‚“ă€‚", + "radio|NEWS": "ăƒ‹ăƒ„ăƒŒă‚č", + "radio|TALK": "ăƒˆăƒŒă‚Ż", + "radio|WEATHER": "æ°—è±Ą", + "radio|SAFETY": "è­ŠćŻŸăƒ»æ¶ˆé˜Č", + "radio|AIR / SEA": "èˆȘç©ș / æ”·äș‹", + "radio|TRANSIT": "äș€é€š", + "radio|MUSIC": "éŸłæ„œ", + "radio|OTHER": "ăăźä»–", + "Broadcaster stream is unavailable or blocked by the browser.": "æ”Ÿé€ć±€ăźă‚čトăƒȘăƒŒăƒ ă‚’ćˆ©ç”šă§ăăȘă„ă‹ă€ăƒ–ăƒ©ă‚Šă‚¶ăƒŒă«ăƒ–ăƒ­ăƒƒă‚Żă•ă‚ŒăŠă„ăŸă™ă€‚", + "Playback requires a direct click or tap.": "ć†ç”Ÿă™ă‚‹ă«ăŻç›ŽæŽ„ă‚ŻăƒȘăƒƒă‚ŻăŸăŸăŻă‚żăƒƒăƒ—ă—ăŠăă ă•ă„ă€‚", + "Broadcaster stream could not be started.": "æ”Ÿé€ć±€ăźă‚čトăƒȘăƒŒăƒ ă‚’é–‹ć§‹ă§ăăŸă›ă‚“ă§ă—ăŸă€‚", + "Alternative": "ă‚Șăƒ«ă‚żăƒŠăƒ†ă‚Łăƒ–", + "Ambient": "ケンビスント", + "Blues": "ăƒ–ăƒ«ăƒŒă‚č", + "Classical": "ă‚Żăƒ©ă‚·ăƒƒă‚Ż", + "Country": "ă‚«ăƒłăƒˆăƒȘăƒŒ", + "Dance": "ダンă‚č", + "Electronic": "スレクトロニック", + "Folk": "ăƒ•ă‚©ăƒŒă‚Ż", + "Funk": "ファンク", + "Hip-Hop": "ヒップホップ", + "House": "ハォă‚č", + "Indie": "ă‚€ăƒłăƒ‡ă‚ŁăƒŒ", + "Jazz": "ゾャă‚ș", + "Latin": "ăƒ©ăƒ†ăƒł", + "Metal": "ăƒĄă‚żăƒ«", + "Oldies": "ă‚ȘăƒŒăƒ«ăƒ‡ă‚ŁăƒŒă‚ș", + "Pop": "ポップ", + "Punk": "パンク", + "R&B": "R&B", + "Reggae": "ハă‚Čス", + "Rock": "ロック", + "Soul": "ă‚œă‚Šăƒ«", + "Techno": "テクノ", + "Trance": "トランă‚č", + "World": "ăƒŻăƒŒăƒ«ăƒ‰", + "overview": "æŠ‚èŠł", + "cloud unknown": "é›Č量䞍明", + "{percent}% scene cloud": "ă‚·ăƒŒăƒłé›Č量 {percent}%", + "{min}–{max}% scene cloud": "ă‚·ăƒŒăƒłé›Č量 {min}–{max}%", + "Comparison in use by another scene": "æŻ”èŒƒæ©ŸèƒœăŻćˆ„ăźă‚·ăƒŒăƒłă§äœżç”šäž­ă§ă™", + "Esri map unavailable · no swipe": "Esriăƒžăƒƒăƒ—ćˆ©ç”šäžćŻ · ă‚čăƒŻă‚€ăƒ—æŻ”èŒƒäžćŻ", + "Swipe needs a globe map": "ă‚čăƒŻă‚€ăƒ—æŻ”èŒƒă«ăŻćœ°çƒć„€ăƒžăƒƒăƒ—ăŒćż…èŠă§ă™", + "Imagery stays on Esri · CLEAR to use Google 3D": "ç”»ćƒăŻEsriăźăŸăŸ · ïŒ»æ¶ˆćŽ»ïŒœă§Google 3Dă‚’äœżç”š", + "Imagery catalog unavailable": "ç”»ćƒă‚«ă‚żăƒ­ă‚°ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Catalog truncated · a newer clear day may exist": "ă‚«ă‚żăƒ­ă‚°çœç•„ă‚ă‚Š · ă‚ˆă‚Šæ–°ă—ă„é›Čぼ民ăȘă„æ—„ăŒă‚ă‚‹ćŻèƒœæ€§", + "{label} catalog unavailable · {detail}": "{label}ăźă‚«ă‚żăƒ­ă‚°ă‚’ćˆ©ç”šă§ăăŸă›ă‚“ · {detail}", + "Daily overview for today may still be empty until the pass": "ä»Šæ—„ăźæ—„æŹĄæŠ‚èŠłăŻă€èĄ›æ˜Ÿăźé€šéŽăŸă§ç©șăźć ŽćˆăŒă‚ă‚ŠăŸă™", + "Box and images cleared": "範ć›Čăšç”»ćƒă‚’æ¶ˆćŽ»ă—ăŸă—ăŸ", + "MORE DETAIL · 30 m": "高çČŸçŽ° · 30 m", + "Sentinel-2 and Landsat via HLS, 30 m, every 2–6 days": "HLSç”Œç”±ăźSentinel-2ずLandsat、30 m、2–6æ—„ă”ăš", + "DAILY OVERVIEW · 250 m": "æ—„æŹĄæŠ‚èŠł · 250 m", + "VIIRS daily mosaic, 250 m, follows broad changes; little detail under 25 km": "VIIRSăźæ—„æŹĄăƒąă‚¶ă‚€ă‚Żă€250 m。ćșƒćŸŸăźć€‰ćŒ–ă‚’èżœè·Ąă€‚25 kmæœȘæș€ăźçŻ„ć›Čă§ăŻçŽ°éƒšă‚’ă»ăŒćˆ€ćˆ„ă§ăăȘい", + "Sentinel-2": "Sentinel-2", + "Sentinel-2 via HLS": "Sentinel-2HLS甌由", + "Landsat 8/9": "Landsat 8/9", + "Landsat 8/9 via HLS": "Landsat 8/9HLS甌由", + "Daily overview": "æ—„æŹĄæŠ‚èŠł", + "Box edges must be finite": "範ć›Čăźç«ŻăŻæœ‰é™ăźć€€ă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™", + "Longitudes must be within ±180°": "甌ćșŠăŻÂ±180Â°ä»„ć†…ă§ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™", + "Select one side of the dateline": "æ—„ä»˜ć€‰æ›Žç·šăźç‰‡ćŽă‚’éžæŠžă—ăŠăă ă•ă„", + "Box must enclose an area": "ćč…ăšé«˜ă•ăźă‚ă‚‹çŻ„ć›Čă‚’éžæŠžă—ăŠăă ă•ă„", + "Add the full Starlink broadband shell (thousands of extra points)": "Starlinkăƒ–ăƒ­ăƒŒăƒ‰ăƒăƒłăƒ‰ă‚·ă‚§ăƒ«ć…šäœ“ă‚’èżœćŠ ïŒˆæ•°ćƒăźèżœćŠ ăƒă‚€ăƒłăƒˆïŒ‰", + "Loading the Starlink shell
": "Starlinkă‚·ă‚§ăƒ«ă‚’èȘ­ăżèŸŒăżäž­â€Š", + "Starlink {detail} — click to retry": "Starlink {detail}ïŒšă‚ŻăƒȘăƒƒă‚Żă§ć†è©ŠèĄŒ", + "load failed": "èȘ­èŸŒć€±æ•—", + "Showing the full Starlink shell — click for the core catalog only": "Starlinkă‚·ă‚§ăƒ«ć…šäœ“ă‚’èĄšç€șäž­ïŒšă‚ŻăƒȘăƒƒă‚Żă§ă‚łă‚ąă‚«ă‚żăƒ­ă‚°ăźăżă«æˆ»ă™", + "DENSE ···": "é«˜ćŻ†ćșŠ Â·Â·Â·", + "DENSE ✕": "é«˜ćŻ†ćșŠ âœ•", + "DENSE": "é«˜ćŻ†ćșŠ", + "CelesTrak unreachable": "CelesTrakă«æŽ„ç¶šă§ăăŸă›ă‚“", + "DOCKED · {name} · +{extra}": "ドッキング侭 · {name} · +{extra}", + "DOCKED · {name}": "ドッキング侭 · {name}", + "{name} needs the Google 3D map: choose it under MAP SOURCE": "{name}にはGoogle 3Dăƒžăƒƒăƒ—ăŒćż…èŠă§ă™ă€‚ăƒžăƒƒăƒ—ă‚œăƒŒă‚čă§éžæŠžă—ăŠăă ă•ă„", + "zoom in to a street to open {name}": "{name}ă‚’é–‹ăă«ăŻé€šă‚ŠăŸă§ă‚șăƒŒăƒ ă‚€ăƒł", + "loading coverage...": "ă‚«ăƒăƒŒçŻ„ć›ČをèȘ­ăżèŸŒăżäž­â€Š", + "No street-level imagery within {radius} m of that point": "そぼ朰ç‚čから{radius} m仄憅にă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ç”»ćƒăŻă‚ă‚ŠăŸă›ă‚“", + "No street-level imagery within {radius} m of the view centre": "èĄšç€ș侭濃から{radius} m仄憅にă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ç”»ćƒăŻă‚ă‚ŠăŸă›ă‚“", + "Zoom in to see street-level coverage": "ă‚șăƒŒăƒ ă‚€ăƒłă—ăŠă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ăźă‚«ăƒăƒŒçŻ„ć›Čă‚’èĄšç€ș", + "Point the camera at the ground for street-level coverage": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ăźă‚«ăƒăƒŒçŻ„ć›Čă‚’èŠ‹ă‚‹ă«ăŻă€ă‚«ăƒĄăƒ©ă‚’ćœ°éąă«ć‘ă‘ăŠăă ă•ă„", + "Coverage tile failed": "ă‚«ăƒăƒŒçŻ„ć›Čă‚żă‚€ăƒ«ăźèȘ­ăżèŸŒăżă«ć€±æ•—ă—ăŸă—ăŸ", + "The photo could not be loaded": "憙真をèȘ­ăżèŸŒă‚ăŸă›ă‚“ă§ă—ăŸ", + "{name} photo. ← and → step along the sequence. On a 360° photo, drag or use Shift+← →, ↑ ↓ to look around, and + − to zoom": "{name}ăźć†™çœŸă€‚â†ăšâ†’ă§ă‚·ăƒŒă‚±ăƒłă‚č憅を移拕。360Â°ć†™çœŸă§ăŻă€ăƒ‰ăƒ©ăƒƒă‚°ăŸăŸăŻShift+← →、↑ â†“ă§èŠ‹ć›žă—ă€+ −でă‚șăƒŒăƒ ", + "{name} street-level photo": "{name}たă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ć†™çœŸ", + "Previous photo in this sequence (←)": "ă“ăźă‚·ăƒŒă‚±ăƒłă‚čăźć‰ăźć†™çœŸïŒˆâ†ïŒ‰", + "Next photo in this sequence (→)": "ă“ăźă‚·ăƒŒă‚±ăƒłă‚čăźæŹĄăźć†™çœŸïŒˆâ†’ïŒ‰", + "Aim the middle of the view at a street to look for imagery there": "ç”»ćƒă‚’æŽąă™ă«ăŻă€èĄšç€șăźäž­ć€źă‚’é€šă‚Šă«ćˆă‚ă›ăŠăă ă•ă„", + "KEY REJECTED": "ă‚­ăƒŒăŒæ‹’ćŠă•ă‚ŒăŸă—ăŸ", + "GOOGLE_MAPS_API_KEY is not set": "GOOGLE_MAPS_API_KEYăŒèš­ćźšă•ă‚ŒăŠă„ăŸă›ă‚“", + "The Google Maps JavaScript API could not load": "Google Maps JavaScript APIをèȘ­ăżèŸŒă‚ăŸă›ă‚“ă§ă—ăŸ", + "Google Street View": "Googleă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒ", + "GOOGLE STREET VIEW": "Googleă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒ", + "Google refused GOOGLE_MAPS_API_KEY for Street View — check that the Maps JavaScript API is enabled for it and this site is an allowed referrer": "Googleがă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒăžăźGOOGLE_MAPS_API_KEYă‚’æ‹’ćŠă—ăŸă—ăŸă€‚ă“ăźă‚­ăƒŒă§Maps JavaScript APIăŒæœ‰ćŠčにăȘăŁăŠă„ă‚‹ă“ăšă€ă“ăźă‚”ă‚€ăƒˆăŒèš±ćŻă•ă‚ŒăŸăƒȘăƒ•ă‚Ąăƒ©ăƒŒă§ă‚ă‚‹ă“ăšă‚’çąșèȘă—ăŠăă ă•ă„", + "Street View did not answer — check the network, and that the Maps JavaScript API is enabled for GOOGLE_MAPS_API_KEY": "ă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒă‹ă‚‰ćżœç­”ăŒă‚ă‚ŠăŸă›ă‚“ă€‚ăƒăƒƒăƒˆăƒŻăƒŒă‚Żă€ăŠă‚ˆăłGOOGLE_MAPS_API_KEYでMaps JavaScript APIăŒæœ‰ćŠčにăȘっどいるこべをçąșèȘă—ăŠăă ă•ă„", + "click a street to open Street View": "通りをクăƒȘックしどă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒă‚’é–‹ă", + "Street View has no imagery for this place": "ă“ăźć Žæ‰€ăźă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒç”»ćƒăŻă‚ă‚ŠăŸă›ă‚“", + "KartaView has no position for this photo": "KartaViewă«ă“ăźć†™çœŸăźäœçœźæƒ…ć ±ăŒă‚ă‚ŠăŸă›ă‚“", + "The KartaView photo could not be loaded": "KartaViewぼ憙真をèȘ­ăżèŸŒă‚ăŸă›ă‚“ă§ă—ăŸ", + "zoom in to see KartaView coverage": "ă‚șăƒŒăƒ ă‚€ăƒłă—ăŠKartaViewăźă‚«ăƒăƒŒçŻ„ć›Čă‚’èĄšç€ș", + "no KartaView photos in view": "èĄšç€ș範ć›Č憅にKartaViewăźć†™çœŸăŻă‚ă‚ŠăŸă›ă‚“", + "KartaView is rate-limiting requests — they resume on their own": "KartaViewがăƒȘクスă‚čăƒˆă‚’ăƒŹăƒŒăƒˆćˆ¶é™äž­ă§ă™ă€‚è‡Șć‹•çš„ă«ć†é–‹ă•ă‚ŒăŸă™", + "KartaView’s photos here are archived and cannot be shown": "ă“ăźć Žæ‰€ăźKartaViewăźć†™çœŸăŻă‚ąăƒŒă‚«ă‚€ăƒ–æžˆăżăźăŸă‚èĄšç€șă§ăăŸă›ă‚“", + "KartaView did not filter this area in time — move the map to ask again": "KartaViewがこぼ範ć›Čă‚’æ™‚é–“ć†…ă«ç”žă‚ŠèŸŒă‚ăŸă›ă‚“ă§ă—ăŸă€‚ćœ°ć›łă‚’ć‹•ă‹ă—ăŠć†ćșŠăƒȘクスă‚čトしどください", + "None of KartaView’s photos here pass the imagery filter": "ă“ăźć Žæ‰€ăźKartaViewăźć†™çœŸăŻă„ăšă‚Œă‚‚ç”»ćƒăƒ•ă‚Łăƒ«ă‚żăƒŒă‚’é€šéŽă—ăŸă›ă‚“", + "KartaView did not answer in time — try again": "KartaViewă‹ă‚‰æ™‚é–“ć†…ă«ćżœç­”ăŒă‚ă‚ŠăŸă›ă‚“ă§ă—ăŸă€‚ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„", + "KartaView could not be reached — check the network": "KartaViewă«æŽ„ç¶šă§ăăŸă›ă‚“ă€‚ăƒăƒƒăƒˆăƒŻăƒŒă‚Żă‚’çąșèȘă—ăŠăă ă•ă„", + "KartaView sent an answer that could not be read": "KartaViewからèȘ­ăżć–ă‚ŒăȘă„ćżœç­”ăŒèż”ă•ă‚ŒăŸă—ăŸ", + "KartaView is rate-limiting requests": "KartaViewがăƒȘクスă‚čăƒˆă‚’ăƒŹăƒŒăƒˆćˆ¶é™äž­ă§ă™", + "KartaView sent too much data": "KartaViewă‹ă‚‰é€ă‚‰ă‚ŒăŸăƒ‡ăƒŒă‚żăŒć€šă™ăŽăŸă™", + "KartaView is rate-limiting requests — try again in a moment": "KartaViewがăƒȘクスă‚čăƒˆă‚’ăƒŹăƒŒăƒˆćˆ¶é™äž­ă§ă™ă€‚ă—ă°ă‚‰ăă—ăŠă‹ă‚‰ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„", + "KartaView has no such photo": "KartaViewă«ăăźć†™çœŸăŻă‚ă‚ŠăŸă›ă‚“", + "Mapillary rejected MAPILLARY_CLIENT_TOKEN — replace it in Provider Settings": "MapillaryがMAPILLARY_CLIENT_TOKENă‚’æ‹’ćŠă—ăŸă—ăŸă€‚ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźšă§çœźăæ›ăˆăŠăă ă•ă„", + "Coverage requests are being rate-limited — they resume on their own": "ă‚«ăƒăƒŒçŻ„ć›ČたăƒȘクスă‚čăƒˆăŒăƒŹăƒŒăƒˆćˆ¶é™äž­ă§ă™ă€‚è‡Șć‹•çš„ă«ć†é–‹ă•ă‚ŒăŸă™", + "The Panoramax photo could not be loaded": "Panoramaxぼ憙真をèȘ­ăżèŸŒă‚ăŸă›ă‚“ă§ă—ăŸ", + "Panoramax is busy — coverage resumes on its own": "PanoramaxăŒæ··é›‘ă—ăŠă„ăŸă™ă€‚ă‚«ăƒăƒŒçŻ„ć›Čăźć–ćŸ—ăŻè‡Șć‹•çš„ă«ć†é–‹ă•ă‚ŒăŸă™", + "no Panoramax photos in view": "èĄšç€ș範ć›Č憅にPanoramaxăźć†™çœŸăŻă‚ă‚ŠăŸă›ă‚“", + "no Panoramax photos here match the filters": "ă“ăźć Žæ‰€ă«ăƒ•ă‚Łăƒ«ă‚żăƒŒă«äž€è‡Žă™ă‚‹Panoramaxăźć†™çœŸăŻă‚ă‚ŠăŸă›ă‚“", + "Panoramax sent a map tile that could not be read": "PanoramaxからèȘ­ăżć–ă‚ŒăȘă„ćœ°ć›łă‚żă‚€ăƒ«ăŒèż”ă•ă‚ŒăŸă—ăŸ", + "This Panoramax photo is no longer available": "こぼPanoramaxăźć†™çœŸăŻćˆ©ç”šă§ăăȘくăȘă‚ŠăŸă—ăŸ", + "zoom in to see Panoramax coverage": "ă‚șăƒŒăƒ ă‚€ăƒłă—ăŠPanoramaxăźă‚«ăƒăƒŒçŻ„ć›Čă‚’èĄšç€ș", + "Panoramax did not answer in time — try again": "Panoramaxă‹ă‚‰æ™‚é–“ć†…ă«ćżœç­”ăŒă‚ă‚ŠăŸă›ă‚“ă§ă—ăŸă€‚ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„", + "Panoramax could not be reached — check the connection": "Panoramaxă«æŽ„ç¶šă§ăăŸă›ă‚“ă€‚æŽ„ç¶šă‚’çąșèȘă—ăŠăă ă•ă„", + "Panoramax sent too much data": "Panoramaxă‹ă‚‰é€ă‚‰ă‚ŒăŸăƒ‡ăƒŒă‚żăŒć€šă™ăŽăŸă™", + "Panoramax is busy": "PanoramaxăŒæ··é›‘ă—ăŠă„ăŸă™", + "Panoramax sent an unreadable answer": "PanoramaxからèȘ­ăżć–ă‚ŒăȘă„ćżœç­”ăŒèż”ă•ă‚ŒăŸă—ăŸ", + "Sequence images unavailable": "ă‚·ăƒŒă‚±ăƒłă‚čç”»ćƒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "No street-level imagery providers configured": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ç”»ćƒăźăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒăŒèš­ćźšă•ă‚ŒăŠă„ăŸă›ă‚“", + "(by upload date)": "ïŒˆă‚ąăƒƒăƒ—ăƒ­ăƒŒăƒ‰æ—„ćŸșæș–", + "Open the Street Level panel to view imagery": "ç”»ćƒă‚’èĄšç€șするには、ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ăƒ‘ăƒăƒ«ă‚’é–‹ă„ăŠăă ă•ă„", + "Image could not be opened": "ç”»ćƒă‚’é–‹ă‘ăŸă›ă‚“ă§ă—ăŸ", + "TeleGeography load failed": "TeleGeographyたèȘ­ăżèŸŒăżă«ć€±æ•—ă—ăŸă—ăŸ", + "UNAVAILABLE · {source} · Roads unavailable": "ćˆ©ç”šäžćŻ · {source} · é“è·Żă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Roads: {source}": "é“è·ŻïŒš{source}", + "TomTom roads unavailable while the traffic service is unreachable": "äș€é€šă‚”ăƒŒăƒ“ă‚čă«æŽ„ç¶šă§ăăȘい間はTomTomăźé“è·Żă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Hybrid unavailable while the traffic service is unreachable": "äș€é€šă‚”ăƒŒăƒ“ă‚čă«æŽ„ç¶šă§ăăȘă„é–“ăŻăƒă‚€ăƒ–ăƒȘăƒƒăƒ‰ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "TomTom roads need a TomTom key": "TomTomăźé“è·Żă«ăŻTomTomă‚­ăƒŒăŒćż…èŠă§ă™", + "Hybrid needs a TomTom key": "ăƒă‚€ăƒ–ăƒȘăƒƒăƒ‰ă«ăŻTomTomă‚­ăƒŒăŒćż…èŠă§ă™", + "Local surface still loading": "摹èŸșăźé“è·Żă‚’èȘ­ăżèŸŒăżäž­", + "Partial coverage": "äž€éƒšăźăżă‚«ăƒăƒŒ", + "Detailed roads unavailable": "è©łçŽ°ăȘé“è·Żă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Reduced detail coverage": "è©łçŽ°ăƒ‡ăƒŒă‚żăźă‚«ăƒăƒŒçŻ„ć›Čが限漚的", + "TomTom roads only, each with its live flow": "TomTomăźé“è·ŻăźăżïŒˆć„é“è·Żă«ăƒ©ă‚€ăƒ–ăźäș€é€šæ”ïŒ‰", + "TomTom roads only, each with its live flow (needs a TomTom key)": "TomTomăźé“è·ŻăźăżïŒˆć„é“è·Żă«ăƒ©ă‚€ăƒ–ăźäș€é€šæ”ă€TomTomă‚­ăƒŒăŒćż…èŠïŒ‰", + "OpenStreetMap roads, with TomTom flow matched when available": "OpenStreetMapăźé“è·ŻïŒˆćˆ©ç”šćŻèƒœăȘ栎搈はTomTomたäș€é€šæ”ă‚’ç…§ćˆïŒ‰", + "TomTom roads first; OpenStreetMap fills the rest, simulated": "TomTomăźé“è·Żă‚’ć„Șć…ˆă—ă€æź‹ă‚ŠăŻOpenStreetMapă§èŁœćźŒïŒˆă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒłïŒ‰", + "TomTom roads first; OpenStreetMap fills the rest, simulated (needs a TomTom key)": "TomTomăźé“è·Żă‚’ć„Șć…ˆă—ă€æź‹ă‚ŠăŻOpenStreetMapă§èŁœćźŒïŒˆă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒłă€TomTomă‚­ăƒŒăŒćż…èŠïŒ‰", + "Hybrid": "ăƒă‚€ăƒ–ăƒȘッド", + "TomTom key unavailable": "TomTomă‚­ăƒŒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "TomTom daily budget reached": "TomTomた1æ—„ăźäžŠé™ă«é”ă—ăŸă—ăŸ", + "TomTom upstream unreachable": "TomTomăźă‚”ăƒŒăƒ“ă‚čă«æŽ„ç¶šă§ăăŸă›ă‚“", + "TomTom flow unavailable": "TomTomたäș€é€šæ”ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "SIMULATED — {reason}": "ă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒłïŒš{reason}", + "Syncing flow · Roads: {source}": "äș€é€šæ”ă‚’ćŒæœŸäž­ · é“è·ŻïŒš{source}", + "LIVE · Roads: {source} · Roads without flow hidden": "ăƒ©ă‚€ăƒ– · é“è·ŻïŒš{source} · äș€é€šæ”ăźăȘă„é“è·ŻăŻéžèĄšç€ș", + "LIVE · Roads: {source} · No flow roads in view": "ăƒ©ă‚€ăƒ– · é“è·ŻïŒš{source} · èĄšç€ș範ć›Čにäș€é€šæ”ăźă‚ă‚‹é“è·ŻăȘし", + "LIVE · Roads: {source} · Flow {percent}%": "ăƒ©ă‚€ăƒ– · é“è·ŻïŒš{source} · äș€é€šæ” {percent}%", + "SIMULATED · Roads: {source} · Flow {percent}%": "ă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒł · é“è·ŻïŒš{source} · äș€é€šæ” {percent}%", + "STALE · Roads: {source} · Flow: cached TomTom tiles": "æ›Žæ–°é…ć»¶ · é“è·ŻïŒš{source} · äș€é€šæ”ïŒšă‚­ăƒŁăƒƒă‚·ăƒ„たTomTomă‚żă‚€ăƒ«", + "Syncing flow · Roads: OpenStreetMap · Flow: TomTom · Unmatched: simulated": "äș€é€šæ”ă‚’ćŒæœŸäž­ · é“è·ŻïŒšOpenStreetMap · äș€é€šæ”ïŒšTomTom · æœȘäž€è‡ŽïŒšă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒł", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov · Unmatched: simulated": "ăƒ©ă‚€ăƒ– · é“è·ŻïŒšOpenStreetMap · äș€é€šæ”ïŒšTomTom · ă‚«ăƒăƒŒçŽ‡ {percent}% · æœȘäž€è‡ŽïŒšă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒł", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov": "ăƒ©ă‚€ăƒ– · é“è·ŻïŒšOpenStreetMap · äș€é€šæ”ïŒšTomTom · ă‚«ăƒăƒŒçŽ‡ {percent}%", + "SIMULATED · Roads: OpenStreetMap · Flow: TomTom (no matches)": "ă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒł · é“è·ŻïŒšOpenStreetMap · äș€é€šæ”ïŒšTomTom䞀臎ăȘă—ïŒ‰", + "SIMULATED — traffic service unreachable": "ă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒłïŒšäș€é€šă‚”ăƒŒăƒ“ă‚čă«æŽ„ç¶šă§ăăŸă›ă‚“", + "SIMULATED — add TomTom key for live": "ă‚·ăƒŸăƒ„ăƒŹăƒŒă‚·ăƒ§ăƒłïŒšăƒ©ă‚€ăƒ–èĄšç€șにはTomTomă‚­ăƒŒă‚’èżœćŠ ", + "OpenFreeMap tiles rate-limited": "OpenFreeMapă‚żă‚€ăƒ«ăŒăƒŹăƒŒăƒˆćˆ¶é™äž­", + "OpenFreeMap tiles timed out": "OpenFreeMapă‚żă‚€ăƒ«ăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸ", + "OpenFreeMap tiles unavailable": "OpenFreeMapă‚żă‚€ăƒ«ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "occupancy|empty": "äč—ćźąăȘし", + "occupancy|many seats available": "ç©șćž­ć€šæ•°", + "occupancy|few seats available": "ç©ș澭わずか", + "occupancy|standing room only": "立づäč—りたみ", + "occupancy|crushed standing room only": "éžćžžă«æ··é›‘", + "occupancy|full": "æș€ć“Ą", + "occupancy|not accepting passengers": "äč—è»ŠäžćŻ", + "occupancy|not boardable": "äč—è»Šă§ăăŸă›ă‚“", + "Route {route}": "è·Żç·š {route}", + "Vehicle {vehicle}": "è»ŠäžĄ {vehicle}", + "vehicle motion|Stopped": "ćœè»Šäž­", + "No recent fix": "æœ€èż‘ăźæžŹäœăȘし", + "Waiting for update": "æ›Žæ–°ćŸ…ăĄ", + "Moving": "è”°èĄŒäž­", + "reported {speed} km/h": "ć ±ć‘Šé€ŸćșŠ {speed} km/h", + "reported hdg {heading}°": "栱摊æ–č䜍 {heading}°", + "Last report: stopped at stop {stop}": "æœ€ç”‚ć ±ć‘ŠïŒšćœç•™æ‰€{stop}ă«ćœè»Šäž­", + "Last report: arriving at stop {stop}": "æœ€ç”‚ć ±ć‘ŠïŒšćœç•™æ‰€{stop}ă«æŽ„èż‘äž­", + "Last report: next stop {stop}": "æœ€ç”‚ć ±ć‘ŠïŒšæŹĄăźćœç•™æ‰€{stop}", + "Shown at street level · depth not in the feed": "ćœ°èĄšăźé«˜ă•ă§èĄšç€ș · ăƒ•ă‚ŁăƒŒăƒ‰ă«æ·±ă•æƒ…ć ±ăȘし", + "Reported {seconds} s ago": "{seconds}ç§’ć‰ă«ć ±ć‘Š", + "Reported {minutes} min ago": "{minutes}ćˆ†ć‰ă«ć ±ć‘Š", + "shown {seconds} s behind": "{seconds}ç§’é…ă‚Œă§èĄšç€ș", + "{reported} (feed time)": "{reported}ïŒˆăƒ•ă‚ŁăƒŒăƒ‰æ™‚ćˆ»ïŒ‰", + "Available trail: {minutes} min (limited)": "ćˆ©ç”šćŻèƒœăȘè»Œè·ĄïŒš{minutes}ćˆ†ïŒˆćˆ¶é™ă‚ă‚ŠïŒ‰", + "Available trail: {minutes} min": "ćˆ©ç”šćŻèƒœăȘè»Œè·ĄïŒš{minutes}戆", + "Bus": "バă‚č", + "Tram": "è·Żéąé›»è»Š", + "Subway": "朰例鉄", + "Train": "鉄道", + "Ferry": "フェăƒȘăƒŒ", + "Transit vehicle": "ć…Źć…±äș€é€šè»ŠäžĄ", + "AIS: {name}": "AIS: {name}", + "{type} SPD: {speed} HDG: {heading}": "{type} SPD: {speed} HDG: {heading}", + "VESSEL": "èˆč舶", + "{speed}KT": "{speed} kt", + "{heading}DEG": "{heading}°", + "POS: LIVE": "POS: ăƒ©ă‚€ăƒ–", + "POS: {time}Z": "POS: {time}Z", + "AIS live load failed": "AISăƒ©ă‚€ăƒ–ăƒ‡ăƒŒă‚żăźèȘ­ăżèŸŒăżă«ć€±æ•—ă—ăŸă—ăŸ", + "awaiting first AIS position
": "æœ€ćˆăźAISäœçœźæƒ…ć ±ćŸ…ăĄâ€Š", + "awaiting usable AIS positions
": "ćˆ©ç”šćŻèƒœăȘAISäœçœźæƒ…ć ±ćŸ…ăĄâ€Š", + "awaiting first AIS message
": "æœ€ćˆăźAISăƒĄăƒƒă‚»ăƒŒă‚žćŸ…ăĄâ€Š", + "AISSTREAM_API_KEY not set": "AISSTREAM_API_KEYăŒèš­ćźšă•ă‚ŒăŠă„ăŸă›ă‚“", + "live feed unsupported": "ăƒ©ă‚€ăƒ–ăƒ•ă‚ŁăƒŒăƒ‰éžćŻŸćżœ", + "connecting to feed
": "ăƒ•ă‚ŁăƒŒăƒ‰ă«æŽ„ç¶šäž­â€Š", + "feed disconnected": "ăƒ•ă‚ŁăƒŒăƒ‰ćˆ‡æ–­", + "feed down": "ăƒ•ă‚ŁăƒŒăƒ‰ćœæ­ą", + "feed idle": "ăƒ•ă‚ŁăƒŒăƒ‰ćŸ…æ©Ÿäž­", + "API key rejected — check AISSTREAM_API_KEY": "APIă‚­ăƒŒăŒæ‹’ćŠă•ă‚ŒăŸă—ăŸă€‚AISSTREAM_API_KEYをçąșèȘă—ăŠăă ă•ă„", + "feed silent {seconds}s — no AIS data": "ăƒ•ă‚ŁăƒŒăƒ‰ç„Ąćżœç­” {seconds}秒AISăƒ‡ăƒŒă‚żăȘし", + "feed silent — no AIS data": "ăƒ•ă‚ŁăƒŒăƒ‰ç„Ąćżœç­”ïŒšAISăƒ‡ăƒŒă‚żăȘし", + "feed down — retrying slowly (attempt {attempt})": "ăƒ•ă‚ŁăƒŒăƒ‰ćœæ­ąïŒšäœŽé »ćșŠă§ć†è©ŠèĄŒäž­ïŒˆ{attempt}ć›žç›źïŒ‰", + "reconnecting to feed
 (attempt {attempt})": "ăƒ•ă‚ŁăƒŒăƒ‰ă«ć†æŽ„ç¶šäž­â€ŠïŒˆ{attempt}ć›žç›źïŒ‰", + "feed down — retrying slowly": "ăƒ•ă‚ŁăƒŒăƒ‰ćœæ­ąïŒšäœŽé »ćșŠă§ć†è©ŠèĄŒäž­", + "reconnecting to feed
": "ăƒ•ă‚ŁăƒŒăƒ‰ă«ć†æŽ„ç¶šäž­â€Š", + "Focus vessel {name}, MMSI {mmsi}": "èˆč舶{name}MMSI {mmsi}ïŒ‰ă«ăƒ•ă‚©ăƒŒă‚«ă‚č", + "Hidden by this map source · choose a globe map": "ă“ăźăƒžăƒƒăƒ—ă‚œăƒŒă‚čă§ăŻéžèĄšç€ș · ćœ°çƒć„€ăƒžăƒƒăƒ—ă‚’éžæŠžă—ăŠăă ă•ă„", + "Weather image HTTP {status}": "æ°—è±Ąç”»ćƒ HTTP {status}", + "Weather HTTP {status}": "æ°—è±Ą HTTP {status}", + "Frame unavailable; previous observation retained": "ăƒ•ăƒŹăƒŒăƒ ă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚ć‰ć›žăźèŠłæžŹă‚’äżæŒă—ăŠă„ăŸă™", + "Weather imagery unavailable": "æ°—è±Ąç”»ćƒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Weather source unavailable; previous observation retained": "æ°—è±Ąă‚œăƒŒă‚čă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚ć‰ć›žăźèŠłæžŹă‚’äżæŒă—ăŠă„ăŸă™", + "Weather unavailable": "æ°—è±Ąăƒ‡ăƒŒă‚żă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "No frame within {gap} min of {time}": "{time}ăźć‰ćŸŒ{gap}ćˆ†ä»„ć†…ă«ăƒ•ăƒŹăƒŒăƒ ăŒă‚ă‚ŠăŸă›ă‚“", + "No frame within {gap} h of {time}": "{time}ăźć‰ćŸŒ{gap}æ™‚é–“ä»„ć†…ă«ăƒ•ăƒŹăƒŒăƒ ăŒă‚ă‚ŠăŸă›ă‚“", + "{hours}h {minutes}m ago": "{hours}時間{minutes}戆才", + "{minutes}m ago": "{minutes}戆才", + "{state} · {time} · {lag}": "{state} · {time} · {lag}", + "Observed": "èŠłæžŹ", + "History": "ć±„æ­Ž", + "Observation unavailable": "èŠłæžŹă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Waiting for observation": "èŠłæžŹăƒ‡ăƒŒă‚żćŸ…ăĄ", + "{detail} · synced": "{detail} · ćŒæœŸæžˆăż", + "{detail} · nearest": "{detail} · æœ€ă‚‚èż‘ă„ăƒ•ăƒŹăƒŒăƒ ", + "RADAR REFLECTIVITY · dBZ": "ăƒŹăƒŒăƒ€ăƒŒćć°„ćŒ·ćșŠ Â· dBZ", + "LIGHTNING DENSITY · 15 min accumulation": "雷毆ćșŠ Â· 15ćˆ†é–“ç©çź—", + "GLOBAL INFRARED · hourly": "ć…šçƒè”€ć€– · 1æ™‚é–“ă”ăš", + "GOES INFRARED · ~5 min": "GOESè”€ć€– · 箄5戆ごべ", + "{state}: {time}": "{state}{time}", + "Latest observation": "æœ€æ–°ăźèŠłæžŹ", + "frame {index}/{total}": "ăƒ•ăƒŹăƒŒăƒ  {index}/{total}", + "loading": "èȘ­ăżèŸŒăżäž­", + "Observation: unavailable": "èŠłæžŹïŒšćˆ©ç”šäžćŻ", + "Contiguous US · gaps ≠ no rain": "ç±łć›œæœŹćœŸ · æŹ æžŹ ≠ 降氎ăȘし", + "Americas + Pacific · not individual strikes": "捗挗ケメăƒȘă‚« + ć€ȘćčłæŽ‹ · ć€‹ă€…ăźèœé›·ă§ăŻă‚ă‚ŠăŸă›ă‚“", + "Color: strikes/kmÂČ/min ×10Âł": "è‰Č萜雷数/kmÂČ/戆 ×10Âł", + "60°S–60°N · typically 2–3 h delayed": "60°S–60°N · 通澾2–3æ™‚é–“é…ă‚Œ", + "North America · infrared imagery": "ćŒ—ç±ł · è”€ć€–ç”»ćƒ", + "Reduced motion · history playback unavailable": "ć‹•ăă‚’æž›ă‚‰ă™èš­ćźš · ć±„æ­Žć†ç”ŸăŻćˆ©ç”šäžćŻ", + "Reduced motion · manual history available": "ć‹•ăă‚’æž›ă‚‰ă™èš­ćźš · ć±„æ­ŽăŻæ‰‹ć‹•ă§èĄšç€șćŻèƒœ", + "Rain radar · US": "é™æ°ŽăƒŹăƒŒăƒ€ăƒŒ · ç±łć›œ", + "Lightning density · 15 min": "雷毆ćșŠ Â· 15戆", + "Satellite clouds": "èĄ›æ˜Ÿé›Čç”»ćƒ", + "Americas + Pacific": "捗挗ケメăƒȘă‚« + ć€ȘćčłæŽ‹", + "Global · 60°S–60°N": "慹球 · 60°S–60°N", + "North America": "ćŒ—ç±ł", + "Source observations delayed": "ă‚œăƒŒă‚čăźèŠłæžŹăŒé…ă‚ŒăŠă„ăŸă™", + "Stale source": "ă‚œăƒŒă‚进޿–°é…ć»¶", + "Loading next frame
": "æŹĄăźăƒ•ăƒŹăƒŒăƒ ă‚’èȘ­ăżèŸŒăżäž­â€Š", + "Map center outside coverage": "ćœ°ć›łăźäž­ćżƒăŒă‚«ăƒăƒŒçŻ„ć›Č怖です", + "strikes/kmÂČ/min ×10Âł": "萜雷数/kmÂČ/戆 ×10Âł", + "N. America": "ćŒ—ç±ł", + "Global": "慹球", + "Hourly global mosaic; usually 2–3 hours delayed": "1æ™‚é–“ă”ăšăźć…šçƒăƒąă‚¶ă‚€ă‚Żă€‚é€šćžž2–3æ™‚é–“é…ă‚Œ", + "GOES regional clouds; approximately 5-minute updates": "GOESぼ朰柟é›Čç”»ćƒă€‚çŽ„5ćˆ†ă”ăšă«æ›Žæ–°", + "Clouds only": "é›Čたみ", + "Apply the full cloud brightness key; 100% filter strength": "é›ČăźèŒćșŠă‚­ăƒŒă‚’ćźŒć…šă«é©ç”šă€‚ăƒ•ă‚Łăƒ«ă‚żăƒŒćŒ·ćșŠ100%", + "Full": "ć…šäœ“", + "Show the complete infrared image; 0% filter strength": "è”€ć€–ç”»ćƒć…šäœ“ă‚’èĄšç€șă€‚ăƒ•ă‚Łăƒ«ă‚żăƒŒćŒ·ćșŠ0%", + "Soft": "ćŒ±", + "Vivid": "ćŒ·", + "Image opacity; does not alter the observed values": "ç”»ćƒăźäžé€æ˜ŽćșŠă€‚èŠłæžŹć€€ăŻć€‰ă‚ă‚ŠăŸă›ă‚“", + "View US radar": "ç±łć›œăźăƒŹăƒŒăƒ€ăƒŒă‚’èĄšç€ș", + "View Americas & Pacific": "捗挗ケメăƒȘカずć€ȘćčłæŽ‹ă‚’èĄšç€ș", + "View coverage": "ă‚«ăƒăƒŒçŻ„ć›Čă‚’èĄšç€ș", + "{value} strikes/kmÂČ/min ×10Âł (15-minute density)": "萜雷数 {value}/kmÂČ/戆 ×10ÂłïŒˆ15戆間ぼ毆ćșŠïŒ‰", + "{value} dBZ radar reflectivity": "ăƒŹăƒŒăƒ€ăƒŒćć°„ćŒ·ćșŠ {value} dBZ", + "STALE · cached source metadata": "æ›Žæ–°é…ć»¶ · ă‚­ăƒŁăƒƒă‚·ăƒ„ăźă‚œăƒŒă‚čăƒĄă‚żăƒ‡ăƒŒă‚ż", + "Map center is outside source coverage": "ćœ°ć›łăźäž­ćżƒăŒă‚œăƒŒă‚čăźă‚«ăƒăƒŒçŻ„ć›Č怖です", + "NOAA/NWS 15-minute lightning density derived from Vaisala NLDN/GLD360. Coverage 110°E across the Pacific/Americas to 0°, 25°S–80°N. Not a live strike count, global coverage or a safety warning.": "Vaisala NLDN/GLD360から缗ć‡șしたNOAA/NWSた15ćˆ†é–“é›·ćŻ†ćșŠă€‚ă‚«ăƒăƒŒçŻ„ć›ČăŻæ±ç”Œ110°からć€ȘćčłæŽ‹ăƒ»ć—ćŒ—ă‚ąăƒĄăƒȘă‚«ă‚’ç”ŒăŠ0Â°ăŸă§ă€ć—ç·Ż25Â°â€“ćŒ—ç·Ż80°。ăƒȘă‚ąăƒ«ă‚żă‚€ăƒ ăźèœé›·æ•°ă€ć…šçƒă‚«ăƒăƒŒă€ćź‰ć…šäžŠăźè­Šć ±ă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚", + "NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "NOAA MRMSăźăƒŹăƒŒăƒ€ăƒŒă‚šă‚łăƒŒăŻé™æ°Žăźăƒ‘ă‚żăƒŒăƒłă‚’ç€șă™ă‚‚ăźă§ă€é™æ°ŽćŒ·ćșŠă€ć”ăźè­Šć ±ă€ć°†æ„たäșˆć ±ă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ć…ƒăƒ‡ăƒŒă‚żăźè§ŁćƒćșŠăŻçŽ„1 kmă€èĄšç€șはă‚șăƒŒăƒ ăƒŹăƒ™ăƒ«6ăŸă§ă§ă™ă€‚ć„ăƒ•ăƒŹăƒŒăƒ ăŻć…ŹèĄšă•ă‚ŒăŸæ­ŁçąșăȘèŠłæžŹæ™‚ćˆ»ă‚’äœżç”šă—ăŸă™ă€‚", + "GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "GOES-19/18é•·æłąè”€ć€–ăƒăƒłăƒ‰14ăźćœ°ćŸŸç”»ćƒăšă€NESDISăźć…šçƒé•·æłąăƒąă‚¶ă‚€ă‚Żă€‚ă€Œé›Čăźăżă€ăŻæ˜Žă‚‹ăć†·ăŸă„é›Č頂仄怖をすăčăŠæš—ăă—ăŸă™ă€‚ă“ă‚ŒăŻèŒćșŠăƒ•ă‚Łăƒ«ă‚żăƒŒă§ă‚ă‚Šă€é›Čマă‚čă‚Żă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ă‚«ăƒăƒŒçŻ„ć›Čず韟ćșŠăŻćœ°ćŸŸă«ă‚ˆăŁăŠç•°ăȘă‚ŠăŸă™ă€‚", + "REGION": "㜰㟟", + "IMAGE": "ç”»ćƒ", + "FILTER": "ăƒ•ă‚Łăƒ«ă‚żăƒŒ", + "Cloud filter strength": "é›Čăƒ•ă‚Łăƒ«ă‚żăƒŒăźćŒ·ćșŠ", + "OPACITY": "䞍透明ćșŠ", + "Infrared decode failed": "è”€ć€–ç”»ćƒăźăƒ‡ă‚łăƒŒăƒ‰ă«ć€±æ•—ă—ăŸă—ăŸ", + "Weather prefetch unavailable": "æ°—è±Ąăźăƒ—ăƒȘăƒ•ă‚§ăƒƒăƒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Weather tiles unavailable · previous frame retained": "æ°—è±Ąă‚żă‚€ăƒ«ă‚’ćˆ©ç”šă§ăăŸă›ă‚“ · ć‰ăźăƒ•ăƒŹăƒŒăƒ ă‚’äżæŒ", + "Some weather tiles unavailable": "äž€éƒšăźæ°—è±Ąă‚żă‚€ăƒ«ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Malformed weather manifest": "æ°—è±Ąăƒžăƒ‹ăƒ•ă‚§ă‚čăƒˆăźćœąćŒăŒäžæ­Łă§ă™", + "Weather request timed out": "æ°—è±ĄăƒȘクスă‚čăƒˆăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸ", + "Temperature field unavailable": "æ°—æž©ć Žă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Mean sea level pressure field unavailable": "ćčłć‡æ”·éąæ°—ćœ§ć Žă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Wind upstream unavailable": "éąšăƒ‡ăƒŒă‚żăźé…äżĄć…ƒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "{source} HTTP {status}": "{source} HTTP {status}", + "Wind": "éąš", + "Wind source unavailable": "éąšăźă‚œăƒŒă‚čă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Forecast · does not follow history": "äșˆć ± · ć±„æ­ŽăšăŻé€Łć‹•ă—ăŸă›ă‚“", + "Wind motion": "éąšăźæ”ă‚Œ", + "Wind speed": "鱹速", + "Sea-level pressure": "æ”·éąæ°—ćœ§", + "Air temperature · 2 m": "æ°—æž© · 2 m", + "Global · 1° grid": "慹球 · 1Â°æ Œć­", + "{model} forecast · {time}": "{model}äșˆć ± · {time}", + "Loading forecast": "äșˆć ±ă‚’èȘ­ăżèŸŒăżäž­", + "Preparing flow": "æ”ă‚Œă‚’æș–悙䞭", + "Selected field unavailable": "éžæŠžă—ăŸèŠçŽ ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Cached forecast · stale": "ă‚­ăƒŁăƒƒă‚·ăƒ„ăźäșˆć ± · æ›Žæ–°é…ć»¶", + "ECMWF IFS surface forecast": "ECMWF IFS朰侊äșˆć ±", + "NOAA GFS surface forecast": "NOAA GFS朰侊äșˆć ±", + "Reduced motion": "ć‹•ăă‚’æž›ă‚‰ă™", + "Resume": "憍開", + "Pause": "äž€æ™‚ćœæ­ą", + "Pause visual flow; forecast time does not advance with animation": "æ”ă‚Œăźă‚ąăƒ‹ăƒĄăƒŒă‚·ăƒ§ăƒłă‚’äž€æ™‚ćœæ­ąă€‚äșˆć ±æ™‚ćˆ»ăŻă‚ąăƒ‹ăƒĄăƒŒă‚·ăƒ§ăƒłă§ăŻé€ČăżăŸă›ă‚“", + "None": "ăȘし", + "Speed": "鱹速", + "Pressure": "æ°—ćœ§", + "Temperature": "æ°—æž©", + "Wind trails with no field shading": "èŠçŽ ăźćĄ—ă‚Šćˆ†ă‘ăȘă—ă§éąšăźè»Œè·Ąă‚’èĄšç€ș", + "How hard the surface wind is blowing": "ćœ°äžŠéąšăźćŒ·ă•", + "Sea-level air pressure: broad highs and lows": "æ”·éąæ°—ćœ§ïŒšćșƒćŸŸăźé«˜æ°—ćœ§ăšäœŽæ°—ćœ§", + "Air temperature two meters above the surface": "朰侊2 măźæ°—æž©", + "Wind speed units": "éąšé€Ÿăźć˜äœ", + "Read wind at map center": "朰曳侭濃ぼ鱹をèȘ­ăżć–ă‚‹", + "Read the forecast at the center of the map without changing selection": "éžæŠžă‚’ć€‰ăˆăšă«ćœ°ć›łäž­ćżƒăźäșˆć ±ć€€ă‚’èȘ­ăżć–ă‚‹", + "{model} forecast · {field} ({unit})": "{model}äșˆć ± · {field}{unit}", + "Valid: {time}": "ćŻŸè±Ąæ™‚ćˆ»ïŒš{time}", + "preparing": "æș–悙䞭", + "Issued: {time}": "ç™șèĄšïŒš{time}", + "Selected field unavailable · wind remains visible": "éžæŠžă—ăŸèŠçŽ ă‚’ćˆ©ç”šă§ăăŸă›ă‚“ · éąšăŻèĄšç€șă•ă‚ŒăŸăŸăŸ", + "{error} · wind remains visible": "{error} · éąšăŻèĄšç€șă•ă‚ŒăŸăŸăŸ", + "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "高ćșŠ10 mぼ朰侊鱹。箄1Â°ăźć…šçƒæ Œć­ă€‚æ›Č線は10 mた鹚た栎にæČżăŁăŠăŠă‚Šă€èŠ‹ă‚„ă™ă•ăźăŸă‚12 kmæŒăĄäžŠă’ăŠă„ăŸă™ă€‚èĄšç€șăźé«˜ă•ăŻæ°—è±ĄäžŠăźé«˜ćșŠă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ăƒ“ăƒ„ăƒŒăźç…§æ˜ŽăŻèȘ­ăżă‚„ă™ă•ăźăŸă‚ă§ă™ă€‚ă‚ąăƒ‹ăƒĄăƒŒă‚·ăƒ§ăƒłăŻ1぀たć›ș漚されたäșˆć ±ć†…ăźæ”ă‚Œă‚’ç€șă—ă€æ™‚é–“ăŻé€ČăżăŸă›ă‚“ă€‚è‰ČăźćĄ—ă‚Šćˆ†ă‘ăŻćœ°çƒć„€ăźăƒ™ăƒŒă‚čăƒžăƒƒăƒ—ăŸăŸăŻæœ‰ćŠčăȘăƒ•ă‚©ăƒˆăƒȘă‚ąăƒ«3D TilesăźäžŠă«é‡ăȘă‚ŠăŸă™ă€‚", + "MODEL": "ăƒąăƒ‡ăƒ«", + "FIELD": "芁玠", + "UNITS": "ć˜äœ", + "MOTION": "ăƒąăƒŒă‚·ăƒ§ăƒł", + "Forecast": "äșˆć ±", + "N": "挗", + "NNE": "ćŒ—ćŒ—æ±", + "NE": "ćŒ—æ±", + "ENE": "æ±ćŒ—æ±", + "E": "東", + "ESE": "æ±ć—æ±", + "SE": "ć—æ±", + "SSE": "ć—ć—æ±", + "S": "捗", + "SSW": "ć—ć—è„ż", + "SW": "ć—è„ż", + "WSW": "è„żć—è„ż", + "W": "è„ż", + "WNW": "è„żćŒ—è„ż", + "NW": "ćŒ—è„ż", + "NNW": "ćŒ—ćŒ—è„ż", + "No surface reading": "ćœ°äžŠăźć€€ăŒă‚ă‚ŠăŸă›ă‚“", + "Aim the map center at Earth": "ćœ°ć›łăźäž­ćżƒă‚’ćœ°çƒă«ćˆă‚ă›ăŠăă ă•ă„", + "A location reading needs a loaded forecast and the Earth at the center of the view.": "㜰ç‚čた怀をèȘ­ăżć–るには、äșˆć ±ăŒèȘ­ăżèŸŒăŸă‚Œă€èĄšç€șăźäž­ćżƒă«ćœ°çƒăŒă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚", + "Interpolated model forecast on an approximately 1° grid. Broad weather patterns, not a street-level measurement.": "箄1Â°æ Œć­ă§èŁœé–“ă—ăŸăƒąăƒ‡ăƒ«äșˆć ±ă§ă™ă€‚ć€§ăŸă‹ăȘæ°—è±Ąăƒ‘ă‚żăƒŒăƒłă‚’ç€șă™ă‚‚ăźă§ă€èĄ—ćŒșć˜äœăźćźŸæžŹć€€ă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚", + " · calm": " · 静穏", + " from {direction}": " · {direction}た鹚", + "WIND AT {coordinates}": "{coordinates}た鹚", + "{model} · valid {time}": "{model} · ćŻŸè±Ąæ™‚ćˆ» {time}", + "Wind speed field unavailable": "éąšé€Ÿć Žă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Globe imagery unavailable": "ćœ°çƒć„€ăźç”»ćƒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Globe field image unavailable": "ćœ°çƒć„€ăźèŠçŽ ç”»ćƒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Unknown wind model": "䞍明ăȘéąšăƒąăƒ‡ăƒ«", + "Unknown weather overlay": "䞍明ăȘæ°—è±Ąă‚ȘăƒŒăƒăƒŒăƒŹă‚€", + "Wind request timed out": "鹚たăƒȘクスă‚čăƒˆăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸ", + "Malformed wind manifest": "鱹マニフェă‚čăƒˆăźćœąćŒăŒäžæ­Łă§ă™", + "Malformed wind grid": "鱹グăƒȘăƒƒăƒ‰ăźćœąćŒăŒäžæ­Łă§ă™", + "Error: {message}": "ă‚šăƒ©ăƒŒïŒš{message}", + "Needs {envVars} — add it in Provider Settings": "{envVars}ăŒćż…èŠă§ă™ă€‚ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźšă§èżœćŠ ă—ăŠăă ă•ă„", + "{label} is unavailable": "{label}ăŻćˆ©ç”šă§ăăŸă›ă‚“", + "This map stack": "こぼマップă‚čタック", + "{label} unavailable: {hint}": "{label}ăŻćˆ©ç”šă§ăăŸă›ă‚“ïŒš{hint}", + "Google 3D tiles unavailable — check the key's API restrictions, quota, or network": "Google 3D Tilesă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚ă‚­ăƒŒăźAPIćˆ¶é™ă€ć‰Čă‚Šćœ“ăŠă€ăƒăƒƒăƒˆăƒŻăƒŒă‚Żă‚’çąșèȘă—ăŠăă ă•ă„", + "Needs {envVars} — add it in Provider Settings — or a Cesium ion token for the ion-hosted route": "{envVars}ăŒćż…èŠă§ă™ïŒˆăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźšă§èżœćŠ ïŒ‰ă€‚ăŸăŸăŻionç”Œç”±ă§ćˆ©ç”šă™ă‚‹ăŸă‚ăźCesium ionăƒˆăƒŒă‚ŻăƒłăŒćż…èŠă§ă™", + "Exit cockpit to fly to a camera": "ă‚«ăƒĄăƒ©ăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a location": "ć Žæ‰€ăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a photo": "ć†™çœŸăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a shared view": "ć…±æœ‰ăƒ“ăƒ„ăƒŒăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a target": "ă‚żăƒŒă‚Čăƒƒăƒˆăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a vessel": "èˆčèˆ¶ăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a fire": "ç«çœăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a route": "ăƒ«ăƒŒăƒˆăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a file": "ăƒ•ă‚Ąă‚€ăƒ«ăźäœçœźăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a scene": "ă‚·ăƒŒăƒłăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to view weather coverage": "æ°—è±Ąăźă‚«ăƒăƒŒçŻ„ć›Čă‚’èĄšç€șă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a cyclone": "ă‚”ă‚€ă‚Żăƒ­ăƒłăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to an aircraft": "èˆȘç©șæ©Ÿăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to fly to a satellite": "èĄ›æ˜Ÿăžç§»ć‹•ă™ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Exit cockpit to frame contacts": "ă‚łăƒłă‚żă‚Żăƒˆă‚’èŠ–é‡Žă«ćŽă‚ă‚‹ă«ăŻă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "Visible map targets": "èĄšç€șäž­ăźćœ°ć›łäžŠăźă‚żăƒŒă‚Čット", + "Focusing {label}": "{label}ă«ăƒ•ă‚©ăƒŒă‚«ă‚čäž­", + "Source": "ă‚œăƒŒă‚č", + "Camera ownership changed": "ă‚«ăƒĄăƒ©ăźćˆ¶ćŸĄć…ƒăŒć€‰ă‚ă‚ŠăŸă—ăŸ", + "Saved project could not be read; storage preserved. Import a valid file to resume saving.": "äżć­˜æžˆăżăźăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆă‚’èȘ­ăżć–ă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚ă‚čăƒˆăƒŹăƒŒă‚žăŻäżæŒă•ă‚ŒăŠă„ăŸă™ă€‚äżć­˜ă‚’ć†é–‹ă™ă‚‹ă«ăŻæœ‰ćŠčăȘăƒ•ă‚Ąă‚€ăƒ«ă‚’ă‚€ăƒłăƒăƒŒăƒˆă—ăŠăă ă•ă„ă€‚", + "Ready": "æș–ć‚™ćźŒäș†", + "Scene layer turned off": "ă‚·ăƒŒăƒłăźăƒŹă‚€ăƒ€ăƒŒă‚’ă‚Șăƒ•ă«ă—ăŸă—ăŸ", + "Stopped": "ćœæ­ąă—ăŸă—ăŸ", + "Scene not saved — existing saved project could not be read. Export edits or import a valid file.": "ă‚·ăƒŒăƒłăŻäżć­˜ă•ă‚ŒăŠă„ăŸă›ă‚“ïŒšæ—ąć­˜ăźäżć­˜æžˆăżăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆă‚’èȘ­ăżć–ă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚ç·šé›†ć†…ćźčをスクă‚čăƒăƒŒăƒˆă™ă‚‹ă‹ă€æœ‰ćŠčăȘăƒ•ă‚Ąă‚€ăƒ«ă‚’ă‚€ăƒłăƒăƒŒăƒˆă—ăŠăă ă•ă„ă€‚", + "Scene not saved — {reason}": "ă‚·ăƒŒăƒłăŻäżć­˜ă•ă‚ŒăŠă„ăŸă›ă‚“ïŒš{reason}", + "Scene not saved — browser storage unavailable": "ă‚·ăƒŒăƒłăŻäżć­˜ă•ă‚ŒăŠă„ăŸă›ă‚“ïŒšăƒ–ăƒ©ă‚Šă‚¶ăƒŒăźă‚čăƒˆăƒŹăƒŒă‚žă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Loaded: {scene} / {shot}": "èȘ­ăżèŸŒăżăŸă—ăŸïŒš{scene} / {shot}", + "Cannot update {scene}: shot inventory changed": "{scene}ă‚’æ›Žæ–°ă§ăăŸă›ă‚“ïŒšă‚·ăƒ§ăƒƒăƒˆæ§‹æˆăŒć€‰ă‚ă‚ŠăŸă—ăŸ", + "Cannot update {scene}: evidence beats changed": "{scene}ă‚’æ›Žæ–°ă§ăăŸă›ă‚“ïŒšèšŒæ‹ ăźćŒșćˆ‡ă‚ŠăŒć€‰ă‚ă‚ŠăŸă—ăŸ", + "Cannot update {scene}: shot bindings are incomplete": "{scene}ă‚’æ›Žæ–°ă§ăăŸă›ă‚“ïŒšă‚·ăƒ§ăƒƒăƒˆăźăƒă‚€ăƒłăƒ‰ăŒäžćźŒć…šă§ă™", + "Updated {count} shots: {scene}": { + "other": "{count}ă‚·ăƒ§ăƒƒăƒˆă‚’æ›Žæ–°ă—ăŸă—ăŸïŒš{scene}" + }, + "Appended {count} shots: {scene}": { + "other": "{count}ă‚·ăƒ§ăƒƒăƒˆă‚’èżœćŠ ă—ăŸă—ăŸïŒš{scene}" + }, + "Cannot capture shot: camera not ready": "ă‚·ăƒ§ăƒƒăƒˆă‚’ć–ćŸ—ă§ăăŸă›ă‚“ïŒšă‚«ăƒĄăƒ©ăźæș–ć‚™ăŒă§ăăŠă„ăŸă›ă‚“", + "Captured: {scene} / {shot}": "ć–ćŸ—ă—ăŸă—ăŸïŒš{scene} / {shot}", + "Select a shot first": "ăŸăšă‚·ăƒ§ăƒƒăƒˆă‚’éžæŠžă—ăŠăă ă•ă„", + "Updated: {scene} / {shot}": "æ›Žæ–°ă—ăŸă—ăŸïŒš{scene} / {shot}", + "Could not leave scene: {scene}": "ă‚·ăƒŒăƒłă‚’ç”‚äș†ă§ăăŸă›ă‚“ă§ă—ăŸïŒš{scene}", + "Seeked: {scene} / {shot}": "ă‚·ăƒŒă‚Żă—ăŸă—ăŸïŒš{scene} / {shot}", + "Seeking scene clock": "ă‚·ăƒŒăƒłă‚Żăƒ­ăƒƒă‚Żă‚’ă‚·ăƒŒă‚Żäž­", + "Camera unavailable — exit cockpit first": "ă‚«ăƒĄăƒ©ă‚’äœżç”šă§ăăŸă›ă‚“ïŒšć…ˆă«ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠăă ă•ă„", + "No shots to run": "ćźŸèĄŒă™ă‚‹ă‚·ăƒ§ăƒƒăƒˆăŒă‚ă‚ŠăŸă›ă‚“", + "Scene transition limit reached — load a shot to reset": "ă‚·ăƒŒăƒłćˆ‡ă‚Šæ›żăˆăźäžŠé™ă«é”ă—ăŸă—ăŸă€‚ăƒȘă‚»ăƒƒăƒˆă™ă‚‹ă«ăŻă‚·ăƒ§ăƒƒăƒˆă‚’èȘ­ăżèŸŒă‚“ă§ăă ă•ă„", + "Export failed: {error}": "スクă‚čăƒăƒŒăƒˆă«ć€±æ•—ă—ăŸă—ăŸïŒš{error}", + "Project exported": "プロゾェクトをスクă‚čăƒăƒŒăƒˆă—ăŸă—ăŸ", + "Importing project": "ăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆă‚’ă‚€ăƒłăƒăƒŒăƒˆäž­", + "Imported {file}": "{file}ă‚’ă‚€ăƒłăƒăƒŒăƒˆă—ăŸă—ăŸ", + "Import failed: {error}": "ă‚€ăƒłăƒăƒŒăƒˆă«ć€±æ•—ă—ăŸă—ăŸïŒš{error}", + "Import failed (could not read JSON file)": "ă‚€ăƒłăƒăƒŒăƒˆă«ć€±æ•—ă—ăŸă—ăŸïŒˆJSONăƒ•ă‚Ąă‚€ăƒ«ă‚’èȘ­ăżć–ă‚ŒăŸă›ă‚“ă§ă—ăŸïŒ‰", + "Layers refused: {layers}": "æ‹’ćŠă•ă‚ŒăŸăƒŹă‚€ăƒ€ăƒŒïŒš{layers}", + "Could not exit {mode} — scene layers may be refused": "{mode}を甂äș†ă§ăăŸă›ă‚“ă§ă—ăŸă€‚ă‚·ăƒŒăƒłăźăƒŹă‚€ăƒ€ăƒŒăŒæ‹’ćŠă•ă‚Œă‚‹ćŻèƒœæ€§ăŒă‚ă‚ŠăŸă™", + "Camera move interrupted": "ă‚«ăƒĄăƒ©ăźç§»ć‹•ăŒäž­æ–­ă•ă‚ŒăŸă—ăŸ", + "Scene media timed out": "ă‚·ăƒŒăƒłăźăƒĄăƒ‡ă‚Łă‚ąăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸ", + "Action complete": "æ“äœœăŒćźŒäș†ă—ăŸă—ăŸ", + "Action unavailable or cancelled": "æ“äœœă‚’ćˆ©ç”šă§ăăȘă„ă‹ă€ă‚­ăƒŁăƒłă‚»ăƒ«ă•ă‚ŒăŸă—ăŸ", + "Scene actions": "ă‚·ăƒŒăƒłăźæ“äœœ", + "Select a feature or use Tab and Enter to choose an action.": "ăƒ•ă‚ŁăƒŒăƒăƒŁăƒŒă‚’éžæŠžă™ă‚‹ă‹ă€TabずEnteră§æ“äœœă‚’éžă‚“ă§ăă ă•ă„ă€‚", + "Selected feature: {feature}. Choose an action.": "éžæŠžă—ăŸăƒ•ă‚ŁăƒŒăƒăƒŁăƒŒïŒš{feature}ă€‚æ“äœœă‚’éžă‚“ă§ăă ă•ă„ă€‚", + "Running {index}/{total}: {scene} / {shot}": "ćźŸèĄŒäž­ {index}/{total}{scene} / {shot}", + "Scene run complete": "ă‚·ăƒŒăƒłăźćźŸèĄŒăŒćźŒäș†ă—ăŸă—ăŸ", + "Bhote Koshi Evidence Sequence": "Bhote KoshièšŒæ‹ ă‚·ăƒŒă‚±ăƒłă‚č", + "Nepal Flood Incident": "ăƒăƒ‘ăƒŒăƒ«æŽȘæ°Žă‚€ăƒłă‚·ăƒ‡ăƒłăƒˆ", + "Global Flights Radar": "ă‚°ăƒ­ăƒŒăƒăƒ«èˆȘç©șăƒŹăƒŒăƒ€ăƒŒ", + "Orbital Watch": "è»Œé“ç›ŁèŠ–", + "Thermal Threat Board": "熱æșè„…ćšăƒœăƒŒăƒ‰", + "City Overload": "ă‚·ăƒ†ă‚Łă‚ȘăƒŒăƒăƒŒăƒ­ăƒŒăƒ‰", + "Omniscience Pullback": "ă‚Șăƒ ăƒ‹ă‚”ă‚€ă‚šăƒłă‚čăƒ»ăƒ—ăƒ«ăƒăƒƒă‚Ż", + "Global Incident Context": "ă‚°ăƒ­ăƒŒăƒăƒ«ăȘă‚€ăƒłă‚·ăƒ‡ăƒłăƒˆçŠ¶æł", + "Nepal-Focused Globe Rotation": "ăƒăƒ‘ăƒŒăƒ«ă‚’äž­ćżƒăšă—ăŸćœ°çƒăźć›žè»ą", + "Bhote Koshi Regional Approach": "Bhote Koshićœ°ćŸŸăžăźæŽ„èż‘", + "Bhote Koshi Nearby Cities": "Bhote Koshi摹èŸșăźéƒœćž‚", + "Bhote Koshi Incident Corridor": "Bhote Koshiă‚€ăƒłă‚·ăƒ‡ăƒłăƒˆæ”è·Ż", + "Bhote Koshi Flood Path": "Bhote KoshiæŽȘæ°Žăźç”Œè·Ż", + "Bhote Koshi Corridor Overview": "Bhote Koshiæ”è·ŻăźæŠ‚èŠł", + "Bhote Koshi Upper Valley": "Bhote Koshi䞊攁枓谷", + "Upper Valley Collapse": "äžŠæ”æž“è°·ăźćŽ©ćŁŠ", + "Debris-Dammed Lake": "期砂ダムæč–", + "Nepal-China Border Gate": "ăƒăƒ‘ăƒŒăƒ«ăƒ»äž­ć›œć›œćąƒă‚ČăƒŒăƒˆ", + "Timure Evidence Cluster": "TimureăźèšŒæ‹ çŸ€", + "Syabru Besi Passage": "Syabru Besiぼ通過", + "Bidur / Trishuli Consequence": "Bidur / Trishuliăžăźćœ±éŸż", + "Final view": "æœ€ç”‚ăƒ“ăƒ„ăƒŒ", + "Scene {n}": "ă‚·ăƒŒăƒł {n}", + "Shot {n}": "ă‚·ăƒ§ăƒƒăƒˆ {n}", + "the title of scene {scene} is empty or longer than {max} characters": "ă‚·ăƒŒăƒł{scene}ăźă‚żă‚€ăƒˆăƒ«ăŒç©șか、{max}æ–‡ć­—ă‚’è¶…ăˆăŠă„ăŸă™", + "the title of shot {shot} in scene {scene} is empty or longer than {max} characters": "ă‚·ăƒŒăƒł{scene}ăźă‚·ăƒ§ăƒƒăƒˆ{shot}ăźă‚żă‚€ăƒˆăƒ«ăŒç©șか、{max}æ–‡ć­—ă‚’è¶…ăˆăŠă„ăŸă™", + "the project is larger than 5 MiB": "プロゾェクトが5 MiBă‚’è¶…ăˆăŠă„ăŸă™", + "the project has too many shots": "ăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆăźă‚·ăƒ§ăƒƒăƒˆăŒć€šă™ăŽăŸă™", + "the scene data failed validation": "ă‚·ăƒŒăƒłăƒ‡ăƒŒă‚żăźæ€œèšŒă«ć€±æ•—ă—ăŸă—ăŸ", + "Could not complete this action. Check the file, references and selected assets.": "ă“ăźæ“äœœă‚’ćźŒäș†ă§ăăŸă›ă‚“ă§ă—ăŸă€‚ăƒ•ă‚Ąă‚€ăƒ«ă€ć‚ç…§ă€éžæŠžă—ăŸă‚ąă‚»ăƒƒăƒˆă‚’çąșèȘă—ăŠăă ă•ă„ă€‚", + "{count} scenes": { + "other": "{count}ă‚·ăƒŒăƒł" + }, + "{count} shots": { + "other": "{count}ă‚·ăƒ§ăƒƒăƒˆ" + }, + "{count} data packs": { + "other": "ăƒ‡ăƒŒă‚żăƒ‘ăƒƒă‚Ż{count}怋" + }, + "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}": "{scene} / {pack}{status}ă€‚ăƒ•ă‚Ąă‚€ăƒ«ïŒš{path}。{attribution} · {license}", + "Unavailable layers: {layers}": "ćˆ©ç”šă§ăăȘă„ăƒŹă‚€ăƒ€ăƒŒïŒš{layers}", + "Uses registered content or linked media. Those external files are not included in a scene bundle. Their original notices still apply.": "登éŒČæžˆăżăźă‚łăƒłăƒ†ăƒłăƒ„ăŸăŸăŻăƒȘăƒłă‚Żă•ă‚ŒăŸăƒĄăƒ‡ă‚Łă‚ąă‚’äœżç”šă—ăŠă„ăŸă™ă€‚ă“ă‚Œă‚‰ăźć€–éƒšăƒ•ă‚Ąă‚€ăƒ«ăŻă‚·ăƒŒăƒłăƒăƒłăƒ‰ăƒ«ă«ć«ăŸă‚ŒăŸă›ă‚“ă€‚ć…ƒăźèĄšç€șäș‹é …ăŻćŒ•ăç¶šăé©ç”šă•ă‚ŒăŸă™ă€‚", + "{bytes} bundled bytes verified. Files stay in memory for this session. Reimport the bundle after reloading the app.": "ăƒăƒłăƒ‰ăƒ«ă•ă‚ŒăŸ{bytes}ăƒă‚€ăƒˆă‚’æ€œèšŒă—ăŸă—ăŸă€‚ăƒ•ă‚Ąă‚€ăƒ«ăŻă“ăźă‚»ăƒƒă‚·ăƒ§ăƒłăźé–“ă ă‘ăƒĄăƒąăƒȘăƒŒă«äżæŒă•ă‚ŒăŸă™ă€‚ă‚ąăƒ—ăƒȘを憍èȘ­ăżèŸŒăżă—ăŸćŸŒăŻă€ăƒăƒłăƒ‰ăƒ«ă‚’ć†ă‚€ăƒłăƒăƒŒăƒˆă—ăŠăă ă•ă„ă€‚", + "Review scene import": "ă‚·ăƒŒăƒłăźă‚€ăƒłăƒăƒŒăƒˆă‚’çąșèȘ", + "Nothing is loaded or changed until you apply this file.": "ă“ăźăƒ•ă‚Ąă‚€ăƒ«ă‚’é©ç”šă™ă‚‹ăŸă§ă€äœ•ă‚‚èȘ­ăżèŸŒăŸă‚Œăšă€ć€‰æ›Žă‚‚ă•ă‚ŒăŸă›ă‚“ă€‚", + "Ready to import": "ă‚€ăƒłăƒăƒŒăƒˆăźæș–ć‚™ăŒă§ăăŸă—ăŸ", + "Apply replaces the current project. Export your current project first if you want to keep both.": "é©ç”šă™ă‚‹ăšçŸćœšăźăƒ—ăƒ­ă‚žă‚§ă‚ŻăƒˆăŒçœźăæ›ă‚ă‚ŠăŸă™ă€‚äžĄæ–čă‚’æź‹ă—ăŸă„ć ŽćˆăŻă€ć…ˆă«çŸćœšăźăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆă‚’ă‚šă‚Żă‚čăƒăƒŒăƒˆă—ăŠăă ă•ă„ă€‚", + "Apply import": "ă‚€ăƒłăƒăƒŒăƒˆă‚’é©ç”š", + "Import was not applied. The current project may have changed.": "ă‚€ăƒłăƒăƒŒăƒˆăŻé©ç”šă•ă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚çŸćœšăźăƒ—ăƒ­ă‚žă‚§ă‚ŻăƒˆăŒć€‰æ›Žă•ă‚ŒăŸćŻèƒœæ€§ăŒă‚ă‚ŠăŸă™ă€‚", + "Select a scene and shot first": "ć…ˆă«ă‚·ăƒŒăƒłăšă‚·ăƒ§ăƒƒăƒˆă‚’éžæŠžă—ăŠăă ă•ă„", + "Edit scene details": "ă‚·ăƒŒăƒłăźè©łçŽ°ă‚’ç·šé›†", + "Camera positions use degrees and meters above the ellipsoid. Drafts are validated before they replace your saved scene.": "ă‚«ăƒĄăƒ©äœçœźăŻćșŠăšæ„•ć††äœ“ă‹ă‚‰ăźé«˜ă•ïŒˆăƒĄăƒŒăƒˆăƒ«ïŒ‰ă§æŒ‡ćźšă—ăŸă™ă€‚äž‹æ›žăăŻæ€œèšŒă•ă‚ŒăŠă‹ă‚‰äżć­˜æžˆăżăźă‚·ăƒŒăƒłă‚’çœźăæ›ăˆăŸă™ă€‚", + "Anchors and data packs": "ă‚ąăƒłă‚«ăƒŒăšăƒ‡ăƒŒă‚żăƒ‘ăƒƒă‚Ż", + "Shot camera, timing, packs and actions": "ă‚·ăƒ§ăƒƒăƒˆăźă‚«ăƒĄăƒ©ă€ă‚żă‚€ăƒŸăƒłă‚°ă€ăƒ‘ăƒƒă‚Żă€æ“äœœ", + "New anchor ID": "æ–°ă—ă„ă‚ąăƒłă‚«ăƒŒID", + "Capture camera as anchor": "ă‚«ăƒĄăƒ©äœçœźă‚’ă‚ąăƒłă‚«ăƒŒăšă—ăŠć–ćŸ—", + "Anchor added to draft": "ă‚ąăƒłă‚«ăƒŒă‚’äž‹æ›žăă«èżœćŠ ă—ăŸă—ăŸ", + "Set move start to current camera": "移拕た開構ç‚čă‚’çŸćœšăźă‚«ăƒĄăƒ©ă«èš­ćźš", + "Move added to draft; destination remains the shot camera": "ç§»ć‹•ă‚’äž‹æ›žăă«èżœćŠ ă—ăŸă—ăŸă€‚ç§»ć‹•ć…ˆăŻă‚·ăƒ§ăƒƒăƒˆăźă‚«ăƒĄăƒ©ăźăŸăŸă§ă™", + "Use ordinary flight": "é€šćžžăźéŁ›èĄŒă‚’äœżç”š", + "Invalid shot JSON": "ă‚·ăƒ§ăƒƒăƒˆăźJSONが無ćŠčです", + "Apply details": "è©łçŽ°ă‚’é©ç”š", + "Select a scene first": "ć…ˆă«ă‚·ăƒŒăƒłă‚’éžæŠžă—ăŠăă ă•ă„", + "Share selected scene": "éžæŠžă—ăŸă‚·ăƒŒăƒłă‚’ć…±æœ‰", + "Scene JSON preserves authored settings and attribution. It does not include asset files. Bundles include only pack files you choose here or previously imported bundle files.": "ă‚·ăƒŒăƒłJSONă«ăŻäœœæˆæ™‚ăźèš­ćźšăšć‡șć…žæƒ…ć ±ăŒäżæŒă•ă‚ŒăŸă™ă€‚ă‚ąă‚»ăƒƒăƒˆăƒ•ă‚Ąă‚€ăƒ«ăŻć«ăŸă‚ŒăŸă›ă‚“ă€‚ăƒăƒłăƒ‰ăƒ«ă«ăŻă€ă“ă“ă§éžæŠžă—ăŸăƒ‘ăƒƒă‚Żăƒ•ă‚Ąă‚€ăƒ«ă‹ă€ä»„ć‰ă«ă‚€ăƒłăƒăƒŒăƒˆă—ăŸăƒăƒłăƒ‰ăƒ«ăƒ•ă‚Ąă‚€ăƒ«ăźăżăŒć«ăŸă‚ŒăŸă™ă€‚", + "Download scene JSON": "ă‚·ăƒŒăƒłJSONă‚’ăƒ€ă‚Šăƒłăƒ­ăƒŒăƒ‰", + "Choose data-pack files": "ăƒ‡ăƒŒă‚żăƒ‘ăƒƒă‚Żăźăƒ•ă‚Ąă‚€ăƒ«ă‚’éžæŠž", + "Or choose a data-pack folder": "ăŸăŸăŻăƒ‡ăƒŒă‚żăƒ‘ăƒƒă‚Żăźăƒ•ă‚©ăƒ«ăƒ€ăƒŒă‚’éžæŠž", + "Download asset bundle": "ă‚ąă‚»ăƒƒăƒˆăƒăƒłăƒ‰ăƒ«ă‚’ăƒ€ă‚Šăƒłăƒ­ăƒŒăƒ‰", + "Asset bundle downloaded": "ă‚ąă‚»ăƒƒăƒˆăƒăƒłăƒ‰ăƒ«ă‚’ăƒ€ă‚Šăƒłăƒ­ăƒŒăƒ‰ă—ăŸă—ăŸ", + "No RTL-SDR device selected": "RTL-SDRăƒ‡ăƒă‚€ă‚čăŒéžæŠžă•ă‚ŒăŠă„ăŸă›ă‚“", + "WebUSB requires desktop Chrome or Edge on localhost/HTTPS": "WebUSBには、localhostăŸăŸăŻHTTPS侊ぼデă‚čクトップ版ChromeかEdgeăŒćż…èŠă§ă™", + "RTL-SDR access failed; close other SDR apps and check USB permissions": "RTL-SDRにスクセă‚čă§ăăŸă›ă‚“ă§ă—ăŸă€‚ă»ă‹ăźSDRケプăƒȘを閉じど、USBăźèš±ćŻă‚’çąșèȘă—ăŠăă ă•ă„", + "RTL-SDR connection failed": "RTL-SDRăźæŽ„ç¶šă«ć€±æ•—ă—ăŸă—ăŸ", + "Receiving 1090 MHz ADS-B": "1090 MHz ADS-Bを揗信侭", + "Receiving broadcast FM": "FMæ”Ÿé€ă‚’ć—äżĄäž­", + "Connect an RTL-SDR to begin.": "開構するにはRTL-SDRă‚’æŽ„ç¶šă—ăŠăă ă•ă„ă€‚", + "WebUSB is unavailable in this browser": "ă“ăźăƒ–ăƒ©ă‚Šă‚¶ăƒŒă§ăŻWebUSBă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "USB work abandoned after a stalled transfer": "è»ąé€ăŒćœæ­ąă—ăŸăŸă‚USBć‡Šç†ă‚’äž­æ­ąă—ăŸă—ăŸ", + "SDR decoder worker failed": "SDRăƒ‡ă‚łăƒŒăƒ€ăƒŒăźăƒŻăƒŒă‚«ăƒŒăŒć€±æ•—ă—ăŸă—ăŸ", + "SDR decoder did not start; receiver stopped": "SDRăƒ‡ă‚łăƒŒăƒ€ăƒŒăŒè”·ć‹•ă—ăŸă›ă‚“ă§ă—ăŸă€‚ć—äżĄæ©Ÿă‚’ćœæ­ąă—ăŸă—ăŸ", + "SDR decoder stopped responding; receiver stopped": "SDRăƒ‡ă‚łăƒŒăƒ€ăƒŒăŒćżœç­”ă—ăȘくăȘă‚ŠăŸă—ăŸă€‚ć—äżĄæ©Ÿă‚’ćœæ­ąă—ăŸă—ăŸ", + "SDR decoder fell behind; receiver stopped": "SDRăƒ‡ă‚łăƒŒăƒ€ăƒŒăźć‡Šç†ăŒèżœă„ă€ăăŸă›ă‚“ă€‚ć—äżĄæ©Ÿă‚’ćœæ­ąă—ăŸă—ăŸ", + "WebUSB requires desktop Chrome or Edge": "WebUSBă«ăŻăƒ‡ă‚čクトップ版ChromeăŸăŸăŻEdgeăŒćż…èŠă§ă™", + "Waiting for an RTL-SDR device
": "RTL-SDRăƒ‡ăƒă‚€ă‚čăźæŽ„ç¶šćŸ…ăĄâ€Š", + "Browser audio is suspended; press Connect again to resume it": "ăƒ–ăƒ©ă‚Šă‚¶ăƒŒăźéŸłćŁ°ăŒäž€æ™‚ćœæ­ąă—ăŠă„ăŸă™ă€‚ć†é–‹ă™ă‚‹ă«ăŻă‚‚ă†äž€ćșŠïŒ»æŽ„ç¶šïŒœă‚’æŠŒă—ăŠăă ă•ă„", + "RTL-SDR sample stream stopped": "RTL-SDRăźă‚”ăƒłăƒ—ăƒ«ă‚čトăƒȘăƒŒăƒ ăŒćœæ­ąă—ăŸă—ăŸ", + "Switching to {mode}
": "{mode}ă«ćˆ‡ă‚Šæ›żăˆäž­â€Š", + "Browser audio is suspended; select FM again to resume it": "ăƒ–ăƒ©ă‚Šă‚¶ăƒŒăźéŸłćŁ°ăŒäž€æ™‚ćœæ­ąă—ăŠă„ăŸă™ă€‚ć†é–‹ă™ă‚‹ă«ăŻă‚‚ă†äž€ćșŠFMă‚’éžæŠžă—ăŠăă ă•ă„", + "RTL-SDR gain change failed": "RTL-SDRたă‚Čă‚€ăƒłć€‰æ›Žă«ć€±æ•—ă—ăŸă—ăŸ", + "Tuned to {mhz} MHz FM": "FM {mhz} MHză«ćŒèȘżă—ăŸă—ăŸ", + "Seeking up
": "侊æ–čć‘ă«ă‚·ăƒŒă‚Żäž­â€Š", + "Seeking down
": "例æ–čć‘ă«ă‚·ăƒŒă‚Żäž­â€Š", + "Seek stopped": "ă‚·ăƒŒă‚Żă‚’ćœæ­ąă—ăŸă—ăŸ", + "Scanning {mhz} MHz
": "{mhz} MHzをă‚čキャン侭
", + "Found {mhz} MHz · {snr} dB": "{mhz} MHză‚’æ€œć‡ș · {snr} dB", + "FM signal found at {mhz} MHz": "{mhz} MHzでFMäżĄć·ă‚’æ€œć‡șă—ăŸă—ăŸ", + "No FM signal found": "FMäżĄć·ăŒèŠ‹ă€ă‹ă‚ŠăŸă›ă‚“", + "Browser location is unavailable": "ăƒ–ăƒ©ă‚Šă‚¶ăƒŒăźäœçœźæƒ…ć ±ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Receiver location was not granted": "ć—äżĄæ©Ÿăźäœçœźæƒ…ć ±ăŒèš±ćŻă•ă‚ŒăŸă›ă‚“ă§ă—ăŸ", + "RTL-SDR disconnected": "RTL-SDRăŒćˆ‡æ–­ă•ă‚ŒăŸă—ăŸ", + "Upstream response too large": "é…äżĄć…ƒă‹ă‚‰ăźćżœç­”ăŒć€§ăă™ăŽăŸă™", + "Vector tile request timed out": "ăƒ™ă‚Żă‚żăƒŒă‚żă‚€ăƒ«ăźăƒȘクスă‚čăƒˆăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸ", + "Vector tiles unavailable": "ăƒ™ă‚Żă‚żăƒŒă‚żă‚€ăƒ«ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Vector tile metadata unavailable": "ăƒ™ă‚Żă‚żăƒŒă‚żă‚€ăƒ«ăźăƒĄă‚żăƒ‡ăƒŒă‚żă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Zoom in for vector tile coverage": "ă‚șăƒŒăƒ ă‚€ăƒłă—ăŠăƒ™ă‚Żă‚żăƒŒă‚żă‚€ăƒ«ăźă‚«ăƒăƒŒçŻ„ć›Čă‚’èĄšç€ș", + "Saturation": "ćœ©ćșŠ", + "Edge Thickness": "èŒȘéƒ­ç·šăźć€Șさ", + "Contrast": "ă‚łăƒłăƒˆăƒ©ă‚čト", + "Grain": "çȒ歐", + "Vignette": "摹èŸșæž›ć…‰", + "Pixelation": "ăƒ”ă‚Żă‚»ăƒ«ćŒ–", + "Distortion": "æ­Șみ", + "Instability": "æșらぎ", + "Density": "毆ćșŠ", + "Gain": "ă‚Čă‚€ăƒł", + "Bloom": "ăƒ–ăƒ«ăƒŒăƒ ", + "Scanlines": "蔰査線", + "Sensitivity": "感ćșŠ", + "WHOT/BHOT": "WHOT/BHOT", + "Ironbow": "Ironbow", + "unsaved CCTV calibration": "æœȘ保歘ぼCCTVキャăƒȘăƒ–ăƒŹăƒŒă‚·ăƒ§ăƒł", + "the open cockpit": "èĄšç€ș侭ぼコックピット", + "Switching language reloads the page. This will be lost: {items}. Switch anyway?": "蚀èȘžă‚’ćˆ‡ă‚Šæ›żăˆă‚‹ăšăƒšăƒŒă‚žăŒć†èȘ­ăżèŸŒăżă•ă‚ŒăŸă™ă€‚æŹĄăźć†…ćźčăŻć€±ă‚ă‚ŒăŸă™ïŒš{items}ă€‚ćˆ‡ă‚Šæ›żăˆăŸă™ă‹ïŒŸ", + "VISUAL PRESETS": "ăƒ“ă‚žăƒ„ă‚ąăƒ«ăƒ—ăƒȘă‚»ăƒƒăƒˆ", + "LOCATION": "äœçœź", + "CONTACTS — nearest planes · vessels · sites": "ă‚łăƒłă‚żă‚ŻăƒˆïŒšæœ€ćŻ„ă‚ŠăźèˆȘç©ș機 · èˆč舶 · 斜蚭", + "SPACE MISSIONS — launches & orbital assets": "ćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒłïŒšæ‰“ăĄäžŠă’ăšè»Œé“äžŠăźćź‡ćź™æ©Ÿ", + "LIVE SIGNALS": "ăƒ©ă‚€ăƒ–ă‚·ă‚°ăƒŠăƒ«", + "Contacts could not complete the requested transition; try again": "ă‚łăƒłă‚żă‚ŻăƒˆăŒèŠæ±‚ă•ă‚ŒăŸćˆ‡ă‚Šæ›żăˆă‚’ćźŒäș†ă§ăăŸă›ă‚“ă§ă—ăŸă€‚ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„", + "CCTV layer unavailable": "CCTVăƒŹă‚€ăƒ€ăƒŒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Link shared": "ăƒȘăƒłă‚Żă‚’ć…±æœ‰ă—ăŸă—ăŸ", + "Link copied!": "ăƒȘăƒłă‚Żă‚’ă‚łăƒ”ăƒŒă—ăŸă—ăŸ", + "Copy failed": "ă‚łăƒ”ăƒŒă«ć€±æ•—ă—ăŸă—ăŸ", + "Return map to straight-down view": "ćœ°ć›łă‚’çœŸäžŠă‹ă‚‰ăźèĄšç€șă«æˆ»ă™", + "Tilt map to oblique view": "ćœ°ć›łă‚’æ–œă‚ăźèŠ–ç‚čă«ć‚Ÿă‘ă‚‹", + "Reset map to north up. Current heading {heading} degrees": "ćœ°ć›łă‚’ćŒ—ăŒäžŠă«ăȘă‚‹ă‚ˆă†ă«ăƒȘă‚»ăƒƒăƒˆă€‚çŸćœšăźæ–č䜍 {heading}ćșŠ", + "Tilted view": "æ–œă‚èĄšç€ș", + "Straight-down view": "çœŸäžŠèĄšç€ș", + "North up": "ćŒ—ă‚’äžŠă«", + "CCTV calibration saved": "CCTVキャăƒȘăƒ–ăƒŹăƒŒă‚·ăƒ§ăƒłă‚’äżć­˜ă—ăŸă—ăŸ", + "HDG": "HDG", + "PITCH": "ピッチ", + "FOV": "FOV", + "RANGE": "è·é›ą", + "HGT": "é«˜ă•", + "ΔN": "ΔN", + "ΔE": "ΔE", + "{value}m": "{value}m", + "CCTV calibration reset": "CCTVキャăƒȘăƒ–ăƒŹăƒŒă‚·ăƒ§ăƒłă‚’ăƒȘă‚»ăƒƒăƒˆă—ăŸă—ăŸ", + "ADJUST ON": "èȘżæ•Ž ă‚Șン", + "ADJUST": "èȘżæ•Ž", + "SNAPSHOT": "ă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆ", + "LIVE": "ăƒ©ă‚€ăƒ–", + "UPSTREAM": "配信慃", + "SYNTHETIC": "ćˆæˆ", + "CONFIGURED": "èš­ćźšæžˆăż", + "SEED": "ćˆæœŸăƒ‡ăƒŒă‚ż", + "UNKNOWN": "䞍明", + "OK": "æ­Łćžž", + "ERROR": "ă‚šăƒ©ăƒŒ", + "Live HLS connected": "ăƒ©ă‚€ăƒ–HLSæŽ„ç¶šæžˆăż", + "Live HLS unavailable": "ăƒ©ă‚€ăƒ–HLSă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "No stream URL configured": "ă‚čトăƒȘăƒŒăƒ URLăŒèš­ćźšă•ă‚ŒăŠă„ăŸă›ă‚“", + "Live stream connected": "ăƒ©ă‚€ăƒ–ă‚čトăƒȘăƒŒăƒ æŽ„ç¶šæžˆăż", + "Snapshot feed connected": "ă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆăƒ•ă‚ŁăƒŒăƒ‰æŽ„ç¶šæžˆăż", + "Media fetch failed": "ăƒĄăƒ‡ă‚Łă‚ąăźć–ćŸ—ă«ć€±æ•—ă—ăŸă—ăŸ", + "Upstream snapshot active": "配信慃ぼă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆă‚’äœżç”šäž­", + "Fallback Street View frame": "ä»Łæ›żăźă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒç”»ćƒ", + "Upstream unavailable": "é…äżĄć…ƒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "No source configured": "ă‚œăƒŒă‚čăŒèš­ćźšă•ă‚ŒăŠă„ăŸă›ă‚“", + "Configured source": "èš­ćźšæžˆăżăźă‚œăƒŒă‚č", + "Configured Source": "èš­ćźšæžˆăżăźă‚œăƒŒă‚č", + "Synthetic fallback": "ćˆæˆă«ă‚ˆă‚‹ä»Łæ›ż", + "Upstream HTTP {status}": "配信慃 HTTP {status}", + "Unexpected media type {type}": "äșˆæœŸă—ăȘă„ăƒĄăƒ‡ă‚Łă‚ąă‚żă‚€ăƒ— {type}", + "SOURCE · UNKNOWN": "ă‚œăƒŒă‚č · 䞍明", + "FRAME · LOADING": "ăƒ•ăƒŹăƒŒăƒ  · èȘ­èŸŒäž­", + "FRAME · UNAVAILABLE": "ăƒ•ăƒŹăƒŒăƒ  · ćˆ©ç”šäžćŻ", + "CALIBRATED": "æ Ąæ­Łæžˆăż", + "CURATED": "çČŸæŸ»æžˆăż", + "RAW PRIOR": "ćˆæœŸæŽšćźšć€€", + "CCTV ON": "CCTV ă‚Șン", + "CCTV OFF": "CCTV ă‚Șフ", + "VIEWSHED ON": "ćŻèŠ–ćŸŸ ă‚Șン", + "COVERAGE ON": "ă‚«ăƒăƒŒçŻ„ć›Č ă‚Șン", + "COVERAGE OFF": "ă‚«ăƒăƒŒçŻ„ć›Č ă‚Șフ", + "AUTO HOP ON": "è‡Șć‹•ćˆ‡æ›ż ă‚Șン", + "AUTO HOP OFF": "è‡Șć‹•ćˆ‡æ›ż ă‚Șフ", + "PROJECTION ON": "æŠ•ćœ± ă‚Șン", + "PROJECTION OFF": "æŠ•ćœ± ă‚Șフ", + "CAL · EDITED (UNSAVED)": "CAL · ç·šé›†æžˆăżïŒˆæœȘäżć­˜ïŒ‰", + "CAL · {badge}": "CAL · {badge}", + "MONITOR": "ăƒąăƒ‹ă‚żăƒŒ", + "OFF": "ă‚Șフ", + "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · è·é›ą {range}m · {projection}{calBadge} · {provider}{status}", + "{count} cameras loaded · click a camera to activate": { + "other": "ă‚«ăƒĄăƒ© {count}揰をèȘ­èŸŒæžˆăż · ă‚«ăƒĄăƒ©ă‚’ă‚ŻăƒȘăƒƒă‚Żă—ăŠæœ‰ćŠč挖" + }, + "{count} cameras loaded · enable CCTV to activate": { + "other": "ă‚«ăƒĄăƒ© {count}揰をèȘ­èŸŒæžˆăż · CCTVă‚’æœ‰ćŠčă«ă—ăŠäœżç”š" + }, + "{count} more cameras outside this view · pan or zoom out": { + "other": "ă“ăźèĄšç€ș範ć›Č怖にさらに {count}ć°ăźă‚«ăƒĄăƒ© · ç§»ć‹•ăŸăŸăŻă‚șăƒŒăƒ ă‚ąă‚Šăƒˆ" + }, + "Enable CCTV to load camera intersections": "CCTVă‚’æœ‰ćŠčă«ă™ă‚‹ăšă€ă‚«ăƒĄăƒ©ăźă‚ă‚‹äș€ć·źç‚čをèȘ­ăżèŸŒăżăŸă™", + "Enable CCTV to start camera-linked intelligence summaries.": "CCTVă‚’æœ‰ćŠčă«ă™ă‚‹ăšă€ă‚«ăƒĄăƒ©é€Łć‹•ăźă‚€ăƒłăƒ†ăƒȘゾェンă‚čæŠ‚èŠă‚’é–‹ć§‹ă—ăŸă™ă€‚", + "No summary available.": "ćˆ©ç”šă§ăă‚‹æŠ‚èŠăŻă‚ă‚ŠăŸă›ă‚“ă€‚", + "loading frames": "ăƒ•ăƒŹăƒŒăƒ èȘ­èŸŒäž­", + "camera grid ready": "ă‚«ăƒĄăƒ©ă‚°ăƒȘッドæș–ć‚™ćźŒäș†", + "Clearing selected data layers": "éžæŠžäž­ăźăƒ‡ăƒŒă‚żăƒŹă‚€ăƒ€ăƒŒă‚’è§Łé™€äž­", + "Clear selected data layers": "éžæŠžäž­ăźăƒ‡ăƒŒă‚żăƒŹă‚€ăƒ€ăƒŒă‚’è§Łé™€", + "CONDITIONS UNKNOWN": "æ°—è±ĄçŠ¶æłäžæ˜Ž", + "CLEAR": "ćż«æ™Ž", + "PARTLY CLOUDY": "æ™Žă‚Œ", + "OVERCAST": "æ›‡ć€©", + "FOG": "霧", + "DRIZZLE": "霧雹", + "RAIN": "雹", + "RAIN SHOWERS": "ă«ă‚ă‹é›š", + "SNOW SHOWERS": "ă«ă‚ă‹é›Ș", + "THUNDERSTORM": "雷雚", + "MIXED CONDITIONS": "ăăźä»–ăźæ°—è±ĄçŠ¶æł", + "CYCLE ON": "è‡Șć‹•ćˆ‡æ›ż ă‚Șン", + "CYCLE OFF": "è‡Șć‹•ćˆ‡æ›ż ă‚Șフ", + "Stop automatic page cycling. Previous, Next, and the SIG/NEWS/LOCAL tabs stay available.": "ăƒšăƒŒă‚žăźè‡Șć‹•ćˆ‡ă‚Šæ›żăˆă‚’ćœæ­ąă—ăŸă™ă€‚ïŒ»ć‰ăžïŒœă€ïŒ»æŹĄăžïŒœăšïŒ»ă‚·ă‚°ăƒŠăƒ«ïŒœïŒïŒ»ăƒ‹ăƒ„ăƒŒă‚čïŒœïŒïŒ»ăƒ­ăƒŒă‚«ăƒ«ïŒœă‚żăƒ–ăŻćŒ•ăç¶šăäœżăˆăŸă™ă€‚", + "Cycle briefing pages automatically every 9 seconds (Signals → News → Local). Pauses while you hover or focus the panel. Live signal data refreshes continuously either way.": "9ç§’ă”ăšă«ăƒ–ăƒȘăƒŒăƒ•ă‚Łăƒłă‚°ăƒšăƒŒă‚žă‚’è‡Șć‹•ă§ćˆ‡ă‚Šæ›żăˆăŸă™ïŒˆă‚·ă‚°ăƒŠăƒ« → ăƒ‹ăƒ„ăƒŒă‚č → ăƒ­ăƒŒă‚«ăƒ«ïŒ‰ă€‚ăƒ‘ăƒăƒ«ă«ă‚«ăƒŒă‚œăƒ«ă‚’ćˆă‚ă›ă‚‹ă‹ăƒ•ă‚©ăƒŒă‚«ă‚čă—ăŠă„ă‚‹é–“ăŻäž€æ™‚ćœæ­ąă—ăŸă™ă€‚ăƒ©ă‚€ăƒ–ă‚·ă‚°ăƒŠăƒ«ăźăƒ‡ăƒŒă‚żăŻă€ă©ăĄă‚‰ăźć Žćˆă‚‚ç¶™ç¶šçš„ă«æ›Žæ–°ă•ă‚ŒăŸă™ă€‚", + "ACQUIRING REGIONAL NEWS": "ćœ°ćŸŸăƒ‹ăƒ„ăƒŒă‚čă‚’ć–ćŸ—äž­", + "REGIONAL NEWS UNAVAILABLE": "ćœ°ćŸŸăƒ‹ăƒ„ăƒŒă‚čă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "RESOLVING REGION": "朰柟をç‰č漚侭", + "REGION UNAVAILABLE": "ćœ°ćŸŸă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "NO RECENT LOCATION MATCHES": "ă“ăźćœ°ćŸŸăźæœ€èż‘ăźăƒ‹ăƒ„ăƒŒă‚čăȘし", + "{domain} · {age}": "{domain} · {age}", + "{value} KM/H": "{value} km/h", + "CLOUD {pct}%": "é›Č量 {pct}%", + "CLOUD UNKNOWN": "é›Č量䞍明", + "{source} · LOCATION QUERY": "{source} · äœçœźă‚Żă‚šăƒȘ", + "REGIONAL NEWS": "ćœ°ćŸŸăƒ‹ăƒ„ăƒŒă‚č", + "{label} · {radius} AIR/SEA WINDOW": "{label} · èˆȘç©ș機/èˆčèˆ¶ăźçŻ„ć›Č {radius}", + "{scope} · INSTALLATIONS {coverage}": "{scope} · 斜蚭 {coverage}", + "CONTEXT STANDBY": "コンテキă‚čăƒˆćŸ…æ©Ÿ", + "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "ă‚°ăƒ­ăƒŒăƒăƒ«ă‚łăƒłăƒ†ă‚­ă‚čăƒˆă‚’æœ‰ćŠčă«ă™ă‚‹ăšèż‘æŽ„ăƒ”ăƒłă‚°ă‚’èĄšç€ș", + "CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "コンタクトć–Ș怱 · æœ€ç”‚æ—ąçŸ„ăźć€€ · ćź‰ć…šăźäżèšŒă§ăŻă‚ă‚ŠăŸă›ă‚“", + "CONTACT LOST · {subject}": "コンタクトć–Ș怱 · {subject}", + "SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "ćŻŸè±ĄăŒăƒ•ă‚ŁăƒŒăƒ‰ă‹ă‚‰ć€–ă‚ŒăŸă—ăŸ · æœ€ç”‚æ—ąçŸ„ăźć€€ă‚’äżæŒ", + "{cohort} · {contact}": "{cohort} · {contact}", + "NO AVAILABLE EXAMPLE": "è©Čćœ“ă™ă‚‹äŸ‹ăȘし", + "{cohort}, Unavailable": "{cohort}ă€ćˆ©ç”šäžćŻ", + "AHEAD": "æ­Łéą", + "{side} {angle}": "{side} {angle}", + "L": "ć·Š", + "R": "揳", + "{count} INPUTS UNKNOWN · NOT AN ALL-CLEAR": { + "other": "䞍明ăȘ慄抛 {count}ä»¶ · ćź‰ć…šăźäżèšŒă§ăŻă‚ă‚ŠăŸă›ă‚“" + }, + "AVAILABLE INPUTS CURRENT · NOT AN ALL-CLEAR": "ćˆ©ç”šćŻèƒœăȘć…„ćŠ›ăŻæœ€æ–° · ćź‰ć…šăźäżèšŒă§ăŻă‚ă‚ŠăŸă›ă‚“", + "SQUAWK {code} · {status}": "ă‚čă‚łăƒŒă‚Ż {code} · {status}", + "ADS-B PRIORITY · {status}": "ADS-Bć„Ș慈 · {status}", + "ADS-B EMERGENCY · {status}": "ADS-B緊怄 · {status}", + "AIRCRAFT": "èˆȘç©ș機", + "ACQUIRING SURFACE": "ćœ°èĄšă‚’ć–ćŸ—äž­", + "SURFACE FALLBACK": "ćœ°èĄšăƒ•ă‚©ăƒŒăƒ«ăƒăƒƒă‚Ż", + "STALE FEED": "ăƒ•ă‚ŁăƒŒăƒ‰æ›Žæ–°é…ć»¶", + "LIVE TRACK": "ăƒ©ă‚€ăƒ–èżœè·Ą", + "COMMERCIAL": "民間", + "{aircraftClass} · {emergency} · {feedState}": "{aircraftClass} · {emergency} · {feedState}", + "{aircraftClass} · {feedState} · COURSE ALIGNED": "{aircraftClass} · {feedState} · é‡è·Żäž€è‡Ž", + "ARROW · ESTIMATED DIRECTION": "矱捰 · æŽšćźšæ–č搑", + "ROUTE DATA UNAVAILABLE": "ç”Œè·Żăƒ‡ăƒŒă‚żăȘし", + "DEST {bearing}": "盼的朰 {bearing}", + "Disable cockpit weather effects": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăźć€©ć€™ă‚šăƒ•ă‚§ă‚Żăƒˆă‚’ç„ĄćŠčにする", + "Enable cockpit weather effects": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăźć€©ć€™ă‚šăƒ•ă‚§ă‚Żăƒˆă‚’æœ‰ćŠčにする", + "ON": "ă‚Șン", + "Normal": "æš™æș–", + "Night vision": "暗芖", + "Thermal": "ă‚”ăƒŒăƒžăƒ«", + "Anime": "ケニメ", + "Noir": "ăƒŽăƒŻăƒŒăƒ«", + "Current cockpit vision style: {style}. Activate for next style.": "çŸćœšăźă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăƒ“ă‚žăƒ§ăƒłă‚čă‚żă‚€ăƒ«ïŒš{style}ă€‚æŠŒă™ăšæŹĄăźă‚čă‚żă‚€ăƒ«ă«ćˆ‡ă‚Šæ›żă‚ă‚ŠăŸă™ă€‚", + "Current style: {style} — click for next": "çŸćœšăźă‚čă‚żă‚€ăƒ«ïŒš{style}。クăƒȘăƒƒă‚Żă§æŹĄăž", + "Collapse Contact panel": "ă‚łăƒłă‚żă‚Żăƒˆăƒ‘ăƒăƒ«ă‚’æŠ˜ă‚ŠăŸăŸă‚€", + "Expand Contact panel": "ă‚łăƒłă‚żă‚Żăƒˆăƒ‘ăƒăƒ«ă‚’ć±•é–‹", + "Collapse contact panel": "ă‚łăƒłă‚żă‚Żăƒˆăƒ‘ăƒăƒ«ă‚’æŠ˜ă‚ŠăŸăŸă‚€", + "Expand contact panel": "ă‚łăƒłă‚żă‚Żăƒˆăƒ‘ăƒăƒ«ă‚’ć±•é–‹", + "Collapse cockpit briefing panel": "コックピットブăƒȘăƒŒăƒ•ă‚Łăƒłă‚°ăƒ‘ăƒăƒ«ă‚’æŠ˜ă‚ŠăŸăŸă‚€", + "Expand cockpit briefing panel": "コックピットブăƒȘăƒŒăƒ•ă‚Łăƒłă‚°ăƒ‘ăƒăƒ«ă‚’ć±•é–‹", + "Collapse briefing panel": "ブăƒȘăƒŒăƒ•ă‚Łăƒłă‚°ăƒ‘ăƒăƒ«ă‚’æŠ˜ă‚ŠăŸăŸă‚€", + "Expand briefing panel": "ブăƒȘăƒŒăƒ•ă‚Łăƒłă‚°ăƒ‘ăƒăƒ«ă‚’ć±•é–‹", + "OBSERVED / MAPPED PINGS": "èŠłæžŹ / ăƒžăƒƒăƒ—æžˆăżăƒ”ăƒłă‚°", + "SOURCE-BACKED EVENTS · NO SYNTHETIC NEWS": "ć‡șć…žä»˜ăă‚€ăƒ™ăƒłăƒˆăźăż · ćˆæˆăƒ‹ăƒ„ăƒŒă‚čăȘし", + "LATEST LOCATION-MATCHED REPORTING": "äœçœźă«äž€è‡Žă™ă‚‹æœ€æ–°ăźć ±é“", + "{source} · LOCATION QUERY · RECENT": "{source} · äœçœźă‚Żă‚šăƒȘ · æœ€èż‘", + "LOCAL INFO": "ăƒ­ăƒŒă‚«ăƒ«æƒ…ć ±", + "PLACE / CONDITIONS / POSITION": "ć Žæ‰€ / 怩怙 / äœçœź", + "TIME UNKNOWN": "æ™‚ćˆ»äžæ˜Ž", + "{count}M AGO": "{count}戆才", + "{count}H AGO": "{count}æ™‚é–“ć‰", + "{count}D AGO": "{count}æ—„ć‰", + "DIR UNKNOWN": "éąšć‘äžæ˜Ž", + "Select flight {title}": "ăƒ•ăƒ©ă‚€ăƒˆ{title}ă‚’éžæŠž", + "{aircraftClass} · CURRENT": "{aircraftClass} · èżœè·Ąäž­", + "MILITARY FLIGHT": "軍甚機", + "COMMERCIAL FLIGHT": "民間機", + "{aircraftClass} · {distance}": "{aircraftClass} · {distance}", + "DISTANCE UNKNOWN": "è·é›ąäžæ˜Ž", + "{count} INPUTS UNKNOWN": { + "other": "䞍明ăȘ慄抛 {count}ä»¶" + }, + "SOURCE STATUS UNAVAILABLE": "ă‚œăƒŒă‚čçŠ¶æ…‹ă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "Restore real aircraft": "漟際ぼèˆȘç©șæ©Ÿă«æˆ»ă™", + "Reclassify as TR-3B": "TR-3Bă«ć†ćˆ†éĄž", + "TRACK ACQUIRED": "èżœè·Ąé–‹ć§‹", + "{label} · COURSE {heading}°": "{label} · é‡è·Ż {heading}°", + "Context could not restore every layer; try again": "コンテキă‚čトがすăčăŠăźăƒŹă‚€ăƒ€ăƒŒă‚’ćŸ©ć…ƒă§ăăŸă›ă‚“ă§ă—ăŸă€‚ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„", + "No selected data layers": "éžæŠžäž­ăźăƒ‡ăƒŒă‚żăƒŹă‚€ăƒ€ăƒŒăŻă‚ă‚ŠăŸă›ă‚“", + "{count} data layers could not be cleared": { + "other": "ăƒ‡ăƒŒă‚żăƒŹă‚€ăƒ€ăƒŒ{count}ä»¶ă‚’è§Łé™€ă§ăăŸă›ă‚“ă§ă—ăŸ" + }, + "Cleared {count} data layers": { + "other": "ăƒ‡ăƒŒă‚żăƒŹă‚€ăƒ€ăƒŒă‚’{count}ä»¶è§Łé™€ă—ăŸă—ăŸ" + }, + "Selected data layers could not be cleared": "éžæŠžäž­ăźăƒ‡ăƒŒă‚żăƒŹă‚€ăƒ€ăƒŒă‚’è§Łé™€ă§ăăŸă›ă‚“ă§ă—ăŸ", + "Space Missions could not complete the requested transition; try again": "ćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒłăŒèŠæ±‚ă•ă‚ŒăŸćˆ‡ă‚Šæ›żăˆă‚’ćźŒäș†ă§ăăŸă›ă‚“ă§ă—ăŸă€‚ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„", + "Nearby installations refreshed": "摹èŸșæ–œèš­ă‚’æ›Žæ–°ă—ăŸă—ăŸ", + "Nearby installations could not be refreshed; try again": "摹èŸșæ–œèš­ă‚’æ›Žæ–°ă§ăăŸă›ă‚“ă§ă—ăŸă€‚ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„", + "Space Missions cancellation could not restore the previous layer state": "ćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒłăźă‚­ăƒŁăƒłă‚»ăƒ«æ™‚ă«ă€ä»„ć‰ăźăƒŹă‚€ăƒ€ăƒŒçŠ¶æ…‹ă‚’ćŸ©ć…ƒă§ăăŸă›ă‚“ă§ă—ăŸ", + "That layer is unavailable in the current Context mode": "ăăźăƒŹă‚€ăƒ€ăƒŒăŻçŸćœšăźă‚łăƒłăƒ†ă‚­ă‚čăƒˆăƒąăƒŒăƒ‰ă§ăŻćˆ©ç”šă§ăăŸă›ă‚“", + "{layerId} could not {action} cleanly": "{layerId}ă‚’æ­Łćžžă«{action}ă§ăăŸă›ă‚“ă§ă—ăŸ", + "start": "開構", + "stop": "ćœæ­ą", + "{mode} could not start because another layer did not stop cleanly": "ćˆ„ăźăƒŹă‚€ăƒ€ăƒŒăŒæ­Łćžžă«ćœæ­ąă—ăȘかったため、{mode}ă‚’é–‹ć§‹ă§ăăŸă›ă‚“ă§ă—ăŸ", + "Space Missions": "ćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒł", + "Context": "コンテキă‚čト", + "Rendered globe frames per second · toggle with `": "ćœ°çƒć„€ăźæç”»ăƒ•ăƒŹăƒŒăƒ ăƒŹăƒŒăƒˆïŒˆæŻŽç§’ïŒ‰ · `ă‚­ăƒŒă§ćˆ‡ă‚Šæ›żăˆ", + "imported map files": "ă‚€ăƒłăƒăƒŒăƒˆă—ăŸćœ°ć›łăƒ•ă‚Ąă‚€ăƒ«", + "Ground heights could not be refreshed. Try the file again when the map has loaded.": "ćœ°èĄšé«˜ă‚’æ›Žæ–°ă§ăăŸă›ă‚“ă§ă—ăŸă€‚ćœ°ć›łăźèȘ­ăżèŸŒăżćŸŒă«ă€ă‚‚う䞀ćșŠă“ăźăƒ•ă‚Ąă‚€ăƒ«ă‚’ăŠè©Šă—ăă ă•ă„ă€‚", + "{count} map objects": { + "other": "朰曳ă‚Șブゾェクト{count}怋" + }, + ", drawn with its own styles": "、独è‡Șたă‚čă‚żă‚€ăƒ«ă§æç”»", + "Hide {name}": "{name}ă‚’éžèĄšç€ș", + "Show {name}": "{name}ă‚’èĄšç€ș", + "Fly to {name}": "{name}ぞ移拕", + "Remove {name}": "{name}を扊陀", + "At most {count} files at once — remove one first.": "侀ćșŠă«èȘ­ăżèŸŒă‚ă‚‹ăźăŻæœ€ć€§{count}ăƒ•ă‚Ąă‚€ăƒ«ă§ă™ă€‚ć…ˆă«1ă€ć‰Šé™€ă—ăŠăă ă•ă„ă€‚", + "Reading {name}
": "{name}をèȘ­ăżć–り䞭 ", + "That file could not be read.": "ăƒ•ă‚Ąă‚€ăƒ«ă‚’èȘ­ăżć–ă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚", + "Added {count} files.": { + "other": "{count}ć€‹ăźăƒ•ă‚Ąă‚€ăƒ«ă‚’èżœćŠ ă—ăŸă—ăŸă€‚" + }, + "{count} files could not be added ({name}: {error})": { + "other": "{count}ć€‹ăźăƒ•ă‚Ąă‚€ăƒ«ă‚’èżœćŠ ă§ăăŸă›ă‚“ă§ă—ăŸïŒˆ{name}{error}" + }, + "Some KML content was left out.": "KMLぼ侀郹ぼ憅ćźčはèȘ­ăżèŸŒăŸă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚", + "Press on the ground, not the sky": "ç©șではăȘăćœ°èĄšă‚’æŠŒă—ăŠăă ă•ă„", + "Drag to size the box": "ăƒ‰ăƒ©ăƒƒă‚°ă—ăŠçŻ„ć›Čăźć€§ăă•ă‚’æ±șめどください", + "light {source} to use your {name} key": "{source}をă‚Șăƒłă«ă—ăŠ{name}ă‚­ăƒŒă‚’äœżă†", + "light {source}": "{source}をă‚Șăƒłă«ă™ă‚‹", + ", or ": "か、", + "{requirement}, or {offer}": "{requirement}ă€‚ăŸăŸăŻ{offer}", + "Live Flights": "ăƒ©ă‚€ăƒ–ăƒ•ăƒ©ă‚€ăƒˆ", + "Military Flights": "軍甚機", + "Earthquakes (24h)": "ćœ°éœ‡ïŒˆ24時間", + "Satellites": "èĄ›æ˜Ÿ", + "Space Missions (30d)": "ćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒł 30æ—„", + "Street Traffic": "é“è·Żäș€é€š", + "CCTV": "CCTV", + "Radio": "ăƒ©ă‚žă‚Ș", + "Bikeshare": "ă‚·ă‚§ă‚ąă‚”ă‚€ă‚Żăƒ«", + "Live AIS Vessels": "ăƒ©ă‚€ăƒ–AISèˆč舶", + "Mapped Installations": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­", + "Global Context": "ă‚°ăƒ­ăƒŒăƒăƒ«ă‚łăƒłăƒ†ă‚­ă‚čト", + "Datacenters": "ăƒ‡ăƒŒă‚żă‚»ăƒłă‚żăƒŒ", + "Dams": "ダム", + "Submarine Cables": "æ”·ćș•ă‚±ăƒŒăƒ–ăƒ«", + "FIRMS Active Fires": "FIRMS火灜怜矄", + "Local ADS-B": "ăƒ­ăƒŒă‚«ăƒ«ADS-B", + "Transit": "ć…Źć…±äș€é€š", + "Recent Imagery": "æœ€èż‘ăźèĄ›æ˜Ÿç”»ćƒ", + "Fire Perimeters": "ç«çœăźć»¶ç„ŒçŻ„ć›Č", + "GNSS Integrity": "GNSSă‚€ăƒłăƒ†ă‚°ăƒȘティ", + "S2 GhostMaps": "S2 GhostMaps", + "Rain radar": "é™æ°ŽăƒŹăƒŒăƒ€ăƒŒ", + "Lightning density": "雷毆ćșŠ", + "Cyclone advisories": "ă‚”ă‚€ă‚Żăƒ­ăƒłæƒ…ć ±", + "ALPR Cameras": "ALPRă‚«ăƒĄăƒ©", + "Live Vessels": "ăƒ©ă‚€ăƒ–èˆč舶", + "Bike Share": "ă‚·ă‚§ă‚ąă‚”ă‚€ă‚Żăƒ«", + "Cameras": "ă‚«ăƒĄăƒ©", + "Street Level": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«", + "Mapped ALPR Cameras": "ALPRă‚«ăƒĄăƒ©", + "Data Centers": "ăƒ‡ăƒŒă‚żă‚»ăƒłă‚żăƒŒ", + "Active Fires": "火灜怜矄", + "Military aircraft": "軍甚機", + "Vessels": "èˆč舶", + "CCTV + Street View fallback": "CCTV + ă‚čトăƒȘăƒŒăƒˆăƒ“ăƒ„ăƒŒă§ä»Łæ›ż", + "OpenStreetMap + optional Google Maps Places": "OpenStreetMap + Google Maps Places任意", + "GFS / ECMWF IFS · FORECAST": "GFS / ECMWF IFS · äșˆć ±", + "NOAA nowCOAST · OBSERVED": "NOAA nowCOAST · èŠłæžŹ", + "NASA FIRMS · LIVE": "NASA FIRMS · ăƒ©ă‚€ăƒ–", + "OSM routing": "OSMăƒ«ăƒŒăƒˆæ€œçŽą", + "data source|Local": "ăƒ­ăƒŒă‚«ăƒ«", + "ENABLING": "有ćŠč挖侭", + "DISABLING": "無ćŠč挖侭", + "Movement": "ç§»ć‹•äœ“", + "Infrastructure": "ă‚€ăƒłăƒ•ăƒ©", + "Events": "ă‚€ăƒ™ăƒłăƒˆ", + "Weather": "æ°—è±Ą", + "Utilities": "ăƒŠăƒŒăƒ†ă‚ŁăƒȘティ", + "Other layers": "ăăźä»–ăźăƒŹă‚€ăƒ€ăƒŒ", + "{state} · {source}": "{state} · {source}", + "UNCERTAIN · {source} · lifecycle state requires reconciliation": "䞍明çąș · {source} · ăƒ©ă‚€ăƒ•ă‚”ă‚€ă‚Żăƒ«çŠ¶æ…‹ăźèȘżæ•ŽăŒćż…èŠă§ă™", + "{state} · {source} · {detail} · retry {seconds}s": "{state} · {source} · {detail} · {seconds}ç§’ćŸŒă«ć†è©ŠèĄŒ", + "{state} · {source} · {detail}": "{state} · {source} · {detail}", + "never": "æœȘć–ćŸ—", + "{source} · {loadingLabel}": "{source} · {loadingLabel}", + "{accepted} of {raw} records accepted": "{raw}ä»¶äž­{accepted}ä»¶ăźăƒŹă‚łăƒŒăƒ‰ă‚’æŽĄç”š", + "incomplete snapshot": "侍漌慹ăȘă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆ", + "{state} · {source} · {detail} · {ago}": "{state} · {source} · {detail} · {ago}", + "{state} · {source} · {ago} · retrying in {seconds}s": "{state} · {source} · {ago} · {seconds}ç§’ćŸŒă«ć†è©ŠèĄŒ", + "{state} · {source} · {ago}": "{state} · {source} · {ago}", + "{source} · {ago}": "{source} · {ago}", + "UNCERTAIN": "䞍明çąș", + "status chip|UNAVAILABLE": "ćˆ©ç”šäžćŻ", + "Data source unavailable": "ăƒ‡ăƒŒă‚żă‚œăƒŒă‚čă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "{name}: {state}": "{name}{state}", + "{count}s ago": "{count}秒才", + "Local FM stopped: internet radio started": "ăƒ­ăƒŒă‚«ăƒ«FMă‚’ćœæ­ąă—ăŸă—ăŸïŒšă‚€ăƒłă‚żăƒŒăƒăƒƒăƒˆăƒ©ă‚žă‚Șă‚’é–‹ć§‹ă—ăŸă—ăŸ", + "IDLE": "ćŸ…æ©Ÿ", + "CONNECTING": "掄続䞭", + "TUNING": "㐌èȘżäž­", + "STREAMING": "揗信侭", + "UNSUPPORTED": "éžćŻŸćżœ", + "idle": "ćŸ…æ©Ÿäž­", + "running": "ćźŸèĄŒäž­", + "suspended": "äž€æ™‚ćœæ­ąäž­", + "closed": "甂äș†", + "feed status|live": "ăƒ©ă‚€ăƒ–", + "feed status|stale": "æ›Žæ–°é…ć»¶", + "feed status|unreachable": "æŽ„ç¶šäžćŻ", + "feed status|invalid": "無ćŠč", + "waiting for IQ": "IQăƒ‡ăƒŒă‚żćŸ…ăĄ", + "{count} messages": { + "other": "ăƒĄăƒƒă‚»ăƒŒă‚ž {count}ä»¶" + }, + "DSP {count} blocks": { + "other": "DSP {count}ブロック" + }, + "DSP waiting": "DSPćŸ…æ©Ÿäž­", + "{level} dBFS audio": "音棰 {level} dBFS", + "audio signal --": "éŸłćŁ°äżĄć· --", + "audio {state}": "音棰 {state}", + "{count} HEARD": { + "other": "揗信 {count}機" + }, + "DISCONNECT": "ćˆ‡æ–­", + "CONNECT": "掄続", + "LOCATING
": "æžŹäœäž­â€Š", + "LOCATED": "æžŹäœæžˆăż", + "LOCATE": "æžŹäœ", + " · read while Local ADS-B is on": " · ăƒ­ăƒŒă‚«ăƒ«ADS-Bがă‚Șăƒłăźé–“ă«èȘ­ăżć–り", + "Decoder feeds: {feeds}": "ăƒ‡ă‚łăƒŒăƒ€ăƒŒăƒ•ă‚ŁăƒŒăƒ‰ïŒš{feeds}", + "Language: {language}": "蚀èȘžïŒš{language}", + "Change the interface language": "ă‚€ăƒłă‚żăƒŒăƒ•ă‚§ăƒŒă‚čăźèš€èȘžă‚’ć€‰æ›Ž", + "Interface language": "ă‚€ăƒłă‚żăƒŒăƒ•ă‚§ăƒŒă‚čăźèš€èȘž", + "Search languages": "蚀èȘžă‚’æ€œçŽą", + "No matching languages": "äž€è‡Žă™ă‚‹èš€èȘžăŒă‚ă‚ŠăŸă›ă‚“", + "📍 Location: --": "📍 äœçœźïŒš--", + "Landmark: --": "ăƒ©ăƒłăƒ‰ăƒžăƒŒă‚ŻïŒš--", + "Searched location": "æ€œçŽąă—ăŸć Žæ‰€", + "ORBIT": "摹曞", + "Location not found": "ć Žæ‰€ăŒèŠ‹ă€ă‹ă‚ŠăŸă›ă‚“", + "Check the spelling and press Enter to search again.": "぀いりをçąșèȘă—、Enteră‚’æŠŒă—ăŠă‚‚ă†äž€ćșŠæ€œçŽąă—ăŠăă ă•ă„ă€‚", + "Search failed": "æ€œçŽąă«ć€±æ•—ă—ăŸă—ăŸ", + "Press Enter to try again.": "Enteră‚’æŠŒă—ăŠă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„ă€‚", + "Detailed outline unavailable": "è©łçŽ°ăȘèŒȘéƒ­ă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "Fly to a POI first": "ć…ˆă«POIăžç§»ć‹•ă—ăŠăă ă•ă„", + "Reset to full globe view": "ćœ°çƒć…šäœ“ăƒ“ăƒ„ăƒŒă«æˆ»ă™", + "Reset cockpit to full globe view": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ćœ°çƒć…šäœ“ăƒ“ăƒ„ăƒŒă«æˆ»ă™", + "Resetting to full globe view": "ćœ°çƒć…šäœ“ăƒ“ăƒ„ăƒŒă«æˆ»ă—ăŠă„ăŸă™", + "Resetting cockpit to full globe view": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ćœ°çƒć…šäœ“ăƒ“ăƒ„ăƒŒă«æˆ»ă—ăŠă„ăŸă™", + "MAP": "マップ", + "Layers": "ăƒŹă‚€ăƒ€ăƒŒ", + "Search": "æ€œçŽą", + "More": "ăăźä»–", + "Panels": "ăƒ‘ăƒăƒ«", + "panel": "ăƒ‘ăƒăƒ«", + "Expand {name}": "{name}を汕開", + "Collapse {name}": "{name}ă‚’æŠ˜ă‚ŠăŸăŸă‚€", + "Expand Radio": "ăƒ©ă‚žă‚Șを汕開", + "Collapse Radio": "ăƒ©ă‚žă‚Șă‚’æŠ˜ă‚ŠăŸăŸă‚€", + "Expand Radio section": "ăƒ©ă‚žă‚Șă‚»ă‚Żă‚·ăƒ§ăƒłă‚’ć±•é–‹", + "Collapse Radio section": "ăƒ©ă‚žă‚Șă‚»ă‚Żă‚·ăƒ§ăƒłă‚’æŠ˜ă‚ŠăŸăŸă‚€", + "Panel layout updated — positions reset to new defaults": "ăƒ‘ăƒăƒ«ăƒŹă‚€ă‚ąă‚Šăƒˆă‚’æ›Žæ–°ă—ăŸă—ăŸă€‚äœçœźă‚’æ–°ă—ă„ćˆæœŸć€€ă«ăƒȘă‚»ăƒƒăƒˆă—ăŸă—ăŸ", + "Austin": "ă‚ȘăƒŒă‚čティン", + "San Francisco": "ă‚”ăƒłăƒ•ăƒ©ăƒłă‚·ă‚čコ", + "New York": "ăƒ‹ăƒ„ăƒŒăƒšăƒŒă‚Ż", + "Tokyo": "東äșŹ", + "London": "ロンドン", + "Paris": "パăƒȘ", + "Dubai": "ăƒ‰ăƒă‚€", + "Washington DC": "ăƒŻă‚·ăƒłăƒˆăƒłD.C.", + "Tallinn": "タăƒȘン", + "Los Angeles": "ăƒ­ă‚”ăƒłă‚Œăƒ«ă‚č", + "Collapse Cockpit display options": "コックピットぼディă‚čăƒ—ăƒŹă‚€èš­ćźšă‚’æŠ˜ă‚ŠăŸăŸă‚€", + "Expand Cockpit display options": "コックピットぼディă‚čăƒ—ăƒŹă‚€èš­ćźšă‚’ć±•é–‹", + "Collapse Cockpit Radio controls": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăźăƒ©ă‚žă‚Șæ“äœœă‚’æŠ˜ă‚ŠăŸăŸă‚€", + "Expand Cockpit Radio controls": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăźăƒ©ă‚žă‚Șæ“äœœă‚’ć±•é–‹", + "CH {index} / {total}": "CH {index} / {total}", + "NO STATIONS": "ć±€ăȘし", + "NO STATION AVAILABLE": "ćˆ©ç”šă§ăă‚‹ć±€ăŒă‚ă‚ŠăŸă›ă‚“", + "{name}, station {index} of {total}": "{name}、{total}汀䞭{index}汀盟", + "No station available": "ćˆ©ç”šă§ăă‚‹ć±€ăŒă‚ă‚ŠăŸă›ă‚“", + "OFF AIR": "æ”Ÿé€äŒ‘æ­ą", + "STATION UNAVAILABLE": "ć±€ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Station unavailable after directory refresh": "ディレクトăƒȘæ›Žæ–°ćŸŒă«ć±€ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Radio could not {action} cleanly": "ăƒ©ă‚žă‚Șă‚’æ­Łćžžă«{action}ă§ăăŸă›ă‚“ă§ă—ăŸ", + "SYNC": "ćŒæœŸ", + "RECONCILE": "憍èȘżæ•Ž", + "DISABLE": "無ćŠč挖", + "ENABLE": "有ćŠč挖", + "Reconcile Radio — lifecycle uncertain": "ăƒ©ă‚žă‚Șを憍èȘżæ•ŽïŒšăƒ©ă‚€ăƒ•ă‚”ă‚€ă‚Żăƒ«ăŒäžæ˜Žçąș", + "Disable Radio": "ăƒ©ă‚žă‚Șを無ćŠčにする", + "Enable Radio": "ăƒ©ă‚žă‚Șă‚’æœ‰ćŠčにする", + "{category} ({count})": "{category}{count}", + "DIRECTORY BAND": "ディレクトăƒȘバンド", + "{category} BAND": "{category}バンド", + "NO STATION SELECTED": "ć±€ăŒæœȘ遞択", + "Directory metadata only": "ディレクトăƒȘăźăƒĄă‚żăƒ‡ăƒŒă‚żăźăż", + "Loading station directory
": "ć±€ăƒ‡ă‚ŁăƒŹă‚ŻăƒˆăƒȘをèȘ­ăżèŸŒăżäž­â€Š", + "Choose a globe marker or use next.": "ćœ°çƒć„€ăźăƒžăƒŒă‚«ăƒŒă‚’éžă¶ă‹ă€ïŒ»æŹĄăžïŒœă‚’äœżăŁăŠăă ă•ă„ă€‚", + "TAGS · {tags}": "タグ · {tags}", + "Play": "憍生", + "PAUSE": "äž€æ™‚ćœæ­ą", + "RESUME": "憍開", + "PLAY": "憍生", + "selected": "éžæŠžäž­ăź", + "nearest": "æœ€ćŻ„ă‚Šăź", + "{action} {target} radio station": "{target}ăƒ©ă‚žă‚Ș汀を{action}", + "SYNCING": "ćŒæœŸäž­", + "READY": "æș–ć‚™ćźŒäș†", + "station": "ć±€", + " · stale/degraded directory": " · ディレクトăƒȘæ›Žæ–°é…ć»¶/性胜䜎䞋", + " · degraded directory": " · ディレクトăƒȘ性胜䜎䞋", + " · stale directory": " · ディレクトăƒȘæ›Žæ–°é…ć»¶", + " · outside current filter": " · çŸćœšăźç”žă‚ŠèŸŒăżćŻŸè±Ąć€–", + "Ready — playback starts only from your action": "æș–ć‚™ćźŒäș†ïŒšć†ç”ŸăŻæ“äœœă—ăŸăšăăźăżé–‹ć§‹ă•ă‚ŒăŸă™", + "Radio off": "ăƒ©ă‚žă‚Ș ă‚Șフ", + "Connecting directly to broadcaster
": "æ”Ÿé€ć±€ă«ç›ŽæŽ„æŽ„ç¶šäž­â€Š", + "Buffering broadcaster stream
": "æ”Ÿé€ć±€ăźă‚čトăƒȘăƒŒăƒ ă‚’ăƒăƒƒăƒ•ă‚ĄăƒȘング侭
", + "Playing {station}": "{station}を憍生侭", + "Paused {station}": "{station}ă‚’äž€æ™‚ćœæ­ąäž­", + "Broadcaster stream unavailable": "æ”Ÿé€ć±€ăźă‚čトăƒȘăƒŒăƒ ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + " · muted during voice interaction": " · éŸłćŁ°æ“äœœäž­ăŻăƒŸăƒ„ăƒŒăƒˆ", + " · restoring volume after voice": " · éŸłćŁ°æ“äœœćŸŒă«éŸłé‡ă‚’ćŸ©ć…ƒäž­", + " · static indicates no broadcaster audio": " · ăƒŽă‚€ă‚șăŻæ”Ÿé€ć±€ăźéŸłćŁ°ăŒăȘいこべをç€șă—ăŸă™", + " · tuning static until broadcaster starts": " · æ”Ÿé€ăŒć§‹ăŸă‚‹ăŸă§éžć±€ăƒŽă‚€ă‚șを憍生", + "Station unavailable after directory refresh — choose another channel": "ディレクトăƒȘæ›Žæ–°ćŸŒă«ć±€ă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚ćˆ„ăźăƒăƒŁăƒłăƒăƒ«ă‚’éžă‚“ă§ăă ă•ă„", + "Radio is enabling
": "ăƒ©ă‚žă‚Șă‚’æœ‰ćŠčćŒ–ă—ăŠă„ăŸă™â€Š", + "Radio is disabling
": "ăƒ©ă‚žă‚Șを無ćŠčćŒ–ă—ăŠă„ăŸă™â€Š", + "Radio lifecycle is uncertain — use Enable or Disable to reconcile": "ăƒ©ă‚žă‚Șăźăƒ©ă‚€ăƒ•ă‚”ă‚€ă‚Żăƒ«ăŒäžæ˜Žçąșă§ă™ă€‚æœ‰ćŠčćŒ–ăŸăŸăŻç„ĄćŠč挖で憍èȘżæ•Žă—ăŠăă ă•ă„", + "Clear reading": "èȘ­ăżć–ă‚Šć€€ă‚’æ¶ˆćŽ»", + "Earlier observation": "ć‰ăźèŠłæžŹ", + "Observed history": "èŠłæžŹć±„æ­Ž", + "Later observation": "æŹĄăźèŠłæžŹ", + "Latest": "最新", + "Newest frame per product": "ăƒ—ăƒ­ăƒ€ă‚Żăƒˆă”ăšăźæœ€æ–°ăƒ•ăƒŹăƒŒăƒ ", + "Replay observed history": "èŠłæžŹć±„æ­Žă‚’ć†ç”Ÿ", + "Imagery on Esri · Google 3D returns when cleared": "ç”»ćƒăŻEsriäžŠă«èĄšç€ș · æ¶ˆćŽ»ă™ă‚‹ăšGoogle 3Dă«æˆ»ă‚ŠăŸă™", + "Point the camera at the ground to use the view": "ă“ăźăƒ“ăƒ„ăƒŒă‚’äœżă†ă«ăŻă‚«ăƒĄăƒ©ă‚’ćœ°éąă«ć‘ă‘ăŠăă ă•ă„", + "That point cannot anchor a box": "そぼ朰ç‚čは範ć›ČたćŸșç‚čă«ă§ăăŸă›ă‚“", + "Imagery stops at ±{limit}° latitude": "ç”»ćƒăŻç·ŻćșŠÂ±{limit}Â°ăŸă§ă§ă™", + "{owner} is using the pointer — close it first": "{owner}ăŒăƒă‚€ăƒłă‚żăƒŒă‚’äœżç”šäž­ă§ă™ă€‚ć…ˆă«é–‰ă˜ăŠăă ă•ă„", + "Box is {size} wide · limit {limit}": "範ć›Čたćč… {size} · 侊限 {limit}", + "View is {size} wide · limit {limit}": "èĄšç€șたćč… {size} · 侊限 {limit}", + "VS BASEMAP": "ćœ°ć›łăšæŻ”èŒƒ", + "A / B": "A / B", + "Newest low-cloud day for this box · scene cloud, not box cloud": "こぼ範ć›Čでé›Čぼ民ăȘă„æœ€æ–°ăźæ—„ · ă‚·ăƒŒăƒłć…šäœ“ăźé›Č量で、範ć›Č憅ぼé›Čé‡ă§ăŻă‚ă‚ŠăŸă›ă‚“", + "Newest day covering this box · cloudier than 20%": "こぼ範ć›Čă‚’ă‚«ăƒăƒŒă™ă‚‹æœ€æ–°ăźæ—„ · é›Č量20%超", + "Newest day with imagery for this box · partial coverage": "こぼ範ć›Čăźç”»ćƒăŒă‚ă‚‹æœ€æ–°ăźæ—„ · äž€éƒšăźăżă‚«ăƒăƒŒ", + "Newest daily overview for this box": "こぼ範ć›Čăźæœ€æ–°ăźæ—„æŹĄæŠ‚èŠł", + "newest clear day": "é›Čぼ民ăȘă„æœ€æ–°ăźæ—„", + "newest day (cloudy)": "æœ€æ–°ăźæ—„ïŒˆæ›‡ă‚ŠïŒ‰", + "newest day (partial coverage)": "æœ€æ–°ăźæ—„ïŒˆäž€éƒšă‚«ăƒăƒŒïŒ‰", + "newest overview": "æœ€æ–°ăźæŠ‚èŠł", + "No imagery": "ç”»ćƒăȘし", + "Loading": "èȘ­ăżèŸŒăżäž­", + "coverage|full": "ć…šäœ“", + "coverage|partial": "侀郹", + "unknown": "䞍明", + "no imagery": "ç”»ćƒăȘし", + "{percent}% cloud": "é›Č量 {percent}%", + "{min}–{max}% cloud": "é›Č量 {min}–{max}%", + "NO BOX": "範ć›ČăȘし", + "SEARCHING": "æ€œçŽąäž­", + "{count} DAYS": { + "other": "{count}æ—„ćˆ†" + }, + "Zoom in or draw a smaller box": "ă‚șăƒŒăƒ ă‚€ăƒłă™ă‚‹ă‹ă€ă‚ˆă‚Šć°ă•ă„çŻ„ć›Čă‚’æă„ăŠăă ă•ă„", + "Select a box or use the view": "範ć›Čă‚’éžæŠžă™ă‚‹ă‹ă€çŸćœšăźăƒ“ăƒ„ăƒŒă‚’äœżç”šă—ăŠăă ă•ă„", + "Searching the last 30 days": "過掻30æ—„é–“ă‚’æ€œçŽąäž­", + "No days to show for this box": "こぼ範ć›Čă§èĄšç€șă§ăă‚‹æ—„ăŒă‚ă‚ŠăŸă›ă‚“", + "Drag the divider · SWAP trades sides": "ćąƒç•Œç·šă‚’ăƒ‰ăƒ©ăƒƒă‚° · ïŒ»ć…„ă‚Œæ›żăˆïŒœă§ć·Šćłă‚’äș€æ›", + "← → preview · A or B pins the focused day": "← → ă§ăƒ—ăƒŹăƒ“ăƒ„ăƒŒ · AăŸăŸăŻBă§éžæŠžäž­ăźæ—„ă‚’ć›ș漚", + "← → preview the other side · A or B pins it": "← → ă§ććŻŸćŽă‚’ăƒ—ăƒŹăƒ“ăƒ„ăƒŒ · AăŸăŸăŻBでć›ș漚", + "S on another day replaces it · × unpins": "ćˆ„ăźæ—„ă§Să‚’æŠŒă™ăšçœźăæ›ăˆ · ×でć›șćźšă‚’è§Łé™€", + "← → preview · S shows the focused day": "← → ă§ăƒ—ăƒŹăƒ“ăƒ„ăƒŒ · Să§éžæŠžäž­ăźæ—„ă‚’èĄšç€ș", + "ZOOM IN": "ă‚șăƒŒăƒ ă‚€ăƒł", + "Fly in until the view fits the 1,000 km limit": "èĄšç€șが侊限ぼ1,000 kmă«ćŽăŸă‚‹ăŸă§èż‘ă„ă„ăŠăă ă•ă„", + "Imagery days, newest first · arrows move, S or A and B pin": "ç”»ćƒăźă‚ă‚‹æ—„ïŒˆæ–°ă—ă„é †ïŒ‰ · çŸąć°ă‚­ăƒŒă§ç§»ć‹•ă€SăŸăŸăŻA・Bでć›ș漚", + "On the map": "朰曳侊", + "Mode": "ăƒąăƒŒăƒ‰", + "Imagery opacity": "ç”»ćƒăźäžé€æ˜ŽćșŠ", + "SWAP": "ć…„ă‚Œæ›żăˆ", + "Trade the two sides of the divider": "ćąƒç•Œç·šăźć·Šćłă‚’ć…„ă‚Œæ›żăˆă‚‹", + "SELECT BOX": "範ć›Čă‚’éžæŠž", + "Drag a box on the map (Esc cancels)": "朰曳侊で範ć›Čă‚’ăƒ‰ăƒ©ăƒƒă‚°ïŒˆEscă§ă‚­ăƒŁăƒłă‚»ăƒ«ïŒ‰", + "USE VIEW": "ăƒ“ăƒ„ăƒŒă‚’äœżç”š", + "Use the current view as the box": "çŸćœšăźăƒ“ăƒ„ăƒŒă‚’çŻ„ć›Čăšă—ăŠäœżç”š", + "Forget the box and its images": "範ć›Čăšăăźç”»ćƒă‚’ç ŽæŁ„", + "START HERE": "ここから開構", + "Checking": "çąșèȘäž­", + "PREVIEW": "ăƒ—ăƒŹăƒ“ăƒ„ăƒŒ", + "Newest day with imagery for this box": "こぼ範ć›Čăźç”»ćƒăŒă‚ă‚‹æœ€æ–°ăźæ—„", + "SHOW": "èĄšç€ș", + "Pin {day} as {slot}": "{day}を{slot}にć›ș漚", + "Show {day}": "{day}ă‚’èĄšç€ș", + "pinned {slot}": "{slot}にć›șćźšæžˆăż", + "shown": "èĄšç€șäž­", + "preview": "ăƒ—ăƒŹăƒ“ăƒ„ăƒŒ", + "start here": "ここから開構", + "No box": "範ć›ČăȘし", + "Searching": "æ€œçŽąäž­", + "Every day is empty here": "ă“ă“ă§ăŻă©ăźæ—„ă‚‚ç”»ćƒăŒă‚ă‚ŠăŸă›ă‚“", + "Sources off": "ă‚œăƒŒă‚čがă‚Șフ", + "VS": "æŻ”èŒƒ", + "Not set": "æœȘèš­ćźš", + "Basemap": "ăƒ™ăƒŒă‚čマップ", + "Source off": "ă‚œăƒŒă‚čがă‚Șフ", + "Unpin {slot}": "{slot}たć›șćźšă‚’è§Łé™€", + "Unpin the image": "ç”»ćƒăźć›șćźšă‚’è§Łé™€", + "EXPORT {slot}": "{slot}ă‚’æ›žăć‡șし", + "EXPORT": "æ›žăć‡șし", + "Download {slot} as a PNG": "{slot}をPNGă§ăƒ€ă‚Šăƒłăƒ­ăƒŒăƒ‰", + "Download the image as a PNG": "ç”»ćƒă‚’PNGă§ăƒ€ă‚Šăƒłăƒ­ăƒŒăƒ‰", + "Box {width} × {height} km": "範ć›Č {width} × {height} km", + "Acquired {time}": "ć–ćŸ—æ™‚ćˆ» {time}", + "Coverage {coverage}": "ă‚«ăƒăƒŒçŻ„ć›Č {coverage}", + "START HERE · {reason}": "ここから開構 · {reason}", + "Daily overview shows little detail in a box this small": "こぼ氏さăȘ範ć›Čă§ăŻă€æ—„æŹĄæŠ‚èŠłă«ă»ăšă‚“ă©è©łçŽ°ăŒć†™ă‚ŠăŸă›ă‚“", + "Imagery: NASA GIBS and Worldview · HLS (Sentinel-2, Landsat 8/9) and VIIRS": "ç”»ćƒïŒšNASA GIBSおよびWorldview · HLSSentinel-2、Landsat 8/9ïŒ‰ăšVIIRS", + "Details": "è©łçŽ°", + "Times, coverage, sources": "æ™‚ćˆ»ă€ă‚«ăƒăƒŒçŻ„ć›Čă€ă‚œăƒŒă‚č", + "HIDE EMPTY DAYS": "ç”»ćƒăźăȘă„æ—„ă‚’éš ă™", + "SHOW EMPTY DAYS · {count}": "ç”»ćƒăźăȘă„æ—„ă‚’èĄšç€ș · {count}", + "Days the probe found empty in this box": "こぼ範ć›ČでèȘżæŸ»ăźç”æžœă€ç”»ćƒăŒăȘă‹ăŁăŸæ—„", + "image": "ç”»ćƒ", + "BASEMAP": "ăƒ™ăƒŒă‚čマップ", + "The basemap": "ăƒ™ăƒŒă‚čマップ", + "basemap": "ăƒ™ăƒŒă‚čマップ", + "Recent imagery against the basemap divider": "æœ€èż‘ăźèĄ›æ˜Ÿç”»ćƒăšăƒ™ăƒŒă‚čăƒžăƒƒăƒ—ăźćąƒç•Œç·š", + "Recent imagery A and B divider": "æœ€èż‘ăźèĄ›æ˜Ÿç”»ćƒAずBăźćąƒç•Œç·š", + "{before} {left} percent, {after} {right} percent": "{before} {left}%、{after} {right}%", + "Export failed · {error}": "æ›žăć‡șă—ă«ć€±æ•—ă—ăŸă—ăŸ · {error}", + "Scene action failed": "ă‚·ăƒŒăƒłæ“äœœă«ć€±æ•—ă—ăŸă—ăŸ", + "New scene name": "æ–°ă—ă„ă‚·ăƒŒăƒłć", + "Delete scene \"{scene}\" and all shots?": "ă‚·ăƒŒăƒłă€Œ{scene}」べすăčăŠăźă‚·ăƒ§ăƒƒăƒˆă‚’ć‰Šé™€ă—ăŸă™ă‹ïŒŸ", + "Delete shot \"{shot}\"?": "ă‚·ăƒ§ăƒƒăƒˆă€Œ{shot}ă€ă‚’ć‰Šé™€ă—ăŸă™ă‹ïŒŸ", + "Stopped (Esc)": "ćœæ­ąă—ăŸă—ăŸïŒˆEsc", + "SPARSE": "äœŽćŻ†ćșŠ", + "BALANCED": "æš™æș–", + "No shots yet. Use CAPTURE SHOT to save current look.": "ă‚·ăƒ§ăƒƒăƒˆăŻăŸă ă‚ă‚ŠăŸă›ă‚“ă€‚ïŒ»ă‚·ăƒ§ăƒƒăƒˆć–ćŸ—ïŒœă§çŸćœšăźèĄšç€șを保歘しどください。", + "Double-click to rename": "ăƒ€ăƒ–ăƒ«ă‚ŻăƒȘăƒƒă‚Żă§ćć‰ă‚’ć€‰æ›Ž", + "Shot name": "ă‚·ăƒ§ăƒƒăƒˆć", + "LOAD": "èȘ­èŸŒ", + "DEL": "扊陀", + "{duration}s + {hold}s": "{duration}秒 + {hold}秒", + "Choose files": "ăƒ•ă‚Ąă‚€ăƒ«ă‚’éžæŠž", + "{count} files selected": { + "other": "{count}ć€‹ăźăƒ•ă‚Ąă‚€ăƒ«ă‚’éžæŠžæžˆăż" + }, + "No file chosen": "ăƒ•ă‚Ąă‚€ăƒ«ăŒéžæŠžă•ă‚ŒăŠă„ăŸă›ă‚“", + "Cancel": "ă‚­ăƒŁăƒłă‚»ăƒ«", + "EDIT DETAILS": "è©łçŽ°ă‚’ç·šé›†", + "SHARE SCENE": "ă‚·ăƒŒăƒłă‚’ć…±æœ‰", + "Shared flight follow expired": "ć…±æœ‰ă•ă‚ŒăŸăƒ•ăƒ©ă‚€ăƒˆăźèżœćŸ“ăŒæœŸé™ćˆ‡ă‚Œă«ăȘă‚ŠăŸă—ăŸ", + "Shared military flight follow expired": "ć…±æœ‰ă•ă‚ŒăŸè»ç”šæ©ŸăźèżœćŸ“ăŒæœŸé™ćˆ‡ă‚Œă«ăȘă‚ŠăŸă—ăŸ", + "Shared satellite follow expired": "ć…±æœ‰ă•ă‚ŒăŸèĄ›æ˜ŸăźèżœćŸ“ăŒæœŸé™ćˆ‡ă‚Œă«ăȘă‚ŠăŸă—ăŸ", + "Shared flight could not be restored — feed unavailable": "ć…±æœ‰ă•ă‚ŒăŸăƒ•ăƒ©ă‚€ăƒˆă‚’ćŸ©ć…ƒă§ăăŸă›ă‚“ă§ă—ăŸïŒšăƒ•ă‚ŁăƒŒăƒ‰ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Shared military flight could not be restored — feed unavailable": "ć…±æœ‰ă•ă‚ŒăŸè»ç”šæ©Ÿă‚’ćŸ©ć…ƒă§ăăŸă›ă‚“ă§ă—ăŸïŒšăƒ•ă‚ŁăƒŒăƒ‰ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Shared satellite could not be restored — feed unavailable": "ć…±æœ‰ă•ă‚ŒăŸèĄ›æ˜Ÿă‚’ćŸ©ć…ƒă§ăăŸă›ă‚“ă§ă—ăŸïŒšăƒ•ă‚ŁăƒŒăƒ‰ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Shared flight is unavailable": "ć…±æœ‰ă•ă‚ŒăŸăƒ•ăƒ©ă‚€ăƒˆăŻćˆ©ç”šă§ăăŸă›ă‚“", + "Shared military flight is unavailable": "ć…±æœ‰ă•ă‚ŒăŸè»ç”šæ©ŸăŻćˆ©ç”šă§ăăŸă›ă‚“", + "Shared satellite is unavailable": "ć…±æœ‰ă•ă‚ŒăŸèĄ›æ˜ŸăŻćˆ©ç”šă§ăăŸă›ă‚“", + "entity": "スンティティ", + "Shared {subject} follow expired": "ć…±æœ‰ă•ă‚ŒăŸ{subject}ăźèżœćŸ“ăŒæœŸé™ćˆ‡ă‚Œă«ăȘă‚ŠăŸă—ăŸ", + "Shared {subject} could not be restored — feed unavailable": "ć…±æœ‰ă•ă‚ŒăŸ{subject}ă‚’ćŸ©ć…ƒă§ăăŸă›ă‚“ă§ă—ăŸïŒšăƒ•ă‚ŁăƒŒăƒ‰ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Shared {subject} is unavailable": "ć…±æœ‰ă•ă‚ŒăŸ{subject}ăŻćˆ©ç”šă§ăăŸă›ă‚“", + "{id} isn't reporting now — showing where it was last seen": "{id}ăŻçŸćœšć ±ć‘Šă—ăŠă„ăŸă›ă‚“ă€‚æœ€ćŸŒă«çąșèȘă•ă‚ŒăŸäœçœźă‚’èĄšç€șă—ăŠă„ăŸă™", + "{id} isn't reporting now — showing where it was at {time}": "{id}ăŻçŸćœšć ±ć‘Šă—ăŠă„ăŸă›ă‚“ă€‚{time}時ç‚čăźäœçœźă‚’èĄšç€șă—ăŠă„ăŸă™", + "This share link can't be opened": "ă“ăźć…±æœ‰ăƒȘăƒłă‚ŻăŻé–‹ă‘ăŸă›ă‚“", + "Shared vessel is unavailable": "ć…±æœ‰ă•ă‚ŒăŸèˆčèˆ¶ăŻćˆ©ç”šă§ăăŸă›ă‚“", + "ACQUIRING": "ć–ćŸ—äž­", + "SHARED {subject}": "ć…±æœ‰ {subject}", + "subject": "ćŻŸè±Ą", + "LOADING LIVE DATA": "ăƒ©ă‚€ăƒ–ăƒ‡ăƒŒă‚żèȘ­èŸŒäž­", + "LOAD COMPLETE": "èȘ­èŸŒćźŒäș†", + "LOAD CANCELLED": "èȘ­èŸŒäž­æ­ą", + "LOAD FAILED": "èȘ­èŸŒć€±æ•—", + "LIVE DATA OFF": "ăƒ©ă‚€ăƒ–ăƒ‡ăƒŒă‚ż ă‚Șフ", + "MAPPED SITES LOADED": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­ă‚’èȘ­èŸŒæžˆăż", + "RETRYING MAPPED SITES": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­ă‚’ć†è©ŠèĄŒäž­", + "FETCHING MAPPED SITES": "ăƒžăƒƒăƒ—æžˆăżæ–œèš­ă‚’ć–ćŸ—äž­", + "RETRYING ALPR CAMERAS": "ALPRă‚«ăƒĄăƒ©ă‚’ć†è©ŠèĄŒäž­", + "FETCHING ALPR CAMERAS": "ALPRă‚«ăƒĄăƒ©ă‚’ć–ćŸ—äž­", + "OVERPASS TEMPORARILY UNAVAILABLE": "OverpassăŒäž€æ™‚çš„ă«ćˆ©ç”šäžćŻ", + "OVERPASS RATE-LIMITED": "OverpassăŒăƒŹăƒŒăƒˆćˆ¶é™äž­", + "OVERPASS TIMED OUT": "OverpassăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆ", + "OVERPASS COULD NOT COMPLETE THE QUERY": "OverpassがクスăƒȘを漌äș†ă§ăăŸă›ă‚“", + "MAP TILES TEMPORARILY UNAVAILABLE": "ćœ°ć›łă‚żă‚€ăƒ«ăŒäž€æ™‚çš„ă«ćˆ©ç”šäžćŻ", + "MAPPED NAMES TEMPORARILY UNAVAILABLE": "æ–œèš­ćăŒäž€æ™‚çš„ă«ćˆ©ç”šäžćŻ", + "TURNING OFF LIVE DATA": "ăƒ©ă‚€ăƒ–ăƒ‡ăƒŒă‚żă‚’ă‚Șăƒ•ă«ă—ăŠă„ăŸă™", + "REFRESHING LIVE DATA": "ăƒ©ă‚€ăƒ–ăƒ‡ăƒŒă‚żă‚’æ›Žæ–°äž­", + "syncing road network": "é“è·Żç¶Čă‚’ćŒæœŸäž­", + "retry pending": "ć†è©ŠèĄŒćŸ…ăĄ", + "retrying in {seconds}s": "{seconds}ç§’ćŸŒă«ć†è©ŠèĄŒ", + "ALPR cameras": "ALPRă‚«ăƒĄăƒ©", + "OpenSky OAuth client missing/invalid": "OpenSky OAuthă‚Żăƒ©ă‚€ă‚ąăƒłăƒˆăŒăȘいか無ćŠčです", + "OpenSky OAuth rejected credentials": "OpenSky OAuthがèȘèšŒæƒ…ć ±ă‚’æ‹’ćŠă—ăŸă—ăŸ", + "OpenSky username/password rejected": "OpenSkyăźăƒŠăƒŒă‚¶ăƒŒć/パă‚čăƒŻăƒŒăƒ‰ăŒæ‹’ćŠă•ă‚ŒăŸă—ăŸ", + "OpenSky auth missing": "OpenSkyたèȘèšŒæƒ…ć ±ăŒă‚ă‚ŠăŸă›ă‚“", + "OpenSky auth required": "OpenSkyたèȘèšŒăŒćż…èŠă§ă™", + "OpenSky auth invalid": "OpenSkyたèȘèšŒăŒç„ĄćŠčです", + "OpenSky auth failed": "OpenSkyたèȘèšŒă«ć€±æ•—ă—ăŸă—ăŸ", + "KartaView answered HTTP {status}": "KartaViewがHTTP {status}ă‚’èż”ă—ăŸă—ăŸ", + "Panoramax answered HTTP {status}": "PanoramaxがHTTP {status}ă‚’èż”ă—ăŸă—ăŸ", + "KartaView refused the request (code {code})": "KartaViewがăƒȘクスă‚čăƒˆă‚’æ‹’ćŠă—ăŸă—ăŸïŒˆă‚łăƒŒăƒ‰ {code}", + "Vector tiles unavailable (HTTP {status})": "ăƒ™ă‚Żă‚żăƒŒă‚żă‚€ăƒ«ă‚’ćˆ©ç”šă§ăăŸă›ă‚“ïŒˆHTTP {status}", + "GNSS feed unavailable (HTTP {status})": "GNSSăƒ•ă‚ŁăƒŒăƒ‰ă‚’ćˆ©ç”šă§ăăŸă›ă‚“ïŒˆHTTP {status}", + "{count} CelesTrak groups unavailable": { + "other": "CelesTrakた{count}ă‚°ăƒ«ăƒŒăƒ—ă‚’ćˆ©ç”šă§ăăŸă›ă‚“" + }, + "{feed} feed unavailable": "{feed}ăƒ•ă‚ŁăƒŒăƒ‰ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Source snapshot {minutes} min old": "ă‚œăƒŒă‚čたă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆăŻ{minutes}戆才ぼもぼです", + "{source} rate limited (anonymous)": "{source}ăŒăƒŹăƒŒăƒˆćˆ¶é™äž­ïŒˆćŒżćïŒ‰", + "{source} rate limited": "{source}ăŒăƒŹăƒŒăƒˆćˆ¶é™äž­", + "{source} network error": "{source}ăźăƒăƒƒăƒˆăƒŻăƒŒă‚Żă‚šăƒ©ăƒŒ", + "Malformed {source} aircraft rows": "{source}たèˆȘç©șæ©Ÿăƒ‡ăƒŒă‚żèĄŒăźćœąćŒăŒäžæ­Łă§ă™", + "Malformed {source} response": "{source}ăźćżœç­”ćœąćŒăŒäžæ­Łă§ă™", + "entry {n}": "項盼 {n}", + "feeds {names} stale": { + "other": "ăƒ•ă‚ŁăƒŒăƒ‰{names}ăŒæ›Žæ–°é…ć»¶" + }, + "feeds {names} unreachable": { + "other": "ăƒ•ă‚ŁăƒŒăƒ‰{names}ă«æŽ„ç¶šă§ăăŸă›ă‚“" + }, + "feeds {names} invalid": { + "other": "ăƒ•ă‚ŁăƒŒăƒ‰{names}が無ćŠčです" + }, + "Loading {feeds}": "{feeds}をèȘ­ăżèŸŒăżäž­", + "{count} heard": { + "other": "揗信 {count}機" + }, + "USB {rate} msg/s": "USB {rate} msg/s", + "{rate} msg/s": "{rate} msg/s", + "{count} feeds live": { + "other": "ăƒ©ă‚€ăƒ–ăƒ•ă‚ŁăƒŒăƒ‰ {count}ä»¶" + }, + "{feed} {count} ({seconds}s old)": "{feed} {count}{seconds}ç§’ć‰ïŒ‰", + "Street Level toggle failed": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ăźćˆ‡ă‚Šæ›żăˆă«ć€±æ•—ă—ăŸă—ăŸ", + "Street Level could not start": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ă‚’é–‹ć§‹ă§ăăŸă›ă‚“ă§ă—ăŸ", + "SHRINK": "羼氏", + "EXPAND": "æ‹Ąć€§", + "Shrink": "羼氏", + "Expand": "æ‹Ąć€§", + "ANY DATE": "ć…šæœŸé–“", + "LAST 10 YEARS": "過掻10ćčŽ", + "LAST 5 YEARS": "過掻5ćčŽ", + "LAST 3 YEARS": "過掻3ćčŽ", + "LAST 2 YEARS": "過掻2ćčŽ", + "LAST YEAR": "過掻1ćčŽ", + "LAST 6 MONTHS": "過掻6ă‹æœˆ", + "LAST 3 MONTHS": "過掻3ă‹æœˆ", + "LAST MONTH": "過掻1ă‹æœˆ", + "LAST {count} DAYS": { + "other": "過掻{count}æ—„" + }, + "{window} · SINCE {date}": "{window} · {date}仄降", + "Turn Street Level off": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ă‚’ă‚Șăƒ•ă«ă™ă‚‹", + "Turn Street Level on": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ă‚’ă‚Șăƒłă«ă™ă‚‹", + "{name} imagery on": "{name}ăźç”»ćƒ ă‚Șン", + "{name} imagery off": "{name}ăźç”»ćƒ ă‚Șフ", + "Image by {creator}": "æ’źćœ±è€…ïŒš{creator}", + " or ": "ăŸăŸăŻ", + "OPEN {labels}": "{labels}を開く", + "Open {names} at the centre of the view": "èĄšç€șた䞭濃で{names}を開く", + "Zoom in to a street to open {names} here": "ここで{names}ă‚’é–‹ăă«ăŻé€šă‚ŠăŸă§ă‚șăƒŒăƒ ă‚€ăƒł", + "Switch Street Level on to draw its coverage.": "ă‚«ăƒăƒŒçŻ„ć›Čă‚’æç”»ă™ă‚‹ă«ăŻă€ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ă‚’ă‚Șăƒłă«ă—ăŠăă ă•ă„ă€‚", + "Every provider is switched off: light a chip to draw its coverage.": "すăčăŠăźăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒăŒă‚Șăƒ•ă§ă™ă€‚ă‚«ăƒăƒŒçŻ„ć›Čă‚’æç”»ă™ă‚‹ă«ăŻă€ă„ăšă‚Œă‹ăźăƒăƒƒăƒ—ă‚’ă‚Șăƒłă«ă—ăŠăă ă•ă„ă€‚", + "Loading this sequence
": "ă“ăźă‚·ăƒŒă‚±ăƒłă‚čをèȘ­ăżèŸŒăżäž­â€Š", + "{n} images in this sequence · Esc clears": { + "other": "ă“ăźă‚·ăƒŒă‚±ăƒłă‚čăźç”»ćƒ {n}枚 · Escă§æ¶ˆćŽ»" + }, + "No sequences in view match the filter": "èĄšç€ș範ć›Čć†…ă«ăƒ•ă‚Łăƒ«ă‚żăƒŒă«äž€è‡Žă™ă‚‹ă‚·ăƒŒă‚±ăƒłă‚čăŻă‚ă‚ŠăŸă›ă‚“", + "No coverage in view": "èĄšç€ș範ć›Čć†…ă«ă‚«ăƒăƒŒçŻ„ć›ČăŒă‚ă‚ŠăŸă›ă‚“", + "{n} streets in view · click a line for its nearest photo": { + "other": "èĄšç€ș範ć›Č憅ぼ通り {n}æœŹ · 線をクăƒȘăƒƒă‚Żă§æœ€ćŻ„ă‚Šăźć†™çœŸă‚’èĄšç€ș" + }, + "{n} sequences in view · click a line for its nearest photo": { + "other": "èĄšç€ș範ć›Čć†…ăźă‚·ăƒŒă‚±ăƒłă‚č {n}ä»¶ · 線をクăƒȘăƒƒă‚Żă§æœ€ćŻ„ă‚Šăźć†™çœŸă‚’èĄšç€ș" + }, + "{n} sequences in view · click a line for its photos": { + "other": "èĄšç€ș範ć›Čć†…ăźă‚·ăƒŒă‚±ăƒłă‚č {n}ä»¶ · 線をクăƒȘăƒƒă‚Żă§ć†™çœŸă‚’èĄšç€ș" + }, + "km/h": "km/h", + "m/s": "m/s", + "mph": "mph", + "hPa": "hPa", + "kt": "kt", + "kts": "kt", + "ft": "ft", + "km": "km", + "m": "m", + "h": "時間", + "min": "戆", + "s": "秒", + "dB": "dB", + "Celestial ring — reveal the full globe": "怩球ăƒȘăƒłă‚°ïŒšćœ°çƒć…šäœ“ă‚’èĄšç€ș", + "Celestial ring — available in Normal style": "怩球ăƒȘăƒłă‚°ïŒšæš™æș–ă‚čă‚żă‚€ăƒ«ă§ćˆ©ç”šćŻèƒœ", + "Detection overlay: {mode}": "怜ć‡șă‚ȘăƒŒăƒăƒŒăƒŹă‚€ïŒš{mode}", + "Detection overlay: off": "怜ć‡șă‚ȘăƒŒăƒăƒŒăƒŹă‚€ïŒšă‚Șフ", + "DETECT": "怜ć‡ș", + "{time} · {minutes} min ago": "{time} · {minutes}戆才", + "Active weather": "有ćŠčăȘæ°—è±ĄăƒŹă‚€ăƒ€ăƒŒ", + "LATEST · newest per product": "最新 · ăƒ—ăƒ­ăƒ€ă‚Żăƒˆă”ăšăźæœ€æ–°", + "Forecast · valid {valid} · issued {issued}": "äșˆć ± · ćŻŸè±Ąæ™‚ćˆ» {valid} · ç™șèĄš {issued}", + "{detail} · Does not follow history": "{detail} · ć±„æ­ŽăšăŻé€Łć‹•ă—ăŸă›ă‚“", + "Forecast · valid {valid}": "äșˆć ± · ćŻŸè±Ąæ™‚ćˆ» {valid}", + "voice|OFF": "ă‚Șフ", + "voice|CONNECTING": "掄続䞭", + "voice|LISTENING": "èžăć–ă‚Šäž­", + "voice|EXECUTING": "ćźŸèĄŒäž­", + "voice|ERROR": "ă‚šăƒ©ăƒŒ", + "Voice provider": "éŸłćŁ°ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒ", + "Changing provider reconnects voice if it is on.": "音棰がă‚Șăƒłăźć Žćˆă€ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒă‚’ć€‰æ›Žă™ă‚‹ăšéŸłćŁ°ăŒć†æŽ„ç¶šă•ă‚ŒăŸă™ă€‚", + "Voice Settings": "éŸłćŁ°èš­ćźš", + "AI AGENT": "AIă‚šăƒŒă‚žă‚§ăƒłăƒˆ", + "Voice model tier — applies next session": "éŸłćŁ°ăƒąăƒ‡ăƒ«ăźăƒ†ă‚Łă‚ąïŒšæŹĄć›žă‚»ăƒƒă‚·ăƒ§ăƒłă§é©ç”š", + "STD": "æš™æș–", + "Estimated session cost": "ă‚»ăƒƒă‚·ăƒ§ăƒłăźæŽšćźšă‚łă‚čト", + "Voice control — activate to toggle voice; hold Space to speak": "éŸłćŁ°ă‚łăƒłăƒˆăƒ­ăƒŒăƒ«ïŒšæŠŒă™ăšéŸłćŁ°ăźă‚Șン/ă‚Șăƒ•ă‚’ćˆ‡ă‚Šæ›żăˆă€Spaceă‚’é•·æŠŒă—ă§è©±ă™", + "ON/OFF": "ă‚Șン/ă‚Șフ", + "VOICE STANDBY": "éŸłćŁ°ćŸ…æ©Ÿäž­", + "VOICE CONTROL": "éŸłćŁ°ă‚łăƒłăƒˆăƒ­ăƒŒăƒ«", + "Hold Space to speak · tap Space to activate focused controls": "Spaceă‚’é•·æŠŒă—ă§è©±ă™ · Spaceă‚’ă‚żăƒƒăƒ—ă§ăƒ•ă‚©ăƒŒă‚«ă‚čäž­ăźæ“äœœă‚’ćźŸèĄŒ", + "VOICE": "音棰", + "Preview": "ăƒ—ăƒŹăƒ“ăƒ„ăƒŒ", + "Settings": "èš­ćźš", + "Close voice panel": "éŸłćŁ°ăƒ‘ăƒăƒ«ă‚’é–‰ă˜ă‚‹", + "Voice replies appear here.": "éŸłćŁ°ăźćżœç­”ăŻă“ă“ă«èĄšç€șă•ă‚ŒăŸă™ă€‚", + "Voice assistant": "éŸłćŁ°ă‚ąă‚·ă‚čタント", + "Dismiss voice card": "éŸłćŁ°ă‚«ăƒŒăƒ‰ă‚’é–‰ă˜ă‚‹", + "YOU": "あăȘた", + "THIS": "ćŻŸè±Ą", + "Plan": "蚈画", + "Referenced items": "揂照された項盼", + "NOTES & SOURCES": "æłšèš˜ăšć‡ș慾", + "Show Voice Preview": "éŸłćŁ°ăƒ—ăƒŹăƒ“ăƒ„ăƒŒă‚’èĄšç€ș", + "Voice inactivity timeout": "éŸłćŁ°ăźç„Ąæ“äœœă‚żă‚€ăƒ ă‚ąă‚Šăƒˆ", + "Minutes": "戆", + "Custom": "ă‚«ă‚čタム", + "These preferences stay in this browser.": "ă“ă‚Œă‚‰ăźèš­ćźšăŻă“ăźăƒ–ăƒ©ă‚Šă‚¶ăƒŒă«ăźăżäżć­˜ă•ă‚ŒăŸă™ă€‚", + "VOICE SYSTEM ERROR": "éŸłćŁ°ă‚·ă‚čăƒ†ăƒ ă‚šăƒ©ăƒŒ", + "DISMISS": "閉じる", + "Check microphone permission and network access, then try again.": "ăƒžă‚€ă‚Żăźèš±ćŻăšăƒăƒƒăƒˆăƒŻăƒŒă‚ŻæŽ„ç¶šă‚’çąșèȘă—お、もう䞀ćșŠăŠè©Šă—ăă ă•ă„ă€‚", + "Gemini returned an oversized audio chunk": "Geminiă‹ă‚‰ć€§ăă™ăŽă‚‹éŸłćŁ°ăƒăƒŁăƒłă‚ŻăŒèż”ă•ă‚ŒăŸă—ăŸ", + "Gemini returned an unsupported audio format": "Geminiă‹ă‚‰ćŻŸćżœă—ăŠă„ăȘă„éŸłćŁ°ćœąćŒăŒèż”ă•ă‚ŒăŸă—ăŸ", + "Gemini returned an invalid audio sample rate": "Geminiから無ćŠčăȘéŸłćŁ°ă‚”ăƒłăƒ—ăƒ«ăƒŹăƒŒăƒˆăŒèż”ă•ă‚ŒăŸă—ăŸ", + "Gemini returned incomplete PCM audio": "Geminiから侍漌慹ăȘPCMéŸłćŁ°ăŒèż”ă•ă‚ŒăŸă—ăŸ", + "This browser does not support Gemini microphone audio": "ă“ăźăƒ–ăƒ©ă‚Šă‚¶ăƒŒăŻGeminiăźăƒžă‚€ă‚ŻéŸłćŁ°ă«ćŻŸćżœă—ăŠă„ăŸă›ă‚“", + "Microphone audio processing failed": "ăƒžă‚€ă‚ŻéŸłćŁ°ăźć‡Šç†ă«ć€±æ•—ă—ăŸă—ăŸ", + "Gemini audio playback fell behind. Reconnect to continue.": "GeminiăźéŸłćŁ°ć†ç”ŸăŒé…ă‚ŒăŠă„ăŸă™ă€‚ç¶šă‘ă‚‹ă«ăŻć†æŽ„ç¶šă—ăŠăă ă•ă„ă€‚", + "Gemini token response did not include an ephemeral credential": "GeminiăźăƒˆăƒŒă‚Żăƒłćżœç­”ă«äž€æ™‚çš„ăȘèȘèšŒæƒ…ć ±ăŒć«ăŸă‚ŒăŠă„ăŸă›ă‚“", + "Invalid Gemini connection endpoint": "GeminiăźæŽ„ç¶šă‚šăƒłăƒ‰ăƒă‚€ăƒłăƒˆăŒç„ĄćŠčです", + "Gemini voice could not connect. Try again.": "GeminiéŸłćŁ°ă«æŽ„ç¶šă§ăăŸă›ă‚“ă§ă—ăŸă€‚ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„ă€‚", + "Gemini voice requires a same-origin app request": "GeminiéŸłćŁ°ă«ăŻćŒäž€ă‚ȘăƒȘゾンぼケプăƒȘからぼăƒȘクスă‚čăƒˆăŒćż…èŠă§ă™", + "Add a Gemini API key in Provider Settings": "ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźšă§Gemini APIă‚­ăƒŒă‚’èżœćŠ ă—ăŠăă ă•ă„", + "The Gemini Live model configuration is invalid": "Gemini Liveăźăƒąăƒ‡ăƒ«èš­ćźšăŒç„ĄćŠčです", + "Gemini voice is starting too often. Try again shortly.": "GeminiéŸłćŁ°ăźè”·ć‹•ăŒé »çčă™ăŽăŸă™ă€‚ă—ă°ă‚‰ăă—ăŠă‹ă‚‰ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„ă€‚", + "Gemini quota is unavailable. Try again later.": "Geminiたć‰Čă‚Šćœ“ăŠă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚ćŸŒă§ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„ă€‚", + "Gemini access was refused. Check the API key and model access.": "Geminiぞたスクセă‚čăŒæ‹’ćŠă•ă‚ŒăŸă—ăŸă€‚APIă‚­ăƒŒăšăƒąăƒ‡ăƒ«ăžăźă‚ąă‚Żă‚»ă‚čæš©ă‚’çąșèȘă—ăŠăă ă•ă„ă€‚", + "Gemini Live is unavailable for the configured model.": "èš­ćźšă•ă‚ŒăŸăƒąăƒ‡ăƒ«ă§ăŻGemini Liveă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚", + "Token request is too large": "ăƒˆăƒŒă‚ŻăƒłăƒȘクスă‚čăƒˆăŒć€§ăă™ăŽăŸă™", + "Use an empty JSON token request": "ç©șたJSONăƒˆăƒŒă‚ŻăƒłăƒȘクスă‚čăƒˆă‚’äœżç”šă—ăŠăă ă•ă„", + "Release Space to send": "Spaceを雱しど送信", + "Hold Space to talk": "Spaceă‚’é•·æŠŒă—ă§è©±ă™", + "Voice command context is too large": "音棰コマンドぼコンテキă‚čăƒˆăŒć€§ăă™ăŽăŸă™", + "Gemini reliable transport exceeded its queue limit. Start voice again.": "Geminiăźé«˜äżĄé Œăƒˆăƒ©ăƒłă‚čăƒăƒŒăƒˆăŒă‚­ăƒ„ăƒŒăźäžŠé™ă‚’è¶…ăˆăŸă—ăŸă€‚éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Gemini reliable transport did not drain. Start voice again.": "Geminiăźé«˜äżĄé Œăƒˆăƒ©ăƒłă‚čăƒăƒŒăƒˆăźă‚­ăƒ„ăƒŒăŒç©șにăȘă‚ŠăŸă›ă‚“ă§ă—ăŸă€‚éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Gemini token request failed (HTTP {status})": "GeminiăźăƒˆăƒŒă‚ŻăƒłăƒȘクスă‚čăƒˆă«ć€±æ•—ă—ăŸă—ăŸïŒˆHTTP {status}", + "Gemini token response did not include a valid model": "GeminiăźăƒˆăƒŒă‚Żăƒłćżœç­”ă«æœ‰ćŠčăȘăƒąăƒ‡ăƒ«ăŒć«ăŸă‚ŒăŠă„ăŸă›ă‚“", + "Gemini token response did not include session settings": "GeminiăźăƒˆăƒŒă‚Żăƒłćżœç­”ă«ă‚»ăƒƒă‚·ăƒ§ăƒłèš­ćźšăŒć«ăŸă‚ŒăŠă„ăŸă›ă‚“", + "Gemini session settings do not match the input mode": "Geminiăźă‚»ăƒƒă‚·ăƒ§ăƒłèš­ćźšăŒć…„ćŠ›ăƒąăƒŒăƒ‰ăšäž€è‡Žă—ăŸă›ă‚“", + "Requesting microphone": "ăƒžă‚€ă‚Żăžăźă‚ąă‚Żă‚»ă‚čă‚’èŠæ±‚äž­", + "Gemini could not submit this input. Start voice again.": "GeminiăŒă“ăźć…„ćŠ›ă‚’é€äżĄă§ăăŸă›ă‚“ă§ă—ăŸă€‚éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Connecting to Gemini": "Geminiă«æŽ„ç¶šäž­", + "Ask or command": "èłȘć•ăŸăŸăŻă‚łăƒžăƒłăƒ‰ă‚’ă©ă†ăž", + "Gemini returned an oversized message": "Geminiă‹ă‚‰ć€§ăă™ăŽă‚‹ăƒĄăƒƒă‚»ăƒŒă‚žăŒèż”ă•ă‚ŒăŸă—ăŸ", + "Gemini Live connection failed. Check network access, then start voice again.": "Gemini LiveăźæŽ„ç¶šă«ć€±æ•—ă—ăŸă—ăŸă€‚ăƒăƒƒăƒˆăƒŻăƒŒă‚ŻæŽ„ç¶šă‚’çąșèȘă—ăŠă‹ă‚‰ă€éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Gemini Live connection ended. Start voice again for a new conversation.": "Gemini LiveăźæŽ„ç¶šăŒç”‚äș†ă—ăŸă—ăŸă€‚æ–°ă—ă„äŒšè©±ă‚’ć§‹ă‚ă‚‹ă«ăŻă€éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Gemini Live could not start. Start voice again to request a fresh session.": "Gemini Liveă‚’é–‹ć§‹ă§ăăŸă›ă‚“ă§ă—ăŸă€‚æ–°ă—ă„ă‚»ăƒƒă‚·ăƒ§ăƒłă‚’èŠæ±‚ă™ă‚‹ă«ăŻă€éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Start voice again for a fresh token and a new conversation.": "æ–°ă—ă„ăƒˆăƒŒă‚Żăƒłă§æ–°ă—ă„äŒšè©±ă‚’ć§‹ă‚ă‚‹ă«ăŻă€éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Start voice again to request a fresh session credential.": "æ–°ă—ă„ă‚»ăƒƒă‚·ăƒ§ăƒłăźèȘèšŒæƒ…ć ±ă‚’èŠæ±‚ă™ă‚‹ă«ăŻă€éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Microphone permission was denied. Allow microphone access and try again.": "ăƒžă‚€ă‚Żăźäœżç”šăŒæ‹’ćŠă•ă‚ŒăŸă—ăŸă€‚ăƒžă‚€ă‚Żăžăźă‚ąă‚Żă‚»ă‚čă‚’èš±ćŻă—ăŠă€ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„ă€‚", + "Gemini connection timed out. Try again.": "GeminiăžăźæŽ„ç¶šăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸă€‚ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„ă€‚", + "Gemini voice could not start": "GeminiéŸłćŁ°ă‚’é–‹ć§‹ă§ăăŸă›ă‚“ă§ă—ăŸ", + "Gemini did not finish the interrupted reply. Start voice again.": "GeminiăŒäž­æ–­ă•ă‚ŒăŸćżœç­”ă‚’ćźŒäș†ă—ăŸă›ă‚“ă§ă—ăŸă€‚éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Gemini session expiring; finishing the current reply": "Geminiăźă‚»ăƒƒă‚·ăƒ§ăƒłăŒăŸă‚‚ăȘăæœŸé™ćˆ‡ă‚Œă§ă™ă€‚çŸćœšăźćżœç­”ă‚’ćźŒäș†ă—ăŠă„ăŸă™", + "Gemini rejected the voice session. Start voice again to request a fresh session.": "GeminiăŒéŸłćŁ°ă‚»ăƒƒă‚·ăƒ§ăƒłă‚’æ‹’ćŠă—ăŸă—ăŸă€‚æ–°ă—ă„ă‚»ăƒƒă‚·ăƒ§ăƒłă‚’èŠæ±‚ă™ă‚‹ă«ăŻă€éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Start voice again for a fresh session credential. If it repeats, check Gemini model and API access.": "æ–°ă—ă„ă‚»ăƒƒă‚·ăƒ§ăƒłăźèȘèšŒæƒ…ć ±ă‚’ć–ćŸ—ă™ă‚‹ă«ăŻă€éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚çč°ă‚Šèż”しç™ș生する栮搈は、Geminiăźăƒąăƒ‡ăƒ«ăšAPIぞたスクセă‚čをçąșèȘă—ăŠăă ă•ă„ă€‚", + "Gemini action history is full. Start voice again for a fresh session.": "Geminiăźæ“äœœć±„æ­ŽăŒă„ăŁă±ă„ă§ă™ă€‚æ–°ă—ă„ă‚»ăƒƒă‚·ăƒ§ăƒłă‚’ć§‹ă‚ă‚‹ă«ăŻă€éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Gemini requested too many simultaneous actions": "GeminiăŒćŒæ™‚ă«èŠæ±‚ă—ăŸæ“äœœăŒć€šă™ăŽăŸă™", + "Running command": "ă‚łăƒžăƒłăƒ‰ćźŸèĄŒäž­", + "Voice text command is too long": "音棰ぼテキă‚čăƒˆă‚łăƒžăƒłăƒ‰ăŒé•·ă™ăŽăŸă™", + "Gemini voice is not connected": "GeminiéŸłćŁ°ăŒæŽ„ç¶šă•ă‚ŒăŠă„ăŸă›ă‚“", + "Gemini interrupted input exceeded its buffer or wait limit. Start voice again.": "Geminiăźäž­æ–­ă•ă‚ŒăŸć…„ćŠ›ăŒăƒăƒƒăƒ•ă‚ĄăƒŒăŸăŸăŻćŸ…æ©ŸăźäžŠé™ă‚’è¶…ăˆăŸă—ăŸă€‚éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Gemini Live connection is expiring. Start voice again for a new conversation.": "Gemini LiveăźæŽ„ç¶šăŒăŸă‚‚ăȘăæœŸé™ćˆ‡ă‚Œă§ă™ă€‚æ–°ă—ă„äŒšè©±ă‚’ć§‹ă‚ă‚‹ă«ăŻă€éŸłćŁ°ă‚’ă‚‚ă†äž€ćșŠé–‹ć§‹ă—ăŠăă ă•ă„ă€‚", + "Voice off": "音棰 ă‚Șフ", + "Gemini voice sessions have a time limit. When a session expires, start voice again for a new conversation.": "GeminiéŸłćŁ°ăźă‚»ăƒƒă‚·ăƒ§ăƒłă«ăŻæ™‚é–“ćˆ¶é™ăŒă‚ă‚ŠăŸă™ă€‚ă‚»ăƒƒă‚·ăƒ§ăƒłăŒæœŸé™ćˆ‡ă‚Œă«ăȘったら、音棰をもう侀ćșŠé–‹ć§‹ă—ăŠæ–°ă—ă„äŒšè©±ă‚’ć§‹ă‚ăŠăă ă•ă„ă€‚", + "Stopped by voice": "éŸłćŁ°ă§ćœæ­ąă—ăŸă—ăŸ", + "Automatic stop is unavailable for this voice connection.": "ă“ăźéŸłćŁ°æŽ„ç¶šă§ăŻè‡Șć‹•ćœæ­ąă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚", + "Preview is off.": "ăƒ—ăƒŹăƒ“ăƒ„ăƒŒăŻă‚Șフです。", + "Your choice applies now, but could not be saved.": "éžæŠžăŻé©ç”šă•ă‚ŒăŸă—ăŸăŒă€äżć­˜ă§ăăŸă›ă‚“ă§ă—ăŸă€‚", + "WebRTC microphone support unavailable": "ă“ăźăƒ–ăƒ©ă‚Šă‚¶ăƒŒă§ăŻWebRTCă§ăƒžă‚€ă‚Żă‚’äœżç”šă§ăăŸă›ă‚“", + "VOICE UNAVAILABLE": "éŸłćŁ°ćˆ©ç”šäžćŻ", + "VOICE ACTIVE": "音棰 ă‚Șン", + "Voice session could not be started.": "éŸłćŁ°ă‚»ăƒƒă‚·ăƒ§ăƒłă‚’é–‹ć§‹ă§ăăŸă›ă‚“ă§ă—ăŸă€‚", + "MINI": "ミニ", + "Next session: {pendingId} — this session stays on {modelId}": "æŹĄć›žă‚»ăƒƒă‚·ăƒ§ăƒłïŒš{pendingId}ă€‚ă“ăźă‚»ăƒƒă‚·ăƒ§ăƒłăŻ{modelId}ăźăŸăŸă§ă™", + "Voice model: {pendingId} — click to switch to {target}; applies next session": "éŸłćŁ°ăƒąăƒ‡ăƒ«ïŒš{pendingId}。クăƒȘックで{target}ă«ćˆ‡ă‚Šæ›żăˆă€æŹĄć›žă‚»ăƒƒă‚·ăƒ§ăƒłă§é©ç”š", + "standard": "æš™æș–", + "mini": "ミニ", + "COST UNKNOWN": "コă‚čăƒˆäžæ˜Ž", + "ChatGPT OAuth session: {responses} response(s), {input} input and {output} output tokens, {captions} caption transcription(s) reported.": "ChatGPT OAuthă‚»ăƒƒă‚·ăƒ§ăƒłïŒšćżœç­”{responses}ä»¶ă€ć…„ćŠ›ăƒˆăƒŒă‚Żăƒł{input}、ć‡șćŠ›ăƒˆăƒŒă‚Żăƒł{output}、歗ćč•ăźæ–‡ć­—è”·ă“ă—{captions}ä»¶ăŒć ±ć‘Šă•ă‚ŒăŸă—ăŸă€‚", + "USD cost and the API spend cap are unavailable for this auth mode.": "こぼèȘèšŒăƒąăƒŒăƒ‰ă§ăŻă€ç±łăƒ‰ăƒ«ă§ăźă‚łă‚čトずAPIăźæ”Żć‡șäžŠé™ă‚’ćˆ©ç”šă§ăăŸă›ă‚“ă€‚", + "Usage is incomplete because a response was still in flight when the session ended.": "ă‚»ăƒƒă‚·ăƒ§ăƒłç”‚äș†æ™‚ă«ć‡Šç†äž­ăźćżœç­”ăŒă‚ăŁăŸăŸă‚ă€äœżç”šé‡ăŻäžćźŒć…šă§ă™ă€‚", + "Estimated session cost on {modelId} — {responses} response(s). Warns at {warn}, ends the session at {cap}.": "{modelId}ă§ăźă‚»ăƒƒă‚·ăƒ§ăƒłæŽšćźšă‚łă‚čăƒˆïŒšćżœç­”{responses}件。{warn}ă§è­Šć‘Šă—ă€{cap}ă§ă‚»ăƒƒă‚·ăƒ§ăƒłă‚’ç”‚äș†ă—ăŸă™ă€‚", + "Estimate is incomplete — a response was still in flight when the session ended, so its usage was never reported.": "æŽšćźšăŻäžćźŒć…šă§ă™ă€‚ă‚»ăƒƒă‚·ăƒ§ăƒłç”‚äș†æ™‚ă«ć‡Šç†äž­ăźćżœç­”ăŒă‚ăŁăŸăŸă‚ă€ăăźäœżç”šé‡ăŻć ±ć‘Šă•ă‚ŒăŸă›ă‚“ă§ă—ăŸă€‚", + "STANDARD": "æš™æș–", + "{tier} applies next session": "{tier}ăŻæŹĄć›žă‚»ăƒƒă‚·ăƒ§ăƒłă§é©ç”š", + "Session ended — cost cap {cost}": "ă‚»ăƒƒă‚·ăƒ§ăƒłç”‚äș†ïŒšă‚łă‚čト侊限 {cost}", + "MIC": "ăƒžă‚€ă‚Ż", + "Radio did not start": "ăƒ©ă‚žă‚Șă‚’é–‹ć§‹ă§ăăŸă›ă‚“ă§ă—ăŸ", + "{n} aircraft": { + "other": "èˆȘç©ș機{n}機" + }, + "{n} military aircraft": { + "other": "軍甚機{n}機" + }, + "{n} ships": { + "other": "èˆč舶{n}隻" + }, + "{n} satellites": { + "other": "èĄ›æ˜Ÿ{n}ćŸș" + }, + "{n} launches": { + "other": "æ‰“ăĄäžŠă’{n}ä»¶" + }, + "{n} earthquakes": { + "other": "朰震{n}ä»¶" + }, + "{n} fires": { + "other": "火灜{n}ä»¶" + }, + "{n} fire perimeters": { + "other": "ç«çœăźć»¶ç„ŒçŻ„ć›Č{n}ä»¶" + }, + "{n} cyclones": { + "other": "ă‚”ă‚€ă‚Żăƒ­ăƒł{n}怋" + }, + "{n} buses": { + "other": "バă‚č{n}揰" + }, + "{n} bike share": { + "other": "ă‚·ă‚§ă‚ąă‚”ă‚€ă‚Żăƒ«{n}ă‹æ‰€" + }, + "{n} flock cameras": { + "other": "Flockă‚«ăƒĄăƒ©{n}揰" + }, + "{n} military bases": { + "other": "軍äș‹ćŸș㜰{n}ă‹æ‰€" + }, + "{n} datacenters": { + "other": "ăƒ‡ăƒŒă‚żă‚»ăƒłă‚żăƒŒ{n}ă‹æ‰€" + }, + "{n} dams": { + "other": "ダム{n}ă‹æ‰€" + }, + "{n} air quality": { + "other": "ć€§æ°—èłȘăźèŠłæžŹć±€{n}ć±€" + }, + "{n} results": { + "other": "甐果{n}ä»¶" + }, + "anywhere in the loaded data": "èȘ­ăżèŸŒăżæžˆăżăƒ‡ăƒŒă‚żć…šäœ“", + "in view": "èĄšç€ș範ć›Č憅", + "within {radius} of the view centre": "èĄšç€ș侭濃から{radius}仄憅", + "within {radius} of {place} (Contacts window)": "{place}から{radius}ä»„ć†…ïŒˆă‚łăƒłă‚żă‚ŻăƒˆăźçŻ„ć›Č", + "within {radius} of {place}": "{place}から{radius}仄憅", + "within {radius}": "{radius}仄憅", + "over {region}": "{region}慹柟", + "At least {items}": "民ăȘくべも{items}", + "{items} {scope}": "{scope}た{items}", + "last 24 h": "過掻24時間", + "past 30 d and upcoming": "過掻30æ—„é–“ăšä»ŠćŸŒ", + "the flights layer loads by viewport": "ăƒ•ăƒ©ă‚€ăƒˆăƒŹă‚€ăƒ€ăƒŒăŻèĄšç€ș範ć›ČごずにèȘ­ăżèŸŒăŸă‚ŒăŸă™", + "distance is ground distance, not overhead": "è·é›ąăŻćœ°èĄšäžŠăźè·é›ąă§ă€èĄ›æ˜ŸăŸă§ăźç›Žç·šè·é›ąă§ăŻă‚ă‚ŠăŸă›ă‚“", + "the count is a lower bound because at least one layer reached its retained limit.": "民ăȘくべも1ă€ăźăƒŹă‚€ăƒ€ăƒŒăŒäżæŒäžŠé™ă«é”ă—ăŸăŸă‚ă€ă“ăźä»¶æ•°ăŻäž‹é™ć€€ă§ă™ă€‚", + "{label} off": "{label} ă‚Șフ", + "{label} loading": "{label}èȘ­ăżèŸŒăżäž­", + "{label} error": "{label}ă‚šăƒ©ăƒŒ", + "counted the first {returned} loaded records": "æœ€ćˆă«èȘ­ăżèŸŒăŸă‚ŒăŸ{returned}ä»¶ă‚’é›†èšˆă—ăŸă—ăŸ", + "counted {returned} of {total} loaded records": "èȘ­ăżèŸŒăżæžˆăżăź{total}件たうづ{returned}ä»¶ă‚’é›†èšˆă—ăŸă—ăŸ", + "{layers} just turned on — still loading, counts will rise": "{layers}をă‚Șăƒłă«ă—ăŸă°ă‹ă‚Šă§ă™ă€‚èȘ­ăżèŸŒăżäž­ăźăŸă‚ă€ä»¶æ•°ăŻćą—ăˆăŸă™", + "Contacts panel snapshot at {time} — the same retained cohort supplies the card, speech, and follow-up memory": "{time}時ç‚čăźă‚łăƒłă‚żă‚Żăƒˆăƒ‘ăƒăƒ«ăźă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆă€‚ă‚«ăƒŒăƒ‰ă€éŸłćŁ°ă€èżœćŠ ăźèłȘć•ăžăźèš˜æ†¶ă«ăŻćŒă˜äżæŒćŻŸè±Ąă‚’äœżç”šă—ăŠă„ăŸă™", + "Contacts panel snapshot — the same retained cohort supplies the card, speech, and follow-up memory": "ă‚łăƒłă‚żă‚Żăƒˆăƒ‘ăƒăƒ«ăźă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆă€‚ă‚«ăƒŒăƒ‰ă€éŸłćŁ°ă€èżœćŠ ăźèłȘć•ăžăźèš˜æ†¶ă«ăŻćŒă˜äżæŒćŻŸè±Ąă‚’äœżç”šă—ăŠă„ăŸă™", + "Fly below {km} km to a covered region": "{km} kmæœȘæș€ăŸă§é«˜ćșŠă‚’äž‹ă’ă€ă‚«ăƒăƒŒçŻ„ć›Čć†…ăźćœ°ćŸŸăžç§»ć‹•ă—ăŠăă ă•ă„", + "No feed here yet · {n} regions available": { + "other": "ă“ă“ă«ăŻăŸă ăƒ•ă‚ŁăƒŒăƒ‰ăŒă‚ă‚ŠăŸă›ă‚“ · ćˆ©ç”šćŻèƒœăȘ㜰㟟 {n}ă‹æ‰€" + }, + "degraded": "性胜䜎䞋", + "stale": "æ›Žæ–°é…ć»¶", + "partial": "郹戆的", + "fallback": "ăƒ•ă‚©ăƒŒăƒ«ăƒăƒƒă‚Ż", + "unavailable": "ćˆ©ç”šäžćŻ", + "Not answered: {layers}": "濜答ăȘă—ïŒš{layers}", + "Toggle voice control": "éŸłćŁ°ă‚łăƒłăƒˆăƒ­ăƒŒăƒ«ă‚’ćˆ‡ă‚Šæ›żăˆ", + "Activate to toggle voice": "æŠŒă™ăšéŸłćŁ°ăźă‚Șン/ă‚Șăƒ•ă‚’ćˆ‡ă‚Šæ›żăˆ", + "Voice active": "音棰 ă‚Șン", + "Voice could not be started.": "éŸłćŁ°ă‚’é–‹ć§‹ă§ăăŸă›ă‚“ă§ă—ăŸă€‚", + "the active voice session": "é€ČèĄŒäž­ăźéŸłćŁ°ă‚»ăƒƒă‚·ăƒ§ăƒł", + "{value} feet": "{value}ăƒ•ă‚ŁăƒŒăƒˆ", + "Fire · FRP {frp} MW": "火灜 · FRP {frp} MW", + "The flights layer is not enabled": "ăƒ•ăƒ©ă‚€ăƒˆăƒŹă‚€ăƒ€ăƒŒăŒæœ‰ćŠčにăȘăŁăŠă„ăŸă›ă‚“", + "The military layer is not enabled": "è»ç”šæ©ŸăƒŹă‚€ăƒ€ăƒŒăŒæœ‰ćŠčにăȘăŁăŠă„ăŸă›ă‚“", + "The satellites layer is not enabled": "èĄ›æ˜ŸăƒŹă‚€ăƒ€ăƒŒăŒæœ‰ćŠčにăȘăŁăŠă„ăŸă›ă‚“", + "The ais-live-vessels layer is not enabled": "ăƒ©ă‚€ăƒ–AISèˆčèˆ¶ăƒŹă‚€ăƒ€ăƒŒăŒæœ‰ćŠčにăȘăŁăŠă„ăŸă›ă‚“", + "Could not enable the requested layer": "èŠæ±‚ă•ă‚ŒăŸăƒŹă‚€ăƒ€ăƒŒă‚’æœ‰ćŠčă«ă§ăăŸă›ă‚“ă§ă—ăŸ", + "Could not disable the requested layer": "èŠæ±‚ă•ă‚ŒăŸăƒŹă‚€ăƒ€ăƒŒă‚’ç„ĄćŠčă«ă§ăăŸă›ă‚“ă§ă—ăŸ", + "Radio layer unavailable": "ăƒ©ă‚žă‚ȘăƒŹă‚€ăƒ€ăƒŒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Camera navigation is unavailable in the current view": "çŸćœšăźăƒ“ăƒ„ăƒŒă§ăŻă‚«ăƒĄăƒ©ăźăƒŠăƒ“ă‚ČăƒŒă‚·ăƒ§ăƒłă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Camera navigation policy unavailable": "ă‚«ăƒĄăƒ©ăźăƒŠăƒ“ă‚ČăƒŒă‚·ăƒ§ăƒłăƒăƒȘă‚·ăƒŒă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Nearest-aircraft selection supports Flights or Military Flights only": "æœ€ćŻ„ă‚ŠăźèˆȘç©șæ©ŸăźéžæŠžăŻă€ăƒ•ăƒ©ă‚€ăƒˆăŸăŸăŻè»ç”šæ©Ÿăźăżă«ćŻŸćżœă—ăŠă„ăŸă™", + "Nearest-aircraft selection needs a preset, place name, or latitude and longitude": "æœ€ćŻ„ă‚ŠăźèˆȘç©șæ©Ÿă‚’éžæŠžă™ă‚‹ă«ăŻă€ăƒ—ăƒȘă‚»ăƒƒăƒˆă€ćœ°ćă€ăŸăŸăŻç·ŻćșŠăƒ»ç”ŒćșŠăŒćż…èŠă§ă™", + "Could not arrive at the requested place": "èŠæ±‚ă•ă‚ŒăŸć Žæ‰€ă«ćˆ°é”ă§ăăŸă›ă‚“ă§ă—ăŸ", + "The nearest airborne aircraft could not be selected": "éŁ›èĄŒäž­ăźæœ€ćŻ„ă‚ŠăźèˆȘç©șæ©Ÿă‚’éžæŠžă§ăăŸă›ă‚“ă§ă—ăŸ", + "No flights within {radius} of the current view": "çŸćœšăźăƒ“ăƒ„ăƒŒă‹ă‚‰{radius}ä»„ć†…ă«ăƒ•ăƒ©ă‚€ăƒˆăŻă‚ă‚ŠăŸă›ă‚“", + "No military within {radius} of the current view": "çŸćœšăźăƒ“ăƒ„ăƒŒă‹ă‚‰{radius}ä»„ć†…ă«è»ç”šæ©ŸăŻă‚ă‚ŠăŸă›ă‚“", + "No satellites within {radius} of the current view": "çŸćœšăźăƒ“ăƒ„ăƒŒă‹ă‚‰{radius}ä»„ć†…ă«èĄ›æ˜ŸăŻă‚ă‚ŠăŸă›ă‚“", + "No vessels within {radius} of the current view": "çŸćœšăźăƒ“ăƒ„ăƒŒă‹ă‚‰{radius}仄憅にèˆčèˆ¶ăŻă‚ă‚ŠăŸă›ă‚“", + "{layer} is enabled on the {source} feed, but no airborne aircraft is loaded in the {place} view yet": "{layer}は{source}ăƒ•ă‚ŁăƒŒăƒ‰ă§æœ‰ćŠčですが、{place}ăźăƒ“ăƒ„ăƒŒă«éŁ›èĄŒäž­ăźèˆȘç©șæ©ŸăŻăŸă èȘ­ăżèŸŒăŸă‚ŒăŠă„ăŸă›ă‚“", + "{layer} is enabled, but no airborne aircraft is loaded in the {place} view yet": "{layer}ăŻæœ‰ćŠčですが、{place}ăźăƒ“ăƒ„ăƒŒă«éŁ›èĄŒäž­ăźèˆȘç©șæ©ŸăŻăŸă èȘ­ăżèŸŒăŸă‚ŒăŠă„ăŸă›ă‚“", + "{layer} is enabled, but its aircraft feed is unavailable": "{layer}ăŻæœ‰ćŠčですが、èˆȘç©șæ©Ÿăƒ•ă‚ŁăƒŒăƒ‰ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "{layer} is enabled, but its destination refresh did not complete": "{layer}ăŻæœ‰ćŠčă§ă™ăŒă€ç›źçš„ćœ°ăźæ›Žæ–°ăŒćźŒäș†ă—ăŸă›ă‚“ă§ă—ăŸ", + "{layer} is enabled, but {source} is unavailable": "{layer}ăŻæœ‰ćŠčですが、{source}ă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Could not arrive at {place}": "{place}ă«ćˆ°é”ă§ăăŸă›ă‚“ă§ă—ăŸ", + "{name} is no longer loaded": "{name}はèȘ­ăżèŸŒăŸă‚ŒăŠă„ăŸă›ă‚“", + "Unknown target layer: {target}": "䞍明ăȘă‚żăƒŒă‚ČăƒƒăƒˆăƒŹă‚€ăƒ€ăƒŒïŒš{target}", + "nominal": "æš™æș–", + "{label} on": "{label} ă‚Șン", + "Frame aircraft": "èˆȘç©șæ©Ÿă‚’èŠ–é‡Žă«ćŽă‚ă‚‹", + "Frame military aircraft": "è»ç”šæ©Ÿă‚’èŠ–é‡Žă«ćŽă‚ă‚‹", + "Frame ships": "èˆčèˆ¶ă‚’èŠ–é‡Žă«ćŽă‚ă‚‹", + "Frame satellites": "èĄ›æ˜Ÿă‚’èŠ–é‡Žă«ćŽă‚ă‚‹", + "Frame contacts": "ă‚łăƒłă‚żă‚Żăƒˆă‚’èŠ–é‡Žă«ćŽă‚ă‚‹", + "{count} aircraft in frame": { + "other": "èŠ–é‡Žć†…ăźèˆȘç©ș機 {count}機" + }, + "{count} military aircraft in frame": { + "other": "èŠ–é‡Žć†…ăźè»ç”šæ©Ÿ {count}機" + }, + "{count} ships in frame": { + "other": "èŠ–é‡Žć†…ăźèˆč舶 {count}隻" + }, + "{count} satellites in frame": { + "other": "èŠ–é‡Žć†…ăźèĄ›æ˜Ÿ {count}ćŸș" + }, + "{count} contacts in frame": { + "other": "èŠ–é‡Žć†…ăźă‚łăƒłă‚żă‚Żăƒˆ {count}ä»¶" + }, + "Nearest military aircraft": "æœ€ćŻ„ă‚Šăźè»ç”šæ©Ÿ", + "Nearest ships": "æœ€ćŻ„ă‚Šăźèˆč舶", + "Nearest satellites": "æœ€ćŻ„ă‚ŠăźèĄ›æ˜Ÿ", + "Nearest aircraft": "æœ€ćŻ„ă‚ŠăźèˆȘç©ș機", + "{first} and {second}": "{first}ず{second}", + "Layer": "ăƒŹă‚€ăƒ€ăƒŒ", + "there": "そこ", + "Camera range {range}": "ă‚«ăƒĄăƒ©è·é›ą {range}", + "Within {radius} of the view": "ăƒ“ăƒ„ăƒŒă‹ă‚‰{radius}仄憅", + "Labels on": "ăƒ©ăƒ™ăƒ« ă‚Șン", + "Framing uses the nearest 80 loaded contacts": "èŠ–é‡Žă«ćŽă‚ă‚‹ćŻŸè±ĄăŻă€èȘ­ăżèŸŒăżæžˆăżăźæœ€ćŻ„ă‚Šăź80ä»¶ăźă‚łăƒłă‚żă‚Żăƒˆă§ă™", + "{distance} from {location}": "{location}から{distance}", + "Altitude {altitude}": "高ćșŠ {altitude}", + "{origin} to {destination}": "{origin}ç™ș{destination}èĄŒă", + "from {origin}": "{origin}ç™ș", + "to {destination}": "{destination}èĄŒă", + "Registration {registration}": "登éŒČèš˜ć· {registration}", + "View state": "ăƒ“ăƒ„ăƒŒăźçŠ¶æ…‹", + "Marked {count} places": { + "other": "{count}ă‹æ‰€ă‚’ăƒžăƒŒă‚Żă—ăŸă—ăŸ" + }, + "Nothing marked": "ăƒžăƒŒă‚Żă—ăŸă‚‚ăźăŻă‚ă‚ŠăŸă›ă‚“", + "Not found: {places}": "èŠ‹ă€ă‹ă‚ŠăŸă›ă‚“ïŒš{places}", + "Tracing outlines": "èŒȘéƒ­ă‚’æç”»äž­", + "Frame flights": "ăƒ•ăƒ©ă‚€ăƒˆă‚’èŠ–é‡Žă«ćŽă‚ă‚‹", + "Frame military": "è»ç”šæ©Ÿă‚’èŠ–é‡Žă«ćŽă‚ă‚‹", + "Frame vessels": "èˆčèˆ¶ă‚’èŠ–é‡Žă«ćŽă‚ă‚‹", + "Frame {target}": "{target}ă‚’èŠ–é‡Žă«ćŽă‚ă‚‹", + "Zoom out to globe": "ćœ°çƒć…šäœ“ăŸă§ă‚șăƒŒăƒ ă‚ąă‚Šăƒˆ", + "Open data layers": "ăƒ‡ăƒŒă‚żăƒŹă‚€ăƒ€ăƒŒă‚’é–‹ă", + "Open or close a panel": "ăƒ‘ăƒăƒ«ă‚’é–‹é–‰", + "Change context mode": "コンテキă‚čăƒˆăƒąăƒŒăƒ‰ă‚’ć€‰æ›Ž", + "Control cockpit": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’æ“äœœ", + "Change visual style": "ăƒ“ă‚žăƒ„ă‚ąăƒ«ă‚čă‚żă‚€ăƒ«ă‚’ć€‰æ›Ž", + "Adjust HUD": "HUDをèȘżæ•Ž", + "Adjust cyber sonar": "ă‚”ă‚€ăƒăƒŒă‚œăƒŠăƒŒă‚’èȘżæ•Ž", + "Adjust detection overlay": "怜ć‡șă‚ȘăƒŒăƒăƒŒăƒŹă‚€ă‚’èȘżæ•Ž", + "Change map stack": "マップă‚čă‚żăƒƒă‚Żă‚’ć€‰æ›Ž", + "Adjust post-processing": "ポă‚čăƒˆăƒ—ăƒ­ă‚»ă‚čをèȘżæ•Ž", + "Control scene": "ă‚·ăƒŒăƒłă‚’æ“äœœ", + "Control CCTV": "CCTVă‚’æ“äœœ", + "Control radio": "ăƒ©ă‚žă‚Șă‚’æ“äœœ", + "Track contact": "ă‚łăƒłă‚żă‚Żăƒˆă‚’èżœè·Ą", + "Stop tracking": "èżœè·Ąă‚’ćœæ­ą", + "Clear marks": "ăƒžăƒŒă‚Żă‚’æ¶ˆćŽ»", + "Move camera": "ă‚«ăƒĄăƒ©ă‚’ç§»ć‹•", + "Fly route": "ăƒ«ăƒŒăƒˆă‚’éŁ›èĄŒ", + "Analyst query": "ćˆ†æžă‚Żă‚šăƒȘ", + "Next ISS pass": "æŹĄăźISS通過", + "Next satellite pass": "æŹĄăźèĄ›æ˜Ÿé€šéŽ", + "Mark the map": "ćœ°ć›łă«ăƒžăƒŒă‚Ż", + "Mark {targets} +{more}": "{targets}ă‚’ăƒžăƒŒă‚Ż +{more}", + "Mark {targets}": "{targets}ă‚’ăƒžăƒŒă‚Ż", + "Fly to {place}": "{place}ぞ移拕", + "Fly to Location": "ć Žæ‰€ăžç§»ć‹•", + "Nearest aircraft to {place}": "{place}ăźæœ€ćŻ„ă‚ŠăźèˆȘç©ș機", + "Nearest aircraft to Here": "ă“ă“ăźæœ€ćŻ„ă‚ŠăźèˆȘç©ș機", + "Layer on": "ăƒŹă‚€ăƒ€ăƒŒ ă‚Șン", + "Layer off": "ăƒŹă‚€ăƒ€ăƒŒ ă‚Șフ", + "Zoom out": "ă‚șăƒŒăƒ ă‚ąă‚Šăƒˆ", + "Zoom in": "ă‚șăƒŒăƒ ă‚€ăƒł", + "Read the view": "ăƒ“ăƒ„ăƒŒăźć†…ćźčをèȘ­ăżć–り", + "Check view state": "ăƒ“ăƒ„ăƒŒăźçŠ¶æ…‹ă‚’çąșèȘ", + "Action": "操䜜", + "Finding places": "ć Žæ‰€ă‚’æ€œçŽąäž­", + "Tracing outline": "èŒȘéƒ­ă‚’æç”»äž­", + "Looking up place": "ć Žæ‰€ă‚’ç…§äŒšäž­", + "Flying": "移拕䞭", + "Turning on layer": "ăƒŹă‚€ăƒ€ăƒŒă‚’æœ‰ćŠč挖侭", + "Loading aircraft": "èˆȘç©șæ©Ÿă‚’èȘ­ăżèŸŒăżäž­", + "Picking nearest": "æœ€ćŻ„ă‚Šă‚’éžæŠžäž­", + "Working": "懩理侭", + "in progress": "懩理侭", + "done": "漌äș†", + "failed": "ć€±æ•—", + "cancelled": "ă‚­ăƒŁăƒłă‚»ăƒ«æžˆăż", + "Outline traced": "èŒȘéƒ­ă‚’æç”»ă—ăŸă—ăŸ", + "Outline unavailable": "èŒȘéƒ­ă‚’ć–ćŸ—ă§ăăŸă›ă‚“", + "Source: {label}": "ć‡șć…žïŒš{label}", + "WORKING": "懩理侭", + "DONE": "漌äș†", + "Recent speech": "æœ€èż‘ăźç™ș話", + "HERE": "ここ", + "Aircraft cockpit view": "èˆȘç©șæ©Ÿă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăƒ“ăƒ„ăƒŒ", + "LEVEL": "æ°Žćčł", + "Estimated destination direction": "æŽšćźšç›źçš„ćœ°ăźæ–č搑", + "DEST ---°": "盼的朰 ---°", + "OPTICAL PLANE · 01": "慉歩靱 · 01", + "VISOR LOCK · ACTIVE": "ăƒă‚€ă‚¶ăƒŒăƒ­ăƒƒă‚Ż · 有ćŠč", + "GROUND SPEED · KTS": "ćŻŸćœ°é€ŸćșŠ Â· KT", + "ALTITUDE · FT": "高ćșŠ Â· FT", + "FIRST PERSON": "侀äșș称芖ç‚č", + "LIVE TRACK · COURSE ALIGNED": "ăƒ©ă‚€ăƒ–èżœè·Ą · é‡è·Żäž€è‡Ž", + "Cockpit vision style": "コックピットぼビゾョンă‚čă‚żă‚€ăƒ«", + "Previous cockpit vision style": "才ぼコックピットビゾョンă‚čă‚żă‚€ăƒ«", + "Previous vision style": "才ぼビゾョンă‚čă‚żă‚€ăƒ«", + "Current cockpit vision style: NORMAL. Activate for next style.": "çŸćœšăźă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăƒ“ă‚žăƒ§ăƒłă‚čă‚żă‚€ăƒ«ïŒšæš™æș–ă€‚æŠŒă™ăšæŹĄăźă‚čă‚żă‚€ăƒ«ă«ćˆ‡ă‚Šæ›żă‚ă‚ŠăŸă™ă€‚", + "Current style: NORMAL — click for next": "çŸćœšăźă‚čă‚żă‚€ăƒ«ïŒšæš™æș–。クăƒȘăƒƒă‚Żă§æŹĄăž", + "CURRENT": "çŸćœš", + "Next cockpit vision style": "æŹĄăźă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăƒ“ă‚žăƒ§ăƒłă‚čă‚żă‚€ăƒ«", + "Next vision style": "æŹĄăźăƒ“ă‚žăƒ§ăƒłă‚čă‚żă‚€ăƒ«", + "Current aircraft heading": "çŸćœšăźæ©ŸéŠ–æ–č䜍", + "GROUND SPEED": "ćŻŸćœ°é€ŸćșŠ", + "KTS": "KT", + "ALTITUDE": "高ćșŠ", + "FT": "FT", + "Contact cockpit summary": "ă‚łăƒłă‚żă‚Żăƒˆăźă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆæŠ‚èŠ", + "CONTACT": "コンタクト", + "CONTACTS · 250 KM": "コンタクト · 250 km", + "Contact navigation": "コンタクトナビă‚ČăƒŒă‚·ăƒ§ăƒł", + "CONTEXT ONLY": "ć‚è€ƒæƒ…ć ±ăźăż", + "Nearby cohort counts": "摹èŸșăźçšźćˆ„ă”ăšăźä»¶æ•°", + "FLT": "FLT", + "MIL": "軍甚", + "SITE": "斜蚭", + "NEAREST OBSERVED / MAPPED": "æœ€ćŻ„ă‚ŠăźèŠłæžŹ / ăƒžăƒƒăƒ—æžˆăż", + "AVAILABLE INPUTS ONLY · NOT AN ALL-CLEAR": "ćˆ©ç”šćŻèƒœăȘ慄抛たみ · ćź‰ć…šăźäżèšŒă§ăŻă‚ă‚ŠăŸă›ă‚“", + "WX": "æ°—è±Ą", + "Cockpit briefing carousel": "コックピットブăƒȘăƒŒăƒ•ă‚Łăƒłă‚°ă‚«ăƒ«ăƒŒă‚»ăƒ«", + "Estimated flight plan": "æŽšćźšăƒ•ăƒ©ă‚€ăƒˆăƒ—ăƒ©ăƒł", + "ESTIMATED FLIGHT PLAN": "æŽšćźšăƒ•ăƒ©ă‚€ăƒˆăƒ—ăƒ©ăƒł", + "FROM": "ć‡șç™ș", + "TO": "戰着", + "Cockpit briefing controls": "コックピットブăƒȘăƒŒăƒ•ă‚Łăƒłă‚°ăźæ“äœœ", + "Previous briefing page": "才ぼブăƒȘăƒŒăƒ•ă‚Łăƒłă‚°ăƒšăƒŒă‚ž", + "Next briefing page": "æŹĄăźăƒ–ăƒȘăƒŒăƒ•ă‚Łăƒłă‚°ăƒšăƒŒă‚ž", + "Live signals": "ăƒ©ă‚€ăƒ–ă‚·ă‚°ăƒŠăƒ«", + "Latest regional news": "æœ€æ–°ăźćœ°ćŸŸăƒ‹ăƒ„ăƒŒă‚č", + "Location-based information": "äœçœźă«ćŸșă„ăæƒ…ć ±", + "TEMP": "æ°—æž©", + "WIND": "éąš", + "SKY": "ć€©æ°—", + "PRECIP": "降氎", + "MM": "mm", + "Weather data by Open-Meteo.com": "æ°—è±Ąăƒ‡ăƒŒă‚żæäŸ›ïŒšOpen-Meteo.com", + "Cockpit briefing pages": "コックピットぼブăƒȘăƒŒăƒ•ă‚Łăƒłă‚°ăƒšăƒŒă‚ž", + "SIG": "ă‚·ă‚°ăƒŠăƒ«", + "Show Live Signals": "ăƒ©ă‚€ăƒ–ă‚·ă‚°ăƒŠăƒ«ă‚’èĄšç€ș", + "NEWS": "ăƒ‹ăƒ„ăƒŒă‚č", + "Show Regional News": "ćœ°ćŸŸăƒ‹ăƒ„ăƒŒă‚čă‚’èĄšç€ș", + "LOCAL": "ăƒ­ăƒŒă‚«ăƒ«", + "Show Local Info": "ăƒ­ăƒŒă‚«ăƒ«æƒ…ć ±ă‚’èĄšç€ș", + "Cockpit display and Radio controls": "コックピットぼディă‚čăƒ—ăƒŹă‚€ăšăƒ©ă‚žă‚Șăźæ“äœœ", + "DISPLAY": "ディă‚čăƒ—ăƒŹă‚€", + "Cockpit display options": "コックピットぼディă‚čăƒ—ăƒŹă‚€èš­ćźš", + "RADIO": "ăƒ©ă‚žă‚Ș", + "Cockpit compact Radio controls": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăźă‚łăƒłăƒ‘ă‚Żăƒˆăƒ©ă‚žă‚Ș操䜜", + "Previous filtered radio station": "ç”žă‚ŠèŸŒăżäž­ăźć‰ăźăƒ©ă‚žă‚Șć±€", + "Play selected radio station": "éžæŠžă—ăŸăƒ©ă‚žă‚Șć±€ă‚’ć†ç”Ÿ", + "Next filtered radio station": "ç”žă‚ŠèŸŒăżäž­ăźæŹĄăźăƒ©ă‚žă‚Șć±€", + "VOLUME": "音量", + "Cockpit Radio volume": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăƒ©ă‚žă‚Șぼ音量", + "ESC EXIT": "Escで甂äș†", + "C TOGGLE": "Că§ćˆ‡æ›ż", + "View switcher": "ăƒ“ăƒ„ăƒŒćˆ‡æ›ż", + "Exit cockpit and return to full globe view": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆă‚’ç”‚äș†ă—ăŠćœ°çƒć…šäœ“ăƒ“ăƒ„ăƒŒă«æˆ»ă‚‹", + "RESET": "ăƒȘă‚»ăƒƒăƒˆ", + "Exit cockpit view": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆăƒ“ăƒ„ăƒŒă‚’ç”‚äș†", + "EXIT COCKPIT": "ă‚łăƒƒă‚Żăƒ”ăƒƒăƒˆç”‚äș†", + "Navigation, voice, and visual preset controls": "ナビă‚ČăƒŒă‚·ăƒ§ăƒłă€éŸłćŁ°ă€ăƒ“ă‚žăƒ„ă‚ąăƒ«ăƒ—ăƒȘă‚»ăƒƒăƒˆăźæ“äœœ", + "Expand Visual Presets": "ăƒ“ă‚žăƒ„ă‚ąăƒ«ăƒ—ăƒȘă‚»ăƒƒăƒˆă‚’ć±•é–‹", + "Pin visual presets": "ăƒ“ă‚žăƒ„ă‚ąăƒ«ăƒ—ăƒȘă‚»ăƒƒăƒˆă‚’ć›ș漚", + "Keep visual presets open": "ăƒ“ă‚žăƒ„ă‚ąăƒ«ăƒ—ăƒȘă‚»ăƒƒăƒˆă‚’é–‹ă„ăŸăŸăŸă«ă™ă‚‹", + "Show the globe without a visual filter.": "ăƒ“ă‚žăƒ„ă‚ąăƒ«ăƒ•ă‚Łăƒ«ă‚żăƒŒăȘă—ă§ćœ°çƒć„€ă‚’èĄšç€șă—ăŸă™ă€‚", + "Emulate a green phosphor CRT with scanlines and screen curvature.": "è”°æŸ»ç·šăšç”»éąăźæčŸæ›Čă‚’ć‚™ăˆăŸă€ç·‘è‰Čè›ć…‰äœ“ăźCRTă‚’ć†çŸă—ăŸă™ă€‚", + "Simulate night-vision goggles with green intensification and a tube vignette.": "緑è‰Čぼ慉汗ćč…ăšăƒăƒ„ăƒŒăƒ–ć‘šèŸșăźæž›ć…‰ă§ă€æš—èŠ–ă‚ŽăƒŒă‚°ăƒ«ă‚’ć†çŸă—ăŸă™ă€‚", + "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "FLIRéąšăźç†±ă‚łăƒłăƒˆăƒ©ă‚čăƒˆă‚’ć†çŸă—ăŸă™ă€‚è‰Čă‚’ä»˜ă‘ă‚‹ă«ăŻIronbowを侊げどください。", + "Apply bright cel-shaded color and illustrated outlines.": "æ˜Žă‚‹ă„ă‚»ăƒ«ă‚·ă‚§ăƒŒăƒ‡ă‚Łăƒłă‚°ăźè‰ČずèŒȘéƒ­ç·šă‚’é©ç”šă—ăŸă™ă€‚", + "Apply high-contrast monochrome film-noir grading.": "ă‚łăƒłăƒˆăƒ©ă‚čăƒˆăźćŒ·ă„ăƒąăƒŽă‚Żăƒ­ăźăƒ•ă‚Łăƒ«ăƒ ăƒŽăƒŻăƒŒăƒ«èȘżă«ä»•äžŠă’ăŸă™ă€‚", + "MAP SOURCE": "ăƒžăƒƒăƒ—ă‚œăƒŒă‚č", + "Map source": "ăƒžăƒƒăƒ—ă‚œăƒŒă‚č", + "Style": "ă‚čă‚żă‚€ăƒ«", + "Expand LOCATION": "äœçœźă‚’ć±•é–‹", + "Collapse panel": "ăƒ‘ăƒăƒ«ă‚’æŠ˜ă‚ŠăŸăŸă‚€", + "Pin location tray": "äœçœźăƒˆăƒŹă‚€ă‚’ć›ș漚", + "Keep location tray open": "äœçœźăƒˆăƒŹă‚€ă‚’é–‹ă„ăŸăŸăŸă«ă™ă‚‹", + "Search any location": "ć Žæ‰€ă‚’æ€œçŽą", + "Search location by name or coordinates": "ćć‰ăŸăŸăŻćș§æš™ă§ć Žæ‰€ă‚’æ€œçŽą", + "Search any location...": "ć Žæ‰€ă‚’æ€œçŽąâ€Š", + "WEATHER": "æ°—è±Ą", + "Active weather products": "有ćŠčăȘæ°—è±Ąăƒ—ăƒ­ăƒ€ă‚Żăƒˆ", + "RECENT IMAGERY": "æœ€èż‘ăźèĄ›æ˜Ÿç”»ćƒ", + "Imagery days in the box": "範ć›Čć†…ăźç”»ćƒăźă‚ă‚‹æ—„", + "CONTEXT": "コンテキă‚čト", + "Expand panel": "ăƒ‘ăƒăƒ«ă‚’ć±•é–‹", + "Context mode": "コンテキă‚čăƒˆăƒąăƒŒăƒ‰", + "CONTACTS": "コンタクト", + "Cycles the nearest contacts of whatever type you select — planes, vessels, installations. Satellites track independently.": "éžæŠžă—ăŸçšźéĄžïŒˆèˆȘç©șæ©Ÿă€èˆčèˆ¶ă€æ–œèš­ïŒ‰ăźæœ€ćŻ„ă‚Šăźă‚łăƒłă‚żă‚Żăƒˆă‚’é †ă«ćˆ‡ă‚Šæ›żăˆăŸă™ă€‚èĄ›æ˜ŸăŻç‹Źç«‹ă—ăŠèżœè·Ąă•ă‚ŒăŸă™ă€‚", + "SPACE MISSIONS": "ćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒł", + "SELECT CONTEXT": "コンテキă‚čăƒˆă‚’éžæŠž", + "Contact Context actions": "コンタクトコンテキă‚čăƒˆăźæ“äœœ", + "COCKPIT": "コックピット", + "SEARCH NEARBY SITES": "摹èŸșæ–œèš­ă‚’æ€œçŽą", + "Reclassify tracked contact as TR-3B": "èżœè·Ąäž­ăźă‚łăƒłă‚żă‚Żăƒˆă‚’TR-3Bă«ć†ćˆ†éĄž", + "CONTACTS CONTEXT OFF": "コンタクトコンテキă‚čト ă‚Șフ", + "SELECT CONTACTS TO LOAD OBSERVED / MAPPED PROXIMITY": "ă‚łăƒłă‚żă‚Żăƒˆă‚’éžæŠžă—ăŠă€èŠłæžŹ / ăƒžăƒƒăƒ—æžˆăżăźèż‘æŽ„æƒ…ć ±ă‚’èȘ­ăżèŸŒăż", + "Available Space Missions": "ćˆ©ç”šćŻèƒœăȘćź‡ćź™ăƒŸăƒƒă‚·ăƒ§ăƒł", + "AVAILABLE MISSIONS": "ćˆ©ç”šćŻèƒœăȘăƒŸăƒƒă‚·ăƒ§ăƒł", + "SELECT A MISSION TO INSPECT": "ăƒŸăƒƒă‚·ăƒ§ăƒłă‚’éžæŠžă—ăŠè©łçŽ°ă‚’èĄšç€ș", + "LOADING 30-DAY MISSION INDEX": "30æ—„é–“ăźăƒŸăƒƒă‚·ăƒ§ăƒłäž€èŠ§ă‚’èȘ­èŸŒäž­", + "TAB PREVIEWS · ENTER / SPACE SELECTS": "Tabă§ăƒ—ăƒŹăƒ“ăƒ„ăƒŒ · Enter / Spaceă§éžæŠž", + "Internet radio and local SDR": "ă‚€ăƒłă‚żăƒŒăƒăƒƒăƒˆăƒ©ă‚žă‚Șăšăƒ­ăƒŒă‚«ăƒ«SDR", + "STATION TAG": "汀タグ", + "Filter stations by station tag": "ć±€ă‚żă‚°ă§ć±€ă‚’ç”žă‚ŠèŸŒăż", + "All": "すăčお", + "Enable Radio, then choose a globe marker or use next.": "ăƒ©ă‚žă‚Șă‚’æœ‰ćŠčă«ă—ăŠă‹ă‚‰ă€ćœ°çƒć„€ăźăƒžăƒŒă‚«ăƒŒă‚’éžă¶ă‹ă€ïŒ»æŹĄăžïŒœă‚’äœżăŁăŠăă ă•ă„ă€‚", + "DRAG TO TUNE": "ăƒ‰ăƒ©ăƒƒă‚°ă§éžć±€", + "Tune available internet radio stations": "ćˆ©ç”šćŻèƒœăȘă‚€ăƒłă‚żăƒŒăƒăƒƒăƒˆăƒ©ă‚žă‚Ș汀を遞汀", + "ALL · DRAG THE NEEDLE": "すăčお · é‡ă‚’ăƒ‰ăƒ©ăƒƒă‚°", + "SNAPS TO AVAILABLE STATIONS": "ćˆ©ç”šćŻèƒœăȘ汀にă‚čナップ", + "Radio playback": "ăƒ©ă‚žă‚Ș憍生", + "Previous filtered station": "ç”žă‚ŠèŸŒăżäž­ăźć‰ăźć±€", + "Play selected station": "éžæŠžă—ăŸć±€ă‚’ć†ç”Ÿ", + "Next filtered station": "ç”žă‚ŠèŸŒăżäž­ăźæŹĄăźć±€", + "STOP": "ćœæ­ą", + "Stop radio playback": "ăƒ©ă‚žă‚Șć†ç”Ÿă‚’ćœæ­ą", + "Radio volume": "ăƒ©ă‚žă‚Șぼ音量", + "STATION SITE": "æ”Ÿé€ć±€ă‚”ă‚€ăƒˆ", + "DIRECTORY: RADIO BROWSER": "ディレクトăƒȘRadio Browser", + "Audio connects directly to the broadcaster after you press play. Your IP is visible to that broadcaster.": "ć†ç”Ÿăƒœă‚żăƒłă‚’æŠŒă™ăšă€éŸłćŁ°ăŻæ”Ÿé€ć±€ă«ç›ŽæŽ„æŽ„ç¶šă•ă‚ŒăŸă™ă€‚ăŠäœżă„ăźIPケドレă‚čăŻæ”Ÿé€ć±€ćŽă‹ă‚‰èŠ‹ăˆăŸă™ă€‚", + "Local RTL-SDR receiver": "ăƒ­ăƒŒă‚«ăƒ«RTL-SDRć—äżĄæ©Ÿ", + "LOCAL RTL-SDR": "ăƒ­ăƒŒă‚«ăƒ«RTL-SDR", + "Chrome/Edge · WebUSB · one local tuner shared by FM and the Local ADS-B layer.": "Chrome/Edge · WebUSB · FMăšăƒ­ăƒŒă‚«ăƒ«ADS-BăƒŹă‚€ăƒ€ăƒŒă§1ć°ăźăƒ­ăƒŒă‚«ăƒ«ăƒăƒ„ăƒŒăƒŠăƒŒă‚’ć…±æœ‰ă—ăŸă™ă€‚", + "Use your location for faster ADS-B position decoding": "äœçœźæƒ…ć ±ă‚’äœżăŁăŠADS-Băźäœçœźăƒ‡ă‚łăƒŒăƒ‰ă‚’é«˜é€ŸćŒ–", + "CHANGE DEVICE": "ăƒ‡ăƒă‚€ă‚čă‚’ć€‰æ›Ž", + "Choose a different RTL-SDR or receiver channel": "戄たRTL-SDRăŸăŸăŻć—äżĄăƒăƒŁăƒłăƒăƒ«ă‚’éžæŠž", + "RTL-SDR receiver mode": "RTL-SDRăźć—äżĄăƒąăƒŒăƒ‰", + "GAIN": "ă‚Čă‚€ăƒł", + "RTL-SDR tuner gain for the current mode": "çŸćœšăźăƒąăƒŒăƒ‰ăźRTL-SDRăƒăƒ„ăƒŒăƒŠăƒŒă‚Čă‚€ăƒł", + "AUTO": "è‡Ș拕", + "MSG/S": "MSG/S", + "HEARD": "揗信", + "POSITIONED": "äœçœźç‰čćźšæžˆăż", + "FM MHZ": "FM MHZ", + "TUNE": "㐌èȘż", + "Seek broadcast FM stations": "FMæ”Ÿé€ć±€ă‚’ă‚·ăƒŒă‚Ż", + "◀ SEEK": "◀ ă‚·ăƒŒă‚Ż", + "SEEK ▶": "ă‚·ăƒŒă‚Ż ▶", + "SDR VOL": "SDR音量", + "Local SDR volume": "ăƒ­ăƒŒă‚«ăƒ«SDRぼ音量", + "Intelligence HUD (H)": "ă‚€ăƒłăƒ†ăƒȘゾェンă‚čHUDH", + "Layout": "ăƒŹă‚€ă‚ąă‚Šăƒˆ", + "HUD layout": "HUDăƒŹă‚€ă‚ąă‚Šăƒˆ", + "Tactical": "ă‚żă‚Żăƒ†ă‚Łă‚«ăƒ«", + "Minimal": "ăƒŸăƒ‹ăƒžăƒ«", + "Cyber": "ă‚”ă‚€ăƒăƒŒ", + "Sonar": "ă‚œăƒŠăƒŒ", + "Cyber sonar contact scanner": "ă‚”ă‚€ăƒăƒŒă‚œăƒŠăƒŒăźă‚łăƒłă‚żă‚Żăƒˆă‚čă‚­ăƒŁăƒŠăƒŒ", + "Rings": "ăƒȘăƒłă‚°æ•°", + "Sonar ring count": "ă‚œăƒŠăƒŒăźăƒȘăƒłă‚°æ•°", + "Range": "範ć›Č", + "Sonar ring range": "ă‚œăƒŠăƒŒăźăƒȘング範ć›Č", + "Power": "ćŒ·ćșŠ", + "Sonar intensity": "ă‚œăƒŠăƒŒăźćŒ·ćșŠ", + "Opacity": "䞍透明ćșŠ", + "Cyber contact and label opacity": "ă‚”ă‚€ăƒăƒŒăźă‚łăƒłă‚żă‚Żăƒˆăšăƒ©ăƒ™ăƒ«ăźäžé€æ˜ŽćșŠ", + "Minimum opacity for map dots, icons, models, brackets, and labels between sonar passes": "ă‚œăƒŠăƒŒăźè”°æŸ»ăźćˆé–“ă«ăŠă‘ă‚‹ćœ°ć›łäžŠăźç‚čă€ă‚ąă‚€ă‚łăƒłă€ăƒąăƒ‡ăƒ«ă€ăƒ–ăƒ©ă‚±ăƒƒăƒˆă€ăƒ©ăƒ™ăƒ«ăźæœ€ć°äžé€æ˜ŽćșŠ", + "Sector": "æ‰‡ćœą", + "Sonar sector width": "ă‚œăƒŠăƒŒăźæ‰‡ćœąăźćč…", + "Detection Overlay (D)": "怜ć‡șă‚ȘăƒŒăƒăƒŒăƒŹă‚€ïŒˆD", + "Detection overlay": "怜ć‡șă‚ȘăƒŒăƒăƒŒăƒŹă‚€", + "Detection label density": "怜ć‡șăƒ©ăƒ™ăƒ«ăźćŻ†ćșŠ", + "Allocation": "配戆", + "Detection label allocation": "怜ć‡șăƒ©ăƒ™ăƒ«ăźé…ćˆ†", + "Elastic": "ă‚šăƒ©ă‚čティック", + "Weighted": "抠重", + "Fade": "ăƒ•ă‚§ăƒŒăƒ‰", + "Detection fade distance": "怜ć‡șăźăƒ•ă‚§ăƒŒăƒ‰è·é›ą", + "World-overlay fade distance outside the keyhole as a percentage of its radius": "ă‚­ăƒŒăƒ›ăƒŒăƒ«ć€–ăźăƒŻăƒŒăƒ«ăƒ‰ă‚ȘăƒŒăƒăƒŒăƒŹă‚€ăźăƒ•ă‚§ăƒŒăƒ‰è·é›ąïŒˆă‚­ăƒŒăƒ›ăƒŒăƒ«ćŠćŸ„ă«ćŻŸă™ă‚‹ć‰ČćˆïŒ‰", + "Outside": "怖恎", + "Detection opacity outside the keyhole": "ă‚­ăƒŒăƒ›ăƒŒăƒ«ć€–ăźæ€œć‡șăźäžé€æ˜ŽćșŠ", + "World-overlay label and card opacity beyond the fade distance": "ăƒ•ă‚§ăƒŒăƒ‰è·é›ąă‚’è¶…ăˆăŸçŻ„ć›ČăźăƒŻăƒŒăƒ«ăƒ‰ă‚ȘăƒŒăƒăƒŒăƒŹă‚€ăźăƒ©ăƒ™ăƒ«ăšă‚«ăƒŒăƒ‰ăźäžé€æ˜ŽćșŠ", + "PARAMETERS": "ăƒ‘ăƒ©ăƒĄăƒŒă‚żăƒŒ", + "3D aircraft — flat icons zoomed out, 3D models up close": "3DèˆȘç©șæ©ŸïŒšé æ™ŻăŻăƒ•ăƒ©ăƒƒăƒˆă‚ąă‚€ă‚łăƒłă€èż‘æ™ŻăŻ3Dăƒąăƒ‡ăƒ«", + "Models": "ăƒąăƒ‡ăƒ«", + "3D model coverage": "3Dăƒąăƒ‡ăƒ«ăźé©ç”šçŻ„ć›Č", + "Proximity": "èż‘æŽ„", + "Scope — the circular viewport mask": "ă‚čă‚łăƒŒăƒ—ïŒšć††ćœąăźăƒ“ăƒ„ăƒŒăƒăƒŒăƒˆăƒžă‚čク", + "Scope": "ă‚čă‚łăƒŒăƒ—", + "Feather": "ăŒă‹ă—", + "Scope edge feather": "ă‚čă‚łăƒŒăƒ—çžăźăŒă‹ă—", + "Scope edge feather as a percentage of the keyhole radius": "ă‚čă‚łăƒŒăƒ—çžăźăŒă‹ă—ïŒˆă‚­ăƒŒăƒ›ăƒŒăƒ«ćŠćŸ„ă«ćŻŸă™ă‚‹ć‰ČćˆïŒ‰", + "Draw on the world — click vertices, double-click or Enter to finish, Esc to cancel": "ćœ°çƒäžŠă«æç”»ïŒšă‚ŻăƒȘックで頂ç‚čă‚’èżœćŠ ă€ăƒ€ăƒ–ăƒ«ă‚ŻăƒȘăƒƒă‚ŻăŸăŸăŻEnterで漌äș†ă€Escă§ă‚­ăƒŁăƒłă‚»ăƒ«", + "Shape": "ć›łćœą", + "Shape to draw": "æç”»ă™ă‚‹ć›łćœą", + "Area": "範ć›Č", + "Line": "線", + "Pin": "ピン", + "Label (optional)": "ăƒ©ăƒ™ăƒ«ïŒˆä»»æ„ïŒ‰", + "Label for the drawn shape": "æç”»ă—ăŸć›łćœąăźăƒ©ăƒ™ăƒ«", + "Colour of the drawn shape": "æç”»ă—ăŸć›łćœąăźè‰Č", + "Primary": "ăƒ—ăƒ©ă‚€ăƒžăƒȘăƒŒ", + "Amber": "ă‚ąăƒłăƒăƒŒ", + "Cyan": "ă‚·ă‚ąăƒł", + "Green": "緑", + "Red": "蔀", + "Clear": "æ¶ˆćŽ»", + "Remove every mark from the board": "ăƒœăƒŒăƒ‰ă‹ă‚‰ă™ăčăŠăźăƒžăƒŒă‚Żă‚’ć‰Šé™€", + "Show your own GeoJSON, KML, KMZ or GPX files on the globe (or drop them onto it). File bytes stay on this device; overlays can appear in map screenshots shared with voice.": "æ‰‹ć…ƒăźGeoJSON、KML、KMZ、GPXăƒ•ă‚Ąă‚€ăƒ«ă‚’ćœ°çƒäžŠă«èĄšç€șă—ăŸă™ïŒˆćœ°çƒă«ăƒ‰ăƒ­ăƒƒăƒ—ă™ă‚‹ă“ăšă‚‚ă§ăăŸă™ïŒ‰ă€‚ăƒ•ă‚Ąă‚€ăƒ«ăźăƒ‡ăƒŒă‚żăŻă“ăźăƒ‡ăƒă‚€ă‚čからć‡șăŸă›ă‚“ă€‚ă‚ȘăƒŒăƒăƒŒăƒŹă‚€ăŻă€éŸłćŁ°ă‚ąă‚·ă‚čă‚żăƒłăƒˆăšć…±æœ‰ă•ă‚Œă‚‹ćœ°ć›łăźă‚čクăƒȘăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆă«ć†™ă‚‹ć ŽćˆăŒă‚ă‚ŠăŸă™ă€‚", + "Import": "ă‚€ăƒłăƒăƒŒăƒˆ", + "Choose GeoJSON, KML, KMZ or GPX files": "GeoJSON、KML、KMZ、GPXăƒ•ă‚Ąă‚€ăƒ«ă‚’éžæŠž", + "Imported files": "ă‚€ăƒłăƒăƒŒăƒˆă—ăŸăƒ•ă‚Ąă‚€ăƒ«", + "Celestial": "怩球", + "Hide UI chrome": "UIă‚’éžèĄšç€ș", + "Clean UI": "クăƒȘăƒŒăƒłUI", + "Bloom / Glow": "ăƒ–ăƒ«ăƒŒăƒ  / ă‚°ăƒ­ăƒŒ", + "Bloom intensity": "ăƒ–ăƒ«ăƒŒăƒ ăźćŒ·ćșŠ", + "Sharpening": "ă‚·ăƒŁăƒŒăƒ—ćŒ–", + "Sharpen": "ă‚·ăƒŁăƒŒăƒ—", + "Sharpen intensity": "ă‚·ăƒŁăƒŒăƒ—ăźćŒ·ćșŠ", + "EXIT CLEAN VIEW": "クăƒȘăƒŒăƒłăƒ“ăƒ„ăƒŒç”‚äș†", + "Return UI controls": "UIă‚łăƒłăƒˆăƒ­ăƒŒăƒ«ă‚’æˆ»ă™", + "Initializing photorealistic world...": "ăƒ•ă‚©ăƒˆăƒȘă‚ąăƒ«ăȘäž–ç•Œă‚’ćˆæœŸćŒ–äž­â€Š", + "DATA LAYERS": "ăƒ‡ăƒŒă‚żăƒŹă‚€ăƒ€ăƒŒ", + "ACQUIRING FRAME": "ăƒ•ăƒŹăƒŒăƒ ă‚’ć–ćŸ—äž­", + "NEAREST": "æœ€ćŻ„ă‚Š", + "CCTV camera": "CCTVă‚«ăƒĄăƒ©", + "CALIBRATION": "キャăƒȘăƒ–ăƒŹăƒŒă‚·ăƒ§ăƒł", + "Drag the camera in the world: rings rotate, arrows move, handles set range/FOV": "ăƒŻăƒŒăƒ«ăƒ‰äžŠă§ă‚«ăƒĄăƒ©ă‚’ăƒ‰ăƒ©ăƒƒă‚°ïŒšăƒȘăƒłă‚°ă§ć›žè»ąă€çŸąć°ă§ç§»ć‹•ă€ăƒăƒłăƒ‰ăƒ«ă§è·é›ą/FOVă‚’èš­ćźš", + "Camera pose — click a value to type": "ă‚«ăƒĄăƒ©ăźć§żć‹ąïŒšć€€ă‚’ă‚ŻăƒȘăƒƒă‚Żă—ăŠć…„ćŠ›", + "Heading (compass °) — click to type": "æ–čäœïŒˆă‚łăƒłăƒ‘ă‚č Â°ïŒ‰ïŒšă‚ŻăƒȘăƒƒă‚Żă—ăŠć…„ćŠ›", + "Pitch (° up/down) — click to type": "ăƒ”ăƒƒăƒïŒˆäžŠäž‹ Â°ïŒ‰ïŒšă‚ŻăƒȘăƒƒă‚Żă—ăŠć…„ćŠ›", + "Horizontal FOV (°) — click to type": "æ°ŽćčłFOVïŒˆÂ°ïŒ‰ïŒšă‚ŻăƒȘăƒƒă‚Żă—ăŠć…„ćŠ›", + "Range / monitor-plane distance (m) — click to type": "è·é›ą / ăƒąăƒ‹ă‚żăƒŒéąăŸă§ăźè·é›ąïŒˆmïŒ‰ïŒšă‚ŻăƒȘăƒƒă‚Żă—ăŠć…„ćŠ›", + "Mount height above ground (m) — click to type": "ćœ°äžŠă‹ă‚‰ăźèš­çœźé«˜ïŒˆmïŒ‰ïŒšă‚ŻăƒȘăƒƒă‚Żă—ăŠć…„ćŠ›", + "North offset from catalog position (m) — click to type": "ă‚«ă‚żăƒ­ă‚°äœçœźă‹ă‚‰ăźćŒ—æ–č搑ă‚Șăƒ•ă‚»ăƒƒăƒˆïŒˆmïŒ‰ïŒšă‚ŻăƒȘăƒƒă‚Żă—ăŠć…„ćŠ›", + "East offset from catalog position (m) — click to type": "ă‚«ă‚żăƒ­ă‚°äœçœźă‹ă‚‰ăźæ±æ–č搑ă‚Șăƒ•ă‚»ăƒƒăƒˆïŒˆmïŒ‰ïŒšă‚ŻăƒȘăƒƒă‚Żă—ăŠć…„ćŠ›", + "SAVE CAL": "CAL保歘", + "RESET CAL": "CALăƒȘă‚»ăƒƒăƒˆ", + "SCENE SUMMARY": "ă‚·ăƒŒăƒłæŠ‚èŠ", + "STREET LEVEL": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«", + "Turn Street Level on or off": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ăźă‚Șン/ă‚Șフ", + "Show the street-level view full screen (Esc shrinks it)": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ăźăƒ“ăƒ„ăƒŒă‚’ć…šç”»éąèĄšç€șEscă§çžźć°ïŒ‰", + "Image fit": "ç”»ćƒăźèĄšç€șæ–čæł•", + "FIT": "ć…šäœ“", + "Fit: show the whole photo, with dark bars where its shape differs from the frame": "ć…šäœ“ïŒšć†™çœŸć…šäœ“ă‚’èĄšç€șă—ă€æž ăšçžŠæšȘæŻ”ăŒç•°ăȘă‚‹éƒšćˆ†ăŻé»’ćžŻă§ćŸ‹ă‚ăŸă™", + "FILL": "慹靱", + "Fill: fill the frame edge to edge, cropping the photo": "ć…šéąïŒšæž ă„ăŁă±ă„ă«èĄšç€șし、憙真をトăƒȘăƒŸăƒłă‚°ă—ăŸă™", + "Close the image and deselect it on the map": "ç”»ćƒă‚’é–‰ă˜ăŠćœ°ć›łäžŠăźéžæŠžă‚’è§Łé™€", + "Close the street-level image": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ç”»ćƒă‚’é–‰ă˜ă‚‹", + "Street-level viewer": "ă‚čトăƒȘăƒŒăƒˆăƒŹăƒ™ăƒ«ăƒ“ăƒ„ăƒŒă‚ąăƒŒ", + "Open this image on the provider's site": "ă“ăźç”»ćƒă‚’ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒăźă‚”ă‚€ăƒˆă§é–‹ă", + "Imagery providers": "ç”»ćƒăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒ", + "PROVIDERS": "ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒ", + "Imagery filters": "ç”»ćƒăƒ•ă‚Łăƒ«ă‚żăƒŒ", + "IMAGERY": "ç”»ćƒ", + "Panorama filter": "ăƒ‘ăƒŽăƒ©ăƒžăƒ•ă‚Łăƒ«ă‚żăƒŒ", + "ALL": "すăčお", + "FLAT": "ćčłéą", + "SINCE": "期間", + "SCENES": "ă‚·ăƒŒăƒł", + "Scene recipe": "ă‚·ăƒŒăƒłăƒŹă‚·ăƒ”", + "NEW": "新芏", + "CAPTURE SHOT": "ă‚·ăƒ§ăƒƒăƒˆć–ćŸ—", + "UPDATE SHOT": "ă‚·ăƒ§ăƒƒăƒˆæ›Žæ–°", + "START": "開構", + "EXPORT PRESETS": "スクă‚čăƒăƒŒăƒˆ", + "IMPORT": "ă‚€ăƒłăƒăƒŒăƒˆ", + "RUN LOG": "ćźŸèĄŒăƒ­ă‚°", + "POWER UP": "ăƒ‘ăƒŻăƒŒă‚ąăƒƒăƒ—", + "GROUND STATION · PROVIDER SETTINGS": "ćœ°äžŠć±€ · ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒèš­ćźš", + "Close key setup": "ă‚­ăƒŒèš­ćźšă‚’é–‰ă˜ă‚‹", + "Power up the globe": "ćœ°çƒć„€ă‚’ăƒ‘ăƒŻăƒŒă‚ąăƒƒăƒ—", + "The globe already flies keyless. Every key below switches on another real feed — paste one and it's saved into this app's local configuration, then the server restarts itself. Server-side keys stay on this machine; Google Maps and Cesium ion run in the browser and must be provider-restricted. Keys you configured elsewhere are shown but never touched.": "ćœ°çƒć„€ăŻă‚­ăƒŒăȘă—ă§ă‚‚ăăźăŸăŸäœżăˆăŸă™ă€‚äž‹ăźć„ă‚­ăƒŒăŻă€ăă‚Œăžă‚Œćˆ„ăźćźŸăƒ‡ăƒŒă‚żăƒ•ă‚ŁăƒŒăƒ‰ă‚’æœ‰ćŠčă«ă—ăŸă™ă€‚ă‚­ăƒŒă‚’èČŒă‚Šä»˜ă‘ă‚‹ăšă“ăźă‚ąăƒ—ăƒȘăźăƒ­ăƒŒă‚«ăƒ«èš­ćźšă«äżć­˜ă•ă‚Œă€ă‚”ăƒŒăƒăƒŒăŒè‡Șć‹•ă§ć†è”·ć‹•ă—ăŸă™ă€‚ă‚”ăƒŒăƒăƒŒćŽăźă‚­ăƒŒăŻă“ăźăƒžă‚·ăƒłă‹ă‚‰ć‡șăŸă›ă‚“ă€‚Google MapsずCesium ionăŻăƒ–ăƒ©ă‚Šă‚¶ăƒŒă§ć‹•äœœă™ă‚‹ăŸă‚ă€ăƒ—ăƒ­ăƒă‚€ăƒ€ăƒŒćŽă§ćˆ©ç”šćˆ¶é™ă‚’èš­ćźšă—ăŠăă ă•ă„ă€‚ä»–ăźć Žæ‰€ă§èš­ćźšæžˆăżăźă‚­ăƒŒăŻèĄšç€șăźăżă§ă€ć€‰æ›Žă•ă‚ŒăŸă›ă‚“ă€‚", + "SAVE KEYS": "ă‚­ăƒŒă‚’äżć­˜", + "ESC to close": "Escで閉じる", + "The Google Maps key buys the photorealistic planet — everything else stacks on top.": "Google Mapsăźă‚­ăƒŒă§ăƒ•ă‚©ăƒˆăƒȘă‚ąăƒ«ăȘćœ°çƒăŒäœżăˆă‚‹ă‚ˆă†ă«ăȘり、他たすăčăŠăŻăăźäžŠă«é‡ăȘă‚ŠăŸă™ă€‚", + "NO PLACE LEFT BEHIND": "ć–ă‚Šæź‹ă•ă‚Œă‚‹ć Žæ‰€ăŻăȘい", + "ACTIVE STYLE": "çŸćœšăźă‚čă‚żă‚€ăƒ«", + "Globe actions": "ćœ°çƒć„€ăźæ“äœœ", + "Turn off all selected data layers": "éžæŠžäž­ăźăƒ‡ăƒŒă‚żăƒŹă‚€ăƒ€ăƒŒă‚’ă™ăčおă‚Șăƒ•ă«ă™ă‚‹", + "Copy share link": "ć…±æœ‰ăƒȘăƒłă‚Żă‚’ă‚łăƒ”ăƒŒ", + "Toggle straight-down and tilted map views": "çœŸäžŠèĄšç€șăšæ–œă‚èĄšç€șă‚’ćˆ‡ă‚Šæ›żăˆ", + "Reset map to north up": "ćœ°ć›łă‚’ćŒ—ăŒäžŠă«ăȘă‚‹ă‚ˆă†ă«ăƒȘă‚»ăƒƒăƒˆ", + "Reset map bearing to north": "朰曳ぼæ–čäœă‚’ćŒ—ă«ăƒȘă‚»ăƒƒăƒˆ", + "Reset camera and return to full globe view": "ă‚«ăƒĄăƒ©ă‚’ăƒȘă‚»ăƒƒăƒˆă—ăŠćœ°çƒć…šäœ“ăƒ“ăƒ„ăƒŒă«æˆ»ă™", + "MISSION CONTROL · FIRST LAUNCH": "ăƒŸăƒƒă‚·ăƒ§ăƒłă‚łăƒłăƒˆăƒ­ăƒŒăƒ« · ćˆć›žè”·ć‹•", + "Choose your first view": "æœ€ćˆăźăƒ“ăƒ„ăƒŒă‚’éžæŠž", + "LIVE CONTACTS": "ăƒ©ă‚€ăƒ–ă‚łăƒłă‚żă‚Żăƒˆ", + "Aircraft, vessels and nearby intelligence": "èˆȘç©șæ©Ÿă€èˆčèˆ¶ă€ć‘šèŸșăźă‚€ăƒłăƒ†ăƒȘゾェンă‚č", + "Launches, spacecraft and orbital context": "æ‰“ăĄäžŠă’ă€ćź‡ćź™æ©Ÿă€è»Œé“ăźçŠ¶æł", + "EXPLORE MANUALLY": "æ‰‹ć‹•ă§æŽąçŽą", + "Begin with a clean globe": "ăŸăŁă•ă‚‰ăȘ朰球愀から構める", + "Don't show this again": "ä»ŠćŸŒèĄšç€șしăȘい", + "ESC to dismiss": "Escで閉じる", + "Tip: the GEV MIC button in the dock lets you talk to the map.": "ăƒ’ăƒłăƒˆïŒšăƒ‰ăƒƒă‚ŻăźïŒ»ăƒžă‚€ă‚ŻïŒœăƒœă‚żăƒłă§ćœ°ć›łă«è©±ă—ă‹ă‘ă‚‰ă‚ŒăŸă™ă€‚", + "routing busy — too many routes at once": "ăƒ«ăƒŒăƒˆæ€œçŽąă‚”ăƒŒăƒ“ă‚čăŒæ··é›‘ă—ăŠă„ăŸă™ă€‚ćŒæ™‚ă«èŠæ±‚ă•ă‚ŒăŸăƒ«ăƒŒăƒˆăŒć€šă™ăŽăŸă™", + "route proxy error": "ăƒ«ăƒŒăƒˆæ€œçŽąăƒ—ăƒ­ă‚­ă‚·ă§ă‚šăƒ©ăƒŒăŒç™șç”Ÿă—ăŸă—ăŸ", + "Malformed cyclone snapshot": "ă‚”ă‚€ă‚Żăƒ­ăƒłăźă‚čăƒŠăƒƒăƒ—ă‚·ăƒ§ăƒƒăƒˆăźćœąćŒăŒäžæ­Łă§ă™", + "Cyclone request timed out": "ă‚”ă‚€ă‚Żăƒ­ăƒłăźăƒȘクスă‚čăƒˆăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă—ăŸă—ăŸ", + "{lower} to {upper}": "{lower}{upper}", + "Up to {upper}": "{upper}ăŸă§", + "From {lower}": "{lower}から", + "Informational only · not for flight planning": "ć‚è€ƒæƒ…ć ±ăźăż · éŁ›èĄŒèšˆç”»ă«ăŻäœżç”šă—ăȘいでください", + "Unnamed zone": "損称ăȘă—ăźă‚ŸăƒŒăƒł", + "Restricted airspace source unavailable": "ćˆ¶é™ç©șćŸŸăźăƒ‡ăƒŒă‚żă‚œăƒŒă‚čă‚’ćˆ©ç”šă§ăăŸă›ă‚“", + "Prohibited (P)": "éŁ›èĄŒçŠæ­ąćŒș㟟 (P)", + "Restricted (R)": "ćˆ¶é™ćŒș㟟 (R)", + "FAA prohibited and restricted special-use airspace only, not the UAS Facility Map or UAS flight restrictions. Informational only — not a substitute for official UAS flight-planning tools (B4UFLY / LAANC).": "FAAăźéŁ›èĄŒçŠæ­ąćŒșćŸŸăšćˆ¶é™ćŒșćŸŸïŒˆç‰čćˆ„äœżç”šç©șćŸŸïŒ‰ăźăżă§ă€UAS Facility MapやUASéŁ›èĄŒćˆ¶é™ăŻć«ăżăŸă›ă‚“ă€‚ć‚è€ƒæƒ…ć ±ăźăż — ć…ŹćŒăźUASéŁ›èĄŒèšˆç”»ăƒ„ăƒŒăƒ«ïŒˆB4UFLY / LAANCïŒ‰ăźä»Łă‚ă‚Šă«ăŻăȘă‚ŠăŸă›ă‚“ă€‚", + "Prohibited": "éŁ›èĄŒçŠæ­ąćŒș㟟", + "Restricted": "ćˆ¶é™ćŒș㟟", + "Prohibited & Restricted Airspace": "éŁ›èĄŒçŠæ­ąćŒșćŸŸăšćˆ¶é™ćŒș㟟" +} diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json new file mode 100644 index 000000000..fbbaf6339 --- /dev/null +++ b/src/i18n/locales/pt.json @@ -0,0 +1,3012 @@ +{ + "Pick a shape, then click the map.": "Escolha uma forma e clique no mapa.", + "Enter to place the pin, Esc to cancel.": "Enter para colocar o marcador, Esc para cancelar.", + "Click where the pin goes.": "Clique onde o marcador deve ficar.", + "Click {count} more points.": { + "one": "Clique em mais {count} ponto.", + "many": "Clique em mais {count} de pontos.", + "other": "Clique em mais {count} pontos." + }, + "Those points are in a line — move one off it to enclose an area.": "Esses pontos estĂŁo em linha — tire um deles da linha para fechar uma ĂĄrea.", + "That line has no length — click somewhere further away.": "Essa linha nĂŁo tem comprimento — clique em um ponto mais distante.", + " · {max}-point limit reached": " · limite de {max} pontos atingido", + "{measure} · double-click or Enter to finish, Backspace undoes, Esc cancels.{full}": "{measure} · clique duplo ou Enter para concluir, Backspace desfaz, Esc cancela.{full}", + "drawings on the map": "os desenhos no mapa", + "That shape already has {count} points — finish it or press Backspace.": "Essa forma jĂĄ tem {count} pontos — conclua-a ou pressione Backspace.", + "That point is off the globe — click on the world.": "Esse ponto estĂĄ fora do globo — clique sobre o mundo.", + "That shape could not be placed.": "NĂŁo foi possĂ­vel colocar essa forma.", + "Could not place the shape: {error}": "NĂŁo foi possĂ­vel colocar a forma: {error}", + "Board cleared.": "Quadro limpo.", + "{owner} is using the pointer — close it first.": "A ferramenta \"{owner}\" estĂĄ usando o ponteiro — feche-a primeiro.", + "{label} · Detailed outline unavailable": "{label} · Contorno detalhado indisponĂ­vel", + "Flying to Austin, TX...": "Voando para Austin, TX...", + "Restoring shared view...": "Restaurando a vista compartilhada...", + "Configuring viewer...": "Configurando o visualizador...", + "Loading Google 3D Tiles...": "Carregando Google 3D Tiles...", + "Loading the keyless globe...": "Carregando o globo sem chave...", + "Google 3D Tiles unavailable ({detail}). Loading the keyless globe...": "Google 3D Tiles indisponĂ­vel ({detail}). Carregando o globo sem chave...", + "Initializing systems...": "Inicializando sistemas...", + "Space Missions isolates replay data. Exit the mode to enable {layer}.": "O modo MissĂ”es espaciais isola os dados da reprise. Saia do modo para ativar {layer}.", + "Data attribution": "Atribuição de dados", + "Data provided by:": "Dados fornecidos por:", + "Close data attribution": "Fechar atribuição de dados", + "Light aircraft": "Aeronave leve", + "Glider": "Planador", + "Turboprop": "TurboĂ©lice", + "Airliner": "AviĂŁo comercial", + "Widebody": "AviĂŁo de fuselagem larga", + "Four-engine jet": "Jato quadrimotor", + "Helicopter": "HelicĂłptero", + "Fast jet": "Jato de alto desempenho", + "Business jet": "Jato executivo", + "Drone": "Drone", + "General emergency": "EmergĂȘncia geral", + "Unlawful interference": "InterferĂȘncia ilĂ­cita", + "Radio failure": "Falha de rĂĄdio", + "Downed aircraft": "Aeronave acidentada", + "Minimum fuel": "CombustĂ­vel mĂ­nimo", + "Lifeguard (medical priority)": "Lifeguard (prioridade mĂ©dica)", + "Rasuwagadhi witness video": "VĂ­deo de testemunha em Rasuwagadhi", + "Bhote Koshi valley footage": "Imagens do vale do Bhote Koshi", + "Flood footage": "Imagens da inundação", + "Compilation and casualty claims": "Compilação e relatos sobre vĂ­timas", + "SOURCE GEOCONFIRMED · WORLD-PINNED": "FONTE GEOCONFIRMADA · FIXADA NO MAPA", + "SOURCE CREDITED · LOCATION UNRESOLVED": "FONTE CREDITADA · LOCAL NÃO DETERMINADO", + "REFERENCE ONLY · CLAIMS UNVERIFIED": "SÓ REFERÊNCIA · RELATOS NÃO VERIFICADOS", + "SOURCE GEOCONFIRMED": "FONTE GEOCONFIRMADA", + "2021 historical reference versus 2026 post-event imagery; changes are cumulative and include the July 2025 Rasuwagadhi flood. Schematic downstream progression, not modeled arrival time; not an official hazard model.": "ReferĂȘncia histĂłrica de 2021 comparada a imagens posteriores ao evento de 2026; as mudanças sĂŁo cumulativas e incluem a inundação de Rasuwagadhi de julho de 2025. Avanço esquemĂĄtico rio abaixo, nĂŁo um tempo de chegada modelado; nĂŁo Ă© um modelo oficial de risco.", + "Immediate collapse viewpoint": "Ponto de vista junto ao colapso", + "Collapse viewpoint": "Vista do colapso", + "Debris-dammed lake": "Lago represado por detritos", + "Dammed lake": "Lago represado", + "Second landslide": "Segundo deslizamento", + "Gyirong border gate": "Posto de fronteira de Gyirong", + "Border gate": "Posto de fronteira", + "Timure evidence cluster": "Grupo de evidĂȘncias de Timure", + "Mailung / Upper Trishuli bridge": "Mailung / ponte de Upper Trishuli", + "Dandagaun viewpoint restaurant": "Restaurante mirante de Dandagaun", + "Dandagaun viewpoint": "Mirante de Dandagaun", + "Bidur - Trishuli bridge": "Ponte Bidur - Trishuli", + "Bidur bridge": "Ponte de Bidur", + "Devighat / Taadi Khola Bridge": "Devighat / ponte de Taadi Khola", + "Devighat bridge": "Ponte de Devighat", + "Facebook player API did not initialize.": "A API do player do Facebook nĂŁo foi inicializada.", + "Facebook player API could not load.": "NĂŁo foi possĂ­vel carregar a API do player do Facebook.", + "Facebook player API timed out.": "A API do player do Facebook excedeu o tempo limite.", + "X embed API did not initialize.": "A API de incorporação do X nĂŁo foi inicializada.", + "X embed could not load.": "NĂŁo foi possĂ­vel carregar a incorporação do X.", + "X embed timed out.": "A incorporação do X excedeu o tempo limite.", + "UNAVAILABLE": "INDISPONÍVEL", + "TIMEOUT": "TEMPO ESGOTADO", + "BLOCKED": "BLOQUEADO", + "SOURCE": "FONTE", + "Facebook embed unavailable. The post may be private, removed, region-restricted, or blocked.": "Incorporação do Facebook indisponĂ­vel. A publicação pode ser privada, ter sido removida, ter restrição regional ou estar bloqueada.", + "Preloading {provider} media": "PrĂ©-carregando mĂ­dia do {provider}", + "LOADING X POST
": "CARREGANDO PUBLICAÇÃO DO X
", + "The X post is unavailable or cannot be embedded.": "A publicação do X estĂĄ indisponĂ­vel ou nĂŁo pode ser incorporada.", + "X POST · PROVIDER CONTROLS": "PUBLICAÇÃO DO X · CONTROLES DO PROVEDOR", + "{reason} OPEN ORIGINAL.": "{reason} ABRA O ORIGINAL.", + "X embed unavailable": "Incorporação do X indisponĂ­vel", + "FACEBOOK · PROVIDER CONTROLS": "FACEBOOK · CONTROLES DO PROVEDOR", + "Facebook embed unavailable": "Incorporação do Facebook indisponĂ­vel", + "AUTOPLAY BLOCKED · USE PROVIDER CONTROLS": "REPRODUÇÃO AUTOMÁTICA BLOQUEADA · USE OS CONTROLES DO PROVEDOR", + "Embedded {provider} media for {source}": "MĂ­dia do {provider} incorporada para {source}", + "witness source": "fonte de testemunha", + "Witness source": "Fonte de testemunha", + "{provider} · EMBEDDED SOURCE": "{provider} · FONTE INCORPORADA", + "OPEN ORIGINAL ↗": "ABRIR ORIGINAL ↗", + "{provider} media: {source}": "MĂ­dia do {provider}: {source}", + "{provider} · PROVIDER CONTROLS": "{provider} · CONTROLES DO PROVEDOR", + "YOUTUBE {state} · OPEN ORIGINAL": "YOUTUBE {state} · ABRIR ORIGINAL", + "INITIATION": "INÍCIO", + "DAMMING": "REPRESAMENTO", + "SECONDARY FAILURE": "RUPTURA SECUNDÁRIA", + "BORDER ARRIVAL": "CHEGADA À FRONTEIRA", + "PROPAGATION": "PROPAGAÇÃO", + "DOWNSTREAM PASSAGE": "PASSAGEM RIO ABAIXO", + "CONSEQUENCE": "CONSEQUÊNCIAS", + "DOWNSTREAM CONSEQUENCE": "CONSEQUÊNCIAS RIO ABAIXO", + "EVIDENCE": "EVIDÊNCIA", + "{year} HISTORICAL REFERENCE": "REFERÊNCIA HISTÓRICA {year}", + "{year} POST-EVENT": "PÓS-EVENTO {year}", + "{count} GEOLOCATED SOURCE-MAP PLACEMENTS": { + "one": "{count} POSIÇÃO GEOLOCALIZADA NO MAPA DE FONTES", + "many": "{count} DE POSIÇÕES GEOLOCALIZADAS NO MAPA DE FONTES", + "other": "{count} POSIÇÕES GEOLOCALIZADAS NO MAPA DE FONTES" + }, + "NO PREVIEW": "SEM PRÉVIA", + "YouTube source": "Fonte do YouTube", + "Facebook source": "Fonte do Facebook", + "SOURCE LINK": "LINK DA FONTE", + "{publisher} / OPEN": "{publisher} / ABRIR", + "Bhote Koshi flood reconstruction controls": "Controles da reconstrução da inundação do Bhote Koshi", + "EVENT RECONSTRUCTION · 26 AUG 2026": "RECONSTRUÇÃO DO EVENTO · 26 AGO 2026", + "BHOTE KOSHI OUTBURST FLOOD": "INUNDAÇÃO POR ROMPIMENTO NO BHOTE KOSHI", + "Close event layer": "Fechar a camada do evento", + "OBSERVED IMAGERY": "IMAGENS OBSERVADAS", + "SCHEMATIC CORRIDOR": "CORREDOR ESQUEMÁTICO", + "2021 HISTORICAL REFERENCE / 2026 POST-EVENT": "REF. HISTÓRICA 2021 / PÓS-EVENTO 2026", + "Historical reference and post-event image split": "DivisĂŁo entre a imagem de referĂȘncia histĂłrica e a pĂłs-evento", + "RECONSTRUCTION CLOCK": "RELÓGIO DA RECONSTRUÇÃO", + "Schematic downstream progression": "Avanço esquemĂĄtico rio abaixo", + "Story beat navigation": "Navegação pelos momentos da histĂłria", + "Previous story beat": "Momento anterior da histĂłria", + "CAUSE": "CAUSA", + "CAPTURE TIME UNVERIFIED": "HORA DE CAPTURA NÃO VERIFICADA", + "Next story beat": "PrĂłximo momento da histĂłria", + "▶ PLAY": "▶ REPRODUZIR", + "Play the next shot and continue through this scene": "Reproduzir o prĂłximo plano e seguir por esta cena", + "▶ PLAY SCENE": "▶ REPRODUZIR CENA", + "◉ CINEMATIC": "◉ CINEMATOGRÁFICO", + "â†ș FULL STORY": "â†ș HISTÓRIA COMPLETA", + "↗ OPEN ORIGINAL": "↗ ABRIR ORIGINAL", + "⌖ LOWER GORGE": "⌖ GARGANTA INFERIOR", + "FIELD REPORTS · {count}": "RELATOS DE CAMPO · {count}", + "GEOLOCATIONS · {credit}": "GEOLOCALIZAÇÕES · {credit}", + "↗ OPEN PUBLIC MAP": "↗ ABRIR MAPA PÚBLICO", + " Clouds are preserved from the source imagery.": " As nuvens vĂȘm das imagens de origem.", + "Rasuwagadhi witness": "Testemunha em Rasuwagadhi", + "Open original source for {source}; capture time unverified": "Abrir a fonte original de {source}; hora de captura nĂŁo verificada", + "Historical reference and post-event image divider": "Divisor entre a imagem de referĂȘncia histĂłrica e a pĂłs-evento", + "A historical reference {before} percent, B post-event {after} percent": "A, referĂȘncia histĂłrica, {before} por cento; B, pĂłs-evento, {after} por cento", + "■ RELEASE CAMERA": "■ LIBERAR CÂMERA", + "Seek Nepal scene clock": "Navegar pelo relĂłgio da cena do Nepal", + "NEPAL SCENE CLOCK": "RELÓGIO DA CENA DO NEPAL", + "
 PLAYING SHOT": "
 REPRODUZINDO PLANO", + "▶ PLAY SHOT": "▶ REPRODUZIR PLANO", + "Ⅱ PAUSE": "Ⅱ PAUSAR", + "â†ș REPLAY CINEMATIC": "â†ș REPETIR CINEMATOGRÁFICO", + "â†ș REPLAY": "â†ș REPETIR", + "
 PLAYING SCENE": "
 REPRODUZINDO CENA", + "Continue {scene} from next shot": "Continuar {scene} a partir do prĂłximo plano", + "current scene": "a cena atual", + "Replay the full reconstruction": "Repetir a reconstrução completa", + "SCENE SHOT": "PLANO DA CENA", + "TIME UNVERIFIED": "HORA NÃO VERIFICADA", + "{count} SOURCES": { + "one": "{count} FONTE", + "many": "{count} DE FONTES", + "other": "{count} FONTES" + }, + "OUTSIDE IMAGERY SWIPE": "FORA DA COMPARAÇÃO DE IMAGENS", + "{scene} / AUTHORED SHOT": "{scene} / PLANO AUTORAL", + "NEPAL FLOOD INCIDENT": "INCIDENTE DE INUNDAÇÃO NO NEPAL", + "Play {shot}": "Reproduzir {shot}", + "current scene shot": "o plano atual da cena", + "Play reconstruction": "Reproduzir a reconstrução", + "Load previous scene shot": "Carregar o plano anterior da cena", + "Load next scene shot": "Carregar o prĂłximo plano da cena", + "SCHEMATIC CORRIDOR, NOT MODELED ARRIVAL TIME.": "CORREDOR ESQUEMÁTICO, NÃO UM TEMPO DE CHEGADA MODELADO.", + "Rasuwa · 26 Aug 2026": "Rasuwa · 26 ago 2026", + "Event reconstruction": "Reconstrução do evento", + "BHOTE KOSHI FLOOD INCIDENT": "INCIDENTE DE INUNDAÇÃO NO BHOTE KOSHI", + "NEPAL · 26 AUG 2026": "NEPAL · 26 AGO 2026", + "USGS INITIAL REPORT": "RELATÓRIO INICIAL DO USGS", + "26 AUG 2026 · 08:37 NPT": "26 AGO 2026 · 08:37 NPT", + "28.2710° N · 85.5150° E": "28,2710° N · 85,5150° L", + "INITIAL M4.4 · RECLASSIFIED M5.2 LANDSLIDE": "INICIAL M4,4 · RECLASSIFICADO COMO DESLIZAMENTO M5,2", + "USGS EVENT us7000tbwb · OPEN SOURCE": "EVENTO USGS us7000tbwb · ABRIR FONTE", + "Open the USGS initial report for the 26 August 2026 Nepal landslide": "Abrir o relatĂłrio inicial do USGS sobre o deslizamento de 26 de agosto de 2026 no Nepal", + "Show the Nepal context callout without a border or country fill": "Mostrar o destaque de contexto do Nepal sem fronteira nem preenchimento do paĂ­s", + "Introduce Nepal, draw its border, then reveal the Bhote Koshi incident": "Apresentar o Nepal, desenhar sua fronteira e depois revelar o incidente do Bhote Koshi", + "CITIES": "CIDADES", + "Keep the regional incident context and introduce nearby city labels": "Manter o contexto regional do incidente e apresentar os rĂłtulos das cidades prĂłximas", + "PLACES": "LUGARES", + "Introduce the reconstruction scene key places from trigger to downstream": "Apresentar os lugares-chave da cena de reconstrução, do gatilho atĂ© rio abaixo", + "PATH": "PERCURSO", + "Animate the sourced cyan river-centerline route to Trishuli Bazaar": "Animar a rota ciano documentada pelo eixo do rio atĂ© Trishuli Bazaar", + "OVERVIEW": "VISÃO GERAL", + "Keep the completed flood path and location labels visible": "Manter visĂ­veis o percurso completo da inundação e os rĂłtulos dos locais", + "RECORD": "REGISTRO", + "Reveal the trigger record while making a slow camera approach": "Revelar o registro do gatilho com uma aproximação lenta da cĂąmera", + "{speed} kn": "{speed} kt", + "That file is not valid JSON.": "Esse arquivo nĂŁo Ă© um JSON vĂĄlido.", + "That JSON file is not GeoJSON.": "Esse arquivo JSON nĂŁo Ă© GeoJSON.", + "That FeatureCollection has no features list.": "Essa FeatureCollection nĂŁo tem lista de features.", + "Every GeoJSON feature must have type Feature.": "Todo elemento GeoJSON deve ter o tipo Feature.", + "That GeoJSON has invalid geometries.": "Esse GeoJSON tem geometrias invĂĄlidas.", + "That GeoJSON contains an unsupported geometry.": "Esse GeoJSON contĂ©m uma geometria nĂŁo suportada.", + "That GeoJSON has invalid coordinates.": "Esse GeoJSON tem coordenadas invĂĄlidas.", + "That file creates more than {limit} map objects (the limit).": "Esse arquivo cria mais de {limit} objetos no mapa (o limite).", + "That file has more than {limit} style definitions and image links after cleanup (the limit).": "ApĂłs a limpeza, esse arquivo tem mais de {limit} definiçÔes de estilo e links de imagem (o limite).", + "That file has more than {limit} features (the limit).": "Esse arquivo tem mais de {limit} elementos (o limite).", + "That file has more than {limit} points (the limit) across {features} features.": "Esse arquivo tem mais de {limit} pontos (o limite). Total de elementos: {features}.", + "That file has more than {limit} points (the limit).": "Esse arquivo tem mais de {limit} pontos (o limite).", + "That KMZ unpacks to more than the import limit.": "Descompactado, esse KMZ ultrapassa o limite de importação.", + "That KMZ is damaged and could not be unpacked.": "Esse KMZ estĂĄ danificado e nĂŁo pĂŽde ser descompactado.", + "That KMZ is not a readable zip archive.": "Esse KMZ nĂŁo Ă© um arquivo zip legĂ­vel.", + "That KMZ uses a zip format this import does not read.": "Esse KMZ usa um formato zip que esta importação nĂŁo lĂȘ.", + "That KMZ is encrypted.": "Esse KMZ estĂĄ criptografado.", + "That KMZ uses a compression method this import does not read.": "Esse KMZ usa um mĂ©todo de compressĂŁo que esta importação nĂŁo lĂȘ.", + "That KML has invalid geometry bounds.": "Esse KML tem limites de geometria invĂĄlidos.", + "That KML has invalid coordinates.": "Esse KML tem coordenadas invĂĄlidas.", + "That GPX file has no document.": "Esse arquivo GPX nĂŁo tem documento .", + "That {format} file is not valid XML.": "Esse arquivo {format} nĂŁo Ă© um XML vĂĄlido.", + "That file has an unreadable image or exceeds the 16-megapixel image limit.": "Esse arquivo tem uma imagem ilegĂ­vel ou ultrapassa o limite de imagem de 16 megapixels.", + "That KML could not be read.": "NĂŁo foi possĂ­vel ler esse KML.", + "That file has invalid point coordinates.": "Esse arquivo tem coordenadas de pontos invĂĄlidas.", + "Ground heights are not available for that file. Try again when the map has loaded.": "As altitudes do terreno nĂŁo estĂŁo disponĂ­veis para esse arquivo. Tente de novo quando o mapa tiver carregado.", + "That file took too long to read.": "A leitura desse arquivo demorou demais.", + "Nothing to import.": "Nada para importar.", + "That file is larger than {size} MiB.": "Esse arquivo tem mais de {size} MiB.", + "Only GeoJSON, KML, KMZ and GPX files can be imported.": "SĂł Ă© possĂ­vel importar arquivos GeoJSON, KML, KMZ e GPX.", + "That file has nothing to draw.": "Esse arquivo nĂŁo tem nada para desenhar.", + "That KMZ holds no KML document.": "Esse KMZ nĂŁo contĂ©m nenhum documento KML.", + "That {format} file could not be read.": "NĂŁo foi possĂ­vel ler esse arquivo {format}.", + "That file has {count} map objects; the limit is {limit}.": "Esse arquivo tem {count} objetos no mapa; o limite Ă© {limit}.", + "Ground heights could not be read. Try that file again.": "NĂŁo foi possĂ­vel ler as altitudes do terreno. Tente esse arquivo de novo.", + "That file has invalid point graphics.": "Esse arquivo tem grĂĄficos de pontos invĂĄlidos.", + "Overpass rate-limited": "Overpass: limite de requisiçÔes atingido", + "Overpass timed out": "Tempo esgotado no Overpass", + "Overpass could not complete the query": "Overpass nĂŁo conseguiu concluir a consulta", + "Map tiles temporarily unavailable": "Blocos do mapa temporariamente indisponĂ­veis", + "Mapped names temporarily unavailable": "Nomes mapeados temporariamente indisponĂ­veis", + "Overpass temporarily unavailable": "Overpass temporariamente indisponĂ­vel", + "Retrying mapped sites
": "Buscando de novo os locais mapeados
", + "Fetching mapped sites
": "Buscando locais mapeados
", + "{reason} — retrying in {seconds}s": "{reason} — nova tentativa em {seconds} s", + "{reason} — retry pending": "{reason} — nova tentativa pendente", + "Zoom in to search mapped installations": "Aproxime o zoom para buscar instalaçÔes mapeadas", + "Showing cached mapped sites": "Mostrando locais mapeados em cache", + "Mapped sites not loaded": "Locais mapeados nĂŁo carregados", + "Mapped sites loaded": "Locais mapeados carregados", + "Military airfield": "AerĂłdromo militar", + "Naval base": "Base naval", + "Firing range": "Campo de tiro", + "Military land": "Terreno militar", + "Mapped installation": "Instalação mapeada", + "Military area": "Área militar", + "flight": "voo", + "military flight": "voo militar", + "satellite": "satĂ©lite", + "feed unavailable": "feed indisponĂ­vel", + "feed stale": "feed desatualizado", + "observed or mapped nearby context": "contexto observado ou mapeado nas proximidades", + "no observed or mapped objects in current feeds": "nenhum objeto observado ou mapeado nos feeds atuais", + "Draw": "Desenho", + "Directions": "Rotas", + "Recent imagery": "Imagens recentes", + "STATION": "ESTAÇÃO", + "Crewed stations and their visiting vehicles": "EstaçÔes tripuladas e seus veĂ­culos visitantes", + "NAV": "NAV", + "GNSS navigation — GPS, GLONASS, Galileo": "Navegação GNSS — GPS, GLONASS, Galileo", + "GEO": "GEO", + "Geostationary belt — comms and weather, fixed over the equator": "CinturĂŁo geoestacionĂĄrio — comunicaçÔes e meteorologia, fixo sobre o equador", + "VISUAL": "VISUAL", + "Brightest naked-eye objects — CelesTrak visual group": "Objetos mais brilhantes a olho nu — grupo visual do CelesTrak", + "COMMS": "TELECOM", + "Broadband constellation shell — shown only in DENSE mode": "Camada orbital da constelação de banda larga — exibida sĂł no modo DENSO", + "FISHING": "PESCA", + "TOWING": "REBOQUE", + "DREDGER": "DRAGA", + "DIVE OPS": "OPS DE MERGULHO", + "MILITARY": "MILITAR", + "SAILING": "VELEIRO", + "PLEASURE": "RECREIO", + "PILOT": "PRÁTICO", + "SAR": "SAR", + "TUG": "REBOCADOR", + "PORT TENDER": "APOIO PORTUÁRIO", + "ANTI-POLLUTION": "ANTIPOLUIÇÃO", + "LAW ENFORCE": "FISCALIZAÇÃO", + "MEDICAL": "MÉDICO", + "HIGH-SPEED": "ALTA VELOCIDADE", + "PASSENGER": "PASSAGEIROS", + "CARGO": "CARGUEIRO", + "TANKER": "NAVIO-TANQUE", + "OTHER": "OUTROS", + "Included in bundle": "IncluĂ­do no pacote", + "Missing bundle file — reimport its bundle": "Arquivo ausente no pacote — importe o pacote de novo", + "Source configured; file checked when loaded": "Fonte configurada; o arquivo serĂĄ verificado ao carregar", + "Source unavailable": "Fonte indisponĂ­vel", + "ENVIRONMENTAL": "AMBIENTAL", + "EARTH WATCH": "VIGILÂNCIA DA TERRA", + "ACTIVE EVENTS": "EVENTOS ATIVOS", + "Starting live contacts
": "Iniciando contatos ao vivo
", + "Opening space missions
": "Abrindo missĂ”es espaciais
", + "Scanning active events
": "Varrendo eventos ativos
", + "Live earthquakes and active fires, from USGS and NASA": "Terremotos e incĂȘndios ativos ao vivo, do USGS e da NASA", + "It feels like a forbidden cockpit—then you realize the sources are public and the data is real.": "Parece uma cabine proibida — atĂ© vocĂȘ perceber que as fontes sĂŁo pĂșblicas e os dados sĂŁo reais.", + "Working
": "Processando
", + "Could not open that mission{detail}. Retry or explore manually.": "NĂŁo foi possĂ­vel abrir essa missĂŁo{detail}. Tente novamente ou explore manualmente.", + "This browser is blocking storage, so that could not be saved.": "Este navegador estĂĄ bloqueando o armazenamento, entĂŁo nĂŁo foi possĂ­vel salvar.", + "NORMAL": "NORMAL", + "CRT": "CRT", + "NVG": "NVG", + "FLIR": "FLIR", + "ANIME": "ANIME", + "NOIR": "NOIR", + "SNOW": "NEVE", + "ARCTIC": "ÁRTICO", + "ANTARCTIC": "ANTÁRTICO", + "NORTH AMERICA": "AMÉRICA DO NORTE", + "SOUTH AMERICA": "AMÉRICA DO SUL", + "EUROPE": "EUROPA", + "AFRICA": "ÁFRICA", + "ASIA": "ÁSIA", + "OCEANIA": "OCEANIA", + "NORTHERN OCEANIC GRID": "GRADE OCEÂNICA NORTE", + "SOUTHERN OCEANIC GRID": "GRADE OCEÂNICA SUL", + "LOADING": "CARREGANDO", + "DEGRADED": "DEGRADADO", + "STALE": "DESATUALIZADO", + "PARTIAL": "PARCIAL", + "FALLBACK": "ALTERNATIVO", + "{state} {layers}": "{state}: {layers}", + "view band|STREET": "RUA", + "view band|CITY": "CIDADE", + "view band|METRO": "METRÓPOLE", + "view band|REGIONAL": "REGIÃO", + "view band|GLOBAL": "GLOBAL", + "SUMMARY": "RESUMO", + "Awaiting telemetry...": "Aguardando telemetria...", + "REC": "REC", + "AIS: --": "AIS: --", + "N/A": "N/D", + "{mode} {band} {locality} | {region} | ALT {alt} | WINDOW {window} | SUN {sun}° | ONA {ona}° | {zone}": "{mode} · {band} · {locality} | {region} | ALT {alt} | JANELA {window} | SOL {sun}° | ONA {ona}° | {zone}", + "NEAR {poi} ({city}) {distance}": "PERTO DE {poi} ({city}) {distance}", + "SECTOR {lat} {lon}": "SETOR {lat} {lon}", + "hemisphere|N": "N", + "hemisphere|S": "S", + "hemisphere|E": "L", + "hemisphere|W": "O", + "POWER UP · {count} KEYS WAITING": { + "one": "ATIVAR · {count} CHAVE PENDENTE", + "many": "ATIVAR · {count} DE CHAVES PENDENTES", + "other": "ATIVAR · {count} CHAVES PENDENTES" + }, + "POWERED UP": "ATIVADO", + "Provider Settings does not answer proxied requests": "O painel \"ConfiguraçÔes de provedores\" nĂŁo responde a requisiçÔes via proxy", + "Provider Settings is disabled while sharing is enabled": "O painel \"ConfiguraçÔes de provedores\" fica desativado enquanto o compartilhamento estiver ativo", + "Provider Settings answers only the machine running the server": "O painel \"ConfiguraçÔes de provedores\" sĂł responde Ă  mĂĄquina que executa o servidor", + "Provider Settings answers only local hostnames": "O painel \"ConfiguraçÔes de provedores\" sĂł responde a nomes de host locais", + "Provider Settings requires an exact local Origin": "O painel \"ConfiguraçÔes de provedores\" exige um Origin local exato", + "Unrecognized Origin refused": "Origin nĂŁo reconhecido: requisição recusada", + "Cross-origin requests are refused": "RequisiçÔes de outra origem sĂŁo recusadas", + "Content-Type must be application/json": "Content-Type deve ser application/json", + "Method not allowed": "MĂ©todo nĂŁo permitido", + "Request too large": "Requisição grande demais", + "Invalid JSON": "JSON invĂĄlido", + "Body must be a JSON object of {ENV_VAR: value}": "O corpo deve ser um objeto JSON de {ENV_VAR: value}", + "No keys provided": "Nenhuma chave enviada", + "At most {limit} keys per save": "No mĂĄximo {limit} chaves por salvamento", + "Unknown key: {name}": "Chave desconhecida: {name}", + "{name} must be a string": "{name}: o valor deve ser uma string", + "{name} is empty": "{name}: o valor estĂĄ vazio", + "{name} is longer than any real key ({limit} max)": "{name}: o valor Ă© mais longo que qualquer chave real (mĂĄximo {limit})", + "{name} may only contain printable characters with no spaces": "{name}: sĂł sĂŁo aceitos caracteres imprimĂ­veis, sem espaços", + "{name} contains a character that is not valid in a key (#, quotes, $, \\, or backtick)": "{name}: hĂĄ um caractere invĂĄlido para uma chave (#, aspas, $, \\ ou crase)", + "{name} is configured outside Provider Settings and can only be changed where it was set": "{name} foi configurada fora de \"ConfiguraçÔes de provedores\" e sĂł pode ser alterada onde foi definida", + "The key was not saved: could not restrict the credential file to your account; nothing was saved": "A chave nĂŁo foi salva: nĂŁo foi possĂ­vel restringir o arquivo de credenciais Ă  sua conta; nada foi salvo", + "The key was not saved: the existing configuration could not be read, so nothing was changed": "A chave nĂŁo foi salva: nĂŁo foi possĂ­vel ler a configuração existente, entĂŁo nada foi alterado", + "Could not write the {store} store": "NĂŁo foi possĂ­vel gravar no armazenamento {store}", + "Save failed ({status}).": "Falha ao salvar ({status}).", + "OAuth check failed: {detail}": "Falha ao verificar o OAuth: {detail}", + "Could not check ChatGPT sign-in. Try again.": "NĂŁo foi possĂ­vel verificar o login do ChatGPT. Tente novamente.", + "VOICE AUTH · CHATGPT OAUTH": "AUTENTICAÇÃO DE VOZ · OAUTH DO CHATGPT", + "VOICE AUTH · API KEY": "AUTENTICAÇÃO DE VOZ · CHAVE DE API", + "USE API KEY": "USAR CHAVE DE API", + "USE CHATGPT OAUTH": "USAR OAUTH DO CHATGPT", + "Use OPENAI_API_KEY for the next cloud voice session": "Usar OPENAI_API_KEY na prĂłxima sessĂŁo de voz na nuvem", + "Use the signed-in local ChatGPT/Codex OAuth session for the next cloud voice session": "Usar a sessĂŁo OAuth local do ChatGPT/Codex jĂĄ conectada na prĂłxima sessĂŁo de voz na nuvem", + "Metered — a billing-enabled account": "Cobrança por uso — uma conta com faturamento ativado", + "Optional paid token — public access works without one": "Token pago opcional — o acesso pĂșblico funciona sem ele", + "Free key — register, paste, done": "Chave gratuita — cadastre-se, cole e pronto", + "browser-side": "no navegador", + "This key runs in the browser by design — restrict it at the provider (see SECURITY.md)": "Esta chave roda no navegador por design — restrinja-a no provedor (veja SECURITY.md)", + "configured externally": "configurada externamente", + "Supplied by your environment, Keychain, or launcher — change it where it was set": "Fornecida pelo seu ambiente, Keychain ou inicializador — altere-a onde foi definida", + "MANAGE ↗": "GERENCIAR ↗", + "GET KEY ↗": "OBTER CHAVE ↗", + "{envVar} saved — paste to replace": "{envVar} salva — cole outra para substituir", + "paste {envVar}": "cole {envVar}", + "REMOVE": "REMOVER", + "Remove {title} from this app's saved keys": "Remover {title} das chaves salvas deste app", + "unsaved provider keys": "chaves de provedores nĂŁo salvas", + "Project keys: {status}": "Chaves do projeto: {status}", + "your app configuration": "sua configuração do app", + "your local .env": "seu .env local", + "Saving
": "Salvando
", + "Save failed: {detail}": "Falha ao salvar: {detail}", + "Paste at least one key first.": "Cole pelo menos uma chave primeiro.", + "Saved to {store}. Restarting — this page reloads itself.": "Salvo em {store}. Reiniciando — esta pĂĄgina recarrega sozinha.", + "Cloud voice will use OPENAI_API_KEY on the next session.": "A voz na nuvem usarĂĄ OPENAI_API_KEY na prĂłxima sessĂŁo.", + "Checking local ChatGPT OAuth sign-in
": "Verificando o login OAuth local do ChatGPT
", + "Could not check ChatGPT sign-in.": "NĂŁo foi possĂ­vel verificar o login do ChatGPT.", + "ChatGPT OAuth selected for cloud voice. Your API key stays saved and available.": "OAuth do ChatGPT selecionado para a voz na nuvem. Sua chave de API continua salva e disponĂ­vel.", + "ChatGPT sign-in expired. Opening sign-in again
": "O login do ChatGPT expirou. Abrindo o login de novo
", + "Opening ChatGPT sign-in in your browser
": "Abrindo o login do ChatGPT no seu navegador
", + "Could not start ChatGPT sign-in on this machine.": "NĂŁo foi possĂ­vel iniciar o login do ChatGPT nesta mĂĄquina.", + "Finish ChatGPT sign-in in the browser. Waiting for it to complete
": "Conclua o login do ChatGPT no navegador. Aguardando a conclusĂŁo
", + "ChatGPT sign-in timed out. Click {button} to try again.": "O tempo do login do ChatGPT esgotou. Clique em \"{button}\" para tentar novamente.", + "ChatGPT sign-in complete. OAuth will be used for the next cloud voice session.": "Login do ChatGPT concluĂ­do. O OAuth serĂĄ usado na prĂłxima sessĂŁo de voz na nuvem.", + "Remove this key from your saved configuration?": "Remover esta chave da sua configuração salva?", + "Removed from {store}. Restarting — this page reloads itself.": "Removido de {store}. Reiniciando — esta pĂĄgina recarrega sozinha.", + "The photorealistic 3D planet, place search + Street View": "O planeta 3D fotorrealista, busca de lugares + Street View", + "Places context + Street View fallback; optional separate key": "Contexto de lugares + Street View como alternativa; chave separada opcional", + "Voice control — API key or ChatGPT OAuth": "Controle por voz — chave de API ou OAuth do ChatGPT", + "Gemini Live voice control": "Controle por voz com Gemini Live", + "Live ships, worldwide": "EmbarcaçÔes ao vivo, no mundo todo", + "Live active-fire detections": "DetecçÔes de incĂȘndios ativos ao vivo", + "Real live traffic (keyless runs a simulation)": "TrĂąnsito real ao vivo (sem chave, roda uma simulação)", + "Bing imagery map stacks + world terrain": "Pilhas de mapas com imagens do Bing + relevo mundial", + "More flight-polling credits (anonymous works without)": "Mais crĂ©ditos de consulta de voos (opcional: o acesso anĂŽnimo tambĂ©m funciona)", + "Street-level imagery and coverage in the Street Level layer. Free: register an app in the Mapillary developer dashboard and paste its Client Token": "Imagens e cobertura no nĂ­vel da rua na camada \"NĂ­vel da rua\". GrĂĄtis: registre um app no painel de desenvolvedores do Mapillary e cole o token de cliente (Client Token)", + "Public space-missions access needs no key. Leave blank for standard use; paid tokens only raise request limits.": "O acesso pĂșblico Ă s missĂ”es espaciais nĂŁo precisa de chave. Deixe em branco para o uso padrĂŁo; tokens pagos sĂł aumentam os limites de requisiçÔes.", + "Air quality request failed": "Falha na requisição de qualidade do ar", + "No readings available": "Nenhuma leitura disponĂ­vel", + "No current readings": "Sem leituras atuais", + "{count} stations reporting": { + "one": "{count} estação com dados", + "many": "{count} de estaçÔes com dados", + "other": "{count} estaçÔes com dados" + }, + "Highest air-quality readings in view": "Leituras de qualidade do ar mais altas na vista", + "Low": "Risco baixo", + "Low health risk": "Risco baixo para a saĂșde", + "Moderate": "Risco moderado", + "Moderate health risk": "Risco moderado para a saĂșde", + "High": "Risco alto", + "High health risk": "Risco alto para a saĂșde", + "Very High": "Risco muito alto", + "Very High health risk": "Risco muito alto para a saĂșde", + "Air quality": "Qualidade do ar", + "Canada only · ECCC AQHI network": "SĂł CanadĂĄ · rede AQHI do ECCC", + "ECCC request timed out": "A requisição ao ECCC excedeu o tempo limite", + "Malformed AQHI station response": "Resposta de estaçÔes AQHI malformada", + "No AQHI stations available": "Nenhuma estação AQHI disponĂ­vel", + "Malformed AQHI observation response": "Resposta de observaçÔes AQHI malformada", + "Camera source temporarily unavailable": "Fonte de cĂąmeras temporariamente indisponĂ­vel", + "Mapped camera locations": "Locais de cĂąmeras mapeadas", + "SHOW NEAREST": "MOSTRAR A MAIS PRÓXIMA", + "Stop following the current object before navigating to a camera": "Pare de seguir o objeto atual antes de ir atĂ© uma cĂąmera", + "Move to the nearest loaded camera and show its details": "Ir atĂ© a cĂąmera carregada mais prĂłxima e mostrar seus detalhes", + "Camera badges": "Ícones de cĂąmeras", + "Cyan cameras turn coral when selected. Wedges illustrate mapped direction, not measured coverage. Nearby cameras may be outside the screen.": "As cĂąmeras ciano ficam coral quando selecionadas. As cunhas ilustram a direção mapeada, nĂŁo a cobertura medida. CĂąmeras prĂłximas podem estar fora da tela.", + "{count} nearby · {onScreen} on screen": { + "one": "{count} prĂłxima · {onScreen} na tela", + "many": "{count} de cĂąmeras prĂłximas · {onScreen} na tela", + "other": "{count} prĂłximas · {onScreen} na tela" + }, + "{count} nearby": { + "one": "{count} prĂłxima", + "many": "{count} de cĂąmeras prĂłximas", + "other": "{count} prĂłximas" + }, + "retrying mapped ALPR cameras": "buscando de novo as cĂąmeras ALPR mapeadas", + "loading mapped ALPR cameras": "carregando cĂąmeras ALPR mapeadas", + "No ALPR data for this area — US and Canada only": "Sem dados ALPR para esta ĂĄrea — sĂł EUA e CanadĂĄ", + "Zoom in to load mapped cameras": "Aproxime o zoom para carregar as cĂąmeras mapeadas", + "Showing cached locations": "Mostrando locais em cache", + "Coverage limited — zoom in": "Cobertura limitada — aproxime o zoom", + "No ALPR data for this area": "Sem dados ALPR para esta ĂĄrea", + "None on screen — nearby cameras are outside the view": "Nenhuma na tela — as cĂąmeras prĂłximas estĂŁo fora da vista", + "ALPR camera": "CĂąmera ALPR", + "Camera coverage unavailable": "Cobertura de cĂąmeras indisponĂ­vel", + "OpenStreetMap · community mapped": "OpenStreetMap · mapeado pela comunidade", + "Overpass returned an incomplete camera response": "O Overpass retornou uma resposta de cĂąmeras incompleta", + "At least {count}": "Pelo menos {count}", + "CONTEXT READY": "CONTEXTO PRONTO", + "GLOBAL CONTEXT OFF": "CONTEXTO GLOBAL DESLIGADO", + "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "SELECIONE UM VOO, EMBARCAÇÃO OU INSTALAÇÃO MAPEADA", + "ENABLE TO LOAD OBSERVED / MAPPED PROXIMITY": "ATIVE PARA CARREGAR PROXIMIDADE OBSERVADA / MAPEADA", + "Unavailable": "IndisponĂ­vel", + "Focus {label}": "Focar {label}", + "Global Context navigation": "Navegação do contexto global", + "Previous — prior visited contact in the 250 km window": "Anterior — contato visitado anteriormente na janela de 250 km", + "PREVIOUS": "ANT.", + "FOCUS": "FOCAR", + "Next — nearest unvisited contact in the 250 km window": "PrĂłximo — contato nĂŁo visitado mais prĂłximo na janela de 250 km", + "NEXT": "PRÓX.", + "Named areas ({n})": "Áreas com nome ({n})", + "{distance} FLIGHT / VESSEL WINDOW": "JANELA DE VOOS / EMBARCAÇÕES DE {distance}", + "Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "Contexto mapeado/observado de fontes abertas. TransmissĂ”es ausentes, ĂĄreas de mapa nĂŁo carregadas ou locais nĂŁo mapeados nĂŁo sĂŁo prova de ausĂȘncia.", + "mapped matches within {km} km of the subject": "correspondĂȘncias mapeadas a atĂ© {km} km do alvo", + "none mapped within {km} km; not a complete 250 km survey": "nenhuma mapeada a atĂ© {km} km; nĂŁo Ă© uma varredura completa de 250 km", + "mapped matches from the loaded viewport": "correspondĂȘncias mapeadas na vista carregada", + "viewport feed is not a complete 250 km survey": "os dados da vista nĂŁo sĂŁo uma varredura completa de 250 km", + "HDG {value}°": "HDG {value}°", + "BRG {value}°": "BRG {value}°", + "BRG —": "BRG —", + "CRS {value}°": "CRS {value}°", + "CURRENT VIEWPORT ONLY": "SÓ A VISTA ATUAL", + "WITHIN {km} KM": "ATÉ {km} KM", + "Flights": "Voos", + "Military flights": "Voos militares", + "AIS vessels": "EmbarcaçÔes AIS", + "Mapped installations": "InstalaçÔes mapeadas", + "syncing {count} city feeds...": "sincronizando feeds de cidades: {count}...", + "scanning nearby systems...": "buscando sistemas prĂłximos...", + "GBFS fetch error": "erro ao obter dados GBFS", + "Station {id}": "Estação {id}", + "Station": "Estação", + "đŸšČ {bikes} avail · {docks} docks · {capacity} cap": "đŸšČ {bikes} disp. · {docks} vagas · {capacity} cap.", + "⚠ Not installed": "⚠ NĂŁo instalada", + "⚠ Not renting": "⚠ Sem aluguel", + "⚠ Not returning": "⚠ Sem devolução", + "HDG {value}° (ESTIMATED)": "HDG {value}° (ESTIMADO)", + "{count} CAMERAS STANDING BY · NO CAMERA SELECTED · CLICK A CAMERA TO ACTIVATE": "CÂMERAS EM ESPERA: {count} · NENHUMA CÂMERA SELECIONADA · CLIQUE EM UMA CÂMERA PARA ATIVAR", + "No cameras available in catalog.": "Nenhuma cĂąmera disponĂ­vel no catĂĄlogo.", + "{city} CCTV": "CCTV {city}", + "FOV {value}° (DATASHEET)": "FOV {value}° (FICHA TÉCNICA)", + "FOV {value}°": "FOV {value}°", + "SPEC FOV {span}° (CAPABILITY)": "FOV DA FICHA {span}° (CAPACIDADE)", + "COVERAGE {value}kmÂČ": "COBERTURA {value} kmÂČ", + "OVERLAP {count} cams": "SOBREPOSIÇÃO {count} cĂąm.", + "ISOLATED VIEW": "VISTA ISOLADA", + "PROJ MONITOR": "PROJ. MONITOR", + "PROJ OFF": "PROJ. DESLIG.", + "VIEWSHED": "ÁREA VISÍVEL", + "CAL {value}": "CAL {value}", + "SRC {value}": "FONTE {value}", + "{value} CONTEXT": "CONTEXTO {value}", + "{spec} · SPECS: CCTV-DATABASE.COM": "{spec} · ESPECIFICAÇÕES: CCTV-DATABASE.COM", + "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "AtlĂąntico e PacĂ­fico Norte oriental/central; nĂŁo Ă© uma cobertura mundial de ciclones.", + "Cyclone advisories unavailable": "Boletins de ciclones indisponĂ­veis", + "Cyclone data unavailable": "Dados de ciclones indisponĂ­veis", + "Potential tropical cyclone": "Potencial ciclone tropical", + "Post-tropical cyclone": "Ciclone pĂłs-tropical", + "Hurricane": "FuracĂŁo", + "Tropical storm": "Tempestade tropical", + "Tropical depression": "DepressĂŁo tropical", + "Subtropical storm": "Tempestade subtropical", + "Subtropical depression": "DepressĂŁo subtropical", + "Track and cone match this advisory": "A trajetĂłria e o cone correspondem a este boletim", + "Track/cone awaiting advisory {number}": "TrajetĂłria/cone aguardando o boletim {number}", + "Track/cone unavailable": "TrajetĂłria/cone indisponĂ­vel", + "Cached advisory · stale source": "Boletim em cache · fonte desatualizada", + "Loading advisories
": "Carregando boletins
", + "{count} active storms": { + "one": "{count} ciclone ativo", + "many": "{count} de ciclones ativos", + "other": "{count} ciclones ativos" + }, + "Position as of {time}": "Posição em {time}", + "Maximum sustained wind: {wind} · Pressure: {pressure}": "Vento mĂĄximo sustentado: {wind} · PressĂŁo: {pressure}", + "{name} · {classification} · Advisory {number} · issued {time}": "{name} · {classification} · Boletim {number} · emitido em {time}", + "No active NHC/CPHC systems": "Nenhum sistema ativo do NHC/CPHC", + "Advisories unavailable": "Boletins indisponĂ­veis", + "Cyclones · NHC / CPHC": "Ciclones · NHC / CPHC", + "Atlantic · E/C Pacific": "AtlĂąntico · PacĂ­fico Leste/Central", + "{storms} · {name} selected": "{storms} · {name} selecionado", + "Official advisory ↗": "Boletim oficial ↗", + "Active NHC and CPHC cyclone advisories": "Boletins de ciclones ativos do NHC e do CPHC", + "Wind unavailable": "Vento indisponĂ­vel", + "Advisory center / forecast track": "Centro do ciclone no boletim / trajetĂłria prevista", + "Center-track uncertainty cone": "Cone de incerteza da trajetĂłria do centro", + "Select a storm on the map, or choose a storm in the list to select it and move the camera. Click empty map space to clear the selection. NOAA NHC/CPHC advisory context. The cone describes forecast center-track uncertainty, not storm size or the full hazard area. Forecast point labels are source lead hours, not times computed from advisory issuance. Geometry follows the surface; height is not weather altitude. Consult the official advisory.": "Selecione um ciclone no mapa ou escolha um na lista para selecionĂĄ-lo e mover a cĂąmera. Clique em um espaço vazio do mapa para limpar a seleção. Contexto dos boletins NOAA NHC/CPHC. O cone descreve a incerteza da trajetĂłria prevista do centro, nĂŁo o tamanho do ciclone nem toda a ĂĄrea de risco. Os rĂłtulos dos pontos de previsĂŁo sĂŁo horas de antecedĂȘncia da fonte, nĂŁo horĂĄrios calculados a partir da emissĂŁo do boletim. A geometria acompanha a superfĂ­cie; a altura nĂŁo Ă© altitude meteorolĂłgica. Consulte o boletim oficial.", + "DRIVE": "CARRO", + "Drive": "De carro", + "WALK": "A PÉ", + "Walk": "A pĂ©", + "BIKE": "BIKE", + "Bike": "De bicicleta", + "rate limited": "limite de requisiçÔes atingido", + "routing service is rate limited": "o serviço de rotas atingiu o limite de requisiçÔes", + "route leg too long": "trecho da rota longo demais", + "route too long": "rota longa demais", + "{error} — try again in a moment": "{error} — tente novamente em instantes", + "Routing is rate limited — try again in a moment": "O limite de requisiçÔes de rotas foi atingido — tente novamente em instantes", + "Routing unavailable (HTTP {status})": "Rotas indisponĂ­veis (HTTP {status})", + "Routing unavailable": "Rotas indisponĂ­veis", + "direction|left": "Ă  esquerda", + "direction|right": "Ă  direita", + "direction|slightly left": "levemente Ă  esquerda", + "direction|slightly right": "levemente Ă  direita", + "direction|sharply left": "acentuadamente Ă  esquerda", + "direction|sharply right": "acentuadamente Ă  direita", + "direction|straight": "em frente", + "direction|around": "no sentido contrĂĄrio", + "fork direction|left": "Ă  esquerda", + "fork direction|right": "Ă  direita", + "fork direction|slightly left": "levemente Ă  esquerda", + "fork direction|slightly right": "levemente Ă  direita", + "fork direction|sharply left": "bem Ă  esquerda", + "fork direction|sharply right": "bem Ă  direita", + "fork direction|straight": "em frente", + "lane direction|left": "da esquerda", + "lane direction|right": "da direita", + "lane direction|slightly left": "da esquerda", + "lane direction|slightly right": "da direita", + "lane direction|sharply left": "da extrema esquerda", + "lane direction|sharply right": "da extrema direita", + "lane direction|straight": "central", + "ordinal|{number}st": "{number}ÂȘ", + "ordinal|{number}nd": "{number}ÂȘ", + "ordinal|{number}rd": "{number}ÂȘ", + "ordinal|{number}th": "{number}ÂȘ", + "Head out on {road}": "Siga por {road}", + "Head out": "Inicie o trajeto", + "Arrive at your destination, on the left": "Seu destino estĂĄ Ă  esquerda", + "Arrive at your destination, on the right": "Seu destino estĂĄ Ă  direita", + "Arrive at your destination": "VocĂȘ chegou ao seu destino", + "Make a U-turn onto {road}": "Faça o retorno para {road}", + "Make a U-turn": "Faça o retorno", + "Continue straight onto {road}": "Siga em frente por {road}", + "Continue straight": "Siga em frente", + "Turn {direction} onto {road}": "Vire {direction} em {road}", + "Turn {direction}": "Vire {direction}", + "Turn onto {road}": "Vire em {road}", + "maneuver|Turn": "Vire", + "Continue {direction} onto {road}": "Siga {direction} por {road}", + "Continue {direction}": "Siga {direction}", + "At the end of the road, turn {direction} onto {road}": "No fim da via, vire {direction} em {road}", + "At the end of the road, turn {direction}": "No fim da via, vire {direction}", + "At the end of the road, continue onto {road}": "No fim da via, siga por {road}", + "At the end of the road, continue": "No fim da via, siga", + "Keep {direction} at the fork onto {road}": "Na bifurcação, mantenha-se {direction} em direção a {road}", + "Keep {direction} at the fork": "Na bifurcação, mantenha-se {direction}", + "Continue at the fork onto {road}": "Na bifurcação, siga por {road}", + "Continue at the fork": "Na bifurcação, siga", + "Merge {direction} onto {road}": "Entre {direction} em {road}", + "Merge {direction}": "Entre na via {direction}", + "Merge onto {road}": "Entre em {road}", + "maneuver|Merge": "Entre na via", + "Take the ramp on the {direction} onto {road}": "Pegue a rampa {direction} para {road}", + "Take the ramp on the {direction}": "Pegue a rampa {direction}", + "Take the ramp {direction} onto {road}": "Pegue a rampa {direction} para {road}", + "Take the ramp {direction}": "Pegue a rampa {direction}", + "Take the ramp onto {road}": "Pegue a rampa para {road}", + "Take the ramp": "Pegue a rampa", + "Take the exit on the {direction} onto {road}": "Pegue a saĂ­da {direction} para {road}", + "Take the exit on the {direction}": "Pegue a saĂ­da {direction}", + "Take the exit {direction} onto {road}": "Pegue a saĂ­da {direction} para {road}", + "Take the exit {direction}": "Pegue a saĂ­da {direction}", + "Take the exit onto {road}": "Pegue a saĂ­da para {road}", + "Take the exit": "Pegue a saĂ­da", + "At the roundabout, take the {exit} exit onto {road}": "Na rotatĂłria, pegue a {exit} saĂ­da para {road}", + "At the roundabout, take the {exit} exit": "Na rotatĂłria, pegue a {exit} saĂ­da", + "Enter the roundabout onto {road}": "Entre na rotatĂłria para {road}", + "Enter the roundabout": "Entre na rotatĂłria", + "At the roundabout, turn {direction} onto {road}": "Na rotatĂłria, vire {direction} em {road}", + "At the roundabout, turn {direction}": "Na rotatĂłria, vire {direction}", + "At the roundabout, continue onto {road}": "Na rotatĂłria, siga por {road}", + "At the roundabout, continue": "Na rotatĂłria, siga", + "Exit the roundabout onto {road}": "Saia da rotatĂłria para {road}", + "Exit the roundabout": "Saia da rotatĂłria", + "Use the {direction} lane onto {road}": "Use a faixa {direction} para {road}", + "Use the {direction} lane": "Use a faixa {direction}", + "Continue onto {road}": "Siga por {road}", + "maneuver|Continue": "Siga", + "{mode} — reroute for {modeLower}": "{mode} — recalcular a rota {modeLower}", + "CLICK MAP": "CLIQUE NO MAPA", + "SET A": "DEFINIR A", + "Click a spot on the globe to place A (click again to cancel)": "Clique em um ponto do globo para colocar A (clique de novo para cancelar)", + "Then click the globe to place the start": "Depois clique no globo para colocar a partida", + "SET B": "DEFINIR B", + "Click a spot on the globe to place B (click again to cancel)": "Clique em um ponto do globo para colocar B (clique de novo para cancelar)", + "Then click the globe to place the destination": "Depois clique no globo para colocar o destino", + "Swap A and B": "Trocar A e B", + "FLY ···": "VOAR ···", + "FLYING": "VOANDO", + "FLY": "VOAR", + "Fly the camera along the route": "Voar com a cĂąmera ao longo da rota", + "Place A and B first": "Coloque A e B primeiro", + "action|CLEAR": "LIMPAR", + "Remove the route and both markers": "Remover a rota e os dois marcadores", + "press Escape twice to leave Draw": "pressione Esc duas vezes para sair de \"Desenho\"", + "{name} is active — turn {name} off, then set {endpoint}": "A ferramenta \"{name}\" estĂĄ ativa — desative \"{name}\" e depois defina {endpoint}", + "{name} is active — {leave}, then set {endpoint}": "A ferramenta \"{name}\" estĂĄ ativa — {leave} e depois defina {endpoint}", + "Only the first {count} turns of this route are shown": "SĂł as primeiras {count} conversĂ”es desta rota sĂŁo mostradas", + "Turn-by-turn directions": "InstruçÔes passo a passo", + "Another map tool is using clicks — close it, then SET A again": "Outra ferramenta do mapa estĂĄ usando os cliques — feche-a e pressione DEFINIR A de novo", + "Routing
": "Calculando a rota
", + "No route found": "Nenhuma rota encontrada", + "{distance} · {duration} · {mode} · first {count} turns": "{distance} · {duration} · {mode} · primeiras {count} conversĂ”es", + "{distance} · {duration} · {mode}": "{distance} · {duration} · {mode}", + "Click the globe to place {endpoint}": "Clique no globo para colocar {endpoint}", + "SET B, then click the globe": "Pressione DEFINIR B e depois clique no globo", + "SET A, then click the globe": "Pressione DEFINIR A e depois clique no globo", + "Step {step} of {total} · then {leg}": "Passo {step} de {total} · depois {leg}", + "Step {step} of {total}": "Passo {step} de {total}", + "Then: {instruction}": "Depois: {instruction}", + "No route found between A and B": "Nenhuma rota encontrada entre A e B", + "Routing failed: {error}": "Falha ao calcular a rota: {error}", + "Routing timed out": "O cĂĄlculo da rota excedeu o tempo limite", + "Routing unavailable — no response from the routing service": "Rotas indisponĂ­veis — sem resposta do serviço de rotas", + "Earthquake source unavailable": "Fonte de terremotos indisponĂ­vel", + "Focus fire detection {title}, {details}": "Focar detecção de incĂȘndio {title}, {details}", + "live feed unavailable": "feed ao vivo indisponĂ­vel", + "{value} conf": "confiança {value}", + "{value} ago": "hĂĄ {value}", + "sensor n/a": "sensor n/d", + "FIRE · {frp} MW": "INCÊNDIO · {frp} MW", + "NIGHT": "NOITE", + "â–Č {frp} MW": "â–Č {frp} MW", + "FIRE": "INCÊNDIO", + "FIRES": "INCÊNDIOS", + "max {value} MW": "mĂĄx {value} MW", + "new {value}": "mais recente hĂĄ {value}", + "{value}°N": "{value}°N", + "{value}°S": "{value}°S", + "{value}°E": "{value}°L", + "{value}°W": "{value}°O", + "just now": "agora mesmo", + "<1m ago": "hĂĄ <1 min", + "{count}m ago": "hĂĄ {count} min", + "{count}h ago": "hĂĄ {count} h", + "fire confidence|high": "alta", + "fire confidence|nominal": "nominal", + "fire confidence|low": "baixa", + "age|<1h": "<1 h", + "age|{count}h": "{count} h", + "age|{count}d": "{count} d", + "STALE · cached {age}": "DESATUALIZADO · em cache {age}", + "refreshing...": "atualizando...", + "loading...": "carregando...", + "KEY REQUIRED": "CHAVE NECESSÁRIA", + "LIVE · updated {age}": "AO VIVO · atualizado {age}", + "Source snapshot time unavailable": "HorĂĄrio do snapshot da fonte indisponĂ­vel", + "Live data unavailable": "Dados ao vivo indisponĂ­veis", + "Intel Picture": "Panorama de inteligĂȘncia", + "Kinetic 30d": "CinĂ©tico 30 d", + "Border Crisis": "Crise na fronteira", + "Iran Picture": "Panorama do IrĂŁ", + "Iran Kinetic": "IrĂŁ cinĂ©tico", + "Yemen FLOT": "FLOT do IĂȘmen", + "Latest Drop": "Última publicação", + "GhostMaps file could not be read": "NĂŁo foi possĂ­vel ler o arquivo do GhostMaps", + "{count} source links ↗ · click card to open the first": { + "one": "{count} link da fonte ↗ · clique no cartĂŁo para abrir", + "many": "{count} de links das fontes ↗ · clique no cartĂŁo para abrir o primeiro", + "other": "{count} links das fontes ↗ · clique no cartĂŁo para abrir o primeiro" + }, + "S2 · {name}": "S2 · {name}", + "Report": "RelatĂłrio", + "Open the source for {title}": "Abrir a fonte de {title}", + "GhostMaps catalog unavailable": "CatĂĄlogo do GhostMaps indisponĂ­vel", + "LIVE · GitHub {commit} · {message} · checked every {seconds}s": "AO VIVO · GitHub {commit} · {message} · verificado a cada {seconds} s", + "GitHub {commit} · {message} · reconnecting for live updates": "GitHub {commit} · {message} · reconectando para receber atualizaçÔes ao vivo", + "Connecting to the S2 GhostMaps repository
": "Conectando ao repositĂłrio S2 GhostMaps
", + "{count} placemarks": { + "one": "{count} marcador", + "many": "{count} de marcadores", + "other": "{count} marcadores" + }, + "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.": "O S2 Underground publica estes produtos KMZ no GitHub. Novos envios sĂŁo detectados em segundos e substituem a edição anterior automaticamente. Clique em um marcador para ver o relatĂłrio.", + "Malformed GhostMaps catalog": "CatĂĄlogo do GhostMaps malformado", + "Low-accuracy score < 2%": "Índice de baixa precisĂŁo < 2%", + "Low-accuracy score 2–10%": "Índice de baixa precisĂŁo 2–10%", + "Low-accuracy score > 10%": "Índice de baixa precisĂŁo > 10%", + "GNSS integrity source unavailable": "Fonte de integridade GNSS indisponĂ­vel", + "Regional sample · 250 nm radius · cells from visited views over 30 min": "Amostra regional · raio de 250 NM · cĂ©lulas das vistas visitadas em 30 min", + "Retrying automatically at {time} UTC": "Nova tentativa automĂĄtica Ă s {time} UTC", + "Retrying automatically after provider cooldown": "Nova tentativa automĂĄtica apĂłs a pausa do provedor", + "Updates automatically after pan or zoom and once a minute. The public feed covers a 250-nautical-mile circle around the view centre; zooming out does not make it a worldwide snapshot. Blank cells are outside sampled coverage or have insufficient observations.": "Atualiza automaticamente apĂłs mover ou dar zoom e uma vez por minuto. O feed pĂșblico cobre um cĂ­rculo de 250 milhas nĂĄuticas ao redor do centro da vista; afastar o zoom nĂŁo o transforma em um snapshot mundial. CĂ©lulas vazias estĂŁo fora da cobertura amostrada ou nĂŁo tĂȘm observaçÔes suficientes.", + "Low-accuracy score = 100 × max(0, bad − 1) / total: one aircraft is discounted, so this is not the raw share. Cells need {aircraft} aircraft over {minutes} minutes. Navigation-integrity anomalies are not a detection of jamming or spoofing.": "Índice de baixa precisĂŁo = 100 × max(0, ruins − 1) / total: uma aeronave Ă© descontada, entĂŁo nĂŁo Ă© a proporção bruta. Cada cĂ©lula precisa de {aircraft} aeronaves em {minutes} minutos. Anomalias de integridade de navegação nĂŁo sĂŁo detecção de interferĂȘncia (jamming) nem de falsificação (spoofing).", + "GNSS snapshot needs a view anchor": "O snapshot GNSS precisa de um ponto de referĂȘncia da vista", + "GNSS feed rate limited (HTTP 429)": "Feed GNSS: limite de requisiçÔes atingido (HTTP 429)", + "Malformed GNSS integrity snapshot": "Snapshot de integridade GNSS malformado", + "GNSS integrity snapshot has no observation time": "O snapshot de integridade GNSS nĂŁo tem horĂĄrio de observação", + "installation class|AIRFIELD": "AERÓDROMO", + "installation class|NAVAL BASE": "BASE NAVAL", + "installation class|RANGE": "CAMPO DE TIRO", + "installation class|MILITARY LAND": "TERRENO MILITAR", + "installation class|BASE": "BASE", + "installation class|BARRACKS": "QUARTEL", + "installation class|TRAINING AREA": "ÁREA DE TREINAMENTO", + "installation class|PLACES CANDIDATE": "CANDIDATO DO GOOGLE PLACES", + "installation class|INSTALLATION": "INSTALAÇÃO", + "No mapped sites within {km} km of the contact": "Nenhum local mapeado a atĂ© {km} km do contato", + "{count} mapped sites within {km} km of the contact": { + "one": "{count} local mapeado a atĂ© {km} km do contato", + "many": "{count} de locais mapeados a atĂ© {km} km do contato", + "other": "{count} locais mapeados a atĂ© {km} km do contato" + }, + "No mapped sites in view": "Nenhum local mapeado na vista", + "{count} mapped sites in view": { + "one": "{count} local mapeado na vista", + "many": "{count} de locais mapeados na vista", + "other": "{count} locais mapeados na vista" + }, + "loading mapped installation context": "carregando contexto da instalação mapeada", + "Too many mapped sites in view to list them all": "HĂĄ locais mapeados demais na vista para listar todos", + "Installation context unavailable": "Contexto de instalaçÔes indisponĂ­vel", + "MAPPED INSTALLATION": "INSTALAÇÃO MAPEADA", + "Unknown": "Desconhecido", + "LAUNCH SITE · {site}": "LOCAL DE LANÇAMENTO · {site}", + "LAUNCH SITE": "LOCAL DE LANÇAMENTO", + "T−{time} · {mission}": "T−{time} · {mission}", + "LAUNCH STANDBY": "LANÇAMENTO EM ESPERA", + "LIFTOFF · {mission}": "DECOLAGEM · {mission}", + "ASCENT REPLAY · {mission}": "REPRISE DA SUBIDA · {mission}", + "ASCENT ESTIMATE · {mission}": "SUBIDA ESTIMADA · {mission}", + "STAGE RE-ENTRY / RECOVERY · {mission}": "REENTRADA / RECUPERAÇÃO DE ESTÁGIO · {mission}", + "ORBIT REPLAY · {mission}": "REPRISE DA ÓRBITA · {mission}", + "PAUSED · {title}": "PAUSADO · {title}", + "UNSPECIFIED": "NÃO ESPECIFICADO", + "+{count} additional payload records": "Outros registros de carga Ăștil: {count}", + "PAYLOAD DATA UNAVAILABLE": "DADOS DA CARGA ÚTIL INDISPONÍVEIS", + "{value} KM DOWNRANGE": "A {value} KM DO LOCAL DE LANÇAMENTO", + "POSITION UNAVAILABLE": "POSIÇÃO INDISPONÍVEL", + "FLIGHT {count}": "VOO {count}", + "REUSED": "REUTILIZADO", + "NO STAGE RE-ENTRY / RECOVERY DATA": "SEM DADOS DE REENTRADA / RECUPERAÇÃO DE ESTÁGIO", + "{count} / 30D": "{count} / 30 D", + "NO MISSIONS AVAILABLE IN THE CURRENT 30-DAY WINDOW": "NENHUMA MISSÃO DISPONÍVEL NA JANELA ATUAL DE 30 DIAS", + "DATE UNAVAILABLE": "DATA INDISPONÍVEL", + "UNSPECIFIED OPERATOR": "OPERADOR NÃO ESPECIFICADO", + "Select {mission}": "Selecionar {mission}", + "{value} KM": "{value} KM", + "{value} KM/S": "{value} KM/S", + "Selected Space Mission": "MissĂŁo espacial selecionada", + "SELECTED SPACE MISSION": "MISSÃO ESPACIAL SELECIONADA", + "Show all missions": "Mostrar todas as missĂ”es", + "Deselect mission": "Desmarcar missĂŁo", + "MISSION": "MISSÃO", + "STATUS · ": "STATUS · ", + "LAUNCH SITE · ": "LOCAL DE LANÇAMENTO · ", + "LAUNCH TIME · ": "HORÁRIO DE LANÇAMENTO · ", + "ORBIT · ": "ÓRBITA · ", + "ASCENT PATH · ": "TRAJETÓRIA DE SUBIDA · ", + "CURRENT DISTANCE FROM EARTH · ": "DISTÂNCIA ATUAL DA TERRA · ", + "SATELLITE SPEED · ": "VELOCIDADE DO SATÉLITE · ", + "PAYLOAD": "CARGA ÚTIL", + "NAME": "NOME", + "TYPE": "TIPO", + "DESTINATION": "DESTINO", + "STAGE / RE-ENTRY / RECOVERY": "ESTÁGIO / REENTRADA / RECUPERAÇÃO", + "STAGE": "ESTÁGIO", + "STATUS": "STATUS", + "FINAL POSITION": "POSIÇÃO FINAL", + "REPLAY SPEED": "VELOCIDADE DA REPRISE", + "Replay speed multiplier": "Multiplicador de velocidade da reprise", + "REPLAY ASCENT": "REPRISE DA SUBIDA", + "Previous mission": "MissĂŁo anterior", + "PREV": "ANT.", + "Next mission": "PrĂłxima missĂŁo", + "SHOW ALL / DESELECT": "MOSTRAR TODAS / DESMARCAR", + "Pause replay": "Pausar reprise", + "Cancel replay": "Cancelar reprise", + "EST. DOWNRANGE": "EST. PELA DIST. DO LANÇAMENTO", + "PLANNED · ": "PLANEJADO · ", + "SUPPLIED TRAJECTORY POINTS": "PONTOS DE TRAJETÓRIA FORNECIDOS", + "RECONSTRUCTED ESTIMATE": "ESTIMATIVA RECONSTRUÍDA", + "Replay the estimated ascent with a following camera": "Reproduzir a subida estimada com uma cĂąmera de acompanhamento", + "Resume replay": "Retomar reprise", + "T minus {seconds}": "T menos {seconds}", + "Preparing launch site": "Preparando o local de lançamento", + "Liftoff": "Decolagem", + "Ascent replay": "Reprise da subida", + "Orbit replay": "Reprise da Ăłrbita", + ", paused": ", pausado", + "Malformed launch snapshot": "Snapshot de lançamentos malformado", + "Heard by your receiver": "Captado pelo seu receptor", + "1090 MHz": "1090 MHz", + "978 MHz UAT": "978 MHz UAT", + "browser SDR": "SDR do navegador", + "decoder feed": "feed do decodificador", + "Your RTL-SDR receiver and decoder feed": "Seu receptor RTL-SDR e o feed do decodificador", + "Your decoder feed": "Seu feed do decodificador", + "Your RTL-SDR receiver": "Seu receptor RTL-SDR", + "NO CALLSIGN": "SEM INDICATIVO", + "ALT {altitude} FT · GS {speed} KT · TRK {track}": "ALT {altitude} FT · GS {speed} KT · TRK {track}", + "V/S {rate}": "V/S {rate}", + "V/S {rate} FPM": "V/S {rate} FT/MIN", + "POSITION {age}": "POSIÇÃO {age}", + "POSITION {seconds} S AGO": "POSIÇÃO HÁ {seconds} S", + "{count} MSGS": { + "one": "{count} MENSAGEM", + "many": "{count} DE MENSAGENS", + "other": "{count} MENSAGENS" + }, + "Decoder feeds": "Feeds do decodificador", + "WebUSB + decoder feeds": "WebUSB + feeds do decodificador", + "opening receiver": "abrindo o receptor", + "checking decoder feeds": "verificando os feeds do decodificador", + "WebUSB needs desktop Chrome or Edge": "O WebUSB requer Chrome ou Edge para desktop", + "connect a receiver in Radio": "conecte um receptor em \"RĂĄdio\"", + "receiver is in FM mode": "o receptor estĂĄ no modo FM", + "listening": "escutando", + "USB error": "erro de USB", + "Alt unknown": "Alt. desconhecida", + "Type unknown": "Tipo desconhecido", + "Reg unknown": "MatrĂ­cula desconhecida", + "Operator unknown": "Operador desconhecido", + "${amount}K": "US$ {amount} mil", + "${amount}M": "US$ {amount} mi", + "${amount}B": "US$ {amount} bi", + "fire cause|Human": "humana", + "fire cause|Natural": "natural", + "fire cause|Undetermined": "indeterminada", + "fire cause|Unknown": "desconhecida", + "fire behavior|Minimal": "atividade mĂ­nima", + "fire behavior|Moderate": "atividade moderada", + "fire behavior|Active": "atividade alta", + "fire behavior|Extreme": "atividade extrema", + "Type {level} Incident": "incidente tipo {level}", + "age|{count}m": "{count} min", + "{acres} ac": { + "one": "{acres} acre", + "many": "{acres} de acres", + "other": "{acres} acres" + }, + "{percent}% contained": "{percent}% contido", + "containment unknown": "contenção desconhecida", + "{cause} cause": "causa: {cause}", + "{personnel} personnel": { + "one": "{personnel} pessoa na equipe", + "many": "{personnel} de pessoas na equipe", + "other": "{personnel} pessoas na equipe" + }, + "{county} County": "condado de {county}", + "{cost} to date": "{cost} atĂ© agora", + "discovered {age} ago": "detectado hĂĄ {age}", + "updated {age} ago": "atualizado hĂĄ {age}", + "part of {complex}": "parte de {complex}", + "InciWeb ↗ · click card to open": "InciWeb ↗ · clique no cartĂŁo para abrir", + "FIRE · {name}": "INCÊNDIO · {name}", + "Unnamed incident": "Sem nome", + "Open {title} on InciWeb": "Abrir {title} no InciWeb", + "Perimeter source unavailable": "Fonte de perĂ­metros indisponĂ­vel", + "Not contained or unknown": "NĂŁo contido ou desconhecido", + "Under 50% contained": "Menos de 50% contido", + "50–99% contained": "50–99% contido", + "Fully contained": "Totalmente contido", + "Colour shows reported containment. Perimeters are simplified to about 100 m.": "A cor indica a contenção informada. Os perĂ­metros sĂŁo simplificados para cerca de 100 m.", + "Malformed perimeter snapshot": "Snapshot de perĂ­metros malformado", + "radio tag|All": "Todas", + "News": "NotĂ­cias", + "Talk": "Conversa", + "Weather / Emergency": "Clima / EmergĂȘncia", + "Public Safety": "Segurança pĂșblica", + "Aviation / Marine": "Aviação / MarĂ­timo", + "Traffic / Transit": "TrĂąnsito / Transporte", + "Music": "MĂșsica", + "Other": "Outras", + "Directory refresh degraded; showing the previous station catalog.": "A atualização do diretĂłrio retornou dados degradados; mostrando o catĂĄlogo de estaçÔes anterior.", + "Radio directory coverage is degraded.": "A cobertura do diretĂłrio de rĂĄdio estĂĄ degradada.", + "Directory refresh failed; showing the previous station catalog.": "A atualização do diretĂłrio falhou; mostrando o catĂĄlogo de estaçÔes anterior.", + "Radio directory is temporarily unavailable.": "O diretĂłrio de rĂĄdio estĂĄ temporariamente indisponĂ­vel.", + "radio|NEWS": "NOTÍCIAS", + "radio|TALK": "CONVERSA", + "radio|WEATHER": "CLIMA", + "radio|SAFETY": "SEGURANÇA", + "radio|AIR / SEA": "AR / MAR", + "radio|TRANSIT": "TRANSPORTE", + "radio|MUSIC": "MÚSICA", + "radio|OTHER": "OUTRAS", + "Broadcaster stream is unavailable or blocked by the browser.": "O stream da emissora estĂĄ indisponĂ­vel ou foi bloqueado pelo navegador.", + "Playback requires a direct click or tap.": "A reprodução exige um clique ou toque direto.", + "Broadcaster stream could not be started.": "NĂŁo foi possĂ­vel iniciar o stream da emissora.", + "Alternative": "Alternativa", + "Ambient": "Ambiente", + "Blues": "Blues", + "Classical": "ClĂĄssica", + "Country": "Country", + "Dance": "Dance", + "Electronic": "EletrĂŽnica", + "Folk": "Folk", + "Funk": "Funk", + "Hip-Hop": "Hip-Hop", + "House": "House", + "Indie": "Indie", + "Jazz": "Jazz", + "Latin": "Latina", + "Metal": "Metal", + "Oldies": "Flashback", + "Pop": "Pop", + "Punk": "Punk", + "R&B": "R&B", + "Reggae": "Reggae", + "Rock": "Rock", + "Soul": "Soul", + "Techno": "Techno", + "Trance": "Trance", + "World": "MĂșsicas do mundo", + "overview": "visĂŁo geral", + "cloud unknown": "nebulosidade desconhecida", + "{percent}% scene cloud": "{percent}% de nuvens na cena", + "{min}–{max}% scene cloud": "{min}–{max}% de nuvens na cena", + "Comparison in use by another scene": "A comparação estĂĄ em uso por outra cena", + "Esri map unavailable · no swipe": "Mapa Esri indisponĂ­vel · sem comparação", + "Swipe needs a globe map": "A comparação precisa de um mapa de globo", + "Imagery stays on Esri · CLEAR to use Google 3D": "As imagens continuam no Esri · LIMPAR para usar o Google 3D", + "Imagery catalog unavailable": "CatĂĄlogo de imagens indisponĂ­vel", + "Catalog truncated · a newer clear day may exist": "CatĂĄlogo truncado · pode haver um dia limpo mais recente", + "{label} catalog unavailable · {detail}": "CatĂĄlogo de {label} indisponĂ­vel · {detail}", + "Daily overview for today may still be empty until the pass": "A visĂŁo geral diĂĄria de hoje pode continuar vazia atĂ© a passagem do satĂ©lite", + "Box and images cleared": "Área e imagens limpas", + "MORE DETAIL · 30 m": "MAIS DETALHE · 30 m", + "Sentinel-2 and Landsat via HLS, 30 m, every 2–6 days": "Sentinel-2 e Landsat via HLS, 30 m, a cada 2–6 dias", + "DAILY OVERVIEW · 250 m": "VISÃO GERAL DIÁRIA · 250 m", + "VIIRS daily mosaic, 250 m, follows broad changes; little detail under 25 km": "Mosaico diĂĄrio do VIIRS, 250 m, acompanha mudanças amplas; pouco detalhe abaixo de 25 km", + "Sentinel-2": "Sentinel-2", + "Sentinel-2 via HLS": "Sentinel-2 via HLS", + "Landsat 8/9": "Landsat 8/9", + "Landsat 8/9 via HLS": "Landsat 8/9 via HLS", + "Daily overview": "VisĂŁo geral diĂĄria", + "Box edges must be finite": "Coordenadas da ĂĄrea invĂĄlidas", + "Longitudes must be within ±180°": "As longitudes devem estar dentro de ±180°", + "Select one side of the dateline": "NĂŁo cruze a linha internacional de data", + "Box must enclose an area": "A ĂĄrea deve delimitar uma superfĂ­cie", + "Add the full Starlink broadband shell (thousands of extra points)": "Adicionar toda a camada orbital de banda larga da Starlink (milhares de pontos extras)", + "Loading the Starlink shell
": "Carregando a camada orbital da Starlink
", + "Starlink {detail} — click to retry": "Starlink {detail} — clique para tentar novamente", + "load failed": "falha ao carregar", + "Showing the full Starlink shell — click for the core catalog only": "Mostrando toda a camada orbital da Starlink — clique para ver sĂł o catĂĄlogo principal", + "DENSE ···": "DENSO ···", + "DENSE ✕": "DENSO ✕", + "DENSE": "DENSO", + "CelesTrak unreachable": "CelesTrak inacessĂ­vel", + "DOCKED · {name} · +{extra}": "ACOPLADO · {name} · +{extra}", + "DOCKED · {name}": "ACOPLADO · {name}", + "{name} needs the Google 3D map: choose it under MAP SOURCE": "{name} requer o mapa Google 3D: escolha-o em FONTE DO MAPA", + "zoom in to a street to open {name}": "aproxime-se de uma rua para abrir o {name}", + "loading coverage...": "carregando cobertura...", + "No street-level imagery within {radius} m of that point": "Nenhuma imagem no nĂ­vel da rua a atĂ© {radius} m desse ponto", + "No street-level imagery within {radius} m of the view centre": "Nenhuma imagem no nĂ­vel da rua a atĂ© {radius} m do centro da vista", + "Zoom in to see street-level coverage": "Aproxime o zoom para ver a cobertura no nĂ­vel da rua", + "Point the camera at the ground for street-level coverage": "Aponte a cĂąmera para o chĂŁo para ver a cobertura no nĂ­vel da rua", + "Coverage tile failed": "Falha ao carregar o bloco de cobertura", + "The photo could not be loaded": "NĂŁo foi possĂ­vel carregar a foto", + "{name} photo. ← and → step along the sequence. On a 360° photo, drag or use Shift+← →, ↑ ↓ to look around, and + − to zoom": "Foto do {name}. ← e → avançam pela sequĂȘncia. Em uma foto 360°, arraste ou use Shift+← →, ↑ ↓ para olhar ao redor, e + − para dar zoom", + "{name} street-level photo": "Foto no nĂ­vel da rua do {name}", + "Previous photo in this sequence (←)": "Foto anterior da sequĂȘncia (←)", + "Next photo in this sequence (→)": "PrĂłxima foto da sequĂȘncia (→)", + "Aim the middle of the view at a street to look for imagery there": "Aponte o centro da vista para uma rua para buscar imagens ali", + "KEY REJECTED": "CHAVE RECUSADA", + "GOOGLE_MAPS_API_KEY is not set": "GOOGLE_MAPS_API_KEY nĂŁo estĂĄ configurada", + "The Google Maps JavaScript API could not load": "NĂŁo foi possĂ­vel carregar a API Maps JavaScript do Google", + "Google Street View": "Google Street View", + "GOOGLE STREET VIEW": "GOOGLE STREET VIEW", + "Google refused GOOGLE_MAPS_API_KEY for Street View — check that the Maps JavaScript API is enabled for it and this site is an allowed referrer": "O Google recusou a GOOGLE_MAPS_API_KEY para o Street View — verifique se a API Maps JavaScript estĂĄ ativada para a chave e se este site Ă© um referenciador permitido", + "Street View did not answer — check the network, and that the Maps JavaScript API is enabled for GOOGLE_MAPS_API_KEY": "O Street View nĂŁo respondeu — verifique a rede e se a API Maps JavaScript estĂĄ ativada para a GOOGLE_MAPS_API_KEY", + "click a street to open Street View": "clique em uma rua para abrir o Street View", + "Street View has no imagery for this place": "O Street View nĂŁo tem imagens deste lugar", + "KartaView has no position for this photo": "O KartaView nĂŁo tem a posição desta foto", + "The KartaView photo could not be loaded": "NĂŁo foi possĂ­vel carregar a foto do KartaView", + "zoom in to see KartaView coverage": "aproxime o zoom para ver a cobertura do KartaView", + "no KartaView photos in view": "nenhuma foto do KartaView na vista", + "KartaView is rate-limiting requests — they resume on their own": "O KartaView estĂĄ limitando as requisiçÔes — elas sĂŁo retomadas sozinhas", + "KartaView’s photos here are archived and cannot be shown": "As fotos do KartaView aqui estĂŁo arquivadas e nĂŁo podem ser exibidas", + "KartaView did not filter this area in time — move the map to ask again": "O KartaView nĂŁo filtrou esta ĂĄrea a tempo — mova o mapa para pedir de novo", + "None of KartaView’s photos here pass the imagery filter": "Nenhuma foto do KartaView aqui passa no filtro de imagens", + "KartaView did not answer in time — try again": "O KartaView nĂŁo respondeu a tempo — tente novamente", + "KartaView could not be reached — check the network": "NĂŁo foi possĂ­vel acessar o KartaView — verifique a rede", + "KartaView sent an answer that could not be read": "O KartaView enviou uma resposta que nĂŁo pĂŽde ser lida", + "KartaView is rate-limiting requests": "O KartaView estĂĄ limitando as requisiçÔes", + "KartaView sent too much data": "O KartaView enviou dados demais", + "KartaView is rate-limiting requests — try again in a moment": "O KartaView estĂĄ limitando as requisiçÔes — tente novamente em instantes", + "KartaView has no such photo": "O KartaView nĂŁo tem essa foto", + "Mapillary rejected MAPILLARY_CLIENT_TOKEN — replace it in Provider Settings": "O Mapillary recusou o MAPILLARY_CLIENT_TOKEN — substitua-o em \"ConfiguraçÔes de provedores\"", + "Coverage requests are being rate-limited — they resume on their own": "As requisiçÔes de cobertura estĂŁo sendo limitadas — elas sĂŁo retomadas sozinhas", + "The Panoramax photo could not be loaded": "NĂŁo foi possĂ­vel carregar a foto do Panoramax", + "Panoramax is busy — coverage resumes on its own": "O Panoramax estĂĄ sobrecarregado — a cobertura volta sozinha", + "no Panoramax photos in view": "nenhuma foto do Panoramax na vista", + "no Panoramax photos here match the filters": "nenhuma foto do Panoramax aqui atende aos filtros", + "Panoramax sent a map tile that could not be read": "O Panoramax enviou um bloco do mapa que nĂŁo pĂŽde ser lido", + "This Panoramax photo is no longer available": "Esta foto do Panoramax nĂŁo estĂĄ mais disponĂ­vel", + "zoom in to see Panoramax coverage": "aproxime o zoom para ver a cobertura do Panoramax", + "Panoramax did not answer in time — try again": "O Panoramax nĂŁo respondeu a tempo — tente novamente", + "Panoramax could not be reached — check the connection": "NĂŁo foi possĂ­vel acessar o Panoramax — verifique a conexĂŁo", + "Panoramax sent too much data": "O Panoramax enviou dados demais", + "Panoramax is busy": "O Panoramax estĂĄ sobrecarregado", + "Panoramax sent an unreadable answer": "O Panoramax enviou uma resposta ilegĂ­vel", + "Sequence images unavailable": "Imagens da sequĂȘncia indisponĂ­veis", + "No street-level imagery providers configured": "Nenhum provedor de imagens no nĂ­vel da rua configurado", + "(by upload date)": "(por data de envio)", + "Open the Street Level panel to view imagery": "Abra o painel \"NĂ­vel da rua\" para ver as imagens", + "Image could not be opened": "NĂŁo foi possĂ­vel abrir a imagem", + "TeleGeography load failed": "Falha ao carregar o TeleGeography", + "UNAVAILABLE · {source} · Roads unavailable": "INDISPONÍVEL · {source} · Vias indisponĂ­veis", + "Roads: {source}": "Vias: {source}", + "TomTom roads unavailable while the traffic service is unreachable": "Vias do TomTom indisponĂ­veis enquanto o serviço de trĂąnsito estiver inacessĂ­vel", + "Hybrid unavailable while the traffic service is unreachable": "Modo hĂ­brido indisponĂ­vel enquanto o serviço de trĂąnsito estiver inacessĂ­vel", + "TomTom roads need a TomTom key": "As vias do TomTom precisam de uma chave do TomTom", + "Hybrid needs a TomTom key": "O modo hĂ­brido precisa de uma chave do TomTom", + "Local surface still loading": "A superfĂ­cie sob as vias ainda estĂĄ carregando", + "Partial coverage": "Cobertura parcial", + "Detailed roads unavailable": "Vias detalhadas indisponĂ­veis", + "Reduced detail coverage": "Cobertura com menos detalhe", + "TomTom roads only, each with its live flow": "SĂł vias do TomTom, cada uma com seu fluxo ao vivo", + "TomTom roads only, each with its live flow (needs a TomTom key)": "SĂł vias do TomTom, cada uma com seu fluxo ao vivo (precisa de uma chave do TomTom)", + "OpenStreetMap roads, with TomTom flow matched when available": "Vias do OpenStreetMap, com o fluxo do TomTom associado quando disponĂ­vel", + "TomTom roads first; OpenStreetMap fills the rest, simulated": "Primeiro as vias do TomTom; o OpenStreetMap completa o resto com fluxo simulado", + "TomTom roads first; OpenStreetMap fills the rest, simulated (needs a TomTom key)": "Primeiro as vias do TomTom; o OpenStreetMap completa o resto com fluxo simulado (precisa de uma chave do TomTom)", + "Hybrid": "HĂ­brido", + "TomTom key unavailable": "Chave do TomTom indisponĂ­vel", + "TomTom daily budget reached": "Limite diĂĄrio do TomTom atingido", + "TomTom upstream unreachable": "Servidor do TomTom inacessĂ­vel", + "TomTom flow unavailable": "Fluxo do TomTom indisponĂ­vel", + "SIMULATED — {reason}": "SIMULADO — {reason}", + "Syncing flow · Roads: {source}": "Sincronizando fluxo · Vias: {source}", + "LIVE · Roads: {source} · Roads without flow hidden": "AO VIVO · Vias: {source} · Vias sem dados de fluxo ocultas", + "LIVE · Roads: {source} · No flow roads in view": "AO VIVO · Vias: {source} · Nenhuma via com dados de fluxo na vista", + "LIVE · Roads: {source} · Flow {percent}%": "AO VIVO · Vias: {source} · Fluxo: {percent}% cob", + "SIMULATED · Roads: {source} · Flow {percent}%": "SIMULADO · Vias: {source} · Fluxo: {percent}% cob", + "STALE · Roads: {source} · Flow: cached TomTom tiles": "DESATUALIZADO · Vias: {source} · Fluxo: blocos do TomTom em cache", + "Syncing flow · Roads: OpenStreetMap · Flow: TomTom · Unmatched: simulated": "Sincronizando fluxo · Vias: OpenStreetMap · Fluxo: TomTom · Sem correspondĂȘncia: simulado", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov · Unmatched: simulated": "AO VIVO · Vias: OpenStreetMap · Fluxo: TomTom · {percent}% cob · Sem correspondĂȘncia: simulado", + "LIVE · Roads: OpenStreetMap · Flow: TomTom · {percent}% cov": "AO VIVO · Vias: OpenStreetMap · Fluxo: TomTom · {percent}% cob", + "SIMULATED · Roads: OpenStreetMap · Flow: TomTom (no matches)": "SIMULADO · Vias: OpenStreetMap · Fluxo: TomTom (sem correspondĂȘncias)", + "SIMULATED — traffic service unreachable": "SIMULADO — serviço de trĂąnsito inacessĂ­vel", + "SIMULATED — add TomTom key for live": "SIMULADO — adicione a chave do TomTom para dados ao vivo", + "OpenFreeMap tiles rate-limited": "Blocos do OpenFreeMap: limite de requisiçÔes atingido", + "OpenFreeMap tiles timed out": "Os blocos do OpenFreeMap excederam o tempo limite", + "OpenFreeMap tiles unavailable": "Blocos do OpenFreeMap indisponĂ­veis", + "occupancy|empty": "vazio", + "occupancy|many seats available": "muitos assentos livres", + "occupancy|few seats available": "poucos assentos livres", + "occupancy|standing room only": "sĂł em pĂ©", + "occupancy|crushed standing room only": "lotado, sĂł em pĂ©", + "occupancy|full": "cheio", + "occupancy|not accepting passengers": "nĂŁo aceita passageiros", + "occupancy|not boardable": "embarque indisponĂ­vel", + "Route {route}": "Linha {route}", + "Vehicle {vehicle}": "VeĂ­culo {vehicle}", + "vehicle motion|Stopped": "Parado", + "No recent fix": "Sem posição recente", + "Waiting for update": "Aguardando atualização", + "Moving": "Em movimento", + "reported {speed} km/h": "velocidade informada: {speed} km/h", + "reported hdg {heading}°": "rumo informado: {heading}°", + "Last report: stopped at stop {stop}": "Último registro: parado no ponto {stop}", + "Last report: arriving at stop {stop}": "Último registro: chegando ao ponto {stop}", + "Last report: next stop {stop}": "Último registro: prĂłximo ponto {stop}", + "Shown at street level · depth not in the feed": "Exibido no nĂ­vel da rua · o feed nĂŁo informa a profundidade", + "Reported {seconds} s ago": "Informado hĂĄ {seconds} s", + "Reported {minutes} min ago": "Informado hĂĄ {minutes} min", + "shown {seconds} s behind": "exibido com {seconds} s de atraso", + "{reported} (feed time)": "{reported} (horĂĄrio do feed)", + "Available trail: {minutes} min (limited)": "Rastro disponĂ­vel: {minutes} min (limitado)", + "Available trail: {minutes} min": "Rastro disponĂ­vel: {minutes} min", + "Bus": "Ônibus", + "Tram": "Bonde", + "Subway": "MetrĂŽ", + "Train": "Trem", + "Ferry": "Balsa", + "Transit vehicle": "VeĂ­culo de transporte pĂșblico", + "AIS: {name}": "AIS: {name}", + "{type} SPD: {speed} HDG: {heading}": "{type} SPD: {speed} HDG: {heading}", + "VESSEL": "EMBARCAÇÃO", + "{speed}KT": "{speed} KT", + "{heading}DEG": "{heading}°", + "POS: LIVE": "POS: AO VIVO", + "POS: {time}Z": "POS: {time}Z", + "AIS live load failed": "Falha ao carregar o AIS ao vivo", + "awaiting first AIS position
": "aguardando primeira posição AIS
", + "awaiting usable AIS positions
": "aguardando posiçÔes AIS utilizĂĄveis
", + "awaiting first AIS message
": "aguardando primeira mensagem AIS
", + "AISSTREAM_API_KEY not set": "AISSTREAM_API_KEY nĂŁo configurada", + "live feed unsupported": "feed ao vivo nĂŁo suportado", + "connecting to feed
": "conectando ao feed
", + "feed disconnected": "feed desconectado", + "feed down": "feed fora do ar", + "feed idle": "feed inativo", + "API key rejected — check AISSTREAM_API_KEY": "Chave de API recusada — verifique a AISSTREAM_API_KEY", + "feed silent {seconds}s — no AIS data": "feed em silĂȘncio hĂĄ {seconds} s — sem dados AIS", + "feed silent — no AIS data": "feed em silĂȘncio — sem dados AIS", + "feed down — retrying slowly (attempt {attempt})": "feed fora do ar — tentando de novo em intervalos maiores (tentativa {attempt})", + "reconnecting to feed
 (attempt {attempt})": "reconectando ao feed
 (tentativa {attempt})", + "feed down — retrying slowly": "feed fora do ar — tentando de novo em intervalos maiores", + "reconnecting to feed
": "reconectando ao feed
", + "Focus vessel {name}, MMSI {mmsi}": "Focar a embarcação {name}, MMSI {mmsi}", + "Hidden by this map source · choose a globe map": "Oculto com esta fonte do mapa · escolha um mapa de globo", + "Weather image HTTP {status}": "Imagem do clima: HTTP {status}", + "Weather HTTP {status}": "Clima: HTTP {status}", + "Frame unavailable; previous observation retained": "Quadro indisponĂ­vel; mantido o anterior", + "Weather imagery unavailable": "Imagens meteorolĂłgicas indisponĂ­veis", + "Weather source unavailable; previous observation retained": "Fonte meteorolĂłgica indisponĂ­vel; a observação anterior foi mantida", + "Weather unavailable": "Clima indisponĂ­vel", + "No frame within {gap} min of {time}": "Nenhum quadro a ±{gap} min de {time}", + "No frame within {gap} h of {time}": "Nenhum quadro a ±{gap} h de {time}", + "{hours}h {minutes}m ago": "hĂĄ {hours} h {minutes} min", + "{minutes}m ago": "hĂĄ {minutes} min", + "{state} · {time} · {lag}": "{state} · {time} · {lag}", + "Observed": "Observado", + "History": "HistĂłrico", + "Observation unavailable": "Observação indisponĂ­vel", + "Waiting for observation": "Aguardando observação", + "{detail} · synced": "{detail} · sinc.", + "{detail} · nearest": "{detail} · mais prĂłximo", + "RADAR REFLECTIVITY · dBZ": "REFLETIVIDADE DE RADAR · dBZ", + "LIGHTNING DENSITY · 15 min accumulation": "DENSIDADE DE RAIOS · acumulado de 15 min", + "GLOBAL INFRARED · hourly": "INFRAVERMELHO GLOBAL · a cada hora", + "GOES INFRARED · ~5 min": "INFRAVERMELHO GOES · ~5 min", + "{state}: {time}": "{state}: {time}", + "Latest observation": "Última observação", + "frame {index}/{total}": "quadro {index}/{total}", + "loading": "carregando", + "Observation: unavailable": "Observação: indisponĂ­vel", + "Contiguous US · gaps ≠ no rain": "EUA contĂ­guos · lacunas ≠ sem chuva", + "Americas + Pacific · not individual strikes": "AmĂ©ricas + PacĂ­fico · nĂŁo sĂŁo raios individuais", + "Color: strikes/kmÂČ/min ×10Âł": "Cor: raios/kmÂČ/min ×10Âł", + "60°S–60°N · typically 2–3 h delayed": "60°S–60°N · normalmente com 2–3 h de atraso", + "North America · infrared imagery": "AmĂ©rica do Norte · imagens infravermelhas", + "Reduced motion · history playback unavailable": "Movimento reduzido · reprodução do histĂłrico indisponĂ­vel", + "Reduced motion · manual history available": "Movimento reduzido · Ă© possĂ­vel percorrer o histĂłrico manualmente", + "Rain radar · US": "Radar de chuva · EUA", + "Lightning density · 15 min": "Densidade de raios · 15 min", + "Satellite clouds": "Nuvens por satĂ©lite", + "Americas + Pacific": "AmĂ©ricas + PacĂ­fico", + "Global · 60°S–60°N": "Global · 60°S–60°N", + "North America": "AmĂ©rica do Norte", + "Source observations delayed": "ObservaçÔes da fonte com atraso", + "Stale source": "Fonte desatualizada", + "Loading next frame
": "Carregando o prĂłximo quadro
", + "Map center outside coverage": "Centro do mapa fora da cobertura", + "strikes/kmÂČ/min ×10Âł": "raios/kmÂČ/min ×10Âł", + "N. America": "Am. do Norte", + "Global": "Global", + "Hourly global mosaic; usually 2–3 hours delayed": "Mosaico global por hora; normalmente com 2–3 horas de atraso", + "GOES regional clouds; approximately 5-minute updates": "Nuvens regionais do GOES; atualizaçÔes a cada 5 minutos aproximadamente", + "Clouds only": "SĂł nuvens", + "Apply the full cloud brightness key; 100% filter strength": "Aplicar o filtro completo de brilho das nuvens; intensidade do filtro 100%", + "Full": "Completa", + "Show the complete infrared image; 0% filter strength": "Mostrar a imagem infravermelha completa; intensidade do filtro 0%", + "Soft": "Suave", + "Vivid": "Intensa", + "Image opacity; does not alter the observed values": "Opacidade da imagem; nĂŁo altera os valores observados", + "View US radar": "Ver radar dos EUA", + "View Americas & Pacific": "Ver AmĂ©ricas e PacĂ­fico", + "View coverage": "Ver cobertura", + "{value} strikes/kmÂČ/min ×10Âł (15-minute density)": "{value} raios/kmÂČ/min ×10Âł (densidade de 15 minutos)", + "{value} dBZ radar reflectivity": "{value} dBZ de refletividade de radar", + "STALE · cached source metadata": "DESATUALIZADO · metadados da fonte em cache", + "Map center is outside source coverage": "O centro do mapa estĂĄ fora da cobertura da fonte", + "NOAA/NWS 15-minute lightning density derived from Vaisala NLDN/GLD360. Coverage 110°E across the Pacific/Americas to 0°, 25°S–80°N. Not a live strike count, global coverage or a safety warning.": "Densidade de raios de 15 minutos da NOAA/NWS derivada do Vaisala NLDN/GLD360. Cobertura de 110°L, passando pelo PacĂ­fico/AmĂ©ricas, atĂ© 0°, 25°S–80°N. NĂŁo Ă© uma contagem de raios ao vivo, nem cobertura global, nem um alerta de segurança.", + "NOAA MRMS radar echoes indicate precipitation patterns, not rain rate, a storm warning or a future forecast. Native source approximately 1 km; display is limited to level 6. Frames use exact advertised observation times.": "Os ecos de radar NOAA MRMS indicam padrĂ”es de precipitação, nĂŁo a intensidade da chuva, nem um alerta de tempestade, nem uma previsĂŁo futura. Fonte nativa de aproximadamente 1 km; a exibição Ă© limitada ao nĂ­vel 6. Os quadros usam os horĂĄrios de observação exatos informados.", + "GOES-19/18 longwave infrared Band 14 regional; NESDIS global longwave mosaic. Clouds only dims everything but bright, cold cloud tops; a brightness filter, not a cloud mask. Coverage and freshness differ by region.": "Infravermelho de onda longa GOES-19/18, banda 14, regional; mosaico global de onda longa da NESDIS. SĂł nuvens escurece tudo, exceto os topos de nuvens brilhantes e frios; Ă© um filtro de brilho, nĂŁo uma mĂĄscara de nuvens. A cobertura e a atualização variam por regiĂŁo.", + "REGION": "REGIÃO", + "IMAGE": "IMAGEM", + "FILTER": "FILTRO", + "Cloud filter strength": "Intensidade do filtro de nuvens", + "OPACITY": "OPACIDADE", + "Infrared decode failed": "Falha ao decodificar o infravermelho", + "Weather prefetch unavailable": "PrĂ©-carregamento do clima indisponĂ­vel", + "Weather tiles unavailable · previous frame retained": "Blocos meteorolĂłgicos indisponĂ­veis · o quadro anterior foi mantido", + "Some weather tiles unavailable": "Alguns blocos meteorolĂłgicos indisponĂ­veis", + "Malformed weather manifest": "Manifesto do clima malformado", + "Weather request timed out": "A requisição do clima excedeu o tempo limite", + "Cyclone request timed out": "A requisição de ciclones excedeu o tempo limite", + "Malformed cyclone snapshot": "Snapshot de ciclones malformado", + "Temperature field unavailable": "Campo de temperatura indisponĂ­vel", + "Mean sea level pressure field unavailable": "Campo de pressĂŁo ao nĂ­vel do mar indisponĂ­vel", + "Wind upstream unavailable": "Origem dos dados de vento indisponĂ­vel", + "{source} HTTP {status}": "{source}: HTTP {status}", + "Wind": "Vento", + "Wind source unavailable": "Fonte de vento indisponĂ­vel", + "Forecast · does not follow history": "PrevisĂŁo · nĂŁo acompanha o histĂłrico", + "Wind motion": "Movimento do vento", + "Wind speed": "Velocidade do vento", + "Sea-level pressure": "PressĂŁo ao nĂ­vel do mar", + "Air temperature · 2 m": "Temperatura do ar · 2 m", + "Global · 1° grid": "Global · grade de 1°", + "{model} forecast · {time}": "PrevisĂŁo {model} · {time}", + "Loading forecast": "Carregando previsĂŁo", + "Preparing flow": "Preparando fluxo", + "Selected field unavailable": "Campo selecionado indisponĂ­vel", + "Cached forecast · stale": "PrevisĂŁo em cache · desatualizada", + "ECMWF IFS surface forecast": "PrevisĂŁo de superfĂ­cie ECMWF IFS", + "NOAA GFS surface forecast": "PrevisĂŁo de superfĂ­cie NOAA GFS", + "Reduced motion": "Movimento reduzido", + "Resume": "Retomar", + "Pause": "Pausar", + "Pause visual flow; forecast time does not advance with animation": "Pausar o fluxo visual; o horĂĄrio da previsĂŁo nĂŁo avança com a animação", + "None": "Nenhum", + "Speed": "Velocidade", + "Pressure": "PressĂŁo", + "Temperature": "Temperatura", + "Wind trails with no field shading": "Rastros de vento sem sombreamento do campo", + "How hard the surface wind is blowing": "Com que força o vento sopra na superfĂ­cie", + "Sea-level air pressure: broad highs and lows": "PressĂŁo do ar ao nĂ­vel do mar: amplas ĂĄreas de alta e baixa pressĂŁo", + "Air temperature two meters above the surface": "Temperatura do ar a dois metros acima da superfĂ­cie", + "Wind speed units": "Unidades de velocidade do vento", + "Read wind at map center": "Ler o vento no centro do mapa", + "Read the forecast at the center of the map without changing selection": "Ler a previsĂŁo no centro do mapa sem mudar a seleção", + "{model} forecast · {field} ({unit})": "PrevisĂŁo {model} · {field} ({unit})", + "Valid: {time}": "VĂĄlida: {time}", + "preparing": "preparando", + "Issued: {time}": "Emitida: {time}", + "Selected field unavailable · wind remains visible": "Campo selecionado indisponĂ­vel · o vento continua visĂ­vel", + "{error} · wind remains visible": "{error} · o vento continua visĂ­vel", + "Surface wind at 10 m. Approximately 1° global grid. Curves follow the 10 m wind field, lifted 12 km for visibility; display height is not weather altitude. View lighting is for readability. Animation shows flow through one fixed forecast; it does not advance time. Color fields drape the globe basemap or the active photorealistic 3D Tiles.": "Vento de superfĂ­cie a 10 m. Grade global de aproximadamente 1°. As curvas seguem o campo de vento a 10 m, elevadas 12 km para ficarem visĂ­veis; a altura exibida nĂŁo Ă© altitude meteorolĂłgica. A iluminação da vista serve para facilitar a leitura. A animação mostra o fluxo de uma Ășnica previsĂŁo fixa; ela nĂŁo avança o tempo. Os campos de cor cobrem o mapa base do globo ou os 3D Tiles fotorrealistas ativos.", + "MODEL": "MODELO", + "FIELD": "CAMPO", + "UNITS": "UNIDADES", + "MOTION": "MOVIMENTO", + "Forecast": "PrevisĂŁo", + "N": "N", + "NNE": "NNE", + "NE": "NE", + "ENE": "ENE", + "E": "L", + "ESE": "ESE", + "SE": "SE", + "SSE": "SSE", + "S": "S", + "SSW": "SSO", + "SW": "SO", + "WSW": "OSO", + "W": "O", + "WNW": "ONO", + "NW": "NO", + "NNW": "NNO", + "No surface reading": "Sem leitura na superfĂ­cie", + "Aim the map center at Earth": "Aponte o centro do mapa para a Terra", + "A location reading needs a loaded forecast and the Earth at the center of the view.": "A leitura de um ponto precisa de uma previsĂŁo carregada e da Terra no centro da vista.", + "Interpolated model forecast on an approximately 1° grid. Broad weather patterns, not a street-level measurement.": "PrevisĂŁo de modelo interpolada em uma grade de aproximadamente 1°. PadrĂ”es meteorolĂłgicos gerais, nĂŁo uma medição no nĂ­vel da rua.", + " · calm": " · calmo", + " from {direction}": " de {direction}", + "WIND AT {coordinates}": "VENTO EM {coordinates}", + "{model} · valid {time}": "{model} · vĂĄlida para {time}", + "Wind speed field unavailable": "Campo de velocidade do vento indisponĂ­vel", + "Globe imagery unavailable": "Imagens do globo indisponĂ­veis", + "Globe field image unavailable": "Imagem do campo no globo indisponĂ­vel", + "Unknown wind model": "Modelo de vento desconhecido", + "Unknown weather overlay": "Camada de clima desconhecida", + "Wind request timed out": "A requisição de vento excedeu o tempo limite", + "Malformed wind manifest": "Manifesto de vento malformado", + "Malformed wind grid": "Grade de vento malformada", + "Error: {message}": "Erro: {message}", + "Needs {envVars} — add it in Provider Settings": "Requer {envVars} — adicione em \"ConfiguraçÔes de provedores\"", + "{label} is unavailable": "{label} indisponĂ­vel", + "This map stack": "Esta pilha de mapas", + "{label} unavailable: {hint}": "{label} indisponĂ­vel: {hint}", + "Google 3D tiles unavailable — check the key's API restrictions, quota, or network": "Google 3D Tiles indisponĂ­vel — verifique as restriçÔes de API da chave, a cota ou a rede", + "Needs {envVars} — add it in Provider Settings — or a Cesium ion token for the ion-hosted route": "Requer {envVars} — adicione em \"ConfiguraçÔes de provedores\" — ou um token do Cesium ion para a rota hospedada no ion", + "Exit cockpit to fly to a camera": "Saia da cabine para voar atĂ© uma cĂąmera", + "Exit cockpit to fly to a location": "Saia da cabine para voar atĂ© um local", + "Exit cockpit to fly to a photo": "Saia da cabine para voar atĂ© uma foto", + "Exit cockpit to fly to a shared view": "Saia da cabine para voar atĂ© uma vista compartilhada", + "Exit cockpit to fly to a target": "Saia da cabine para voar atĂ© um alvo", + "Exit cockpit to fly to a vessel": "Saia da cabine para voar atĂ© uma embarcação", + "Exit cockpit to fly to a fire": "Saia da cabine para voar atĂ© um incĂȘndio", + "Exit cockpit to fly to a route": "Saia da cabine para voar atĂ© uma rota", + "Exit cockpit to fly to a file": "Saia da cabine para voar atĂ© um arquivo", + "Exit cockpit to fly to a scene": "Saia da cabine para voar atĂ© uma cena", + "Exit cockpit to view weather coverage": "Saia da cabine para ver a cobertura da camada de clima", + "Exit cockpit to fly to a cyclone": "Saia da cabine para voar atĂ© um ciclone", + "Exit cockpit to fly to an aircraft": "Saia da cabine para voar atĂ© uma aeronave", + "Exit cockpit to fly to a satellite": "Saia da cabine para voar atĂ© um satĂ©lite", + "Exit cockpit to frame contacts": "Saia da cabine para enquadrar contatos", + "Visible map targets": "Alvos visĂ­veis no mapa", + "Focusing {label}": "Focando {label}", + "Source": "Fonte", + "Camera ownership changed": "O controle da cĂąmera mudou", + "Saved project could not be read; storage preserved. Import a valid file to resume saving.": "NĂŁo foi possĂ­vel ler o projeto salvo; o armazenamento foi preservado. Importe um arquivo vĂĄlido para voltar a salvar.", + "Ready": "Pronto", + "Scene layer turned off": "Camada da cena desativada", + "Stopped": "Parado", + "Scene not saved — existing saved project could not be read. Export edits or import a valid file.": "Cena nĂŁo salva — nĂŁo foi possĂ­vel ler o projeto salvo. Exporte as alteraçÔes ou importe um arquivo vĂĄlido.", + "Scene not saved — {reason}": "Cena nĂŁo salva — {reason}", + "Scene not saved — browser storage unavailable": "Cena nĂŁo salva — armazenamento do navegador indisponĂ­vel", + "Loaded: {scene} / {shot}": "Carregado: {scene} / {shot}", + "Cannot update {scene}: shot inventory changed": "NĂŁo Ă© possĂ­vel atualizar {scene}: o inventĂĄrio de planos mudou", + "Cannot update {scene}: evidence beats changed": "NĂŁo Ă© possĂ­vel atualizar {scene}: os momentos de evidĂȘncia mudaram", + "Cannot update {scene}: shot bindings are incomplete": "NĂŁo Ă© possĂ­vel atualizar {scene}: os vĂ­nculos dos planos estĂŁo incompletos", + "Updated {count} shots: {scene}": { + "one": "{count} plano atualizado: {scene}", + "many": "{count} de planos atualizados: {scene}", + "other": "{count} planos atualizados: {scene}" + }, + "Appended {count} shots: {scene}": { + "one": "{count} plano adicionado: {scene}", + "many": "{count} de planos adicionados: {scene}", + "other": "{count} planos adicionados: {scene}" + }, + "Cannot capture shot: camera not ready": "NĂŁo foi possĂ­vel capturar o plano: a cĂąmera nĂŁo estĂĄ pronta", + "Captured: {scene} / {shot}": "Capturado: {scene} / {shot}", + "Select a shot first": "Selecione um plano primeiro", + "Updated: {scene} / {shot}": "Atualizado: {scene} / {shot}", + "Could not leave scene: {scene}": "NĂŁo foi possĂ­vel sair da cena: {scene}", + "Seeked: {scene} / {shot}": "Posicionado em: {scene} / {shot}", + "Seeking scene clock": "Movendo o relĂłgio da cena", + "Camera unavailable — exit cockpit first": "CĂąmera indisponĂ­vel — saia da cabine primeiro", + "No shots to run": "Nenhum plano para executar", + "Scene transition limit reached — load a shot to reset": "Limite de transiçÔes de cena atingido — carregue um plano para redefinir", + "Export failed: {error}": "Falha na exportação: {error}", + "Project exported": "Projeto exportado", + "Importing project": "Importando projeto", + "Imported {file}": "Importado: {file}", + "Import failed: {error}": "Falha na importação: {error}", + "Import failed (could not read JSON file)": "Falha na importação (nĂŁo foi possĂ­vel ler o arquivo JSON)", + "Layers refused: {layers}": "Camadas recusadas: {layers}", + "Could not exit {mode} — scene layers may be refused": "NĂŁo foi possĂ­vel sair de {mode} — as camadas da cena podem ser recusadas", + "Camera move interrupted": "Movimento de cĂąmera interrompido", + "Scene media timed out": "A mĂ­dia da cena excedeu o tempo limite", + "Action complete": "Ação concluĂ­da", + "Action unavailable or cancelled": "Ação indisponĂ­vel ou cancelada", + "Scene actions": "AçÔes da cena", + "Select a feature or use Tab and Enter to choose an action.": "Selecione um elemento ou use Tab e Enter para escolher uma ação.", + "Selected feature: {feature}. Choose an action.": "Elemento selecionado: {feature}. Escolha uma ação.", + "Running {index}/{total}: {scene} / {shot}": "Executando {index}/{total}: {scene} / {shot}", + "Scene run complete": "Execução da cena concluĂ­da", + "Bhote Koshi Evidence Sequence": "SequĂȘncia de evidĂȘncias do Bhote Koshi", + "Nepal Flood Incident": "Incidente de inundação no Nepal", + "Global Flights Radar": "Radar global de voos", + "Orbital Watch": "VigilĂąncia orbital", + "Thermal Threat Board": "Painel de ameaças tĂ©rmicas", + "City Overload": "Sobrecarga urbana", + "Omniscience Pullback": "Recuo da onisciĂȘncia", + "Global Incident Context": "Contexto global do incidente", + "Nepal-Focused Globe Rotation": "Rotação do globo atĂ© o Nepal", + "Bhote Koshi Regional Approach": "Aproximação regional ao Bhote Koshi", + "Bhote Koshi Nearby Cities": "Cidades prĂłximas ao Bhote Koshi", + "Bhote Koshi Incident Corridor": "Corredor do incidente do Bhote Koshi", + "Bhote Koshi Flood Path": "Percurso da inundação do Bhote Koshi", + "Bhote Koshi Corridor Overview": "VisĂŁo geral do corredor do Bhote Koshi", + "Bhote Koshi Upper Valley": "Vale superior do Bhote Koshi", + "Upper Valley Collapse": "Colapso no vale superior", + "Debris-Dammed Lake": "Lago represado por detritos", + "Nepal-China Border Gate": "Posto de fronteira Nepal-China", + "Timure Evidence Cluster": "Grupo de evidĂȘncias de Timure", + "Syabru Besi Passage": "Passagem por Syabru Besi", + "Bidur / Trishuli Consequence": "ConsequĂȘncias em Bidur / Trishuli", + "Final view": "Vista final", + "Scene {n}": "Cena {n}", + "Shot {n}": "Plano {n}", + "the title of scene {scene} is empty or longer than {max} characters": "o tĂ­tulo da cena {scene} estĂĄ vazio ou passa de {max} caracteres", + "the title of shot {shot} in scene {scene} is empty or longer than {max} characters": "o tĂ­tulo do plano {shot} da cena {scene} estĂĄ vazio ou passa de {max} caracteres", + "the project is larger than 5 MiB": "o projeto tem mais de 5 MiB", + "the project has too many shots": "o projeto tem planos demais", + "the scene data failed validation": "os dados da cena nĂŁo passaram na validação", + "Could not complete this action. Check the file, references and selected assets.": "NĂŁo foi possĂ­vel concluir esta ação. Verifique o arquivo, as referĂȘncias e os recursos selecionados.", + "{count} scenes": { + "one": "{count} cena", + "many": "{count} de cenas", + "other": "{count} cenas" + }, + "{count} shots": { + "one": "{count} plano", + "many": "{count} de planos", + "other": "{count} planos" + }, + "{count} data packs": { + "one": "{count} pacote de dados", + "many": "{count} de pacotes de dados", + "other": "{count} pacotes de dados" + }, + "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}": "{scene} / {pack}: {status}. Arquivo: {path}. {attribution} · {license}", + "Unavailable layers: {layers}": "Camadas indisponĂ­veis: {layers}", + "Uses registered content or linked media. Those external files are not included in a scene bundle. Their original notices still apply.": "Usa conteĂșdo registrado ou mĂ­dia vinculada. Esses arquivos externos nĂŁo sĂŁo incluĂ­dos no pacote da cena. Os avisos originais deles continuam valendo.", + "{bytes} bundled bytes verified. Files stay in memory for this session. Reimport the bundle after reloading the app.": "{bytes} bytes do pacote verificados. Os arquivos ficam na memĂłria durante esta sessĂŁo. Importe o pacote de novo depois de recarregar o app.", + "Review scene import": "Revisar a importação da cena", + "Nothing is loaded or changed until you apply this file.": "Nada Ă© carregado nem alterado atĂ© vocĂȘ aplicar este arquivo.", + "Ready to import": "Pronto para importar", + "Apply replaces the current project. Export your current project first if you want to keep both.": "Aplicar substitui o projeto atual. Exporte o projeto atual primeiro se quiser manter os dois.", + "Apply import": "Aplicar importação", + "Import was not applied. The current project may have changed.": "A importação nĂŁo foi aplicada. O projeto atual pode ter mudado.", + "Select a scene and shot first": "Selecione uma cena e um plano primeiro", + "Edit scene details": "Editar os detalhes da cena", + "Camera positions use degrees and meters above the ellipsoid. Drafts are validated before they replace your saved scene.": "As posiçÔes da cĂąmera usam graus e metros acima do elipsoide. Os rascunhos sĂŁo validados antes de substituir a cena salva.", + "Anchors and data packs": "Âncoras e pacotes de dados", + "Shot camera, timing, packs and actions": "CĂąmera, tempos, pacotes e açÔes do plano", + "New anchor ID": "ID da nova Ăąncora", + "Capture camera as anchor": "Capturar a cĂąmera como Ăąncora", + "Anchor added to draft": "Âncora adicionada ao rascunho", + "Set move start to current camera": "Usar a cĂąmera atual como inĂ­cio do movimento", + "Move added to draft; destination remains the shot camera": "Movimento adicionado ao rascunho; o destino continua sendo a cĂąmera do plano", + "Use ordinary flight": "Usar voo comum", + "Invalid shot JSON": "JSON de plano invĂĄlido", + "Apply details": "Aplicar detalhes", + "Select a scene first": "Selecione uma cena primeiro", + "Share selected scene": "Compartilhar a cena selecionada", + "Scene JSON preserves authored settings and attribution. It does not include asset files. Bundles include only pack files you choose here or previously imported bundle files.": "O JSON da cena preserva as configuraçÔes do autor e a atribuição. Ele nĂŁo inclui arquivos de recursos. Os pacotes incluem sĂł os arquivos de pacotes de dados que vocĂȘ escolher aqui ou os arquivos de pacotes importados antes.", + "Download scene JSON": "Baixar JSON da cena", + "Choose data-pack files": "Escolher arquivos do pacote de dados", + "Or choose a data-pack folder": "Ou escolha uma pasta de pacote de dados", + "Download asset bundle": "Baixar pacote de recursos", + "Asset bundle downloaded": "Pacote de recursos baixado", + "No RTL-SDR device selected": "Nenhum dispositivo RTL-SDR selecionado", + "WebUSB requires desktop Chrome or Edge on localhost/HTTPS": "O WebUSB requer Chrome ou Edge para desktop em localhost/HTTPS", + "RTL-SDR access failed; close other SDR apps and check USB permissions": "Falha ao acessar o RTL-SDR; feche outros apps de SDR e verifique as permissĂ”es USB", + "RTL-SDR connection failed": "Falha na conexĂŁo com o RTL-SDR", + "Receiving 1090 MHz ADS-B": "Recebendo ADS-B em 1090 MHz", + "Receiving broadcast FM": "Recebendo rĂĄdio FM", + "Connect an RTL-SDR to begin.": "Conecte um RTL-SDR para começar.", + "WebUSB is unavailable in this browser": "O WebUSB nĂŁo estĂĄ disponĂ­vel neste navegador", + "USB work abandoned after a stalled transfer": "Operação USB abandonada apĂłs uma transferĂȘncia travada", + "SDR decoder worker failed": "Falha no processo do decodificador SDR", + "SDR decoder did not start; receiver stopped": "O decodificador SDR nĂŁo iniciou; receptor parado", + "SDR decoder stopped responding; receiver stopped": "O decodificador SDR parou de responder; receptor parado", + "SDR decoder fell behind; receiver stopped": "O decodificador SDR nĂŁo acompanhou os dados recebidos; receptor parado", + "WebUSB requires desktop Chrome or Edge": "O WebUSB requer Chrome ou Edge para desktop", + "Waiting for an RTL-SDR device
": "Aguardando um dispositivo RTL-SDR
", + "Browser audio is suspended; press Connect again to resume it": "O ĂĄudio do navegador estĂĄ suspenso; pressione Conectar de novo para retomĂĄ-lo", + "RTL-SDR sample stream stopped": "Fluxo de amostras do RTL-SDR parado", + "Switching to {mode}
": "Mudando para {mode}
", + "Browser audio is suspended; select FM again to resume it": "O ĂĄudio do navegador estĂĄ suspenso; selecione FM de novo para retomĂĄ-lo", + "RTL-SDR gain change failed": "NĂŁo foi possĂ­vel mudar o ganho do RTL-SDR", + "Tuned to {mhz} MHz FM": "Sintonizado em {mhz} MHz FM", + "Seeking up
": "Buscando para cima
", + "Seeking down
": "Buscando para baixo
", + "Seek stopped": "Busca parada", + "Scanning {mhz} MHz
": "Varrendo {mhz} MHz
", + "Found {mhz} MHz · {snr} dB": "Encontrado {mhz} MHz · {snr} dB", + "FM signal found at {mhz} MHz": "Sinal FM encontrado em {mhz} MHz", + "No FM signal found": "Nenhum sinal FM encontrado", + "Browser location is unavailable": "A localização do navegador nĂŁo estĂĄ disponĂ­vel", + "Receiver location was not granted": "A permissĂŁo de localização do receptor nĂŁo foi concedida", + "RTL-SDR disconnected": "RTL-SDR desconectado", + "Upstream response too large": "Resposta da origem grande demais", + "Vector tile request timed out": "A requisição de blocos vetoriais excedeu o tempo limite", + "Vector tiles unavailable": "Blocos vetoriais indisponĂ­veis", + "Vector tile metadata unavailable": "Metadados dos blocos vetoriais indisponĂ­veis", + "Zoom in for vector tile coverage": "Aproxime o zoom para carregar os blocos vetoriais", + "Saturation": "Saturação", + "Edge Thickness": "Espessura das bordas", + "Contrast": "Contraste", + "Grain": "Granulação", + "Vignette": "Vinheta", + "Pixelation": "Pixelização", + "Distortion": "Distorção", + "Instability": "Instabilidade", + "Density": "Densidade", + "Gain": "Ganho", + "Bloom": "Bloom", + "Scanlines": "Linhas de varredura", + "Sensitivity": "Sensibilidade", + "WHOT/BHOT": "WHOT/BHOT", + "Ironbow": "Ironbow", + "unsaved CCTV calibration": "a calibração de CCTV nĂŁo salva", + "the open cockpit": "a cabine aberta", + "Switching language reloads the page. This will be lost: {items}. Switch anyway?": "Mudar de idioma recarrega a pĂĄgina. Isto serĂĄ perdido: {items}. Mudar mesmo assim?", + "VISUAL PRESETS": "PREDEF. VISUAIS", + "LOCATION": "LOCAL", + "CONTACTS — nearest planes · vessels · sites": "CONTATOS — aviĂ”es · embarcaçÔes · locais mais prĂłximos", + "SPACE MISSIONS — launches & orbital assets": "MISSÕES ESPACIAIS — lançamentos e ativos orbitais", + "LIVE SIGNALS": "SINAIS AO VIVO", + "Contacts could not complete the requested transition; try again": "Contatos: nĂŁo foi possĂ­vel concluir a transição solicitada; tente novamente", + "CCTV layer unavailable": "Camada de CCTV indisponĂ­vel", + "Link shared": "Link compartilhado", + "Link copied!": "Link copiado!", + "Copy failed": "Falha ao copiar", + "Return map to straight-down view": "Voltar o mapa Ă  vista de cima", + "Tilt map to oblique view": "Inclinar o mapa para uma vista oblĂ­qua", + "Reset map to north up. Current heading {heading} degrees": "Orientar o mapa com o norte para cima. Orientação atual: {heading} graus", + "Tilted view": "Vista inclinada", + "Straight-down view": "Vista de cima", + "North up": "Norte para cima", + "CCTV calibration saved": "Calibração do CCTV salva", + "HDG": "HDG", + "PITCH": "INCL.", + "FOV": "FOV", + "RANGE": "RANGE", + "HGT": "ALT.", + "ΔN": "ΔN", + "ΔE": "ΔL", + "{value}m": "{value} m", + "CCTV calibration reset": "Calibração do CCTV redefinida", + "ADJUST ON": "AJUSTE LIGADO", + "ADJUST": "AJUSTAR", + "SNAPSHOT": "SNAPSHOT", + "LIVE": "AO VIVO", + "UPSTREAM": "ORIGEM", + "SYNTHETIC": "SINTÉTICO", + "CONFIGURED": "CONFIGURADO", + "SEED": "CATÁLOGO", + "UNKNOWN": "DESCONHECIDO", + "OK": "OK", + "ERROR": "ERRO", + "Live HLS connected": "HLS ao vivo conectado", + "Live HLS unavailable": "HLS ao vivo indisponĂ­vel", + "No stream URL configured": "Nenhuma URL de stream configurada", + "Live stream connected": "Stream ao vivo conectado", + "Snapshot feed connected": "Feed de snapshots conectado", + "Media fetch failed": "Falha ao obter a mĂ­dia", + "Upstream snapshot active": "Snapshot da origem ativo", + "Fallback Street View frame": "Quadro alternativo do Street View", + "Upstream unavailable": "Origem indisponĂ­vel", + "No source configured": "Nenhuma fonte configurada", + "Configured source": "Fonte configurada", + "Configured Source": "Fonte configurada", + "Synthetic fallback": "Alternativa sintĂ©tica", + "Upstream HTTP {status}": "Origem: HTTP {status}", + "Unexpected media type {type}": "Tipo de mĂ­dia inesperado: {type}", + "SOURCE · UNKNOWN": "FONTE · DESCONHECIDA", + "FRAME · LOADING": "QUADRO · CARREGANDO", + "FRAME · UNAVAILABLE": "QUADRO · INDISPONÍVEL", + "CALIBRATED": "CALIBRADA", + "CURATED": "COM CURADORIA", + "RAW PRIOR": "ESTIMATIVA BRUTA", + "CCTV ON": "CCTV LIGADO", + "CCTV OFF": "CCTV DESLIG.", + "VIEWSHED ON": "ÁREA VISÍVEL LIGADA", + "COVERAGE ON": "COBERTURA LIGADA", + "COVERAGE OFF": "COBERTURA DESLIG.", + "AUTO HOP ON": "TROCA AUTO. LIGADA", + "AUTO HOP OFF": "TROCA AUTO. DESLIG.", + "PROJECTION ON": "PROJEÇÃO LIGADA", + "PROJECTION OFF": "PROJEÇÃO DESLIG.", + "CAL · EDITED (UNSAVED)": "CAL · EDITADA (NÃO SALVA)", + "CAL · {badge}": "CAL · {badge}", + "MONITOR": "MONITOR", + "OFF": "INATIVO", + "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · RANGE {range} m · {projection}{calBadge} · {provider}{status}", + "{count} cameras loaded · click a camera to activate": { + "one": "{count} cĂąmera carregada · clique em uma cĂąmera para ativar", + "many": "{count} de cĂąmeras carregadas · clique em uma cĂąmera para ativar", + "other": "{count} cĂąmeras carregadas · clique em uma cĂąmera para ativar" + }, + "{count} cameras loaded · enable CCTV to activate": { + "one": "{count} cĂąmera carregada · ative o CCTV para usar", + "many": "{count} de cĂąmeras carregadas · ative o CCTV para usar", + "other": "{count} cĂąmeras carregadas · ative o CCTV para usar" + }, + "{count} more cameras outside this view · pan or zoom out": { + "one": "Mais {count} cĂąmera fora desta vista · mova ou afaste o zoom", + "many": "Mais {count} de cĂąmeras fora desta vista · mova ou afaste o zoom", + "other": "Mais {count} cĂąmeras fora desta vista · mova ou afaste o zoom" + }, + "Enable CCTV to load camera intersections": "Ative o CCTV para carregar os cruzamentos com cĂąmeras", + "Enable CCTV to start camera-linked intelligence summaries.": "Ative o CCTV para iniciar resumos de inteligĂȘncia vinculados Ă s cĂąmeras.", + "No summary available.": "Nenhum resumo disponĂ­vel.", + "loading frames": "carregando quadros", + "camera grid ready": "grade de cĂąmeras pronta", + "Clearing selected data layers": "Limpando camadas de dados selecionadas", + "Clear selected data layers": "Limpar camadas de dados selecionadas", + "CONDITIONS UNKNOWN": "CONDIÇÕES DESCONHECIDAS", + "CLEAR": "CÉU LIMPO", + "PARTLY CLOUDY": "PARCIALMENTE NUBLADO", + "OVERCAST": "ENCOBERTO", + "FOG": "NEVOEIRO", + "DRIZZLE": "GAROA", + "RAIN": "CHUVA", + "RAIN SHOWERS": "PANCADAS DE CHUVA", + "SNOW SHOWERS": "PANCADAS DE NEVE", + "THUNDERSTORM": "TROVOADA", + "MIXED CONDITIONS": "CONDIÇÕES MISTAS", + "CYCLE ON": "CICLO LIGADO", + "CYCLE OFF": "CICLO DESLIG.", + "Stop automatic page cycling. Previous, Next, and the SIG/NEWS/LOCAL tabs stay available.": "Parar a rotação automĂĄtica de pĂĄginas. Anterior, PrĂłxima e as abas SIG/NOTÍCIAS/LOCAL continuam disponĂ­veis.", + "Cycle briefing pages automatically every 9 seconds (Signals → News → Local). Pauses while you hover or focus the panel. Live signal data refreshes continuously either way.": "Alternar as pĂĄginas do briefing automaticamente a cada 9 segundos (Sinais → NotĂ­cias → Local). A alternĂąncia pausa enquanto vocĂȘ passa o mouse ou foca o painel. Os dados de sinais ao vivo continuam sendo atualizados de qualquer forma.", + "ACQUIRING REGIONAL NEWS": "OBTENDO NOTÍCIAS DA ÁREA", + "REGIONAL NEWS UNAVAILABLE": "NOTÍCIAS DA ÁREA INDISPONÍVEIS", + "RESOLVING REGION": "IDENTIFICANDO REGIÃO", + "REGION UNAVAILABLE": "REGIÃO INDISPONÍVEL", + "NO RECENT LOCATION MATCHES": "NENHUMA CORRESPONDÊNCIA RECENTE COM O LOCAL", + "{domain} · {age}": "{domain} · {age}", + "{value} KM/H": "{value} KM/H", + "CLOUD {pct}%": "NUVENS {pct}%", + "CLOUD UNKNOWN": "NEBULOSIDADE DESCONHECIDA", + "{source} · LOCATION QUERY": "{source} · CONSULTA POR LOCAL", + "REGIONAL NEWS": "NOTÍCIAS DA ÁREA", + "{label} · {radius} AIR/SEA WINDOW": "{label} · AR/MAR {radius}", + "{scope} · INSTALLATIONS {coverage}": "{scope} · INSTALAÇÕES: {coverage}", + "CONTEXT STANDBY": "CONTEXTO EM ESPERA", + "ENABLE GLOBAL CONTEXT FOR PROXIMITY PINGS": "ATIVE O CONTEXTO GLOBAL PARA PINGS DE PROXIMIDADE", + "CONTACT LOST · LAST KNOWN READOUT · NOT AN ALL-CLEAR": "CONTATO PERDIDO · ÚLTIMA LEITURA CONHECIDA · NÃO GARANTE SEGURANÇA", + "CONTACT LOST · {subject}": "CONTATO PERDIDO · {subject}", + "SUBJECT LEFT ITS FEED · READOUT HOLDING LAST KNOWN": "ALVO SAIU DO FEED · LEITURA MANTIDA NO ÚLTIMO VALOR CONHECIDO", + "{cohort} · {contact}": "{cohort} · {contact}", + "NO AVAILABLE EXAMPLE": "NENHUM EXEMPLO DISPONÍVEL", + "{cohort}, Unavailable": "{cohort}, indisponĂ­vel", + "AHEAD": "À FRENTE", + "{side} {angle}": "{side} {angle}", + "L": "E", + "R": "D", + "{count} INPUTS UNKNOWN · NOT AN ALL-CLEAR": { + "one": "{count} ENTRADA DESCONHECIDA · NÃO GARANTE SEGURANÇA", + "many": "{count} DE ENTRADAS DESCONHECIDAS · NÃO GARANTE SEGURANÇA", + "other": "{count} ENTRADAS DESCONHECIDAS · NÃO GARANTE SEGURANÇA" + }, + "AVAILABLE INPUTS CURRENT · NOT AN ALL-CLEAR": "ENTRADAS DISPONÍVEIS ATUALIZADAS · NÃO GARANTE SEGURANÇA", + "SQUAWK {code} · {status}": "SQUAWK {code} · {status}", + "ADS-B PRIORITY · {status}": "PRIORIDADE ADS-B · {status}", + "ADS-B EMERGENCY · {status}": "EMERGÊNCIA ADS-B · {status}", + "AIRCRAFT": "AERONAVE", + "ACQUIRING SURFACE": "CARREGANDO SUPERFÍCIE", + "SURFACE FALLBACK": "SUPERFÍCIE ALTERNATIVA", + "STALE FEED": "FEED DESATUALIZADO", + "LIVE TRACK": "RASTRO AO VIVO", + "COMMERCIAL": "COMERCIAL", + "{aircraftClass} · {emergency} · {feedState}": "{aircraftClass} · {emergency} · {feedState}", + "{aircraftClass} · {feedState} · COURSE ALIGNED": "{aircraftClass} · {feedState} · CURSO ALINHADO", + "ARROW · ESTIMATED DIRECTION": "SETA · DIREÇÃO ESTIMADA", + "ROUTE DATA UNAVAILABLE": "DADOS DE ROTA INDISPONÍVEIS", + "DEST {bearing}": "DEST {bearing}", + "Disable cockpit weather effects": "Desativar efeitos de clima na cabine", + "Enable cockpit weather effects": "Ativar efeitos de clima na cabine", + "ON": "ATIVO", + "Normal": "Normal", + "Night vision": "VisĂŁo noturna", + "Thermal": "TĂ©rmico", + "Anime": "Anime", + "Noir": "Noir", + "Current cockpit vision style: {style}. Activate for next style.": "Estilo atual de visĂŁo da cabine: {style}. Ative para o prĂłximo estilo.", + "Current style: {style} — click for next": "Estilo atual: {style} — clique para o prĂłximo", + "Collapse Contact panel": "Recolher painel de contato", + "Expand Contact panel": "Expandir painel de contato", + "Collapse contact panel": "Recolher painel de contato", + "Expand contact panel": "Expandir painel de contato", + "Collapse cockpit briefing panel": "Recolher painel de briefing da cabine", + "Expand cockpit briefing panel": "Expandir painel de briefing da cabine", + "Collapse briefing panel": "Recolher painel de briefing", + "Expand briefing panel": "Expandir painel de briefing", + "OBSERVED / MAPPED PINGS": "PINGS OBSERVADOS / MAPEADOS", + "SOURCE-BACKED EVENTS · NO SYNTHETIC NEWS": "EVENTOS COM FONTE · SEM NOTÍCIAS SINTÉTICAS", + "LATEST LOCATION-MATCHED REPORTING": "ÚLTIMAS NOTÍCIAS DO LOCAL", + "{source} · LOCATION QUERY · RECENT": "{source} · CONSULTA POR LOCAL · RECENTE", + "LOCAL INFO": "INFO LOCAL", + "PLACE / CONDITIONS / POSITION": "LUGAR / CONDIÇÕES / POSIÇÃO", + "TIME UNKNOWN": "HORA DESCONHECIDA", + "{count}M AGO": "HÁ {count} MIN", + "{count}H AGO": "HÁ {count} H", + "{count}D AGO": "HÁ {count} D", + "DIR UNKNOWN": "DIR DESCONHECIDA", + "Select flight {title}": "Selecionar voo {title}", + "{aircraftClass} · CURRENT": "{aircraftClass} · ATUAL", + "MILITARY FLIGHT": "VOO MILITAR", + "COMMERCIAL FLIGHT": "VOO COMERCIAL", + "{aircraftClass} · {distance}": "{aircraftClass} · {distance}", + "DISTANCE UNKNOWN": "DISTÂNCIA DESCONHECIDA", + "{count} INPUTS UNKNOWN": { + "one": "{count} ENTRADA DESCONHECIDA", + "many": "{count} DE ENTRADAS DESCONHECIDAS", + "other": "{count} ENTRADAS DESCONHECIDAS" + }, + "SOURCE STATUS UNAVAILABLE": "STATUS DA FONTE INDISPONÍVEL", + "Restore real aircraft": "Restaurar a aeronave real", + "Reclassify as TR-3B": "Reclassificar como TR-3B", + "TRACK ACQUIRED": "RASTRO ADQUIRIDO", + "{label} · COURSE {heading}°": "{label} · CURSO {heading}°", + "Context could not restore every layer; try again": "O contexto nĂŁo conseguiu restaurar todas as camadas; tente novamente", + "No selected data layers": "Nenhuma camada de dados selecionada", + "{count} data layers could not be cleared": { + "one": "NĂŁo foi possĂ­vel limpar {count} camada de dados", + "many": "NĂŁo foi possĂ­vel limpar {count} de camadas de dados", + "other": "NĂŁo foi possĂ­vel limpar {count} camadas de dados" + }, + "Cleared {count} data layers": { + "one": "{count} camada de dados limpa", + "many": "{count} de camadas de dados limpas", + "other": "{count} camadas de dados limpas" + }, + "Selected data layers could not be cleared": "NĂŁo foi possĂ­vel limpar as camadas de dados selecionadas", + "Space Missions could not complete the requested transition; try again": "MissĂ”es espaciais: nĂŁo foi possĂ­vel concluir a transição solicitada; tente novamente", + "Nearby installations refreshed": "InstalaçÔes prĂłximas atualizadas", + "Nearby installations could not be refreshed; try again": "NĂŁo foi possĂ­vel atualizar as instalaçÔes prĂłximas; tente novamente", + "Space Missions cancellation could not restore the previous layer state": "O cancelamento de MissĂ”es espaciais nĂŁo conseguiu restaurar o estado anterior das camadas", + "That layer is unavailable in the current Context mode": "Essa camada nĂŁo estĂĄ disponĂ­vel no modo de contexto atual", + "{layerId} could not {action} cleanly": "NĂŁo foi possĂ­vel {action} {layerId} corretamente", + "start": "iniciar", + "stop": "parar", + "{mode} could not start because another layer did not stop cleanly": "NĂŁo foi possĂ­vel iniciar {mode} porque outra camada nĂŁo parou corretamente", + "Space Missions": "MissĂ”es espaciais", + "Context": "Contexto", + "Rendered globe frames per second · toggle with `": "Quadros por segundo renderizados do globo · alterne com `", + "imported map files": "os arquivos importados no mapa", + "Ground heights could not be refreshed. Try the file again when the map has loaded.": "NĂŁo foi possĂ­vel atualizar as altitudes do terreno. Tente o arquivo de novo quando o mapa tiver carregado.", + "{count} map objects": { + "one": "{count} objeto no mapa", + "many": "{count} de objetos no mapa", + "other": "{count} objetos no mapa" + }, + ", drawn with its own styles": ", desenhado com os prĂłprios estilos", + "Hide {name}": "Ocultar {name}", + "Show {name}": "Mostrar {name}", + "Fly to {name}": "Voar atĂ© {name}", + "Remove {name}": "Remover {name}", + "At most {count} files at once — remove one first.": "No mĂĄximo {count} arquivos de cada vez — remova um primeiro.", + "Reading {name}
": "Lendo {name}
", + "That file could not be read.": "NĂŁo foi possĂ­vel ler esse arquivo.", + "Added {count} files.": { + "one": "{count} arquivo adicionado.", + "many": "{count} de arquivos adicionados.", + "other": "{count} arquivos adicionados." + }, + "{count} files could not be added ({name}: {error})": { + "one": "NĂŁo foi possĂ­vel adicionar {count} arquivo ({name}: {error})", + "many": "NĂŁo foi possĂ­vel adicionar {count} de arquivos ({name}: {error})", + "other": "NĂŁo foi possĂ­vel adicionar {count} arquivos ({name}: {error})" + }, + "Some KML content was left out.": "Parte do conteĂșdo KML foi deixada de fora.", + "Press on the ground, not the sky": "Pressione no chĂŁo, nĂŁo no cĂ©u", + "Drag to size the box": "Arraste para definir o tamanho da ĂĄrea", + "light {source} to use your {name} key": "ative {source} para usar sua chave do {name}", + "light {source}": "ative {source}", + ", or ": ", ou ", + "{requirement}, or {offer}": "{requirement}, ou {offer}", + "Live Flights": "Voos ao vivo", + "Military Flights": "Voos militares", + "Earthquakes (24h)": "Terremotos (24 h)", + "Satellites": "SatĂ©lites", + "Space Missions (30d)": "MissĂ”es espaciais (30 d)", + "Street Traffic": "TrĂąnsito urbano", + "CCTV": "CCTV", + "Radio": "RĂĄdio", + "Bikeshare": "Bicicletas compartilhadas", + "Live AIS Vessels": "EmbarcaçÔes AIS ao vivo", + "Mapped Installations": "InstalaçÔes mapeadas", + "Global Context": "Contexto global", + "Datacenters": "Data centers", + "Dams": "Barragens", + "Submarine Cables": "Cabos submarinos", + "FIRMS Active Fires": "IncĂȘndios ativos FIRMS", + "Local ADS-B": "ADS-B local", + "Transit": "Transporte pĂșblico", + "Recent Imagery": "Imagens recentes", + "Fire Perimeters": "PerĂ­metros de incĂȘndios", + "GNSS Integrity": "Integridade GNSS", + "S2 GhostMaps": "S2 GhostMaps", + "Rain radar": "Radar de chuva", + "Lightning density": "Densidade de raios", + "Cyclone advisories": "Boletins de ciclones", + "ALPR Cameras": "CĂąmeras ALPR", + "Live Vessels": "EmbarcaçÔes ao vivo", + "Bike Share": "Bicicletas compartilhadas", + "Cameras": "CĂąmeras", + "Street Level": "NĂ­vel da rua", + "Mapped ALPR Cameras": "CĂąmeras ALPR mapeadas", + "Data Centers": "Data centers", + "Active Fires": "IncĂȘndios ativos", + "Military aircraft": "Aeronaves militares", + "Vessels": "EmbarcaçÔes", + "CCTV + Street View fallback": "CCTV + Street View como alternativa", + "OpenStreetMap + optional Google Maps Places": "OpenStreetMap + Google Maps Places opcional", + "GFS / ECMWF IFS · FORECAST": "GFS / ECMWF IFS · PREVISÃO", + "NOAA nowCOAST · OBSERVED": "NOAA nowCOAST · OBSERVADO", + "NASA FIRMS · LIVE": "NASA FIRMS · AO VIVO", + "OSM routing": "Rotas do OSM", + "data source|Local": "Dados locais", + "ENABLING": "ATIVANDO", + "DISABLING": "DESATIVANDO", + "Movement": "Movimento", + "Infrastructure": "Infraestrutura", + "Events": "Eventos", + "Weather": "Clima", + "Utilities": "UtilitĂĄrios", + "Other layers": "Outras camadas", + "{state} · {source}": "{state} · {source}", + "UNCERTAIN · {source} · lifecycle state requires reconciliation": "INCERTO · {source} · estado do ciclo de vida requer reconciliação", + "{state} · {source} · {detail} · retry {seconds}s": "{state} · {source} · {detail} · nova tentativa em {seconds} s", + "{state} · {source} · {detail}": "{state} · {source} · {detail}", + "never": "nunca", + "{source} · {loadingLabel}": "{source} · {loadingLabel}", + "{accepted} of {raw} records accepted": "{accepted} de {raw} registros aceitos", + "incomplete snapshot": "snapshot incompleto", + "{state} · {source} · {detail} · {ago}": "{state} · {source} · {detail} · {ago}", + "{state} · {source} · {ago} · retrying in {seconds}s": "{state} · {source} · {ago} · nova tentativa em {seconds} s", + "{state} · {source} · {ago}": "{state} · {source} · {ago}", + "{source} · {ago}": "{source} · {ago}", + "UNCERTAIN": "INCERTO", + "status chip|UNAVAILABLE": "INDISP.", + "Data source unavailable": "Fonte de dados indisponĂ­vel", + "{name}: {state}": "{name}: {state}", + "{count}s ago": "hĂĄ {count} s", + "Local FM stopped: internet radio started": "FM local parada: a rĂĄdio pela internet começou", + "IDLE": "EM ESPERA", + "CONNECTING": "CONECTANDO", + "TUNING": "SINTONIZANDO", + "STREAMING": "RECEBENDO", + "UNSUPPORTED": "NÃO SUPORTADO", + "idle": "em espera", + "running": "ativo", + "suspended": "suspenso", + "closed": "fechado", + "feed status|live": "ao vivo", + "feed status|stale": "desatualizado", + "feed status|unreachable": "inacessĂ­vel", + "feed status|invalid": "invĂĄlido", + "waiting for IQ": "aguardando IQ", + "{count} messages": { + "one": "{count} mensagem", + "many": "{count} de mensagens", + "other": "{count} mensagens" + }, + "DSP {count} blocks": { + "one": "DSP {count} bloco", + "many": "DSP {count} de blocos", + "other": "DSP {count} blocos" + }, + "DSP waiting": "DSP em espera", + "{level} dBFS audio": "ĂĄudio {level} dBFS", + "audio signal --": "sinal de ĂĄudio --", + "audio {state}": "ĂĄudio {state}", + "{count} HEARD": { + "one": "CAPTADAS: {count}", + "many": "CAPTADAS: {count}", + "other": "CAPTADAS: {count}" + }, + "DISCONNECT": "DESCONECTAR", + "CONNECT": "CONECTAR", + "LOCATING
": "LOCALIZANDO
", + "LOCATED": "LOCALIZADO", + "LOCATE": "LOCALIZAR", + " · read while Local ADS-B is on": " · lidos enquanto o ADS-B local estĂĄ ativo", + "Decoder feeds: {feeds}": "Feeds do decodificador: {feeds}", + "Language: {language}": "Idioma: {language}", + "Change the interface language": "Mudar o idioma da interface", + "Interface language": "Idioma da interface", + "Search languages": "Buscar idioma", + "No matching languages": "Nenhum idioma corresponde", + "📍 Location: --": "📍 Local: --", + "Landmark: --": "Ponto de referĂȘncia: --", + "Searched location": "Local pesquisado", + "ORBIT": "ORBITANDO", + "Location not found": "Local nĂŁo encontrado", + "Check the spelling and press Enter to search again.": "Verifique a grafia e pressione Enter para buscar de novo.", + "Search failed": "Falha na busca", + "Press Enter to try again.": "Pressione Enter para tentar novamente.", + "Detailed outline unavailable": "Contorno detalhado indisponĂ­vel", + "Fly to a POI first": "Voe atĂ© um ponto de interesse primeiro", + "Reset to full globe view": "Voltar Ă  vista do globo completo", + "Reset cockpit to full globe view": "Redefinir a cabine para a vista do globo completo", + "Resetting to full globe view": "Voltando Ă  vista do globo completo", + "Resetting cockpit to full globe view": "Redefinindo a cabine para a vista do globo completo", + "MAP": "MAPA", + "Layers": "Camadas", + "Search": "Buscar", + "More": "Mais", + "Panels": "PainĂ©is", + "panel": "painel", + "Expand {name}": "Expandir {name}", + "Collapse {name}": "Recolher {name}", + "Expand Radio": "Expandir rĂĄdio", + "Collapse Radio": "Recolher rĂĄdio", + "Expand Radio section": "Expandir seção de rĂĄdio", + "Collapse Radio section": "Recolher seção de rĂĄdio", + "Panel layout updated — positions reset to new defaults": "Layout dos painĂ©is atualizado — posiçÔes redefinidas para os novos padrĂ”es", + "Austin": "Austin", + "San Francisco": "SĂŁo Francisco", + "New York": "Nova York", + "Tokyo": "TĂłquio", + "London": "Londres", + "Paris": "Paris", + "Dubai": "Dubai", + "Washington DC": "Washington, D.C.", + "Tallinn": "Tallinn", + "Los Angeles": "Los Angeles", + "Collapse Cockpit display options": "Recolher opçÔes de exibição da cabine", + "Expand Cockpit display options": "Expandir opçÔes de exibição da cabine", + "Collapse Cockpit Radio controls": "Recolher controles de rĂĄdio da cabine", + "Expand Cockpit Radio controls": "Expandir controles de rĂĄdio da cabine", + "CH {index} / {total}": "CANAL {index} / {total}", + "NO STATIONS": "SEM ESTAÇÕES", + "NO STATION AVAILABLE": "NENHUMA ESTAÇÃO DISPONÍVEL", + "{name}, station {index} of {total}": "{name}, estação {index} de {total}", + "No station available": "Nenhuma estação disponĂ­vel", + "OFF AIR": "FORA DO AR", + "STATION UNAVAILABLE": "ESTAÇÃO INDISPONÍVEL", + "Station unavailable after directory refresh": "Estação indisponĂ­vel apĂłs atualizar o diretĂłrio", + "Radio could not {action} cleanly": "NĂŁo foi possĂ­vel {action} o rĂĄdio corretamente", + "SYNC": "SINC", + "RECONCILE": "RECONCILIAR", + "DISABLE": "DESATIVAR", + "ENABLE": "ATIVAR", + "Reconcile Radio — lifecycle uncertain": "Reconciliar rĂĄdio — ciclo de vida incerto", + "Disable Radio": "Desativar rĂĄdio", + "Enable Radio": "Ativar rĂĄdio", + "{category} ({count})": "{category} ({count})", + "DIRECTORY BAND": "BANDA DO DIRETÓRIO", + "{category} BAND": "BANDA {category}", + "NO STATION SELECTED": "NENHUMA ESTAÇÃO SELECIONADA", + "Directory metadata only": "Somente metadados do diretĂłrio", + "Loading station directory
": "Carregando diretĂłrio de estaçÔes
", + "Choose a globe marker or use next.": "Escolha um marcador no globo ou use PrĂłxima.", + "TAGS · {tags}": "TAGS · {tags}", + "Play": "Reproduzir", + "PAUSE": "PAUSAR", + "RESUME": "RETOMAR", + "PLAY": "OUVIR", + "selected": "selecionada", + "nearest": "mais prĂłxima", + "{action} {target} radio station": "{action} estação de rĂĄdio {target}", + "SYNCING": "SINCRONIZANDO", + "READY": "PRONTO", + "station": "estação", + " · stale/degraded directory": " · diretĂłrio desatualizado/degradado", + " · degraded directory": " · diretĂłrio degradado", + " · stale directory": " · diretĂłrio desatualizado", + " · outside current filter": " · fora do filtro atual", + "Ready — playback starts only from your action": "Pronto — a reprodução sĂł começa por ação sua", + "Radio off": "RĂĄdio desligado", + "Connecting directly to broadcaster
": "Conectando direto Ă  emissora
", + "Buffering broadcaster stream
": "Carregando o stream da emissora
", + "Playing {station}": "Reproduzindo {station}", + "Paused {station}": "Pausado: {station}", + "Broadcaster stream unavailable": "Stream da emissora indisponĂ­vel", + " · muted during voice interaction": " · silenciado durante a interação por voz", + " · restoring volume after voice": " · restaurando o volume apĂłs a voz", + " · static indicates no broadcaster audio": " · chiado indica ausĂȘncia de ĂĄudio da emissora", + " · tuning static until broadcaster starts": " · chiado de sintonia atĂ© a emissora iniciar", + "Station unavailable after directory refresh — choose another channel": "Estação indisponĂ­vel apĂłs atualizar o diretĂłrio — escolha outro canal", + "Radio is enabling
": "O rĂĄdio estĂĄ sendo ativado
", + "Radio is disabling
": "O rĂĄdio estĂĄ sendo desativado
", + "Radio lifecycle is uncertain — use Enable or Disable to reconcile": "O ciclo de vida do rĂĄdio Ă© incerto — use Ativar ou Desativar para reconciliar", + "Clear reading": "Limpar leitura", + "Earlier observation": "Observação anterior", + "Observed history": "HistĂłrico observado", + "Later observation": "Observação posterior", + "Latest": "Mais recente", + "Newest frame per product": "Quadro mais recente por produto", + "Replay observed history": "Reproduzir o histĂłrico observado", + "Imagery on Esri · Google 3D returns when cleared": "Imagens sobre o Esri · LIMPAR restaura o Google 3D", + "Point the camera at the ground to use the view": "Aponte a cĂąmera para o chĂŁo para usar a vista", + "That point cannot anchor a box": "Esse ponto nĂŁo pode ancorar uma ĂĄrea", + "Imagery stops at ±{limit}° latitude": "As imagens vĂŁo atĂ© ±{limit}° de latitude", + "{owner} is using the pointer — close it first": "A ferramenta \"{owner}\" estĂĄ usando o ponteiro — feche-a primeiro", + "Box is {size} wide · limit {limit}": "A ĂĄrea tem {size} de largura · limite {limit}", + "View is {size} wide · limit {limit}": "A vista tem {size} de largura · limite {limit}", + "VS BASEMAP": "VS MAPA BASE", + "A / B": "A / B", + "Newest low-cloud day for this box · scene cloud, not box cloud": "Dia mais recente com poucas nuvens para esta ĂĄrea · nuvens da cena, nĂŁo da ĂĄrea", + "Newest day covering this box · cloudier than 20%": "Dia mais recente que cobre esta ĂĄrea · mais de 20% de nuvens", + "Newest day with imagery for this box · partial coverage": "Dia mais recente com imagens para esta ĂĄrea · cobertura parcial", + "Newest daily overview for this box": "VisĂŁo geral diĂĄria mais recente para esta ĂĄrea", + "newest clear day": "dia limpo mais recente", + "newest day (cloudy)": "dia mais recente (nublado)", + "newest day (partial coverage)": "dia mais recente (cobertura parcial)", + "newest overview": "visĂŁo geral mais recente", + "No imagery": "Sem imagens", + "Loading": "Carregando", + "coverage|full": "completa", + "coverage|partial": "parcial", + "unknown": "desconhecida", + "no imagery": "sem imagens", + "{percent}% cloud": "{percent}% de nuvens", + "{min}–{max}% cloud": "{min}–{max}% de nuvens", + "NO BOX": "SEM ÁREA", + "SEARCHING": "BUSCANDO", + "{count} DAYS": { + "one": "{count} DIA", + "many": "{count} DE DIAS", + "other": "{count} DIAS" + }, + "Zoom in or draw a smaller box": "Aproxime o zoom ou desenhe uma ĂĄrea menor", + "Select a box or use the view": "Selecione uma ĂĄrea ou use a vista", + "Searching the last 30 days": "Buscando nos Ășltimos 30 dias", + "No days to show for this box": "Nenhum dia para mostrar nesta ĂĄrea", + "Drag the divider · SWAP trades sides": "Arraste o divisor · INVERTER troca os lados", + "← → preview · A or B pins the focused day": "← → prĂ©via · A ou B fixa o dia em foco", + "← → preview the other side · A or B pins it": "← → prĂ©via do outro lado · A ou B o fixa", + "S on another day replaces it · × unpins": "S em outro dia o substitui · × desafixa", + "← → preview · S shows the focused day": "← → prĂ©via · S mostra o dia em foco", + "ZOOM IN": "APROXIMAR", + "Fly in until the view fits the 1,000 km limit": "Aproxime atĂ© a vista caber no limite de 1.000 km", + "Imagery days, newest first · arrows move, S or A and B pin": "Dias com imagens, do mais recente · as setas movem, S ou A e B fixam", + "On the map": "No mapa", + "Mode": "Modo", + "Imagery opacity": "Opacidade das imagens", + "SWAP": "INVERTER", + "Trade the two sides of the divider": "Trocar os dois lados do divisor", + "SELECT BOX": "SELECIONAR", + "Drag a box on the map (Esc cancels)": "Arraste uma ĂĄrea no mapa (Esc cancela)", + "USE VIEW": "USAR VISTA", + "Use the current view as the box": "Usar a vista atual como ĂĄrea", + "Forget the box and its images": "Esquecer a ĂĄrea e suas imagens", + "START HERE": "COMECE AQUI", + "Checking": "Verificando", + "PREVIEW": "PRÉVIA", + "Newest day with imagery for this box": "Dia mais recente com imagens para esta ĂĄrea", + "SHOW": "MOSTRAR", + "Pin {day} as {slot}": "Fixar {day} como {slot}", + "Show {day}": "Mostrar {day}", + "pinned {slot}": "fixado em {slot}", + "shown": "exibido", + "preview": "prĂ©via", + "start here": "comece aqui", + "No box": "Sem ĂĄrea", + "Searching": "Buscando", + "Every day is empty here": "Todos os dias estĂŁo vazios aqui", + "Sources off": "Fontes desativadas", + "VS": "VS", + "Not set": "Sem imagem", + "Basemap": "Mapa base", + "Source off": "Fonte desativada", + "Unpin {slot}": "Desafixar {slot}", + "Unpin the image": "Desafixar a imagem", + "EXPORT {slot}": "EXP. {slot}", + "EXPORT": "EXPORTAR", + "Download {slot} as a PNG": "Baixar {slot} como PNG", + "Download the image as a PNG": "Baixar a imagem como PNG", + "Box {width} × {height} km": "Área de {width} × {height} km", + "Acquired {time}": "Adquirida em {time}", + "Coverage {coverage}": "Cobertura {coverage}", + "START HERE · {reason}": "COMECE AQUI · {reason}", + "Daily overview shows little detail in a box this small": "A visĂŁo geral diĂĄria mostra pouco detalhe em uma ĂĄrea tĂŁo pequena", + "Imagery: NASA GIBS and Worldview · HLS (Sentinel-2, Landsat 8/9) and VIIRS": "Imagens: NASA GIBS e Worldview · HLS (Sentinel-2, Landsat 8/9) e VIIRS", + "Details": "Detalhes", + "Times, coverage, sources": "HorĂĄrios, cobertura, fontes", + "HIDE EMPTY DAYS": "OCULTAR DIAS VAZIOS", + "SHOW EMPTY DAYS · {count}": "MOSTRAR DIAS VAZIOS · {count}", + "Days the probe found empty in this box": "Dias que a sondagem encontrou vazios nesta ĂĄrea", + "image": "imagem", + "BASEMAP": "MAPA BASE", + "The basemap": "O mapa base", + "basemap": "mapa base", + "Recent imagery against the basemap divider": "Divisor entre imagens recentes e o mapa base", + "Recent imagery A and B divider": "Divisor A e B de imagens recentes", + "{before} {left} percent, {after} {right} percent": "{before} {left} por cento, {after} {right} por cento", + "Export failed · {error}": "Falha na exportação · {error}", + "Scene action failed": "A ação da cena falhou", + "New scene name": "Nome da nova cena", + "Delete scene \"{scene}\" and all shots?": "Excluir a cena \"{scene}\" e todos os planos?", + "Delete shot \"{shot}\"?": "Excluir o plano \"{shot}\"?", + "Stopped (Esc)": "Parado (Esc)", + "SPARSE": "ESPARSO", + "BALANCED": "EQUILIBRADO", + "No shots yet. Use CAPTURE SHOT to save current look.": "Ainda nĂŁo hĂĄ planos. Use CAPTURAR PLANO para salvar o visual atual.", + "Double-click to rename": "Clique duplo para renomear", + "Shot name": "Nome do plano", + "LOAD": "CARREGAR", + "DEL": "EXCL.", + "{duration}s + {hold}s": "{duration} s + {hold} s", + "Choose files": "Escolher arquivos", + "{count} files selected": { + "one": "{count} arquivo selecionado", + "many": "{count} de arquivos selecionados", + "other": "{count} arquivos selecionados" + }, + "No file chosen": "Nenhum arquivo escolhido", + "Cancel": "Cancelar", + "EDIT DETAILS": "EDITAR DETALHES", + "SHARE SCENE": "COMPARTILHAR CENA", + "Shared flight follow expired": "O acompanhamento do voo compartilhado expirou", + "Shared military flight follow expired": "O acompanhamento do voo militar compartilhado expirou", + "Shared satellite follow expired": "O acompanhamento do satĂ©lite compartilhado expirou", + "Shared flight could not be restored — feed unavailable": "NĂŁo foi possĂ­vel restaurar o voo compartilhado — feed indisponĂ­vel", + "Shared military flight could not be restored — feed unavailable": "NĂŁo foi possĂ­vel restaurar o voo militar compartilhado — feed indisponĂ­vel", + "Shared satellite could not be restored — feed unavailable": "NĂŁo foi possĂ­vel restaurar o satĂ©lite compartilhado — feed indisponĂ­vel", + "Shared flight is unavailable": "O voo compartilhado estĂĄ indisponĂ­vel", + "Shared military flight is unavailable": "O voo militar compartilhado estĂĄ indisponĂ­vel", + "Shared satellite is unavailable": "O satĂ©lite compartilhado estĂĄ indisponĂ­vel", + "entity": "entidade", + "Shared {subject} follow expired": "O acompanhamento compartilhado de {subject} expirou", + "Shared {subject} could not be restored — feed unavailable": "NĂŁo foi possĂ­vel restaurar o compartilhamento de {subject} — feed indisponĂ­vel", + "Shared {subject} is unavailable": "O compartilhamento de {subject} estĂĄ indisponĂ­vel", + "{id} isn't reporting now — showing where it was last seen": "{id} nĂŁo estĂĄ transmitindo agora — mostrando onde foi visto pela Ășltima vez", + "{id} isn't reporting now — showing where it was at {time}": "{id} nĂŁo estĂĄ transmitindo agora — mostrando onde estava em {time}", + "This share link can't be opened": "NĂŁo Ă© possĂ­vel abrir este link de compartilhamento", + "Shared vessel is unavailable": "A embarcação compartilhada estĂĄ indisponĂ­vel", + "ACQUIRING": "ADQUIRINDO", + "SHARED {subject}": "COMPARTILHADO: {subject}", + "subject": "alvo", + "LOADING LIVE DATA": "CARREGANDO DADOS AO VIVO", + "LOAD COMPLETE": "CARREGAMENTO CONCLUÍDO", + "LOAD CANCELLED": "CARREGAMENTO CANCELADO", + "LOAD FAILED": "FALHA NO CARREGAMENTO", + "LIVE DATA OFF": "DADOS AO VIVO DESLIGADOS", + "MAPPED SITES LOADED": "LOCAIS MAPEADOS CARREGADOS", + "RETRYING MAPPED SITES": "BUSCANDO DE NOVO OS LOCAIS MAPEADOS", + "FETCHING MAPPED SITES": "BUSCANDO LOCAIS MAPEADOS", + "RETRYING ALPR CAMERAS": "BUSCANDO DE NOVO AS CÂMERAS ALPR", + "FETCHING ALPR CAMERAS": "BUSCANDO CÂMERAS ALPR", + "OVERPASS TEMPORARILY UNAVAILABLE": "OVERPASS TEMPORARIAMENTE INDISPONÍVEL", + "OVERPASS RATE-LIMITED": "OVERPASS: LIMITE DE REQUISIÇÕES ATINGIDO", + "OVERPASS TIMED OUT": "TEMPO ESGOTADO NO OVERPASS", + "OVERPASS COULD NOT COMPLETE THE QUERY": "OVERPASS NÃO CONSEGUIU CONCLUIR A CONSULTA", + "MAP TILES TEMPORARILY UNAVAILABLE": "BLOCOS DO MAPA TEMPORARIAMENTE INDISPONÍVEIS", + "MAPPED NAMES TEMPORARILY UNAVAILABLE": "NOMES MAPEADOS TEMPORARIAMENTE INDISPONÍVEIS", + "TURNING OFF LIVE DATA": "DESLIGANDO DADOS AO VIVO", + "REFRESHING LIVE DATA": "ATUALIZANDO DADOS AO VIVO", + "syncing road network": "sincronizando malha viĂĄria", + "retry pending": "nova tentativa pendente", + "retrying in {seconds}s": "nova tentativa em {seconds} s", + "ALPR cameras": "cĂąmeras ALPR", + "OpenSky OAuth client missing/invalid": "Cliente OAuth do OpenSky ausente ou invĂĄlido", + "OpenSky OAuth rejected credentials": "O OAuth do OpenSky recusou as credenciais", + "OpenSky username/password rejected": "O OpenSky recusou o usuĂĄrio ou a senha", + "OpenSky auth missing": "Falta a autenticação do OpenSky", + "OpenSky auth required": "O OpenSky exige autenticação", + "OpenSky auth invalid": "Autenticação do OpenSky invĂĄlida", + "OpenSky auth failed": "Falha na autenticação do OpenSky", + "KartaView answered HTTP {status}": "O KartaView respondeu HTTP {status}", + "Panoramax answered HTTP {status}": "O Panoramax respondeu HTTP {status}", + "KartaView refused the request (code {code})": "O KartaView recusou a requisição (cĂłdigo {code})", + "Vector tiles unavailable (HTTP {status})": "Blocos vetoriais indisponĂ­veis (HTTP {status})", + "GNSS feed unavailable (HTTP {status})": "Feed GNSS indisponĂ­vel (HTTP {status})", + "{count} CelesTrak groups unavailable": { + "one": "{count} grupo do CelesTrak indisponĂ­vel", + "many": "{count} de grupos do CelesTrak indisponĂ­veis", + "other": "{count} grupos do CelesTrak indisponĂ­veis" + }, + "{feed} feed unavailable": "Feed {feed} indisponĂ­vel", + "Source snapshot {minutes} min old": "O snapshot da fonte tem {minutes} min", + "{source} rate limited (anonymous)": "{source}: limite de requisiçÔes atingido (acesso anĂŽnimo)", + "{source} rate limited": "{source}: limite de requisiçÔes atingido", + "{source} network error": "{source}: erro de rede", + "Malformed {source} aircraft rows": "{source}: linhas de aeronaves malformadas", + "Malformed {source} response": "{source}: resposta malformada", + "entry {n}": "nÂș {n}", + "feeds {names} stale": { + "one": "feed {names} desatualizado", + "many": "feeds {names} desatualizados", + "other": "feeds {names} desatualizados" + }, + "feeds {names} unreachable": { + "one": "feed {names} inacessĂ­vel", + "many": "feeds {names} inacessĂ­veis", + "other": "feeds {names} inacessĂ­veis" + }, + "feeds {names} invalid": { + "one": "feed {names} invĂĄlido", + "many": "feeds {names} invĂĄlidos", + "other": "feeds {names} invĂĄlidos" + }, + "Loading {feeds}": "Carregando {feeds}", + "{count} heard": { + "one": "{count} aeronave captada", + "many": "{count} de aeronaves captadas", + "other": "{count} aeronaves captadas" + }, + "USB {rate} msg/s": "USB {rate} msg/s", + "{rate} msg/s": "{rate} msg/s", + "{count} feeds live": { + "one": "{count} feed ao vivo", + "many": "{count} de feeds ao vivo", + "other": "{count} feeds ao vivo" + }, + "{feed} {count} ({seconds}s old)": "{feed} {count} (hĂĄ {seconds} s)", + "Street Level toggle failed": "NĂŁo foi possĂ­vel ativar ou desativar a camada \"NĂ­vel da rua\"", + "Street Level could not start": "NĂŁo foi possĂ­vel iniciar a camada \"NĂ­vel da rua\"", + "SHRINK": "REDUZIR", + "EXPAND": "AMPLIAR", + "Shrink": "Reduzir", + "Expand": "Ampliar", + "ANY DATE": "QUALQUER DATA", + "LAST 10 YEARS": "ÚLTIMOS 10 ANOS", + "LAST 5 YEARS": "ÚLTIMOS 5 ANOS", + "LAST 3 YEARS": "ÚLTIMOS 3 ANOS", + "LAST 2 YEARS": "ÚLTIMOS 2 ANOS", + "LAST YEAR": "ÚLTIMO ANO", + "LAST 6 MONTHS": "ÚLTIMOS 6 MESES", + "LAST 3 MONTHS": "ÚLTIMOS 3 MESES", + "LAST MONTH": "ÚLTIMO MÊS", + "LAST {count} DAYS": { + "one": "ÚLTIMO {count} DIA", + "many": "ÚLTIMOS {count} DE DIAS", + "other": "ÚLTIMOS {count} DIAS" + }, + "{window} · SINCE {date}": "{window} · DESDE {date}", + "Turn Street Level off": "Desativar \"NĂ­vel da rua\"", + "Turn Street Level on": "Ativar \"NĂ­vel da rua\"", + "{name} imagery on": "Imagens do {name} ativadas", + "{name} imagery off": "Imagens do {name} desativadas", + "Image by {creator}": "Imagem de {creator}", + " or ": " ou ", + "OPEN {labels}": "ABRIR {labels}", + "Open {names} at the centre of the view": "Abrir {names} no centro da vista", + "Zoom in to a street to open {names} here": "Aproxime-se de uma rua para abrir {names} aqui", + "Switch Street Level on to draw its coverage.": "Ative \"NĂ­vel da rua\" para desenhar a cobertura.", + "Every provider is switched off: light a chip to draw its coverage.": "Todos os provedores estĂŁo desligados: ative um para desenhar a cobertura dele.", + "Loading this sequence
": "Carregando esta sequĂȘncia
", + "{n} images in this sequence · Esc clears": { + "one": "{n} imagem nesta sequĂȘncia · Esc limpa a seleção", + "many": "{n} de imagens nesta sequĂȘncia · Esc limpa a seleção", + "other": "{n} imagens nesta sequĂȘncia · Esc limpa a seleção" + }, + "No sequences in view match the filter": "Nenhuma sequĂȘncia na vista corresponde ao filtro", + "No coverage in view": "Sem cobertura na vista", + "{n} streets in view · click a line for its nearest photo": { + "one": "{n} rua na vista · clique em uma linha para ver a foto mais prĂłxima", + "many": "{n} de ruas na vista · clique em uma linha para ver a foto mais prĂłxima", + "other": "{n} ruas na vista · clique em uma linha para ver a foto mais prĂłxima" + }, + "{n} sequences in view · click a line for its nearest photo": { + "one": "{n} sequĂȘncia na vista · clique em uma linha para ver a foto mais prĂłxima", + "many": "{n} de sequĂȘncias na vista · clique em uma linha para ver a foto mais prĂłxima", + "other": "{n} sequĂȘncias na vista · clique em uma linha para ver a foto mais prĂłxima" + }, + "{n} sequences in view · click a line for its photos": { + "one": "{n} sequĂȘncia na vista · clique em uma linha para ver as fotos", + "many": "{n} de sequĂȘncias na vista · clique em uma linha para ver as fotos", + "other": "{n} sequĂȘncias na vista · clique em uma linha para ver as fotos" + }, + "km/h": "km/h", + "m/s": "m/s", + "mph": "mph", + "hPa": "hPa", + "kt": "kt", + "kts": "kt", + "ft": "ft", + "km": "km", + "m": "m", + "h": "h", + "min": "min", + "s": "s", + "dB": "dB", + "Celestial ring — reveal the full globe": "Anel celeste — revelar o globo inteiro", + "Celestial ring — available in Normal style": "Anel celeste — disponĂ­vel no estilo Normal", + "Detection overlay: {mode}": "Sobreposição de detecção: {mode}", + "Detection overlay: off": "Sobreposição de detecção: desligada", + "DETECT": "DETECÇÃO", + "{time} · {minutes} min ago": "{time} · hĂĄ {minutes} min", + "Active weather": "Camadas de clima ativas", + "LATEST · newest per product": "MAIS RECENTE · Ășltimo por produto", + "Forecast · valid {valid} · issued {issued}": "PrevisĂŁo · vĂĄlida para {valid} · emitida em {issued}", + "{detail} · Does not follow history": "{detail} · NĂŁo acompanha o histĂłrico", + "Forecast · valid {valid}": "PrevisĂŁo · vĂĄlida para {valid}", + "voice|OFF": "DESLIG.", + "voice|CONNECTING": "CONECT
", + "voice|LISTENING": "OUVINDO", + "voice|EXECUTING": "EXECUTANDO", + "voice|ERROR": "ERRO", + "Voice provider": "Provedor de voz", + "Changing provider reconnects voice if it is on.": "Mudar de provedor reconecta a voz se ela estiver ativa.", + "Voice Settings": "ConfiguraçÔes de voz", + "AI AGENT": "AGENTE DE IA", + "Voice model tier — applies next session": "NĂ­vel do modelo de voz — vale na prĂłxima sessĂŁo", + "STD": "PADR.", + "Estimated session cost": "Custo estimado da sessĂŁo", + "Voice control — activate to toggle voice; hold Space to speak": "Controle por voz — ative para ligar ou desligar a voz; segure Space para falar", + "ON/OFF": "LIGA/DESL.", + "VOICE STANDBY": "VOZ EM ESPERA", + "VOICE CONTROL": "CONTROLE POR VOZ", + "Hold Space to speak · tap Space to activate focused controls": "Segure Space para falar · toque em Space para acionar o controle em foco", + "VOICE": "VOZ", + "Preview": "PrĂ©via", + "Settings": "ConfiguraçÔes", + "Close voice panel": "Fechar o painel de voz", + "Voice replies appear here.": "As respostas de voz aparecem aqui.", + "Voice assistant": "Assistente de voz", + "Dismiss voice card": "Fechar o cartĂŁo de voz", + "YOU": "VOCÊ", + "THIS": "ISTO", + "Plan": "Plano", + "Referenced items": "Itens citados", + "NOTES & SOURCES": "NOTAS E FONTES", + "Show Voice Preview": "Mostrar prĂ©via de voz", + "Voice inactivity timeout": "Tempo limite de inatividade da voz", + "Minutes": "Minutos", + "Custom": "Personalizado", + "These preferences stay in this browser.": "Estas preferĂȘncias ficam neste navegador.", + "VOICE SYSTEM ERROR": "ERRO NO SISTEMA DE VOZ", + "DISMISS": "FECHAR", + "Check microphone permission and network access, then try again.": "Verifique a permissĂŁo do microfone e o acesso Ă  rede, e tente novamente.", + "Gemini returned an oversized audio chunk": "O Gemini retornou um trecho de ĂĄudio grande demais", + "Gemini returned an unsupported audio format": "O Gemini retornou um formato de ĂĄudio nĂŁo suportado", + "Gemini returned an invalid audio sample rate": "O Gemini retornou uma taxa de amostragem de ĂĄudio invĂĄlida", + "Gemini returned incomplete PCM audio": "O Gemini retornou ĂĄudio PCM incompleto", + "This browser does not support Gemini microphone audio": "Este navegador nĂŁo suporta ĂĄudio do microfone para o Gemini", + "Microphone audio processing failed": "Falha no processamento do ĂĄudio do microfone", + "Gemini audio playback fell behind. Reconnect to continue.": "A reprodução de ĂĄudio do Gemini atrasou. Reconecte para continuar.", + "Gemini token response did not include an ephemeral credential": "A resposta de token do Gemini nĂŁo incluiu uma credencial temporĂĄria", + "Invalid Gemini connection endpoint": "Endpoint de conexĂŁo do Gemini invĂĄlido", + "Gemini voice could not connect. Try again.": "NĂŁo foi possĂ­vel conectar a voz do Gemini. Tente novamente.", + "Gemini voice requires a same-origin app request": "A voz do Gemini exige uma requisição da mesma origem do app", + "Add a Gemini API key in Provider Settings": "Adicione uma chave de API do Gemini em \"ConfiguraçÔes de provedores\"", + "The Gemini Live model configuration is invalid": "A configuração do modelo do Gemini Live Ă© invĂĄlida", + "Gemini voice is starting too often. Try again shortly.": "A voz do Gemini estĂĄ sendo iniciada com frequĂȘncia demais. Tente novamente em breve.", + "Gemini quota is unavailable. Try again later.": "A cota do Gemini estĂĄ indisponĂ­vel. Tente novamente mais tarde.", + "Gemini access was refused. Check the API key and model access.": "O acesso ao Gemini foi recusado. Verifique a chave de API e o acesso ao modelo.", + "Gemini Live is unavailable for the configured model.": "O Gemini Live nĂŁo estĂĄ disponĂ­vel para o modelo configurado.", + "Token request is too large": "A requisição de token Ă© grande demais", + "Use an empty JSON token request": "Use uma requisição de token com um objeto JSON vazio", + "Release Space to send": "Solte Space para enviar", + "Hold Space to talk": "Segure Space para falar", + "Voice command context is too large": "O contexto do comando de voz Ă© grande demais", + "Gemini reliable transport exceeded its queue limit. Start voice again.": "A fila de envio confiĂĄvel do Gemini excedeu o limite. Inicie a voz de novo.", + "Gemini reliable transport did not drain. Start voice again.": "A fila de envio confiĂĄvel do Gemini nĂŁo esvaziou. Inicie a voz de novo.", + "Gemini token request failed (HTTP {status})": "Falha na requisição de token do Gemini (HTTP {status})", + "Gemini token response did not include a valid model": "A resposta de token do Gemini nĂŁo incluiu um modelo vĂĄlido", + "Gemini token response did not include session settings": "A resposta de token do Gemini nĂŁo incluiu as configuraçÔes da sessĂŁo", + "Gemini session settings do not match the input mode": "As configuraçÔes da sessĂŁo do Gemini nĂŁo correspondem ao modo de entrada", + "Requesting microphone": "Solicitando microfone", + "Gemini could not submit this input. Start voice again.": "O Gemini nĂŁo conseguiu enviar esta entrada. Inicie a voz de novo.", + "Connecting to Gemini": "Conectando ao Gemini", + "Ask or command": "Pergunte ou comande", + "Gemini returned an oversized message": "O Gemini retornou uma mensagem grande demais", + "Gemini Live connection failed. Check network access, then start voice again.": "Falha na conexĂŁo com o Gemini Live. Verifique o acesso Ă  rede e inicie a voz de novo.", + "Gemini Live connection ended. Start voice again for a new conversation.": "A conexĂŁo com o Gemini Live terminou. Inicie a voz de novo para uma nova conversa.", + "Gemini Live could not start. Start voice again to request a fresh session.": "O Gemini Live nĂŁo conseguiu iniciar. Inicie a voz de novo para pedir uma nova sessĂŁo.", + "Start voice again for a fresh token and a new conversation.": "Inicie a voz de novo para obter um novo token e começar outra conversa.", + "Start voice again to request a fresh session credential.": "Inicie a voz de novo para pedir uma nova credencial de sessĂŁo.", + "Microphone permission was denied. Allow microphone access and try again.": "A permissĂŁo do microfone foi negada. Permita o acesso ao microfone e tente novamente.", + "Gemini connection timed out. Try again.": "A conexĂŁo com o Gemini excedeu o tempo limite. Tente novamente.", + "Gemini voice could not start": "NĂŁo foi possĂ­vel iniciar a voz do Gemini", + "Gemini did not finish the interrupted reply. Start voice again.": "O Gemini nĂŁo concluiu a resposta interrompida. Inicie a voz de novo.", + "Gemini session expiring; finishing the current reply": "A sessĂŁo do Gemini vai expirar; concluindo a resposta atual", + "Gemini rejected the voice session. Start voice again to request a fresh session.": "O Gemini recusou a sessĂŁo de voz. Inicie a voz de novo para pedir uma nova sessĂŁo.", + "Start voice again for a fresh session credential. If it repeats, check Gemini model and API access.": "Inicie a voz de novo para obter uma nova credencial de sessĂŁo. Se isso se repetir, verifique o modelo do Gemini e o acesso Ă  API.", + "Gemini action history is full. Start voice again for a fresh session.": "O histĂłrico de açÔes do Gemini estĂĄ cheio. Inicie a voz de novo para uma nova sessĂŁo.", + "Gemini requested too many simultaneous actions": "O Gemini pediu açÔes simultĂąneas demais", + "Running command": "Executando comando", + "Voice text command is too long": "O comando de voz digitado Ă© longo demais", + "Gemini voice is not connected": "A voz do Gemini nĂŁo estĂĄ conectada", + "Gemini interrupted input exceeded its buffer or wait limit. Start voice again.": "A entrada interrompida do Gemini excedeu o limite de buffer ou de espera. Inicie a voz de novo.", + "Gemini Live connection is expiring. Start voice again for a new conversation.": "A conexĂŁo com o Gemini Live vai expirar. Inicie a voz de novo para uma nova conversa.", + "Voice off": "Voz desligada", + "Gemini voice sessions have a time limit. When a session expires, start voice again for a new conversation.": "As sessĂ”es de voz do Gemini tĂȘm limite de tempo. Quando uma sessĂŁo expirar, inicie a voz de novo para uma nova conversa.", + "Stopped by voice": "Parado por voz", + "Automatic stop is unavailable for this voice connection.": "A parada automĂĄtica nĂŁo estĂĄ disponĂ­vel para esta conexĂŁo de voz.", + "routing busy — too many routes at once": "serviço de rotas ocupado — rotas demais ao mesmo tempo", + "route proxy error": "erro do proxy de rotas", + "Preview is off.": "A prĂ©via estĂĄ desativada.", + "Your choice applies now, but could not be saved.": "Sua escolha vale agora, mas nĂŁo pĂŽde ser salva.", + "WebRTC microphone support unavailable": "Suporte a microfone WebRTC indisponĂ­vel", + "VOICE UNAVAILABLE": "VOZ INDISPONÍVEL", + "VOICE ACTIVE": "VOZ ATIVA", + "Voice session could not be started.": "NĂŁo foi possĂ­vel iniciar a sessĂŁo de voz.", + "MINI": "MINI", + "Next session: {pendingId} — this session stays on {modelId}": "PrĂłxima sessĂŁo: {pendingId} — esta sessĂŁo continua em {modelId}", + "Voice model: {pendingId} — click to switch to {target}; applies next session": "Modelo de voz: {pendingId} — clique para mudar para {target}; vale na prĂłxima sessĂŁo", + "standard": "padrĂŁo", + "mini": "mini", + "COST UNKNOWN": "CUSTO DESCONHECIDO", + "ChatGPT OAuth session: {responses} response(s), {input} input and {output} output tokens, {captions} caption transcription(s) reported.": "SessĂŁo OAuth do ChatGPT (dados informados): {responses} resposta(s), {input} tokens de entrada e {output} de saĂ­da, {captions} transcrição(Ă”es) de legendas.", + "USD cost and the API spend cap are unavailable for this auth mode.": "O custo em USD e o limite de gastos da API nĂŁo estĂŁo disponĂ­veis neste modo de autenticação.", + "Usage is incomplete because a response was still in flight when the session ended.": "O uso estĂĄ incompleto porque uma resposta ainda estava em andamento quando a sessĂŁo terminou.", + "Estimated session cost on {modelId} — {responses} response(s). Warns at {warn}, ends the session at {cap}.": "Custo estimado da sessĂŁo em {modelId} — {responses} resposta(s). Alerta em {warn}, encerra a sessĂŁo em {cap}.", + "Estimate is incomplete — a response was still in flight when the session ended, so its usage was never reported.": "A estimativa estĂĄ incompleta — uma resposta ainda estava em andamento quando a sessĂŁo terminou, entĂŁo o uso dela nunca foi informado.", + "STANDARD": "PADRÃO", + "{tier} applies next session": "{tier} vale na prĂłxima sessĂŁo", + "Session ended — cost cap {cost}": "SessĂŁo encerrada — limite de custo {cost}", + "MIC": "MIC", + "Radio did not start": "O rĂĄdio nĂŁo iniciou", + "{n} aircraft": { + "one": "{n} aeronave", + "many": "{n} de aeronaves", + "other": "{n} aeronaves" + }, + "{n} military aircraft": { + "one": "{n} aeronave militar", + "many": "{n} de aeronaves militares", + "other": "{n} aeronaves militares" + }, + "{n} ships": { + "one": "{n} embarcação", + "many": "{n} de embarcaçÔes", + "other": "{n} embarcaçÔes" + }, + "{n} satellites": { + "one": "{n} satĂ©lite", + "many": "{n} de satĂ©lites", + "other": "{n} satĂ©lites" + }, + "{n} launches": { + "one": "{n} lançamento", + "many": "{n} de lançamentos", + "other": "{n} lançamentos" + }, + "{n} earthquakes": { + "one": "{n} terremoto", + "many": "{n} de terremotos", + "other": "{n} terremotos" + }, + "{n} fires": { + "one": "{n} incĂȘndio", + "many": "{n} de incĂȘndios", + "other": "{n} incĂȘndios" + }, + "{n} fire perimeters": { + "one": "{n} perĂ­metro de incĂȘndio", + "many": "{n} de perĂ­metros de incĂȘndio", + "other": "{n} perĂ­metros de incĂȘndio" + }, + "{n} cyclones": { + "one": "{n} ciclone", + "many": "{n} de ciclones", + "other": "{n} ciclones" + }, + "{n} buses": { + "one": "{n} ĂŽnibus", + "many": "{n} de ĂŽnibus", + "other": "{n} ĂŽnibus" + }, + "{n} bike share": { + "one": "{n} estação de bicicletas compartilhadas", + "many": "{n} de estaçÔes de bicicletas compartilhadas", + "other": "{n} estaçÔes de bicicletas compartilhadas" + }, + "{n} flock cameras": { + "one": "{n} cĂąmera ALPR", + "many": "{n} de cĂąmeras ALPR", + "other": "{n} cĂąmeras ALPR" + }, + "{n} military bases": { + "one": "{n} base militar", + "many": "{n} de bases militares", + "other": "{n} bases militares" + }, + "{n} datacenters": { + "one": "{n} data center", + "many": "{n} de data centers", + "other": "{n} data centers" + }, + "{n} dams": { + "one": "{n} barragem", + "many": "{n} de barragens", + "other": "{n} barragens" + }, + "{n} air quality": { + "one": "{n} estação de qualidade do ar", + "many": "{n} de estaçÔes de qualidade do ar", + "other": "{n} estaçÔes de qualidade do ar" + }, + "{n} results": { + "one": "{n} resultado", + "many": "{n} de resultados", + "other": "{n} resultados" + }, + "anywhere in the loaded data": "em todos os dados carregados", + "in view": "na vista", + "within {radius} of the view centre": "em um raio de {radius} do centro da vista", + "within {radius} of {place} (Contacts window)": "em um raio de {radius} de {place} (janela de Contatos)", + "within {radius} of {place}": "em um raio de {radius} de {place}", + "within {radius}": "em um raio de {radius}", + "over {region}": "sobre {region}", + "At least {items}": "Pelo menos {items}", + "{items} {scope}": "{items} {scope}", + "last 24 h": "Ășltimas 24 h", + "past 30 d and upcoming": "Ășltimos 30 d e prĂłximos", + "the flights layer loads by viewport": "a camada de voos carrega conforme a vista", + "distance is ground distance, not overhead": "a distĂąncia Ă© medida no solo atĂ© o ponto subsatĂ©lite, nĂŁo atĂ© o satĂ©lite", + "the count is a lower bound because at least one layer reached its retained limit.": "a contagem Ă© um mĂ­nimo porque pelo menos uma camada atingiu o limite de retenção.", + "{label} off": "{label}: camada desativada", + "{label} loading": "{label}: carregando", + "{label} error": "{label}: erro", + "counted the first {returned} loaded records": "foram contados os primeiros {returned} registros carregados", + "counted {returned} of {total} loaded records": "foram contados {returned} de {total} registros carregados", + "{layers} just turned on — still loading, counts will rise": "{layers}: ativação recente — ainda carregando, as contagens vĂŁo subir", + "Contacts panel snapshot at {time} — the same retained cohort supplies the card, speech, and follow-up memory": "Snapshot do painel Contatos ({time}) — o mesmo grupo retido alimenta o cartĂŁo, a fala e a memĂłria de acompanhamento", + "Contacts panel snapshot — the same retained cohort supplies the card, speech, and follow-up memory": "Snapshot do painel Contatos — o mesmo grupo retido alimenta o cartĂŁo, a fala e a memĂłria de acompanhamento", + "Fly below {km} km to a covered region": "Desça abaixo de {km} km sobre uma regiĂŁo com cobertura", + "No feed here yet · {n} regions available": { + "one": "Ainda nĂŁo hĂĄ feed aqui · {n} regiĂŁo disponĂ­vel", + "many": "Ainda nĂŁo hĂĄ feed aqui · {n} de regiĂ”es disponĂ­veis", + "other": "Ainda nĂŁo hĂĄ feed aqui · {n} regiĂ”es disponĂ­veis" + }, + "degraded": "degradado", + "stale": "desatualizado", + "partial": "parcial", + "fallback": "alternativo", + "unavailable": "indisponĂ­vel", + "Not answered: {layers}": "Sem resposta: {layers}", + "Toggle voice control": "Alternar o controle por voz", + "Activate to toggle voice": "Ative para ligar ou desligar a voz", + "Voice active": "Voz ativa", + "Voice could not be started.": "NĂŁo foi possĂ­vel iniciar a voz.", + "the active voice session": "a sessĂŁo de voz ativa", + "{value} feet": "{value} pĂ©s", + "Fire · FRP {frp} MW": "IncĂȘndio · FRP {frp} MW", + "The flights layer is not enabled": "A camada de voos nĂŁo estĂĄ ativada", + "The military layer is not enabled": "A camada de voos militares nĂŁo estĂĄ ativada", + "The satellites layer is not enabled": "A camada de satĂ©lites nĂŁo estĂĄ ativada", + "The ais-live-vessels layer is not enabled": "A camada de embarcaçÔes AIS nĂŁo estĂĄ ativada", + "Could not enable the requested layer": "NĂŁo foi possĂ­vel ativar a camada solicitada", + "Could not disable the requested layer": "NĂŁo foi possĂ­vel desativar a camada solicitada", + "Radio layer unavailable": "A camada de rĂĄdio estĂĄ indisponĂ­vel", + "Camera navigation is unavailable in the current view": "A navegação da cĂąmera nĂŁo estĂĄ disponĂ­vel na vista atual", + "Camera navigation policy unavailable": "A polĂ­tica de navegação da cĂąmera estĂĄ indisponĂ­vel", + "Nearest-aircraft selection supports Flights or Military Flights only": "A seleção da aeronave mais prĂłxima sĂł funciona com voos ou voos militares", + "Nearest-aircraft selection needs a preset, place name, or latitude and longitude": "Para selecionar a aeronave mais prĂłxima Ă© preciso uma predefinição, um nome de lugar ou a latitude e a longitude", + "Could not arrive at the requested place": "NĂŁo foi possĂ­vel chegar ao lugar solicitado", + "The nearest airborne aircraft could not be selected": "NĂŁo foi possĂ­vel selecionar a aeronave em voo mais prĂłxima", + "No flights within {radius} of the current view": "Nenhum voo em um raio de {radius} da vista atual", + "No military within {radius} of the current view": "Nenhum voo militar em um raio de {radius} da vista atual", + "No satellites within {radius} of the current view": "Nenhum satĂ©lite em um raio de {radius} da vista atual", + "No vessels within {radius} of the current view": "Nenhuma embarcação em um raio de {radius} da vista atual", + "{layer} is enabled on the {source} feed, but no airborne aircraft is loaded in the {place} view yet": "A camada {layer} estĂĄ ativada com o feed {source}, mas ainda nĂŁo hĂĄ aeronaves em voo carregadas na vista de {place}", + "{layer} is enabled, but no airborne aircraft is loaded in the {place} view yet": "A camada {layer} estĂĄ ativada, mas ainda nĂŁo hĂĄ aeronaves em voo carregadas na vista de {place}", + "{layer} is enabled, but its aircraft feed is unavailable": "A camada {layer} estĂĄ ativada, mas o feed de aeronaves dela estĂĄ indisponĂ­vel", + "{layer} is enabled, but its destination refresh did not complete": "A camada {layer} estĂĄ ativada, mas a atualização no destino nĂŁo foi concluĂ­da", + "{layer} is enabled, but {source} is unavailable": "A camada {layer} estĂĄ ativada, mas {source} estĂĄ indisponĂ­vel", + "Could not arrive at {place}": "NĂŁo foi possĂ­vel chegar a {place}", + "{name} is no longer loaded": "{name} nĂŁo estĂĄ mais carregado", + "Unknown target layer: {target}": "Camada de destino desconhecida: {target}", + "nominal": "nominal", + "{label} on": "{label}: camada ativada", + "Frame aircraft": "Enquadrar aeronaves", + "Frame military aircraft": "Enquadrar aeronaves militares", + "Frame ships": "Enquadrar embarcaçÔes", + "Frame satellites": "Enquadrar satĂ©lites", + "Frame contacts": "Enquadrar contatos", + "{count} aircraft in frame": { + "one": "{count} aeronave no enquadramento", + "many": "{count} de aeronaves no enquadramento", + "other": "{count} aeronaves no enquadramento" + }, + "{count} military aircraft in frame": { + "one": "{count} aeronave militar no enquadramento", + "many": "{count} de aeronaves militares no enquadramento", + "other": "{count} aeronaves militares no enquadramento" + }, + "{count} ships in frame": { + "one": "{count} embarcação no enquadramento", + "many": "{count} de embarcaçÔes no enquadramento", + "other": "{count} embarcaçÔes no enquadramento" + }, + "{count} satellites in frame": { + "one": "{count} satĂ©lite no enquadramento", + "many": "{count} de satĂ©lites no enquadramento", + "other": "{count} satĂ©lites no enquadramento" + }, + "{count} contacts in frame": { + "one": "{count} contato no enquadramento", + "many": "{count} de contatos no enquadramento", + "other": "{count} contatos no enquadramento" + }, + "Nearest military aircraft": "Aeronaves militares mais prĂłximas", + "Nearest ships": "EmbarcaçÔes mais prĂłximas", + "Nearest satellites": "SatĂ©lites mais prĂłximos", + "Nearest aircraft": "Aeronaves mais prĂłximas", + "{first} and {second}": "{first} e {second}", + "Layer": "Camada", + "there": "lĂĄ", + "Camera range {range}": "DistĂąncia da cĂąmera {range}", + "Within {radius} of the view": "Em um raio de {radius} da vista", + "Labels on": "RĂłtulos ativados", + "Framing uses the nearest 80 loaded contacts": "O enquadramento usa os 80 contatos carregados mais prĂłximos", + "{distance} from {location}": "A {distance} de {location}", + "Altitude {altitude}": "Altitude {altitude}", + "{origin} to {destination}": "De {origin} para {destination}", + "from {origin}": "de {origin}", + "to {destination}": "para {destination}", + "Registration {registration}": "MatrĂ­cula {registration}", + "View state": "Estado da vista", + "Marked {count} places": { + "one": "{count} lugar marcado", + "many": "{count} de lugares marcados", + "other": "{count} lugares marcados" + }, + "Nothing marked": "Nada marcado", + "Not found: {places}": "NĂŁo encontrado: {places}", + "Tracing outlines": "Traçando contornos", + "Frame flights": "Enquadrar voos", + "Frame military": "Enquadrar voos militares", + "Frame vessels": "Enquadrar embarcaçÔes", + "Frame {target}": "Enquadrar {target}", + "Zoom out to globe": "Afastar atĂ© o globo", + "Open data layers": "Abrir as camadas de dados", + "Open or close a panel": "Abrir ou fechar um painel", + "Change context mode": "Mudar o modo de contexto", + "Control cockpit": "Controlar a cabine", + "Change visual style": "Mudar o estilo visual", + "Adjust HUD": "Ajustar o HUD", + "Adjust cyber sonar": "Ajustar o sonar Ciber", + "Adjust detection overlay": "Ajustar a sobreposição de detecção", + "Change map stack": "Mudar a pilha de mapas", + "Adjust post-processing": "Ajustar o pĂłs-processamento", + "Control scene": "Controlar a cena", + "Control CCTV": "Controlar as cĂąmeras CCTV", + "Control radio": "Controlar o rĂĄdio", + "Track contact": "Rastrear o contato", + "Stop tracking": "Parar o rastreamento", + "Clear marks": "Limpar as marcaçÔes", + "Move camera": "Mover a cĂąmera", + "Fly route": "Percorrer a rota", + "Analyst query": "Consulta analĂ­tica", + "Next ISS pass": "PrĂłxima passagem da ISS", + "Next satellite pass": "PrĂłxima passagem do satĂ©lite", + "Mark the map": "Marcar o mapa", + "Mark {targets} +{more}": "Marcar {targets} +{more}", + "Mark {targets}": "Marcar {targets}", + "Fly to {place}": "Voar atĂ© {place}", + "Fly to Location": "Voar atĂ© o local", + "Nearest aircraft to {place}": "Aeronave mais prĂłxima de {place}", + "Nearest aircraft to Here": "Aeronave mais prĂłxima daqui", + "Layer on": "Camada: ativada", + "Layer off": "Camada: desativada", + "Zoom out": "Afastar", + "Zoom in": "Aproximar", + "Read the view": "Consultar a vista", + "Check view state": "Verificar o estado da vista", + "Action": "Ação", + "Finding places": "Buscando lugares", + "Tracing outline": "Traçando contorno", + "Looking up place": "Buscando lugar", + "Flying": "Voando", + "Turning on layer": "Ativando camada", + "Loading aircraft": "Carregando aeronaves", + "Picking nearest": "Escolhendo a mais prĂłxima", + "Working": "Processando", + "in progress": "em andamento", + "done": "concluĂ­do", + "failed": "falhou", + "cancelled": "cancelado", + "Outline traced": "Contorno traçado", + "Outline unavailable": "Contorno indisponĂ­vel", + "Source: {label}": "Fonte: {label}", + "WORKING": "EM ANDAMENTO", + "DONE": "CONCLUÍDO", + "Recent speech": "Fala recente", + "HERE": "AQUI", + "Aircraft cockpit view": "Vista da cabine da aeronave", + "LEVEL": "NIVELADO", + "Estimated destination direction": "Direção estimada do destino", + "DEST ---°": "DEST ---°", + "OPTICAL PLANE · 01": "PLANO ÓPTICO · 01", + "VISOR LOCK · ACTIVE": "TRAVA DO VISOR · ATIVA", + "GROUND SPEED · KTS": "VELOC. SOLO · KT", + "ALTITUDE · FT": "ALTITUDE · FT", + "FIRST PERSON": "PRIMEIRA PESSOA", + "LIVE TRACK · COURSE ALIGNED": "RASTRO AO VIVO · CURSO ALINHADO", + "Cockpit vision style": "Estilo de visĂŁo da cabine", + "Previous cockpit vision style": "Estilo anterior de visĂŁo da cabine", + "Previous vision style": "Estilo de visĂŁo anterior", + "Current cockpit vision style: NORMAL. Activate for next style.": "Estilo atual de visĂŁo da cabine: NORMAL. Ative para o prĂłximo estilo.", + "Current style: NORMAL — click for next": "Estilo atual: NORMAL — clique para o prĂłximo", + "CURRENT": "ATUAL", + "Next cockpit vision style": "PrĂłximo estilo de visĂŁo da cabine", + "Next vision style": "PrĂłximo estilo de visĂŁo", + "Current aircraft heading": "Rumo atual da aeronave", + "GROUND SPEED": "VELOC. SOLO", + "KTS": "KT", + "ALTITUDE": "ALTITUDE", + "FT": "FT", + "Contact cockpit summary": "Resumo do contato na cabine", + "CONTACT": "CONTATO", + "CONTACTS · 250 KM": "CONTATOS · 250 KM", + "Contact navigation": "Navegação de contatos", + "CONTEXT ONLY": "SÓ CONTEXTO", + "Nearby cohort counts": "Contagens por categoria nas proximidades", + "FLT": "FLT", + "MIL": "MIL", + "SITE": "LOCAIS", + "NEAREST OBSERVED / MAPPED": "MAIS PRÓXIMO OBSERVADO / MAPEADO", + "AVAILABLE INPUTS ONLY · NOT AN ALL-CLEAR": "SÓ ENTRADAS DISPONÍVEIS · NÃO GARANTE SEGURANÇA", + "WX": "WX", + "Cockpit briefing carousel": "Carrossel de briefing da cabine", + "Estimated flight plan": "Plano de voo estimado", + "ESTIMATED FLIGHT PLAN": "PLANO DE VOO ESTIMADO", + "FROM": "DE", + "TO": "PARA", + "Cockpit briefing controls": "Controles do briefing da cabine", + "Previous briefing page": "PĂĄgina anterior do briefing", + "Next briefing page": "PrĂłxima pĂĄgina do briefing", + "Live signals": "Sinais ao vivo", + "Latest regional news": "Últimas notĂ­cias da ĂĄrea", + "Location-based information": "InformaçÔes baseadas na localização", + "TEMP": "TEMP", + "WIND": "VENTO", + "SKY": "CÉU", + "PRECIP": "PRECIP", + "MM": "MM", + "Weather data by Open-Meteo.com": "Dados meteorolĂłgicos do Open-Meteo.com", + "Cockpit briefing pages": "PĂĄginas do briefing da cabine", + "SIG": "SIG", + "Show Live Signals": "Mostrar sinais ao vivo", + "NEWS": "NOTÍCIAS", + "Show Regional News": "Mostrar notĂ­cias da ĂĄrea", + "LOCAL": "LOCAL", + "Show Local Info": "Mostrar informaçÔes locais", + "Cockpit display and Radio controls": "Controles de exibição e rĂĄdio da cabine", + "DISPLAY": "EXIBIÇÃO", + "Cockpit display options": "OpçÔes de exibição da cabine", + "RADIO": "RÁDIO", + "Cockpit compact Radio controls": "Controles compactos de rĂĄdio da cabine", + "Previous filtered radio station": "Estação de rĂĄdio filtrada anterior", + "Play selected radio station": "Reproduzir a estação de rĂĄdio selecionada", + "Next filtered radio station": "PrĂłxima estação de rĂĄdio filtrada", + "VOLUME": "VOLUME", + "Cockpit Radio volume": "Volume do rĂĄdio da cabine", + "ESC EXIT": "ESC SAIR", + "C TOGGLE": "C ALTERNAR", + "View switcher": "Alternador de vista", + "Exit cockpit and return to full globe view": "Sair da cabine e voltar Ă  vista do globo completo", + "RESET": "REDEFINIR", + "Exit cockpit view": "Sair da vista da cabine", + "EXIT COCKPIT": "SAIR DA CABINE", + "Navigation, voice, and visual preset controls": "Controles de navegação, voz e predefiniçÔes visuais", + "Expand Visual Presets": "Expandir predefiniçÔes visuais", + "Pin visual presets": "Fixar predefiniçÔes visuais", + "Keep visual presets open": "Manter predefiniçÔes visuais abertas", + "Show the globe without a visual filter.": "Mostrar o globo sem filtro visual.", + "Emulate a green phosphor CRT with scanlines and screen curvature.": "Emular um CRT de fĂłsforo verde com linhas de varredura e curvatura de tela.", + "Simulate night-vision goggles with green intensification and a tube vignette.": "Simular Ăłculos de visĂŁo noturna com intensificação verde e vinheta de tubo.", + "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "Simular contraste tĂ©rmico estilo FLIR. Aumente o Ironbow para ter cor.", + "Apply bright cel-shaded color and illustrated outlines.": "Aplicar cores vivas em cel shading e contornos ilustrados.", + "Apply high-contrast monochrome film-noir grading.": "Aplicar gradação monocromĂĄtica de filme noir com alto contraste.", + "MAP SOURCE": "FONTE DO MAPA", + "Map source": "Fonte do mapa", + "Style": "Estilo", + "Expand LOCATION": "Expandir LOCAL", + "Collapse panel": "Recolher painel", + "Pin location tray": "Fixar bandeja de locais", + "Keep location tray open": "Manter bandeja de locais aberta", + "Search any location": "Buscar qualquer local", + "Search location by name or coordinates": "Buscar local por nome ou coordenadas", + "Search any location...": "Buscar qualquer local...", + "WEATHER": "CLIMA", + "Active weather products": "Produtos meteorolĂłgicos ativos", + "RECENT IMAGERY": "IMAGENS RECENTES", + "Imagery days in the box": "Dias com imagens na ĂĄrea", + "CONTEXT": "CONTEXTO", + "Expand panel": "Expandir painel", + "Context mode": "Modo de contexto", + "CONTACTS": "CONTATOS", + "Cycles the nearest contacts of whatever type you select — planes, vessels, installations. Satellites track independently.": "Percorre os contatos mais prĂłximos do tipo que vocĂȘ selecionar — aviĂ”es, embarcaçÔes, instalaçÔes. Os satĂ©lites sĂŁo rastreados de forma independente.", + "SPACE MISSIONS": "MISSÕES ESPACIAIS", + "SELECT CONTEXT": "SELECIONE O CONTEXTO", + "Contact Context actions": "AçÔes de contexto do contato", + "COCKPIT": "CABINE", + "SEARCH NEARBY SITES": "BUSCAR LOCAIS PRÓXIMOS", + "Reclassify tracked contact as TR-3B": "Reclassificar o contato rastreado como TR-3B", + "CONTACTS CONTEXT OFF": "CONTEXTO DE CONTATOS DESLIGADO", + "SELECT CONTACTS TO LOAD OBSERVED / MAPPED PROXIMITY": "SELECIONE CONTATOS PARA CARREGAR PROXIMIDADE OBSERVADA / MAPEADA", + "Available Space Missions": "MissĂ”es espaciais disponĂ­veis", + "AVAILABLE MISSIONS": "MISSÕES DISPONÍVEIS", + "SELECT A MISSION TO INSPECT": "SELECIONE UMA MISSÃO PARA INSPECIONAR", + "LOADING 30-DAY MISSION INDEX": "CARREGANDO ÍNDICE DE MISSÕES DE 30 DIAS", + "TAB PREVIEWS · ENTER / SPACE SELECTS": "TAB MOSTRA PRÉVIA · ENTER / SPACE SELECIONA", + "Internet radio and local SDR": "RĂĄdio pela internet e SDR local", + "STATION TAG": "TAG DA ESTAÇÃO", + "Filter stations by station tag": "Filtrar estaçÔes por tag", + "All": "Todos", + "Enable Radio, then choose a globe marker or use next.": "Ative o rĂĄdio e escolha um marcador no globo ou use PrĂłxima.", + "DRAG TO TUNE": "ARRASTE PARA SINTONIZAR", + "Tune available internet radio stations": "Sintonizar as estaçÔes de rĂĄdio pela internet disponĂ­veis", + "ALL · DRAG THE NEEDLE": "TODAS · ARRASTE A AGULHA", + "SNAPS TO AVAILABLE STATIONS": "AJUSTA-SE ÀS ESTAÇÕES DISPONÍVEIS", + "Radio playback": "Reprodução do rĂĄdio", + "Previous filtered station": "Estação filtrada anterior", + "Play selected station": "Reproduzir a estação selecionada", + "Next filtered station": "PrĂłxima estação filtrada", + "STOP": "PARAR", + "Stop radio playback": "Parar a reprodução do rĂĄdio", + "Radio volume": "Volume do rĂĄdio", + "STATION SITE": "SITE DA ESTAÇÃO", + "DIRECTORY: RADIO BROWSER": "DIRETÓRIO: RADIO BROWSER", + "Audio connects directly to the broadcaster after you press play. Your IP is visible to that broadcaster.": "O ĂĄudio conecta direto Ă  emissora depois que vocĂȘ aperta \"Ouvir\". Seu IP fica visĂ­vel para essa emissora.", + "Local RTL-SDR receiver": "Receptor RTL-SDR local", + "LOCAL RTL-SDR": "RTL-SDR LOCAL", + "Chrome/Edge · WebUSB · one local tuner shared by FM and the Local ADS-B layer.": "Chrome/Edge · WebUSB · um sintonizador local compartilhado entre o FM e a camada ADS-B local.", + "Use your location for faster ADS-B position decoding": "Usar sua localização para decodificar as posiçÔes ADS-B mais rĂĄpido", + "CHANGE DEVICE": "TROCAR", + "Choose a different RTL-SDR or receiver channel": "Escolher outro RTL-SDR ou outro canal do receptor", + "RTL-SDR receiver mode": "Modo do receptor RTL-SDR", + "GAIN": "GANHO", + "RTL-SDR tuner gain for the current mode": "Ganho do sintonizador RTL-SDR para o modo atual", + "AUTO": "AUTO", + "MSG/S": "MSG/S", + "HEARD": "CAPTADAS", + "POSITIONED": "POSICIONADAS", + "FM MHZ": "FM MHZ", + "TUNE": "SINTONIZAR", + "Seek broadcast FM stations": "Buscar estaçÔes de rĂĄdio FM", + "◀ SEEK": "◀ BUSCAR", + "SEEK ▶": "BUSCAR ▶", + "SDR VOL": "VOL. SDR", + "Local SDR volume": "Volume do SDR local", + "Intelligence HUD (H)": "HUD de inteligĂȘncia (H)", + "Layout": "Layout", + "HUD layout": "Layout do HUD", + "Tactical": "TĂĄtico", + "Minimal": "MĂ­nimo", + "Cyber": "Ciber", + "Sonar": "Sonar", + "Cyber sonar contact scanner": "Scanner de contatos do sonar Ciber", + "Rings": "AnĂ©is", + "Sonar ring count": "NĂșmero de anĂ©is do sonar", + "Range": "Alcance", + "Sonar ring range": "Alcance dos anĂ©is do sonar", + "Power": "PotĂȘncia", + "Sonar intensity": "Intensidade do sonar", + "Opacity": "Opacidade", + "Cyber contact and label opacity": "Opacidade de contatos e rĂłtulos Ciber", + "Minimum opacity for map dots, icons, models, brackets, and labels between sonar passes": "Opacidade mĂ­nima de pontos, Ă­cones, modelos, marcadores de alvo e rĂłtulos do mapa entre as passagens do sonar", + "Sector": "Setor", + "Sonar sector width": "Largura do setor do sonar", + "Detection Overlay (D)": "Sobreposição de detecção (D)", + "Detection overlay": "Sobreposição de detecção", + "Detection label density": "Densidade dos rĂłtulos de detecção", + "Allocation": "Alocação", + "Detection label allocation": "Alocação dos rĂłtulos de detecção", + "Elastic": "ElĂĄstica", + "Weighted": "Ponderada", + "Fade": "Esmaecimento", + "Detection fade distance": "DistĂąncia de esmaecimento da detecção", + "World-overlay fade distance outside the keyhole as a percentage of its radius": "DistĂąncia de esmaecimento da sobreposição fora do visor, em porcentagem do raio dele", + "Outside": "Fora", + "Detection opacity outside the keyhole": "Opacidade da detecção fora do visor", + "World-overlay label and card opacity beyond the fade distance": "Opacidade de rĂłtulos e cartĂ”es da sobreposição alĂ©m da distĂąncia de esmaecimento", + "PARAMETERS": "PARÂMETROS", + "3D aircraft — flat icons zoomed out, 3D models up close": "Aeronaves 3D — Ă­cones planos de longe, modelos 3D de perto", + "Models": "Modelos", + "3D model coverage": "Cobertura de modelos 3D", + "Proximity": "Proximidade", + "Scope — the circular viewport mask": "Mira — a mĂĄscara circular da vista", + "Scope": "Mira", + "Feather": "Suavização", + "Scope edge feather": "Suavização da borda da mira", + "Scope edge feather as a percentage of the keyhole radius": "Suavização da borda da mira, em porcentagem do raio do visor", + "Draw on the world — click vertices, double-click or Enter to finish, Esc to cancel": "Desenhar sobre o mundo — clique nos vĂ©rtices, clique duplo ou Enter para concluir, Esc para cancelar", + "Shape": "Forma", + "Shape to draw": "Forma a desenhar", + "Area": "Área", + "Line": "Linha", + "Pin": "Marcador", + "Label (optional)": "RĂłtulo (opcional)", + "Label for the drawn shape": "RĂłtulo da forma desenhada", + "Colour of the drawn shape": "Cor da forma desenhada", + "Primary": "Principal", + "Amber": "Âmbar", + "Cyan": "Ciano", + "Green": "Verde", + "Red": "Vermelho", + "Clear": "Limpar", + "Remove every mark from the board": "Remover todas as marcaçÔes do quadro", + "Show your own GeoJSON, KML, KMZ or GPX files on the globe (or drop them onto it). File bytes stay on this device; overlays can appear in map screenshots shared with voice.": "Mostre no globo seus prĂłprios arquivos GeoJSON, KML, KMZ ou GPX (ou solte-os sobre ele). Os arquivos nĂŁo saem deste dispositivo; as sobreposiçÔes podem aparecer em capturas do mapa compartilhadas com a voz.", + "Import": "Importar", + "Choose GeoJSON, KML, KMZ or GPX files": "Escolha arquivos GeoJSON, KML, KMZ ou GPX", + "Imported files": "Arquivos importados", + "Celestial": "Celeste", + "Hide UI chrome": "Ocultar a interface", + "Clean UI": "Interface limpa", + "Bloom / Glow": "Bloom / Brilho", + "Bloom intensity": "Intensidade do bloom", + "Sharpening": "Nitidez", + "Sharpen": "Nitidez", + "Sharpen intensity": "Intensidade da nitidez", + "EXIT CLEAN VIEW": "SAIR DA VISTA LIMPA", + "Return UI controls": "Restaurar controles da interface", + "Initializing photorealistic world...": "Inicializando o mundo fotorrealista...", + "DATA LAYERS": "CAMADAS DE DADOS", + "ACQUIRING FRAME": "OBTENDO QUADRO", + "NEAREST": "MAIS PRÓX.", + "CCTV camera": "CĂąmera de CCTV", + "CALIBRATION": "CALIBRAÇÃO", + "Drag the camera in the world: rings rotate, arrows move, handles set range/FOV": "Arraste a cĂąmera no mundo: anĂ©is giram, setas movem, alças definem alcance/FOV", + "Camera pose — click a value to type": "Pose da cĂąmera — clique em um valor para digitar", + "Heading (compass °) — click to type": "Rumo (bĂșssola °) — clique para digitar", + "Pitch (° up/down) — click to type": "Inclinação (° para cima/baixo) — clique para digitar", + "Horizontal FOV (°) — click to type": "FOV horizontal (°) — clique para digitar", + "Range / monitor-plane distance (m) — click to type": "Alcance / distĂąncia do plano do monitor (m) — clique para digitar", + "Mount height above ground (m) — click to type": "Altura de instalação acima do solo (m) — clique para digitar", + "North offset from catalog position (m) — click to type": "Deslocamento norte da posição do catĂĄlogo (m) — clique para digitar", + "East offset from catalog position (m) — click to type": "Deslocamento leste da posição do catĂĄlogo (m) — clique para digitar", + "SAVE CAL": "SALVAR CAL", + "RESET CAL": "REDEFINIR CAL", + "SCENE SUMMARY": "RESUMO DA CENA", + "STREET LEVEL": "NÍVEL DA RUA", + "Turn Street Level on or off": "Ativar ou desativar \"NĂ­vel da rua\"", + "Show the street-level view full screen (Esc shrinks it)": "Mostrar a vista no nĂ­vel da rua em tela cheia (Esc reduz)", + "Image fit": "Ajuste da imagem", + "FIT": "AJUSTAR", + "Fit: show the whole photo, with dark bars where its shape differs from the frame": "Ajustar: mostra a foto inteira, com barras escuras onde o formato dela difere do quadro", + "FILL": "PREENCHER", + "Fill: fill the frame edge to edge, cropping the photo": "Preencher: preenche o quadro de ponta a ponta, cortando a foto", + "Close the image and deselect it on the map": "Fechar a imagem e desmarcĂĄ-la no mapa", + "Close the street-level image": "Fechar a imagem no nĂ­vel da rua", + "Street-level viewer": "Visualizador no nĂ­vel da rua", + "Open this image on the provider's site": "Abrir esta imagem no site do provedor", + "Imagery providers": "Provedores de imagens", + "PROVIDERS": "PROVEDORES", + "Imagery filters": "Filtros de imagens", + "IMAGERY": "IMAGENS", + "Panorama filter": "Filtro de panoramas", + "ALL": "TODAS", + "FLAT": "PLANAS", + "SINCE": "DESDE", + "SCENES": "CENAS", + "Scene recipe": "Receita de cena", + "NEW": "NOVA", + "CAPTURE SHOT": "CAPTURAR PLANO", + "UPDATE SHOT": "ATUALIZAR PLANO", + "START": "INICIAR", + "EXPORT PRESETS": "EXPORTAR PREDEF.", + "IMPORT": "IMPORTAR", + "RUN LOG": "REGISTRO", + "POWER UP": "ATIVAR", + "GROUND STATION · PROVIDER SETTINGS": "ESTAÇÃO TERRESTRE · CONFIGURAÇÕES DE PROVEDORES", + "Close key setup": "Fechar configuração de chaves", + "Power up the globe": "Ative o globo", + "The globe already flies keyless. Every key below switches on another real feed — paste one and it's saved into this app's local configuration, then the server restarts itself. Server-side keys stay on this machine; Google Maps and Cesium ion run in the browser and must be provider-restricted. Keys you configured elsewhere are shown but never touched.": "O globo jĂĄ voa sem chaves. Cada chave abaixo ativa mais uma fonte real — cole uma e ela serĂĄ salva na configuração local deste app, e entĂŁo o servidor reinicia sozinho. As chaves do servidor ficam nesta mĂĄquina; as chaves do Google Maps e do Cesium ion sĂŁo usadas no navegador e precisam ter restriçÔes de uso configuradas no respectivo provedor. Chaves configuradas em outro lugar sĂŁo exibidas, mas nunca alteradas.", + "SAVE KEYS": "SALVAR CHAVES", + "ESC to close": "ESC para fechar", + "The Google Maps key buys the photorealistic planet — everything else stacks on top.": "A chave do Google Maps libera o planeta fotorrealista — todo o resto se soma a ela.", + "NO PLACE LEFT BEHIND": "NENHUM LUGAR ESQUECIDO", + "ACTIVE STYLE": "ESTILO ATIVO", + "Globe actions": "AçÔes do globo", + "Turn off all selected data layers": "Desativar todas as camadas de dados selecionadas", + "Copy share link": "Copiar link de compartilhamento", + "Toggle straight-down and tilted map views": "Alternar entre a vista de cima e a vista inclinada do mapa", + "Reset map to north up": "Orientar o mapa com o norte para cima", + "Reset map bearing to north": "Redefinir a orientação do mapa para o norte", + "Reset camera and return to full globe view": "Redefinir a cĂąmera e voltar Ă  vista do globo completo", + "MISSION CONTROL · FIRST LAUNCH": "CENTRO DE CONTROLE · PRIMEIRO ACESSO", + "Choose your first view": "Escolha sua primeira vista", + "LIVE CONTACTS": "CONTATOS AO VIVO", + "Aircraft, vessels and nearby intelligence": "Aeronaves, embarcaçÔes e informaçÔes da regiĂŁo", + "Launches, spacecraft and orbital context": "Lançamentos, espaçonaves e contexto orbital", + "EXPLORE MANUALLY": "EXPLORAR MANUALMENTE", + "Begin with a clean globe": "Comece com um globo limpo", + "Don't show this again": "NĂŁo mostrar novamente", + "ESC to dismiss": "ESC para fechar", + "Tip: the GEV MIC button in the dock lets you talk to the map.": "Dica: o botĂŁo GEV MIC no dock permite falar com o mapa.", + "{lower} to {upper}": "{lower} a {upper}", + "Up to {upper}": "AtĂ© {upper}", + "From {lower}": "A partir de {lower}", + "Informational only · not for flight planning": "Apenas informativo · nĂŁo usar para planejamento de voo", + "Unnamed zone": "Zona sem nome", + "Restricted airspace source unavailable": "Fonte de espaço aĂ©reo restrito indisponĂ­vel", + "Prohibited (P)": "Área proibida (P)", + "Restricted (R)": "Área restrita (R)", + "FAA prohibited and restricted special-use airspace only, not the UAS Facility Map or UAS flight restrictions. Informational only — not a substitute for official UAS flight-planning tools (B4UFLY / LAANC).": "Apenas ĂĄreas proibidas e restritas da FAA (espaço aĂ©reo de uso especial), sem o UAS Facility Map ou as restriçÔes de voo de UAS. Apenas informativo — nĂŁo substitui as ferramentas oficiais de planejamento de voo de UAS (B4UFLY / LAANC).", + "Prohibited": "Área proibida", + "Restricted": "Área restrita", + "Prohibited & Restricted Airspace": "Áreas proibidas e restritas" +} diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index b08af09d2..5bd9b023e 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -342,6 +342,12 @@ "many": "Đ—Đ°ĐłŃ€ŃƒĐ¶Đ”ĐœĐŸ {count} ĐșĐ°ĐŒĐ”Ń€ · ĐČĐșлючОтД CCTV, Ń‡Ń‚ĐŸĐ±Ń‹ аĐșтоĐČĐžŃ€ĐŸĐČать", "other": "Đ—Đ°ĐłŃ€ŃƒĐ¶Đ”ĐœĐŸ {count} ĐșĐ°ĐŒĐ”Ń€Ń‹ · ĐČĐșлючОтД CCTV, Ń‡Ń‚ĐŸĐ±Ń‹ аĐșтоĐČĐžŃ€ĐŸĐČать" }, + "{count} more cameras outside this view · pan or zoom out": { + "one": "Ещё {count} ĐșĐ°ĐŒĐ”Ń€Đ° ĐČĐœĐ” ŃŃ‚ĐŸĐłĐŸ ĐČОЎа · сЎĐČĐžĐœŃŒŃ‚Đ” ОлО ĐŸŃ‚ĐŽĐ°Đ»ĐžŃ‚Đ”", + "few": "Ещё {count} ĐșĐ°ĐŒĐ”Ń€Ń‹ ĐČĐœĐ” ŃŃ‚ĐŸĐłĐŸ ĐČОЎа · сЎĐČĐžĐœŃŒŃ‚Đ” ОлО ĐŸŃ‚ĐŽĐ°Đ»ĐžŃ‚Đ”", + "many": "Ещё {count} ĐșĐ°ĐŒĐ”Ń€ ĐČĐœĐ” ŃŃ‚ĐŸĐłĐŸ ĐČОЎа · сЎĐČĐžĐœŃŒŃ‚Đ” ОлО ĐŸŃ‚ĐŽĐ°Đ»ĐžŃ‚Đ”", + "other": "Ещё {count} ĐșĐ°ĐŒĐ”Ń€Ń‹ ĐČĐœĐ” ŃŃ‚ĐŸĐłĐŸ ĐČОЎа · сЎĐČĐžĐœŃŒŃ‚Đ” ОлО ĐŸŃ‚ĐŽĐ°Đ»ĐžŃ‚Đ”" + }, "Enable CCTV to load camera intersections": "ВĐșлючОтД CCTV, Ń‡Ń‚ĐŸĐ±Ń‹ Đ·Đ°ĐłŃ€ŃƒĐ·ĐžŃ‚ŃŒ ĐșĐ°ĐŒĐ”Ń€Ń‹ ĐœĐ° пДрДĐșрёстĐșах", "Enable CCTV to start camera-linked intelligence summaries.": "ВĐșлючОтД CCTV, Ń‡Ń‚ĐŸĐ±Ń‹ запусĐșать сĐČĐŸĐŽĐșĐž ĐżĐŸ ĐșĐ°ĐŒĐ”Ń€Đ°ĐŒ.", "No summary available.": "ĐĄĐČĐŸĐŽĐșа ĐœĐ”ĐŽĐŸŃŃ‚ŃƒĐżĐœĐ°.", @@ -416,7 +422,6 @@ "Thermal": "ĐąĐ”ĐżĐ»ĐŸĐČĐžĐ·ĐŸŃ€", "Anime": "ĐĐœĐžĐŒĐ”", "Noir": "Нуар", - "Snow": "ĐĄĐœĐ”Đł", "Current cockpit vision style: {style}. Activate for next style.": "йДĐșущоĐč ŃŃ‚ĐžĐ»ŃŒ ĐŸĐ±Đ·ĐŸŃ€Đ° ĐșĐ°Đ±ĐžĐœŃ‹: {style}. АĐșтоĐČоруĐčтД, Ń‡Ń‚ĐŸĐ±Ń‹ пДрДĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ĐœĐ° ŃĐ»Đ”ĐŽŃƒŃŽŃ‰ĐžĐč.", "Current style: {style} — click for next": "йДĐșущоĐč ŃŃ‚ĐžĐ»ŃŒ: {style} — ĐœĐ°Đ¶ĐŒĐžŃ‚Đ” ĐŽĐ»Ń ŃĐ»Đ”ĐŽŃƒŃŽŃ‰Đ”ĐłĐŸ", "AIRCRAFT": "САМОЛЁб", @@ -553,8 +558,6 @@ "Expand Cockpit display options": "РазĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ эĐșŃ€Đ°ĐœĐ° ĐșĐ°Đ±ĐžĐœŃ‹", "Collapse Cockpit Radio controls": "ĐĄĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ упраĐČĐ»Đ”ĐœĐžĐ” Ń€Đ°ĐŽĐžĐŸ ĐșĐ°Đ±ĐžĐœŃ‹", "Expand Cockpit Radio controls": "РазĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ упраĐČĐ»Đ”ĐœĐžĐ” Ń€Đ°ĐŽĐžĐŸ ĐșĐ°Đ±ĐžĐœŃ‹", - "Close compact Radio controls": "ЗаĐșрыть ĐșĐŸĐŒĐżĐ°ĐșŃ‚ĐœĐŸĐ” упраĐČĐ»Đ”ĐœĐžĐ” Ń€Đ°ĐŽĐžĐŸ", - "Open compact Radio controls": "ОтĐșрыть ĐșĐŸĐŒĐżĐ°ĐșŃ‚ĐœĐŸĐ” упраĐČĐ»Đ”ĐœĐžĐ” Ń€Đ°ĐŽĐžĐŸ", "DIRECTORY BAND": "ДИАПАЗОН КАбАЛОГА", "{category} BAND": "ДИАПАЗОН {category}", "NO STATION SELECTED": "СбАНЩИЯ НЕ Đ’Đ«Đ‘Đ ĐĐĐ", @@ -568,9 +571,6 @@ "selected": "ĐČŃ‹Đ±Ń€Đ°ĐœĐœŃƒŃŽ", "nearest": "блОжаĐčшую", "{action} {target} radio station": "{action} {target} Ń€Đ°ĐŽĐžĐŸŃŃ‚Đ°ĐœŃ†ĐžŃŽ", - "RADIO STATE UNCERTAIN": "СОСбОЯНИЕ РАДИО НЕОПРЕДЕЛЁННО", - "SYNCING DIRECTORY": "ĐĄĐ˜ĐĐ„Đ ĐžĐĐ˜Đ—ĐĐŠĐ˜ĐŻ КАбАЛОГА", - "RADIO READY": "РАДИО ГОбОВО", "SYNCING": "ĐĄĐ˜ĐĐ„Đ ĐžĐĐ˜Đ—ĐĐŠĐ˜ĐŻ", "READY": "ГОбОВО", "station": "ŃŃ‚Đ°ĐœŃ†ĐžŃ", @@ -690,7 +690,6 @@ "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "Đ˜ĐŒĐžŃ‚ĐžŃ€ŃƒĐ”Ń‚ Ń‚Đ”ĐżĐ»ĐŸĐČĐŸĐč ĐșĐŸĐœŃ‚Ń€Đ°ŃŃ‚ ĐČ ŃŃ‚ĐžĐ»Đ” FLIR. Đ”Đ»Ń цĐČДта уĐČĐ”Đ»ĐžŃ‡ŃŒŃ‚Đ” Ironbow.", "Apply bright cel-shaded color and illustrated outlines.": "ĐŸŃ€ĐžĐŒĐ”ĐœŃĐ”Ń‚ ярĐșОД cel-shading-цĐČДта Đž Ń€ĐžŃĐŸĐČĐ°ĐœĐœŃ‹Đ” ĐșĐŸĐœŃ‚ŃƒŃ€Ń‹.", "Apply high-contrast monochrome film-noir grading.": "ĐŸŃ€ĐžĐŒĐ”ĐœŃĐ”Ń‚ ĐČŃ‹ŃĐŸĐșĐŸĐșĐŸĐœŃ‚Ń€Đ°ŃŃ‚ĐœŃƒŃŽ ĐŒĐŸĐœĐŸŃ…Ń€ĐŸĐŒĐœŃƒŃŽ цĐČĐ”Ń‚ĐŸĐșĐŸŃ€Ń€Đ”Đșцою ĐČ ŃŃ‚ĐžĐ»Đ” ĐœŃƒĐ°Ń€.", - "Add a cold, snowy whiteout treatment to the scene.": "Đ”ĐŸĐ±Đ°ĐČĐ»ŃĐ”Ń‚ ĐČ ŃŃ†Đ”ĐœŃƒ Ń…ĐŸĐ»ĐŸĐŽĐœŃ‹Đč ŃĐœĐ”Đ¶ĐœŃ‹Đč ŃŃ„Ń„Đ”Đșт Â«Đ±Đ”Đ»ĐŸĐč ĐŒĐłĐ»Ń‹Â».", "Expand LOCATION": "РазĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ ĐżĐ°ĐœĐ”Đ»ŃŒ Â«ĐœĐ”ŃŃ‚ĐŸÂ»", "Collapse panel": "ĐĄĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ ĐżĐ°ĐœĐ”Đ»ŃŒ", "Pin location tray": "ЗаĐșŃ€Đ”ĐżĐžŃ‚ŃŒ ĐżĐ°ĐœĐ”Đ»ŃŒ ĐŒĐ”ŃŃ‚Đ°", @@ -710,9 +709,6 @@ "FLIR": "FLIR", "Style": "ĐĄŃ‚ĐžĐ»ŃŒ", "STATION SITE": "САЙб СбАНЩИИ", - "Open detailed Radio controls": "ОтĐșрыть ĐżĐŸĐŽŃ€ĐŸĐ±ĐœĐŸĐ” упраĐČĐ»Đ”ĐœĐžĐ” Ń€Đ°ĐŽĐžĐŸ", - "Previous station": "ĐŸŃ€Đ”ĐŽŃ‹ĐŽŃƒŃ‰Đ°Ń ŃŃ‚Đ°ĐœŃ†ĐžŃ", - "Next station": "ĐĄĐ»Đ”ĐŽŃƒŃŽŃ‰Đ°Ń ŃŃ‚Đ°ĐœŃ†ĐžŃ", "Expand panel": "РазĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ ĐżĐ°ĐœĐ”Đ»ŃŒ", "CONTACTS": "ĐšĐžĐĐąĐĐšĐąĐ«", "Cycles the nearest contacts of whatever type you select — planes, vessels, installations. Satellites track independently.": "ĐŸĐ”Ń€Đ”Đ±ĐžŃ€Đ°Đ”Ń‚ блОжаĐčшОД ĐșĐŸĐœŃ‚Đ°Đșты ĐČŃ‹Đ±Ń€Đ°ĐœĐœĐŸĐłĐŸ топа — ŃĐ°ĐŒĐŸĐ»Ń‘Ń‚Ń‹, суЎа, ĐŸĐ±ŃŠĐ”Đșты. ĐĄĐżŃƒŃ‚ĐœĐžĐșĐž ĐŸŃ‚ŃĐ»Đ”Đ¶ĐžĐČаются ĐŸŃ‚ĐŽĐ”Đ»ŃŒĐœĐŸ.", @@ -724,13 +720,11 @@ "Next filtered station": "ĐĄĐ»Đ”ĐŽŃƒŃŽŃ‰Đ°Ń ĐŸŃ‚Ń„ĐžĐ»ŃŒŃ‚Ń€ĐŸĐČĐ°ĐœĐœĐ°Ń ŃŃ‚Đ°ĐœŃ†ĐžŃ", "STOP": "СбОП", "Stop radio playback": "ĐžŃŃ‚Đ°ĐœĐŸĐČоть ĐČĐŸŃĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ” Ń€Đ°ĐŽĐžĐŸ", - "Compact Radio controls": "ĐšĐŸĐŒĐżĐ°ĐșŃ‚ĐœĐŸĐ” упраĐČĐ»Đ”ĐœĐžĐ” Ń€Đ°ĐŽĐžĐŸ", "Context mode": "Đ Đ”Đ¶ĐžĐŒ ĐșĐŸĐœŃ‚Đ”Đșста", "Contact Context actions": "ДДĐčстĐČоя ĐșĐŸĐœŃ‚Đ”Đșста ĐșĐŸĐœŃ‚Đ°Đșта", "Available Space Missions": "Đ”ĐŸŃŃ‚ŃƒĐżĐœŃ‹Đ” ĐșĐŸŃĐŒĐžŃ‡Đ”ŃĐșОД ĐŒĐžŃŃĐžĐž", "LOADING 30-DAY MISSION INDEX": "ЗАГРУЗКА ИНДЕКСА МИССИЙ ЗА 30 ДНЕЙ", "Radio playback": "Đ’ĐŸŃĐżŃ€ĐŸĐžĐ·ĐČĐ”ĐŽĐ”ĐœĐžĐ” Ń€Đ°ĐŽĐžĐŸ", - "Compact Radio volume": "Đ“Ń€ĐŸĐŒĐșĐŸŃŃ‚ŃŒ ĐșĐŸĐŒĐżĐ°ĐșŃ‚ĐœĐŸĐłĐŸ Ń€Đ°ĐŽĐžĐŸ", "Radio volume": "Đ“Ń€ĐŸĐŒĐșĐŸŃŃ‚ŃŒ Ń€Đ°ĐŽĐžĐŸ", "STATION TAG": "бЕГ СбАНЩИИ", "DRAG TO TUNE": "бЯНИбЕ ДЛЯ НАСбРОЙКИ", @@ -777,7 +771,6 @@ "Fade": "Đ—Đ°Ń‚ŃƒŃ…Đ°ĐœĐžĐ”", "Outside": "ĐĄĐœĐ°Ń€ŃƒĐ¶Đž", "Tactical": "йаĐșтОчДсĐșĐžĐč", - "Operator": "ĐžĐżĐ”Ń€Đ°Ń‚ĐŸŃ€ŃĐșĐžĐč", "Minimal": "ĐœĐžĐœĐžĐŒĐ°Đ»ŃŒĐœŃ‹Đč", "HUD layout": "МаĐșДт HUD", "Layout": "МаĐșДт", @@ -2263,6 +2256,8 @@ "GOOGLE_MAPS_API_KEY is not set": "GOOGLE_MAPS_API_KEY ĐœĐ” Đ·Đ°ĐŽĐ°Đœ", "The Google Maps JavaScript API could not load": "ĐĐ” ŃƒĐŽĐ°Đ»ĐŸŃŃŒ Đ·Đ°ĐłŃ€ŃƒĐ·ĐžŃ‚ŃŒ Google Maps JavaScript API", "Weather request timed out": "Đ˜ŃŃ‚Đ”ĐșĐ»ĐŸ ĐČŃ€Đ”ĐŒŃ ĐŸĐ¶ĐžĐŽĐ°ĐœĐžŃ Đ·Đ°ĐżŃ€ĐŸŃĐ° ĐżĐŸĐłĐŸĐŽŃ‹", + "Cyclone request timed out": "Đ˜ŃŃ‚Đ”ĐșĐ»ĐŸ ĐČŃ€Đ”ĐŒŃ ĐŸĐ¶ĐžĐŽĐ°ĐœĐžŃ Đ·Đ°ĐżŃ€ĐŸŃĐ° цоĐșĐ»ĐŸĐœĐŸĐČ", + "Malformed cyclone snapshot": "ĐĐ”ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœŃ‹Đč ŃĐœĐžĐŒĐŸĐș цоĐșĐ»ĐŸĐœĐŸĐČ", "Malformed weather manifest": "ĐĐ”ĐșĐŸŃ€Ń€Đ”ĐșŃ‚ĐœŃ‹Đč ĐŒĐ°ĐœĐžŃ„Đ”ŃŃ‚ ĐżĐŸĐłĐŸĐŽŃ‹", "Weather HTTP {status}": "ĐŸĐŸĐłĐŸĐŽĐ°: HTTP {status}", "Weather image HTTP {status}": "ĐĄĐœĐžĐŒĐŸĐș ĐżĐŸĐłĐŸĐŽŃ‹: HTTP {status}", @@ -2483,8 +2478,6 @@ "Exit cockpit to fly to a route": "ВыĐčЎОтД Оз ĐșĐ°Đ±ĐžĐœŃ‹, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżĐ”Ń€Đ”Đ»Đ”Ń‚Đ”Ń‚ŃŒ Đș ĐŒĐ°Ń€ŃˆŃ€ŃƒŃ‚Ńƒ", "Exit cockpit to fly to a file": "ВыĐčЎОтД Оз ĐșĐ°Đ±ĐžĐœŃ‹, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżĐ”Ń€Đ”Đ»Đ”Ń‚Đ”Ń‚ŃŒ Đș фаĐčлу", "Exit cockpit to fly to a scene": "ВыĐčЎОтД Оз ĐșĐ°Đ±ĐžĐœŃ‹, Ń‡Ń‚ĐŸĐ±Ń‹ ĐżĐ”Ń€Đ”Đ»Đ”Ń‚Đ”Ń‚ŃŒ Đș ŃŃ†Đ”ĐœĐ”", - "Go to expanded Radio section": "ĐŸĐ”Ń€Đ”Đčто Đș разĐČŃ‘Ń€ĐœŃƒŃ‚ĐŸĐŒŃƒ Ń€Đ°Đ·ĐŽĐ”Đ»Ńƒ Ń€Đ°ĐŽĐžĐŸ", - "Expand Radio section in Context": "РазĐČĐ”Ń€ĐœŃƒŃ‚ŃŒ разЎДл Â«Đ Đ°ĐŽĐžĐŸÂ» ĐČ ĐżĐ°ĐœĐ”Đ»Đž Â«ĐšĐŸĐœŃ‚Đ”Đșст»", "New scene name": "ĐĐ°Đ·ĐČĐ°ĐœĐžĐ” ĐœĐŸĐČĐŸĐč ŃŃ†Đ”ĐœŃ‹", "Delete scene \"{scene}\" and all shots?": "ĐŁĐŽĐ°Đ»ĐžŃ‚ŃŒ ŃŃ†Đ”ĐœŃƒ «{scene}» Đž ĐČсД ĐșаЮры?", "Detailed outline unavailable": "ĐŸĐŸĐŽŃ€ĐŸĐ±ĐœŃ‹Đč ĐșĐŸĐœŃ‚ŃƒŃ€ ĐœĐ”ĐŽĐŸŃŃ‚ŃƒĐżĐ”Đœ", diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json index cbfa534e6..7a1d7ce45 100644 --- a/src/i18n/locales/uk.json +++ b/src/i18n/locales/uk.json @@ -1647,6 +1647,12 @@ "many": "{count} ĐșĐ°ĐŒĐ”Ń€ заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐŸ · уĐČŃ–ĐŒĐșĐœŃ–Ń‚ŃŒ CCTV, Ń‰ĐŸĐ± аĐșтоĐČуĐČато", "other": "{count} ĐșĐ°ĐŒĐ”Ń€Đž заĐČĐ°ĐœŃ‚Đ°Đ¶Đ”ĐœĐŸ · уĐČŃ–ĐŒĐșĐœŃ–Ń‚ŃŒ CCTV, Ń‰ĐŸĐ± аĐșтоĐČуĐČато" }, + "{count} more cameras outside this view · pan or zoom out": { + "one": "ЩД {count} ĐșĐ°ĐŒĐ”Ń€Đ° ĐżĐŸĐ·Đ° Ń†ĐžĐŒ ĐČĐžĐŽĐŸĐŒ · ĐżĐŸŃŃƒĐœŃŒŃ‚Đ” Đ°Đ±ĐŸ ĐČŃ–ĐŽĐŽĐ°Đ»Ń–Ń‚ŃŒ", + "few": "ЩД {count} ĐșĐ°ĐŒĐ”Ń€Đž ĐżĐŸĐ·Đ° Ń†ĐžĐŒ ĐČĐžĐŽĐŸĐŒ · ĐżĐŸŃŃƒĐœŃŒŃ‚Đ” Đ°Đ±ĐŸ ĐČŃ–ĐŽĐŽĐ°Đ»Ń–Ń‚ŃŒ", + "many": "ЩД {count} ĐșĐ°ĐŒĐ”Ń€ ĐżĐŸĐ·Đ° Ń†ĐžĐŒ ĐČĐžĐŽĐŸĐŒ · ĐżĐŸŃŃƒĐœŃŒŃ‚Đ” Đ°Đ±ĐŸ ĐČŃ–ĐŽĐŽĐ°Đ»Ń–Ń‚ŃŒ", + "other": "ЩД {count} ĐșĐ°ĐŒĐ”Ń€Đž ĐżĐŸĐ·Đ° Ń†ĐžĐŒ ĐČĐžĐŽĐŸĐŒ · ĐżĐŸŃŃƒĐœŃŒŃ‚Đ” Đ°Đ±ĐŸ ĐČŃ–ĐŽĐŽĐ°Đ»Ń–Ń‚ŃŒ" + }, "Enable CCTV to load camera intersections": "ĐŁĐČŃ–ĐŒĐșĐœŃ–Ń‚ŃŒ CCTV, Ń‰ĐŸĐ± заĐČĐ°ĐœŃ‚Đ°Đ¶ĐžŃ‚Đž ĐșĐ°ĐŒĐ”Ń€Đž ĐœĐ° ĐżĐ”Ń€Đ”Ń…Ń€Đ”ŃŃ‚ŃŃ…", "Enable CCTV to start camera-linked intelligence summaries.": "ĐŁĐČŃ–ĐŒĐșĐœŃ–Ń‚ŃŒ CCTV, Ń‰ĐŸĐ± ĐŸŃ‚Ń€ĐžĐŒŃƒĐČато Ń€ĐŸĐ·ĐČіЮуĐČĐ°Đ»ŃŒĐœŃ– Đ·ĐČĐ”ĐŽĐ”ĐœĐœŃ за ĐŽĐ°ĐœĐžĐŒĐž ĐșĐ°ĐŒĐ”Ń€.", "No summary available.": "ЗĐČĐ”ĐŽĐ”ĐœĐœŃ ĐœĐ”ĐŽĐŸŃŃ‚ŃƒĐżĐœĐ”.", @@ -1723,7 +1729,6 @@ "Thermal": "ĐąĐ”ĐżĐ»ĐŸĐČŃ–Đ·ĐŸŃ€", "Anime": "ĐĐœŃ–ĐŒĐ”", "Noir": "Нуар", - "Snow": "ĐĄĐœŃ–Đł", "Current cockpit vision style: {style}. Activate for next style.": "ĐŸĐŸŃ‚ĐŸŃ‡ĐœĐžĐč ĐČŃ–Đ·ŃƒĐ°Đ»ŃŒĐœĐžĐč ŃŃ‚ĐžĐ»ŃŒ у ĐșĐ°Đ±Ń–ĐœŃ–: {style}. АĐșтоĐČуĐčтД, Ń‰ĐŸĐ± пДрДĐčто ĐŽĐŸ ĐœĐ°ŃŃ‚ŃƒĐżĐœĐŸĐłĐŸ.", "Current style: {style} — click for next": "ĐŸĐŸŃ‚ĐŸŃ‡ĐœĐžĐč ŃŃ‚ĐžĐ»ŃŒ: {style} — ĐșĐ»Đ°Ń†ĐœŃ–Ń‚ŃŒ ĐŽĐ»Ń ĐœĐ°ŃŃ‚ŃƒĐżĐœĐŸĐłĐŸ", "Collapse Contact panel": "Đ—ĐłĐŸŃ€ĐœŃƒŃ‚Đž ĐżĐ°ĐœĐ”Đ»ŃŒ ĐșĐŸĐœŃ‚Đ°ĐșтіĐČ", @@ -1990,10 +1995,6 @@ "STATION UNAVAILABLE": "СбАНЩІЯ НЕДОСбУПНА", "Station unavailable after directory refresh": "ĐĄŃ‚Đ°ĐœŃ†Ń–Ń ĐœĐ”ĐŽĐŸŃŃ‚ŃƒĐżĐœĐ° ĐżŃ–ŃĐ»Ń ĐŸĐœĐŸĐČĐ»Đ”ĐœĐœŃ ĐșĐ°Ń‚Đ°Đ»ĐŸĐłŃƒ", "Radio could not {action} cleanly": "Đ Đ°ĐŽŃ–ĐŸ: ĐœĐ” ĐČĐŽĐ°Đ»ĐŸŃŃ ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐŸ {action}", - "Go to expanded Radio section": "ĐŸĐ”Ń€Đ”Đčто ĐŽĐŸ Ń€ĐŸĐ·ĐłĐŸŃ€ĐœŃƒŃ‚ĐŸĐłĐŸ Ń€ĐŸĐ·ĐŽŃ–Đ»Ńƒ Ń€Đ°ĐŽŃ–ĐŸ", - "Expand Radio section in Context": "Đ ĐŸĐ·ĐłĐŸŃ€ĐœŃƒŃ‚Đž Ń€ĐŸĐ·ĐŽŃ–Đ» Â«Đ Đ°ĐŽŃ–ĐŸÂ» ĐœĐ° ĐżĐ°ĐœĐ”Đ»Ń– Â«ĐšĐŸĐœŃ‚Đ”Đșст»", - "Close compact Radio controls": "ЗаĐșрото ĐșĐŸĐŒĐżĐ°ĐșŃ‚ĐœĐ” ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ Ń€Đ°ĐŽŃ–ĐŸ", - "Open compact Radio controls": "ВіЮĐșрото ĐșĐŸĐŒĐżĐ°ĐșŃ‚ĐœĐ” ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ Ń€Đ°ĐŽŃ–ĐŸ", "SYNC": "ĐĄĐ˜ĐĐ„Đ .", "RECONCILE": "ЗВІРИбИ", "DISABLE": "ВИМКНУбИ", @@ -2016,9 +2017,6 @@ "selected": "ĐČĐžĐ±Ń€Đ°ĐœĐ°", "nearest": "ĐœĐ°ĐčблОжча", "{action} {target} radio station": "{action}: {target} Ń€Đ°ĐŽŃ–ĐŸŃŃ‚Đ°ĐœŃ†Ń–Ń", - "RADIO STATE UNCERTAIN": "СбАН РАДІО НЕВИЗНАЧЕНИЙ", - "SYNCING DIRECTORY": "ĐĄĐ˜ĐĐ„Đ ĐžĐĐ†Đ—ĐĐŠĐ†ĐŻ КАбАЛОГУ", - "RADIO READY": "РАДІО ГОбОВЕ", "SYNCING": "ĐĄĐ˜ĐĐ„Đ ĐžĐĐ†Đ—ĐĐŠĐ†ĐŻ", "READY": "ГОбОВО", "station": "ŃŃ‚Đ°ĐœŃ†Ń–Ń", @@ -2850,7 +2848,6 @@ "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "Đ†ĐŒŃ–Ń‚ŃƒŃ” Ń‚Đ”ĐżĐ»ĐŸĐČĐžĐč ĐșĐŸĐœŃ‚Ń€Đ°ŃŃ‚ у стОлі FLIR. Đ”Đ»Ń ĐșĐŸĐ»ŃŒĐŸŃ€Ńƒ Đ·Đ±Ń–Đ»ŃŒŃˆŃ‚Đ” Ironbow.", "Apply bright cel-shaded color and illustrated outlines.": "Đ—Đ°ŃŃ‚ĐŸŃĐŸĐČує ясĐșраĐČу ĐŒŃƒĐ»ŃŒŃ‚ŃŃˆĐœŃƒ залОĐČĐșу та Ń–Đ»ŃŽŃŃ‚Ń€ĐŸĐČĐ°ĐœŃ– ĐșĐŸĐœŃ‚ŃƒŃ€Đž.", "Apply high-contrast monochrome film-noir grading.": "Đ—Đ°ŃŃ‚ĐŸŃĐŸĐČує ĐČĐžŃĐŸĐșĐŸĐșĐŸĐœŃ‚Ń€Đ°ŃŃ‚ĐœŃƒ Ń‡ĐŸŃ€ĐœĐŸ-Đ±Ń–Đ»Ńƒ ĐŸĐ±Ń€ĐŸĐ±Đșу ĐČ ŃŃ‚ĐžĐ»Ń– ĐœŃƒĐ°Ń€.", - "Add a cold, snowy whiteout treatment to the scene.": "Đ”ĐŸĐŽĐ°Ń” ĐŽĐŸ ŃŃ†Đ”ĐœĐž Ń…ĐŸĐ»ĐŸĐŽĐœĐžĐč ДфДĐșт ŃĐœŃ–ĐłĐŸĐČĐŸŃ— Ń–ĐŒĐ»Đž.", "MAP SOURCE": "ДЖЕРЕЛО КАРбИ", "Map source": "Đ”Đ¶Đ”Ń€Đ”Đ»ĐŸ Đșарто", "Style": "ĐĄŃ‚ĐžĐ»ŃŒ", @@ -2866,11 +2863,6 @@ "RECENT IMAGERY": "СВІЖІ ЗНІМКИ", "Imagery days in the box": "Đ”ĐœŃ– Đ·Ń– Đ·ĐœŃ–ĐŒĐșĐ°ĐŒĐž ĐČ ĐŸĐ±Đ»Đ°ŃŃ‚Ń–", "CONTEXT": "КОНбЕКСб", - "Compact Radio controls": "ĐšĐŸĐŒĐżĐ°ĐșŃ‚ĐœĐ” ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ Ń€Đ°ĐŽŃ–ĐŸ", - "Open detailed Radio controls": "ВіЮĐșрото ĐŽĐŸĐșĐ»Đ°ĐŽĐœĐ” ĐșĐ”Ń€ŃƒĐČĐ°ĐœĐœŃ Ń€Đ°ĐŽŃ–ĐŸ", - "Previous station": "ĐŸĐŸĐżĐ”Ń€Đ”ĐŽĐœŃ ŃŃ‚Đ°ĐœŃ†Ń–Ń", - "Next station": "ĐĐ°ŃŃ‚ŃƒĐżĐœĐ° ŃŃ‚Đ°ĐœŃ†Ń–Ń", - "Compact Radio volume": "Đ“ŃƒŃ‡ĐœŃ–ŃŃ‚ŃŒ ĐșĐŸĐŒĐżĐ°ĐșŃ‚ĐœĐŸĐłĐŸ Ń€Đ°ĐŽŃ–ĐŸ", "Expand panel": "Đ ĐŸĐ·ĐłĐŸŃ€ĐœŃƒŃ‚Đž ĐżĐ°ĐœĐ”Đ»ŃŒ", "Context mode": "Đ Đ”Đ¶ĐžĐŒ ĐșĐŸĐœŃ‚Đ”Đșсту", "CONTACTS": "КОНбАКбИ", @@ -2931,7 +2923,6 @@ "Layout": "ĐšĐŸĐŒĐżĐŸĐœŃƒĐČĐ°ĐœĐœŃ", "HUD layout": "ĐšĐŸĐŒĐżĐŸĐœŃƒĐČĐ°ĐœĐœŃ HUD", "Tactical": "йаĐșŃ‚ĐžŃ‡ĐœĐ”", - "Operator": "ĐžĐżĐ”Ń€Đ°Ń‚ĐŸŃ€ŃŃŒĐșĐ”", "Minimal": "ĐœŃ–ĐœŃ–ĐŒĐ°Đ»ŃŒĐœĐ”", "Cyber": "КібДр", "Sonar": "ĐĄĐŸĐœĐ°Ń€", @@ -3085,5 +3076,7 @@ "FAA prohibited and restricted special-use airspace only, not the UAS Facility Map or UAS flight restrictions. Informational only — not a substitute for official UAS flight-planning tools (B4UFLY / LAANC).": "Đ›ĐžŃˆĐ” Đ·Đ°Đ±ĐŸŃ€ĐŸĐœĐ”ĐœŃ– Đ·ĐŸĐœĐž та Đ·ĐŸĐœĐž ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœĐœŃ FAA (ĐżĐŸĐČŃ–Ń‚Ń€ŃĐœĐžĐč ĐżŃ€ĐŸŃŃ‚Ń–Ń€ ĐŸŃĐŸĐ±Đ»ĐžĐČĐŸĐłĐŸ ĐČĐžĐșĐŸŃ€ĐžŃŃ‚Đ°ĐœĐœŃ), бДз UAS Facility Map і ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœŃŒ ĐżĐŸĐ»ŃŒĐŸŃ‚Ń–ĐČ Đ‘ĐżĐ›Đ. Đ›ĐžŃˆĐ” ĐŽĐ»Ń ĐŽĐŸĐČіЮĐșĐž — ĐœĐ” Đ·Đ°ĐŒŃ–ĐœŃŽŃ” ĐŸŃ„Ń–Ń†Ń–ĐčĐœŃ– Ń–ĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚Đž ĐżĐ»Đ°ĐœŃƒĐČĐ°ĐœĐœŃ ĐżĐŸĐ»ŃŒĐŸŃ‚Ń–ĐČ Đ‘ĐżĐ›Đ (B4UFLY / LAANC).", "Prohibited": "Đ—Đ°Đ±ĐŸŃ€ĐŸĐœĐ”ĐœĐ° Đ·ĐŸĐœĐ°", "Restricted": "Đ—ĐŸĐœĐ° ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœĐœŃ", - "Prohibited & Restricted Airspace": "Đ—Đ°Đ±ĐŸŃ€ĐŸĐœĐ”ĐœŃ– Đ·ĐŸĐœĐž та Đ·ĐŸĐœĐž ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœĐœŃ" + "Prohibited & Restricted Airspace": "Đ—Đ°Đ±ĐŸŃ€ĐŸĐœĐ”ĐœŃ– Đ·ĐŸĐœĐž та Đ·ĐŸĐœĐž ĐŸĐ±ĐŒĐ”Đ¶Đ”ĐœĐœŃ", + "Malformed cyclone snapshot": "ĐĐ”ĐșĐŸŃ€Đ”ĐșŃ‚ĐœĐžĐč Đ·ĐœŃ–ĐŒĐŸĐș цоĐșĐ»ĐŸĐœŃ–ĐČ", + "Cyclone request timed out": "ĐœĐžĐœŃƒĐČ Ń‡Đ°Ń ĐŸŃ‡Ń–ĐșуĐČĐ°ĐœĐœŃ Đ·Đ°ĐżĐžŃ‚Ńƒ цоĐșĐ»ĐŸĐœŃ–ĐČ" } diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 41f0b15c3..e0157832a 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -1203,6 +1203,8 @@ "Some weather tiles unavailable": "éƒšćˆ†ć€©æ°”ç“Šç‰‡äžćŻç”š", "Malformed weather manifest": "ć€©æ°”æž…ć•æ ŒćŒé”™èŻŻ", "Weather request timed out": "ć€©æ°”èŻ·æ±‚è¶…æ—¶", + "Cyclone request timed out": "æ°”æ—‹èŻ·æ±‚è¶…æ—¶", + "Malformed cyclone snapshot": "æ°”æ—‹ćż«ç…§æ ŒćŒé”™èŻŻ", "Temperature field unavailable": "æž©ćșŠćœș侍揯甹", "Mean sea level pressure field unavailable": "ćčłć‡æ”·ćčłéąæ°”掋ćœș侍揯甹", "Wind upstream unavailable": "风ćœșäžŠæžžæ•°æźæșäžćŻç”š", @@ -1551,6 +1553,9 @@ "{count} cameras loaded · enable CCTV to activate": { "other": "ć·ČćŠ èœœ {count} äžȘæ‘„ćƒć€Ž · 搯甹 CCTV ä»„æż€æŽ»" }, + "{count} more cameras outside this view · pan or zoom out": { + "other": "æ­€è§†ć›Ÿć€–èż˜æœ‰ {count} äžȘæ‘„ćƒć€Ž · ćčłç§»æˆ–çŒ©ć°" + }, "Enable CCTV to load camera intersections": "搯甹 CCTV ä»„ćŠ èœœè·ŻćŁæ‘„ćƒć€Ž", "Enable CCTV to start camera-linked intelligence summaries.": "搯甹 CCTV ä»„ćŒ€ć§‹ç”ŸæˆäžŽæ‘„ćƒć€Žć…łè”çš„æƒ…æŠ„æ‘˜èŠă€‚", "No summary available.": "æš‚æ— æ‘˜èŠă€‚", @@ -1624,7 +1629,6 @@ "Thermal": "çƒ­æˆćƒ", "Anime": "ćŠšæŒ«", "Noir": "黑癜", - "Snow": "é›Șæ™Ż", "Current cockpit vision style: {style}. Activate for next style.": "ćœ“ć‰ćș§èˆ±è§†è§‰æ ·ćŒïŒš{style}。ç‚čć‡»ćŻćˆ‡æąćˆ°äž‹äž€äžȘæ ·ćŒă€‚", "Current style: {style} — click for next": "ćœ“ć‰æ ·ćŒïŒš{style}——ç‚čć‡»ćˆ‡æąćˆ°äž‹äž€äžȘ", "Collapse Contact panel": "æ”¶è”·ç›źæ ‡éąæż", @@ -1860,10 +1864,6 @@ "STATION UNAVAILABLE": "ç””ć°äžćŻç”š", "Station unavailable after directory refresh": "ç›źćœ•ćˆ·æ–°ćŽèŻ„ç””ć°äžćŻç”š", "Radio could not {action} cleanly": "ç””ć°æœȘèƒœæ­Łćžž{action}", - "Go to expanded Radio section": "ć‰ćŸ€ć±•ćŒ€çš„ç””ć°ćŒș㟟", - "Expand Radio section in Context": "ćœšæ€ćŠżéąæżäž­ć±•ćŒ€ç””ć°ćŒș㟟", - "Close compact Radio controls": "慳闭çČŸçź€ç””ć°æŽ§ä»¶", - "Open compact Radio controls": "æ‰“ćŒ€çČŸçź€ç””ć°æŽ§ä»¶", "SYNC": "ćŒæ­„", "RECONCILE": "æ žćŻč", "DISABLE": "恜甹", @@ -1885,9 +1885,6 @@ "selected": "所选", "nearest": "æœ€èż‘", "{action} {target} radio station": "{action}{target}ç””ć°", - "RADIO STATE UNCERTAIN": "ç””ć°çŠ¶æ€äžçĄźćźš", - "SYNCING DIRECTORY": "æ­ŁćœšćŒæ­„ç›źćœ•", - "RADIO READY": "ç””ć°ć°±ç»Ș", "SYNCING": "ćŒæ­„äž­", "READY": "ć°±ç»Ș", "station": "ç””ć°", @@ -2535,7 +2532,6 @@ "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "æšĄæ‹Ÿ FLIR éŁŽæ Œçš„çƒ­æˆćƒćŻčæŻ”ă€‚è°ƒé«˜ Ironbow ćŻæ˜Ÿç€șè‰Čćœ©ă€‚", "Apply bright cel-shaded color and illustrated outlines.": "ćș”甚明äșźçš„蔛璐珞è‰Čćœ©ć’Œæ’ç”»èœźć»“çșżă€‚", "Apply high-contrast monochrome film-noir grading.": "ćș”甚高ćŻčæŻ”ćșŠçš„é»‘ç™œç””ćœ±éŁŽæ Œè°ƒè‰Č。", - "Add a cold, snowy whiteout treatment to the scene.": "äžșćœșæ™Żæ·»ćŠ ćŻ’ć†·çš„æšŽé›Șç™œćŒ–æ•ˆæžœă€‚", "MAP SOURCE": "ćœ°ć›Ÿæș", "Map source": "ćœ°ć›Ÿæș", "Style": "æ ·ćŒ", @@ -2551,11 +2547,6 @@ "RECENT IMAGERY": "èż‘æœŸćœ±ćƒ", "Imagery days in the box": "è§†é‡Žć†…çš„ćœ±ćƒć€©æ•°", "CONTEXT": "æ€ćŠż", - "Compact Radio controls": "çČŸçź€ç””ć°æŽ§ä»¶", - "Open detailed Radio controls": "æ‰“ćŒ€èŻŠç»†ç””ć°æŽ§ä»¶", - "Previous station": "侊侀äžȘç””ć°", - "Next station": "例侀äžȘç””ć°", - "Compact Radio volume": "çČŸçź€ç””ć°éŸłé‡", "Expand panel": "ć±•ćŒ€éąæż", "Context mode": "æ€ćŠżæšĄćŒ", "CONTACTS": "ç›źæ ‡", @@ -2616,7 +2607,6 @@ "Layout": "ćžƒć±€", "HUD layout": "HUD ćžƒć±€", "Tactical": "æˆ˜æœŻ", - "Operator": "æ“äœœć‘˜", "Minimal": "çČŸçź€", "Cyber": "è”›ćš", "Sonar": "棰摐", diff --git a/src/i18n/locales/zh-Hant.json b/src/i18n/locales/zh-Hant.json index 825384709..2542baf6c 100644 --- a/src/i18n/locales/zh-Hant.json +++ b/src/i18n/locales/zh-Hant.json @@ -1198,6 +1198,8 @@ "Some weather tiles unavailable": "éƒšćˆ†ć€©æ°Łç“Šç‰‡äžćŻç”š", "Malformed weather manifest": "ć€©æ°Łæž…ć–źæ ŒćŒéŒŻèȘ€", "Weather request timed out": "ć€©æ°Łè«‹æ±‚è¶…æ™‚", + "Cyclone request timed out": "æ°Łæ—‹è«‹æ±‚è¶…æ™‚", + "Malformed cyclone snapshot": "æ°Łæ—‹ćż«ç…§æ ŒćŒéŒŻèȘ€", "Temperature field unavailable": "æș«ćșŠć ŽäžćŻç”š", "Mean sea level pressure field unavailable": "ćčłć‡æ”·ćčłéąæ°ŁćŁ“ć ŽäžćŻç”š", "Wind upstream unavailable": "éąšć ŽäžŠæžžæ•žæ“šæșäžćŻç”š", @@ -1541,6 +1543,9 @@ "{count} cameras loaded · enable CCTV to activate": { "other": "ć·ČćŠ èŒ‰ {count} ć€‹æ”ćƒé ­ · 敟甹 CCTV ä»„æż€æŽ»" }, + "{count} more cameras outside this view · pan or zoom out": { + "other": "æ­€èŠ–ćœ–ć€–é‚„æœ‰ {count} ć€‹æ”ćƒé ­ · ćčłç§»æˆ–羼氏" + }, "Enable CCTV to load camera intersections": "敟甹 CCTV ä»„ćŠ èŒ‰è·ŻćŁæ”ćƒé ­", "Enable CCTV to start camera-linked intelligence summaries.": "敟甹 CCTV ä»„é–‹ć§‹ç”Ÿæˆèˆ‡æ”ćƒé ­é—œèŻçš„æƒ…ć ±æ‘˜èŠă€‚", "No summary available.": "æš«ç„Ąæ‘˜èŠă€‚", @@ -1614,7 +1619,6 @@ "Thermal": "ç†±æˆćƒ", "Anime": "ć‹•æŒ«", "Noir": "黑癜", - "Snow": "é›Șæ™Ż", "Current cockpit vision style: {style}. Activate for next style.": "ç•¶ć‰ćș§è‰™èŠ–èŠșæšŁćŒïŒš{style}ă€‚é»žæ“ŠćŻćˆ‡æ›ćˆ°äž‹äž€ć€‹æšŁćŒă€‚", "Current style: {style} — click for next": "ç•¶ć‰æšŁćŒïŒš{style}â€”â€”é»žæ“Šćˆ‡æ›ćˆ°äž‹äž€ć€‹", "Collapse Contact panel": "æ”¶è”·ç›źæš™éąæż", @@ -1848,10 +1852,6 @@ "STATION UNAVAILABLE": "電è‡ș侍揯甹", "Station unavailable after directory refresh": "ç›źéŒ„ćˆ·æ–°ćŸŒè©Č電è‡ș侍揯甹", "Radio could not {action} cleanly": "電è‡șæœȘèƒœæ­Łćžž{action}", - "Go to expanded Radio section": "ć‰ćŸ€ć±•é–‹çš„é›»è‡ș捀柟", - "Expand Radio section in Context": "ćœšæ…‹ć‹ąéąæżäž­ć±•é–‹é›»è‡ș捀柟", - "Close compact Radio controls": "關閉çČŸç°Ąé›»è‡ș控件", - "Open compact Radio controls": "打開çČŸç°Ąé›»è‡ș控件", "SYNC": "ćŒæ­„", "RECONCILE": "æ žć°", "DISABLE": "恜甹", @@ -1873,9 +1873,6 @@ "selected": "所遞", "nearest": "æœ€èż‘", "{action} {target} radio station": "{action}{target}電è‡ș", - "RADIO STATE UNCERTAIN": "電è‡ș狀態䞍çąș漚", - "SYNCING DIRECTORY": "æ­ŁćœšćŒæ­„ç›źéŒ„", - "RADIO READY": "電è‡ș氱緒", "SYNCING": "ćŒæ­„äž­", "READY": "氱緒", "station": "電è‡ș", @@ -2523,7 +2520,6 @@ "Simulate FLIR-style thermal contrast. Turn up Ironbow for color.": "æšĄæ“Ź FLIR éąšæ Œçš„ç†±æˆćƒć°æŻ”ă€‚èȘżé«˜ Ironbow 揯顯ç€șè‰Čćœ©ă€‚", "Apply bright cel-shaded color and illustrated outlines.": "應甚明äșźçš„èłœç’çžè‰Čćœ©ć’Œæ’ç•«èŒȘ滓線。", "Apply high-contrast monochrome film-noir grading.": "æ‡‰ç”šé«˜ć°æŻ”ćșŠçš„é»‘ç™œé›»ćœ±éąšæ ŒèȘżè‰Č。", - "Add a cold, snowy whiteout treatment to the scene.": "ç‚șć Žæ™Żæ·»ćŠ ćŻ’ć†·çš„æšŽé›Șç™œćŒ–æ•ˆæžœă€‚", "MAP SOURCE": "朰朖æș", "Map source": "朰朖æș", "Style": "æšŁćŒ", @@ -2539,11 +2535,6 @@ "RECENT IMAGERY": "èż‘æœŸćœ±ćƒ", "Imagery days in the box": "èŠ–é‡Žć…§çš„ćœ±ćƒć€©æ•ž", "CONTEXT": "æ…‹ć‹ą", - "Compact Radio controls": "çČŸç°Ąé›»è‡ș控件", - "Open detailed Radio controls": "æ‰“é–‹è©łçŽ°é›»è‡ș控件", - "Previous station": "䞊䞀怋電è‡ș", - "Next station": "䞋䞀怋電è‡ș", - "Compact Radio volume": "çČŸç°Ąé›»è‡ș音量", "Expand panel": "ć±•é–‹éąæż", "Context mode": "æ…‹ć‹ąæšĄćŒ", "CONTACTS": "ç›źæš™", @@ -2604,7 +2595,6 @@ "Layout": "äœˆć±€", "HUD layout": "HUD äœˆć±€", "Tactical": "æˆ°èĄ“", - "Operator": "æ“äœœć“Ą", "Minimal": "çČŸç°Ą", "Cyber": "èłœćš", "Sonar": "èČ搶", diff --git a/src/i18n/same-as-english.json b/src/i18n/same-as-english.json index 21f2ce2fa..57f2df8df 100644 --- a/src/i18n/same-as-english.json +++ b/src/i18n/same-as-english.json @@ -1,4 +1,170 @@ { + "de": [ + "1090 MHz", + "978 MHz UAT", + "AIS: --", + "AIS: {name}", + "ANIME", + "AUTO", + "Alternative", + "Ambient", + "Anime", + "Austin", + "BRG {value}°", + "BRG —", + "Bloom", + "Blues", + "Bus", + "CCTV", + "COCKPIT", + "CRS {value}°", + "CRT", + "Country", + "Cyan", + "Cyber", + "DEST ---°", + "DEST {bearing}", + "Dance", + "Details", + "Dubai", + "EXPORT", + "EXPORT {slot}", + "FALLBACK", + "FILTER", + "FLIR", + "FOV", + "FOV {value}°", + "FT", + "Folk", + "Funk", + "GEO", + "GOOGLE STREET VIEW", + "Global", + "Global · 60°S–60°N", + "Google Street View", + "HDG", + "HDG {value}°", + "Hip-Hop", + "House", + "Hybrid", + "Indie", + "Ironbow", + "Jazz", + "LIVE", + "Landsat 8/9", + "Latin", + "Layout", + "London", + "Los Angeles", + "MIL", + "MINI", + "MISSION", + "MM", + "MONITOR", + "Metal", + "Minimal", + "NAME", + "NASA FIRMS · LIVE", + "NAV", + "NEWS", + "NNW", + "NOIR", + "NORMAL", + "NVG", + "NW", + "New York", + "Noir", + "Normal", + "OK", + "ORBIT", + "ORBIT · ", + "Oldies", + "OpenStreetMap + optional Google Maps Places", + "Operator", + "PAUSE", + "PLAY", + "POS: LIVE", + "POS: {time}Z", + "POSITION {age}", + "PROJ MONITOR", + "Paris", + "Pause", + "Pin", + "Plan", + "Pop", + "Punk", + "RADIO", + "REC", + "REGION", + "RESET", + "Radio", + "Reggae", + "Rock", + "S2 GhostMaps", + "SAR", + "SIG", + "SNAPSHOT", + "SQUAWK {code} · {status}", + "SSW", + "STANDARD", + "START", + "STATION", + "STATUS", + "STATUS · ", + "STD", + "SW", + "SYNC", + "San Francisco", + "Scanlines", + "Scope", + "Sentinel-2", + "Sonar", + "Soul", + "Station", + "Station {id}", + "T minus {seconds}", + "TAGS · {tags}", + "TANKER", + "TEMP", + "Talk", + "Tallinn", + "Techno", + "Trance", + "Turboprop", + "UPSTREAM", + "Upstream HTTP {status}", + "Vignette", + "WHOT/BHOT", + "WIND", + "WNW", + "WSW", + "Washington DC", + "Wind", + "dB", + "feed status|live", + "fire behavior|Minimal", + "ft", + "hPa", + "km", + "km/h", + "min", + "mph", + "radio|NEWS", + "radio|TALK", + "view band|GLOBAL", + "{city} CCTV", + "{county} County", + "{source} HTTP {status}", + "{speed} kn", + "{type} SPD: {speed} HDG: {heading}", + "{value} KM", + "{value} KM DOWNRANGE", + "{value} KM/H", + "{value} KM/S", + "ΔN", + "Ⅱ PAUSE", + "â–Č {frp} MW" + ], "es": [ "1090 MHz", "978 MHz UAT", @@ -124,6 +290,531 @@ "ΔN", "â–Č {frp} MW" ], + "fr": [ + "1090 MHz", + "978 MHz UAT", + "ALTITUDE", + "ALTITUDE · FT", + "ANIME", + "AUTO", + "Action", + "Allocation", + "Altitude {altitude}", + "Ambient", + "Anime", + "Austin", + "Aviation / Marine", + "BRG {value}°", + "BRG —", + "Bloom", + "Blues", + "Bus", + "CAL {value}", + "CAL · {badge}", + "CALIBRATION", + "CARGO", + "CAUSE", + "CCTV", + "CCTV OFF", + "CCTV ON", + "COCKPIT", + "COMMERCIAL", + "CONTACT", + "CONTACTS", + "CONTACTS · 250 KM", + "CRS {value}°", + "CRT", + "Country", + "Cyan", + "Cyber", + "Cyclones · NHC / CPHC", + "DENSE", + "DENSE ···", + "DENSE ✕", + "DEST ---°", + "DEST {bearing}", + "DESTINATION", + "Dance", + "Drone", + "ENE", + "ESE", + "EUROPE", + "FLIR", + "FM MHZ", + "FOV", + "FOV {value}°", + "FT", + "Ferry", + "Folk", + "Funk", + "GAIN", + "GEO", + "GOOGLE STREET VIEW", + "Gain", + "Google Street View", + "Grain", + "HDG", + "HDG {value}°", + "Hip-Hop", + "House", + "IMAGE", + "Indie", + "Ironbow", + "Jazz", + "LOCAL", + "Landsat 8/9", + "Landsat 8/9 via HLS", + "Los Angeles", + "MIC", + "MIL", + "MINI", + "MISSION", + "MM", + "MSG/S", + "Metal", + "Minimal", + "Minutes", + "Mode", + "NAV", + "NE", + "NNE", + "NOIR", + "NORMAL", + "NVG", + "New York", + "Noir", + "Normal", + "OFF", + "OK", + "ON", + "ON/OFF", + "Oldies", + "PAUSE", + "POSITION {age}", + "PROJ OFF", + "PROJECTION OFF", + "PROJECTION ON", + "PROPAGATION", + "Paris", + "Pause", + "Plan", + "Pop", + "Punk", + "RADIO", + "REC", + "Radio", + "Reggae", + "Rock", + "S2 GhostMaps", + "SAR", + "SE", + "SIG", + "SOURCE", + "SQUAWK {code} · {status}", + "SRC {value}", + "SSE", + "STANDARD", + "STATION", + "STD", + "San Francisco", + "Satellites", + "Saturation", + "Sonar", + "Soul", + "Source", + "Station", + "Station {id}", + "Style", + "TAGS · {tags}", + "TEMP", + "TYPE", + "Tallinn", + "Techno", + "Tokyo", + "Train", + "Trance", + "USB {rate} msg/s", + "VOLUME", + "VS", + "WHOT/BHOT", + "audio {state}", + "dB", + "ft", + "hPa", + "image", + "installation class|BASE", + "installation class|INSTALLATION", + "km", + "km/h", + "max {value} MW", + "min", + "mini", + "mph", + "nominal", + "satellite", + "standard", + "station", + "voice|OFF", + "{count} MSGS", + "{count} SOURCES", + "{count} messages", + "{n} cyclones", + "{n} satellites", + "{rate} msg/s", + "{value} KM", + "{value} KM/H", + "{value} KM/S", + "ΔE", + "ΔN", + "Ⅱ PAUSE", + "â–Č {frp} MW" + ], + "it": [ + "1090 MHz", + "978 MHz UAT", + "AFRICA", + "AIS: --", + "AIS: {name}", + "ALT {altitude} FT · GS {speed} KT · TRK {track}", + "ANIME", + "ASIA", + "AUTO", + "AUTO HOP OFF", + "AUTO HOP ON", + "Alternative", + "Ambient", + "Anime", + "Area", + "Austin", + "BRG {value}°", + "BRG —", + "Bloom", + "Blues", + "Business jet", + "CAL {value}", + "CAL · {badge}", + "CARGO", + "CCTV", + "CCTV OFF", + "CCTV ON", + "CH {index} / {total}", + "COCKPIT", + "CRS {value}°", + "CRT", + "Country", + "Cyber", + "DEST ---°", + "DEST {bearing}", + "DISPLAY", + "Dance", + "Drone", + "Dubai", + "ENE", + "ESE", + "FLIR", + "FM MHZ", + "FOCUS", + "FOV", + "FOV {value}°", + "FT", + "Folk", + "Funk", + "GEO", + "GOOGLE STREET VIEW", + "Google Street View", + "HDG", + "HDG {value}°", + "Hip-Hop", + "House", + "Indie", + "Ironbow", + "Jazz", + "KTS", + "LIVE", + "Landsat 8/9", + "Layout", + "Los Angeles", + "MIC", + "MIL", + "MINI", + "MM", + "MONITOR", + "MSG/S", + "Metal", + "NASA FIRMS · LIVE", + "NAV", + "NE", + "NNE", + "NOIR", + "NVG", + "New York", + "Noir", + "OCEANIA", + "OFF", + "OK", + "ON", + "ON/OFF", + "Oldies", + "PAYLOAD", + "PLAY", + "POS: LIVE", + "POS: {time}Z", + "PRECIP", + "Pop", + "Punk", + "RADIO", + "REC", + "RESET", + "RESET CAL", + "Radio", + "Reggae", + "Rock", + "S2 GhostMaps", + "SAR", + "SE", + "SIG", + "SNAPSHOT", + "SQUAWK {code} · {status}", + "SSE", + "STANDARD", + "STD", + "STOP", + "SYNC", + "San Francisco", + "Scope", + "Sentinel-2", + "Sonar", + "Soul", + "TEMP", + "TIMEOUT", + "Talk", + "Tallinn", + "Techno", + "Tokyo", + "Tram", + "Trance", + "UPSTREAM", + "USB {rate} msg/s", + "Upstream HTTP {status}", + "V/S {rate} FPM", + "VIEWSHED", + "VIEWSHED ON", + "VOLUME", + "VS", + "WHOT/BHOT", + "Washington DC", + "World", + "audio {state}", + "dB", + "feed status|live", + "ft", + "hPa", + "installation class|BASE", + "km", + "km/h", + "max {value} MW", + "min", + "mini", + "mph", + "radio|TALK", + "satellite", + "standard", + "view band|METRO", + "voice|OFF", + "{count} MSGS", + "{count} feeds live", + "{count} scenes", + "{rate} msg/s", + "{scene} / {pack}: {status}. File: {path}. {attribution} · {license}", + "{source} HTTP {status}", + "{speed} kn", + "{speed}KT", + "{value} KM", + "{value} KM DOWNRANGE", + "{value} KM/H", + "{value} KM/S", + "{value} conf", + "ΔE", + "ΔN", + "â–Č {frp} MW" + ], + "ja": [ + "1090 MHz", + "978 MHz UAT", + "AIS: --", + "AIS: {name}", + "BRG {value}°", + "BRG —", + "CAL {value}", + "CAL · {badge}", + "CCTV", + "CH {index} / {total}", + "CRS {value}°", + "CRT", + "FLIR", + "FLT", + "FM MHZ", + "FOV", + "FOV {value}°", + "FT", + "GEO", + "HDG", + "HDG {value}°", + "Ironbow", + "Landsat 8/9", + "MSG/S", + "NVG", + "POS: {time}Z", + "REC", + "S2 GhostMaps", + "SRC {value}", + "Sentinel-2", + "USB {rate} msg/s", + "WHOT/BHOT", + "dB", + "ft", + "hPa", + "km", + "km/h", + "kt", + "mph", + "{city} CCTV", + "{rate} msg/s", + "{source} HTTP {status}", + "{speed} kn", + "{type} SPD: {speed} HDG: {heading}", + "ΔE", + "ΔN", + "â–Č {frp} MW" + ], + "pt": [ + "1090 MHz", + "978 MHz UAT", + "AIS: --", + "AIS: {name}", + "ALT {altitude} FT · GS {speed} KT · TRK {track}", + "ALTITUDE", + "ALTITUDE · FT", + "ANIME", + "AUTO", + "Altitude {altitude}", + "Anime", + "Austin", + "BIKE", + "BRG {value}°", + "BRG —", + "Bloom", + "Blues", + "CAL {value}", + "CAL · {badge}", + "CCTV", + "CRS {value}°", + "CRT", + "Country", + "DEST ---°", + "DEST {bearing}", + "Dance", + "Drone", + "Dubai", + "ENE", + "ESE", + "FLIR", + "FLT", + "FM MHZ", + "FOV", + "FOV {value}°", + "FT", + "Folk", + "Funk", + "GEO", + "GOOGLE STREET VIEW", + "Global", + "Global · 60°S–60°N", + "Google Street View", + "HDG", + "HDG {value}°", + "Hip-Hop", + "House", + "Indie", + "Ironbow", + "Jazz", + "LOCAL", + "Landsat 8/9", + "Landsat 8/9 via HLS", + "Layout", + "Los Angeles", + "MIC", + "MIL", + "MINI", + "MM", + "MONITOR", + "MSG/S", + "Metal", + "NAV", + "NE", + "NNE", + "NOIR", + "NORMAL", + "NVG", + "Noir", + "Normal", + "OCEANIA", + "OK", + "POS: {time}Z", + "PRECIP", + "Paris", + "Pop", + "Punk", + "RANGE", + "REC", + "Reggae", + "Rock", + "S2 GhostMaps", + "SAR", + "SE", + "SIG", + "SNAPSHOT", + "SQUAWK {code} · {status}", + "SSE", + "STATUS", + "STATUS · ", + "Sentinel-2", + "Sentinel-2 via HLS", + "Sonar", + "Soul", + "TAGS · {tags}", + "TEMP", + "Tallinn", + "Techno", + "Trance", + "USB {rate} msg/s", + "V/S {rate}", + "VISUAL", + "VOLUME", + "VS", + "WHOT/BHOT", + "WX", + "dB", + "fire confidence|nominal", + "ft", + "hPa", + "installation class|BASE", + "km", + "km/h", + "kt", + "min", + "mini", + "mph", + "nominal", + "view band|GLOBAL", + "{rate} msg/s", + "{type} SPD: {speed} HDG: {heading}", + "{value} KM", + "{value} KM/H", + "{value} KM/S", + "ΔN", + "â–Č {frp} MW" + ], "ru": [ "AIS: --", "AIS: {name}", diff --git a/src/i18n/zh-CN-display.test.mjs b/src/i18n/zh-CN-display.test.mjs index b9e55058d..29cccd44f 100644 --- a/src/i18n/zh-CN-display.test.mjs +++ b/src/i18n/zh-CN-display.test.mjs @@ -17,6 +17,9 @@ test('Chinese HUD and cockpit units keep their case without spacing coordinates' assert.equal(formatCockpitDistance(14000), '14\u00a0km'); assert.equal(LOCALIZED_LOCALITY.sector({ latDeg: 21.33, lonDeg: -77.5 }), '扇ćŒș 21.33N 77.50W'); + setLocale('ja'); + assert.equal(hudQuantity(13, 'km'), '13 km'); + assert.equal(hudQuantity(1.5, 'km', 1), '1.5 km'); setLocale('en'); assert.equal(hudQuantity(0, 'km'), '0KM'); assert.equal(hudQuantity(2069, 'km', 1), '2069.0KM'); @@ -88,7 +91,6 @@ test('radio option text and accessible name use the same localized parentheses', setLocale(locale); const host = { _radioPanel: element(), _radioFilter: element(), - _syncContextRadioLauncherState() {}, actions: { getLifecycle: () => null, scheduleLayout() {} }, }; renderRadioState.call(host, { diff --git a/src/keySetup.test.mjs b/src/keySetup.test.mjs index e7e6c70ae..013dbbd87 100644 --- a/src/keySetup.test.mjs +++ b/src/keySetup.test.mjs @@ -48,7 +48,7 @@ test('setup placement moves the same button only in Cyber and disconnects on tea chip, ); assert.equal(chip.parentNode, home); - for (const variant of ['cyber', 'operator', 'cyber', 'minimal']) { + for (const variant of ['cyber', 'tactical', 'cyber', 'minimal']) { theme.dataset.uiTheme = variant; notify(); assert.equal(chip.parentNode, variant === 'cyber' ? toolbar : home); diff --git a/src/layers/cctv/cards.js b/src/layers/cctv/cards.js index 72f0b88a4..04b8fb86f 100644 --- a/src/layers/cctv/cards.js +++ b/src/layers/cctv/cards.js @@ -99,7 +99,8 @@ export function createCards({ state: layerState, services, parts, source }) { const candidates = []; const screenById = new Map(); - for (const record of layerState._records) { + // Cards go only on the icons the view pass shows (refreshHorizonCulling). + for (const record of layerState._viewRecords) { const id = record.camera.id; if (id === activeId || !record.position) continue; let inView = false; @@ -187,7 +188,14 @@ export function createCards({ state: layerState, services, parts, source }) { nowMs: Date.now(), cardLimit: budgets.cardLimit, }); - layerState._cardIds = new Set(retention.keepIds); + // Grace keeps a card briefly after it loses selection, but never on a + // camera whose icon the view pass has hidden. + const shownIds = new Set( + layerState._viewRecords.map((record) => record.camera.id), + ); + layerState._cardIds = new Set( + retention.keepIds.filter((id) => shownIds.has(id)), + ); layerState._cardGraceState = retention.graceState; // Bounded thumbnail LRU: live cards (grace included) never lose their @@ -371,7 +379,6 @@ export function createCards({ state: layerState, services, parts, source }) { layerState._cctvOverlayHost.clearSource(CCTV_OVERLAY_SOURCE_ID); layerState._cctvOverlayHost.setVisible(CCTV_OVERLAY_SOURCE_ID, false); parts.hover.clearHoverCard(); - layerState._cameraMoving = false; layerState._cardIds = new Set(); layerState._cardGraceState = new Map(); layerState._cardFrameSlots = new Map(); diff --git a/src/layers/cctv/controls.js b/src/layers/cctv/controls.js index af9f1f427..492ff1758 100644 --- a/src/layers/cctv/controls.js +++ b/src/layers/cctv/controls.js @@ -205,22 +205,21 @@ export function createControls({ state: layerState, services, parts, source }) { * @returns {{ position: Cesium.Cartesian3, id: string, type: string }[]} */ getDetectableObjects(options = {}) { - if (!layerState._enabled || layerState._records.length === 0) return []; + // The cameras the view pass shows, not icons it has hidden. + const records = layerState._viewRecords; + if (!layerState._enabled || records.length === 0) return []; const maxCount = Number.isFinite(options.maxCount) ? Math.max(1, Math.floor(options.maxCount)) - : layerState._records.length; + : records.length; const seed = Number.isFinite(options.seed) ? Math.floor(options.seed) : 0; - const stride = Math.max( - 1, - Math.ceil(layerState._records.length / maxCount), - ); + const stride = Math.max(1, Math.ceil(records.length / maxCount)); const start = seed % stride; const objects = []; - for (let i = start; i < layerState._records.length; i += stride) { - const camera = layerState._records[i].camera; + for (let i = start; i < records.length; i += stride) { + const camera = records[i].camera; objects.push({ - position: layerState._records[i].position, + position: records[i].position, sourceId: camera.id, // Short semantic code where the id is opaque (see cameraDisplayCode). id: `CAM-${camera.code || camera.id}`, diff --git a/src/layers/cctv/geometry.js b/src/layers/cctv/geometry.js index d9db40fe9..362ad4789 100644 --- a/src/layers/cctv/geometry.js +++ b/src/layers/cctv/geometry.js @@ -581,6 +581,13 @@ export function createGeometry({ state: layerState, services, parts, source }) { function coverageNeighborCount(targetRecord) { if (!targetRecord) return 0; + // The summary asks on every notification; scan the catalog only when the + // camera, its pose or the catalog changed. + const { id, lat, lon, rangeM } = targetRecord.camera; + const key = `${id}|${lat}|${lon}|${rangeM}|${layerState._records.length}`; + const cached = layerState._neighborCountCache; + if (cached?.key === key && cached.records === layerState._records) + return cached.count; let count = 0; for (const record of layerState._records) { if (record === targetRecord) continue; @@ -594,6 +601,11 @@ export function createGeometry({ state: layerState, services, parts, source }) { ((targetRecord.camera.rangeM + record.camera.rangeM) / 1000) * 0.92; if (dKm <= overlapKm) count++; } + layerState._neighborCountCache = { + key, + records: layerState._records, + count, + }; return count; } diff --git a/src/layers/cctv/geometryQueue.js b/src/layers/cctv/geometryQueue.js index 5583e36af..b78950aaa 100644 --- a/src/layers/cctv/geometryQueue.js +++ b/src/layers/cctv/geometryQueue.js @@ -6,6 +6,8 @@ import { GEO_TRACKING_BATCH_DELAY_MS, GEO_LOAD_BATCH_SIZE, GEO_LOAD_BATCH_DELAY_MS, + VIEW_GEOMETRY_ATTEMPTS, + VIEW_GEOMETRY_RETRY_MS, } from './policy.js'; export function createGeometryQueue({ @@ -25,6 +27,8 @@ export function createGeometryQueue({ clearTimeout(layerState._geoQueueTimer); layerState._geoQueueTimer = 0; } + clearTimeout(layerState._viewGeometryRetryTimer); + layerState._viewGeometryRetryTimer = 0; layerState._geoQueue = []; layerState._geoProgressNotifier = null; if (clearProgress) { @@ -223,6 +227,7 @@ export function createGeometryQueue({ err?.message || err, ); } + noteViewAttempt(record); if ( layerState._geoLoading && layerState._geoLoadDone < layerState._geoLoadTotal @@ -236,14 +241,15 @@ export function createGeometryQueue({ layerState._geoLoading = false; if (wasInitialLoad) { layerState._geoLoadDone = layerState._geoLoadTotal; - if (layerState._enabled) { - parts.rendering.refreshCoverageStyles(); - // Geometry refinement may have replaced record.position objects — the - // one-shot drain completion re-anchors the card entries (event-driven, - // not a per-frame or timer pass). - parts.cards.refreshAmbientCards(); - } + if (layerState._enabled) parts.rendering.refreshCoverageStyles(); } + // Geometry refinement may have replaced record.position objects — every + // drain's completion re-anchors the card entries (event-driven, not a + // per-frame or timer pass). + // While the camera moves, moveEnd reselects them instead. + if (layerState._enabled && !layerState._cameraMoving) + parts.cards.refreshAmbientCards(); + scheduleViewGeometryRetry(); // Completion is never coalesced: subscribers must observe the final // loading state even if the last progress tick just happened. layerState._geoProgressNotifier?.finish(); @@ -261,16 +267,17 @@ export function createGeometryQueue({ /** * Appends records to the geometry queue (no progress tracking) and starts - * the batch timer if idle. Used by update()'s ONE-SHOT tiles-ready completion - * pass (records left `!groundResolved` by an enable-time drain that ran while - * tiles were still streaming) so it shares the same stagger machinery as the - * initial load. Fires at most once per enable — never on a recurring timer. + * the batch timer if idle. Used by update()'s one-shot tiles-ready + * completion pass and by enqueueViewGeometry, so both share the initial + * load's stagger machinery. Never driven by a recurring timer. * @param {Object[]} records - Camera records needing geometry refresh. */ function enqueueGeometryRefresh(records) { + const queued = new Set(layerState._geoQueue); for (const record of records) { - if (!layerState._geoQueue.includes(record)) { + if (!queued.has(record)) { + queued.add(record); layerState._geoQueue.push(record); } } @@ -283,10 +290,10 @@ export function createGeometryQueue({ } /** - * Starts the initial staggered load: orders all records active-camera-first, - * then by distance from the current viewer position (nearest first, so - * cameras likely in view refine before off-screen ones), and exposes - * loaded/total progress through uiState()/getStats() while running. + * Starts the initial staggered load over the geometry working set: active + * camera first, then by distance from the current viewer position (nearest + * first), and exposes loaded/total progress through uiState()/getStats() + * while running. Cameras outside the view refine when they come into it. */ function startGeometryLoadQueue() { @@ -303,7 +310,7 @@ export function createGeometryQueue({ const refLon = carto ? Cesium.Math.toDegrees(carto.longitude) : (active?.camera.lon ?? 0); - const pending = layerState._records + const pending = geometryWorkingSet() .filter((record) => record !== active) .map((record) => ({ record, @@ -325,7 +332,134 @@ export function createGeometryQueue({ ); layerState._geoQueueTimer = setTimeout(processGeometryBatch, 0); } + /** + * The records whose geometry the view needs: the shown icons, the active + * camera and the coverage cohort drawn around it. + * @returns {Object[]} + */ + + function geometryWorkingSet() { + const records = new Set(layerState._viewRecords); + const active = parts.selection.getActiveRecord(); + if (active) records.add(active); + for (const id of layerState._coverageVisibleIds) { + const record = layerState._recordById.get(id); + if (record) records.add(record); + } + return [...records]; + } + + /** The regime key a view attempt counts against: interim while tiles stream. */ + function viewAttemptKey() { + const regime = parts.ground.currentSurfaceRegime(); + const tilesReady = + regime !== 'google-3d' || parts.model.projectionTilesReady(); + return { key: tilesReady ? regime : `${regime}:interim`, tilesReady }; + } + + /** + * Counts a processed geometry attempt against the current regime key; each + * key keeps its own count, so tile streaming going on and off does not + * reset the ready-tiles budget. + */ + function noteViewAttempt(record) { + const { key } = viewAttemptKey(); + record.viewAttempts ??= {}; + record.viewAttempts[key] = (record.viewAttempts[key] || 0) + 1; + record.viewAttemptAt = performance.now(); + } + + /** + * Whether a record may be attempted again under `key`. After a first + * unresolved attempt, the second waits out VIEW_GEOMETRY_RETRY_MS so its + * elevation cell can warm, rather than going to the next motion tick. + */ + /** Whether a record still has an attempt left under the current key. */ + function withinViewBudget(record) { + const { key } = viewAttemptKey(); + return (record.viewAttempts?.[key] || 0) < VIEW_GEOMETRY_ATTEMPTS; + } + + function attemptsLeft(record, key) { + const attempts = record.viewAttempts?.[key] || 0; + if (attempts >= VIEW_GEOMETRY_ATTEMPTS) return false; + return ( + attempts === 0 || + performance.now() - record.viewAttemptAt >= VIEW_GEOMETRY_RETRY_MS + ); + } + + /** + * After a drain, gives working-set cameras it left ungrounded one more + * attempt once their elevation cells have had time to warm. The timer is + * set for the earliest such camera and re-arms for the rest when it fires. + */ + function scheduleViewGeometryRetry() { + if (!layerState._enabled || layerState._viewGeometryRetryTimer) return; + const { key } = viewAttemptKey(); + const active = parts.selection.getActiveRecord(); + let due = Infinity; + for (const record of geometryWorkingSet()) { + const attempts = record.viewAttempts?.[key] || 0; + if ( + record === active || + attempts === 0 || + attempts >= VIEW_GEOMETRY_ATTEMPTS || + !parts.ground.needsGeometry(record) + ) + continue; + due = Math.min(due, record.viewAttemptAt + VIEW_GEOMETRY_RETRY_MS); + } + if (due === Infinity) return; + layerState._viewGeometryRetryTimer = setTimeout( + () => { + layerState._viewGeometryRetryTimer = 0; + enqueueViewGeometry(); + // A drain re-arms on completion; with none running, the cameras still + // cooling down need their own timer. + if (!layerState._geoQueueTimer) scheduleViewGeometryRetry(); + }, + Math.max(0, due - performance.now()), + ); + } + + /** + * Queues working-set cameras the current surface has not grounded yet, + * after a camera move brings new ones into view. Attempts are counted when + * a record is processed, not queued, so a drain cut short by disable() is + * not lost; each record gets VIEW_GEOMETRY_ATTEMPTS per surface regime, + * spaced by VIEW_GEOMETRY_RETRY_MS, so a sample the shared floor refuses + * (too far, too high) is not retried on every move. While photoreal tiles are still streaming the attempts are + * interim, and the update() completion pass is re-armed to retry these + * records when they land. The active camera is left to selection, which + * owns its re-sampling. + */ + + function enqueueViewGeometry() { + if (!layerState._enabled) return; + const { key, tilesReady } = viewAttemptKey(); + const active = parts.selection.getActiveRecord(); + const pending = []; + let coolingDown = false; + for (const record of geometryWorkingSet()) { + if (record === active || !parts.ground.needsGeometry(record)) continue; + if (!attemptsLeft(record, key)) { + coolingDown ||= + (record.viewAttempts?.[key] || 0) < VIEW_GEOMETRY_ATTEMPTS; + continue; + } + pending.push(record); + } + // A camera back in view during its cooldown still needs its retry timer. + if (coolingDown && !layerState._geoQueueTimer) scheduleViewGeometryRetry(); + if (!pending.length) return; + if (!tilesReady) layerState._tilesReadyReenqueued = false; + enqueueGeometryRefresh(pending); + } return { + enqueueViewGeometry, + withinViewBudget, + geometryWorkingSet, stopGeometryLoadQueue, createGeometryProgressNotifier, processCctvGeometryQueueBatch, diff --git a/src/layers/cctv/ground.js b/src/layers/cctv/ground.js index 5ff41c377..fdf36db14 100644 --- a/src/layers/cctv/ground.js +++ b/src/layers/cctv/ground.js @@ -1,3 +1,4 @@ +import * as Cesium from 'cesium'; import { SUPPORT_KEYS, planeSupportPoints, @@ -78,6 +79,14 @@ export function createGround({ state: layerState, services, parts, source }) { return record?.groundResolved?.[regime] === true; } + /** + * True until the record has geometry grounded for the regime. Cameras are + * refined only once they enter the view, so many never have geometry. + */ + function needsGeometry(record, regime = currentSurfaceRegime()) { + return !record?.frustumGeometry || !isGroundResolved(record, regime); + } + /** * Ground altitude used for pure geometry recomputes: the given regime's * cached resolution (`record.groundSamples[regime]` — a shared mesh/DEM floor @@ -184,8 +193,11 @@ export function createGround({ state: layerState, services, parts, source }) { * Task 5: applies a LATE-arriving ground-prior batch (init's bounded race * lost — cold proxy cache / slow upstream). Pure recomputes only, no scene * queries: + * - records without geometry yet: only the icon moves onto the prior; + * the frustum is built when the camera enters the view. * - terrain-globe regime: the prior IS the resolution → re-run the - * resolution (updateRecordGeometry latches it) for every record. + * resolution (updateRecordGeometry latches it) for every record with + * geometry. * - google-3d regime: records still awaiting a shared floor move from the * catalog fallback onto the exact prior; records already holding a shared * mesh/DEM floor keep it untouched. @@ -198,6 +210,7 @@ export function createGround({ state: layerState, services, parts, source }) { function applyLateGroundPriors(records, priors) { if (!Array.isArray(records) || !Array.isArray(priors)) return; let applied = 0; + let moved = 0; for (let i = 0; i < records.length && i < priors.length; i++) { const record = records[i]; const prior = priors[i]; @@ -212,6 +225,24 @@ export function createGround({ state: layerState, services, parts, source }) { record.camera.absoluteHeightM = prior.ellipsoid + record.camera.mountHeightM; } + // Cameras without geometry only move their icon onto the prior, so the + // view pass projects the right point; their frustums are built when + // they enter the view, as recomputing the whole catalog here would + // stall a large one. + if (!record.frustumGeometry) { + if (record.position) { + Cesium.Cartesian3.fromDegrees( + record.camera.lon, + record.camera.lat, + record.camera.absoluteHeightM, + undefined, + record.position, + ); + if (record.billboard) record.billboard.position = record.position; + moved += 1; + } + continue; + } const regime = currentSurfaceRegime(); if (regime === 'terrain-globe') { // Prior IS the resolution — re-latch onto the fresh value. @@ -224,7 +255,9 @@ export function createGround({ state: layerState, services, parts, source }) { applied += 1; } } - if (applied) parts.presentation.notifyListeners(); + if (moved && parts.rendering.refreshHorizonCulling()) + parts.geometryQueue.enqueueViewGeometry(); + if (applied || moved) parts.presentation.notifyListeners(); } /** @@ -234,7 +267,7 @@ export function createGround({ state: layerState, services, parts, source }) { * deck/building-top in google-3d vs bare Re:Earth DEM on globe stacks), so * on a REGIME change (photoreal ↔ globe; bing→osm stays 'terrain-globe' and * no-ops): - * 1. every record's geometry recomputes IMMEDIATELY from the new regime's + * 1. every record that has geometry recomputes IMMEDIATELY from the new regime's * resolution — cached sample if that regime has one, else the Re:Earth * prior (never blank, zero scene queries); * 2. entering google-3d re-arms the one-shot tiles-ready completion latch so @@ -250,6 +283,9 @@ export function createGround({ state: layerState, services, parts, source }) { layerState._lastAppliedRegime = regime; for (const record of layerState._records) { + // Only cameras that already have geometry are rewritten; the rest are + // grounded for the new regime when they enter the view. + if (!record.frustumGeometry) continue; if (regime === 'terrain-globe') { // Prior IS the resolution — latch it (zero scene queries). record.groundSamples['terrain-globe'] = groundPriorAltFor(record); @@ -353,6 +389,7 @@ export function createGround({ state: layerState, services, parts, source }) { resolveFootprintGround, groundPriorAltFor, isGroundResolved, + needsGeometry, groundAltFor, rearmGroundResolution, resolveCommittedGroundAnchor, diff --git a/src/layers/cctv/index.js b/src/layers/cctv/index.js index 0deba580e..6f1cc77c7 100644 --- a/src/layers/cctv/index.js +++ b/src/layers/cctv/index.js @@ -91,6 +91,9 @@ export function createCctvLayer({ services, source }) { processGeometryBatch: parts.geometryQueue.processGeometryBatch, hideCctvRecordVisuals: parts.rendering.hideCctvRecordVisuals, refreshCoverageStyles: parts.rendering.refreshCoverageStyles, + refreshHorizonCulling: parts.rendering.refreshHorizonCulling, + _viewRecordIdsForTest: () => + state._viewRecords.map((record) => record.camera.id), clearProbeClampOnDeactivation: parts.geometry.clearProbeClampOnDeactivation, cctvRecordNeedsActivation: parts.model.cctvRecordNeedsActivation, diff --git a/src/layers/cctv/ingestion.js b/src/layers/cctv/ingestion.js index 0947ccdb6..2613de1e1 100644 --- a/src/layers/cctv/ingestion.js +++ b/src/layers/cctv/ingestion.js @@ -32,13 +32,22 @@ export function createIngestion({ // projectionTilesReady() is false while a (hidden) Google tileset // exists, so this latch effectively fires for the google-3d regime — // terrain-globe records resolve from the prior in their drain pass. - const unresolved = layerState._records.filter( - (record) => !parts.ground.isGroundResolved(record), - ); + const unresolved = parts.geometryQueue + .geometryWorkingSet() + .filter( + (record) => + !parts.ground.isGroundResolved(record) && + parts.geometryQueue.withinViewBudget(record), + ); if (unresolved.length) parts.geometryQueue.enqueueGeometryRefresh(unresolved); } await parts.health.syncHealthState(); + // New health can change which camera wins a crowded cell. + if (layerState._enabled && parts.rendering.refreshHorizonCulling()) { + parts.geometryQueue.enqueueViewGeometry(); + parts.cards.refreshAmbientCards(); + } parts.navigation.maybeAutoHop(now); parts.presentation.notifyListeners(); }, diff --git a/src/layers/cctv/lifecycle.js b/src/layers/cctv/lifecycle.js index 6d041aa78..4e4443df8 100644 --- a/src/layers/cctv/lifecycle.js +++ b/src/layers/cctv/lifecycle.js @@ -7,8 +7,14 @@ import { CAMERA_ICON, IDLE_CAMERA_COLOR, CALIBRATION_RANGE_FLOOR_M, + VIEW_MOTION_REFRESH_MS, + VIEW_MOTION_MIN_MOVE_FRACTION, + VIEW_MOTION_MIN_TURN_DEG, + VIEW_MOTION_COST_FACTOR, } from './policy.js'; +const MIN_TURN_COS = Math.cos((VIEW_MOTION_MIN_TURN_DEG * Math.PI) / 180); + export function createLifecycle({ state: layerState, services, @@ -22,15 +28,94 @@ export function createLifecycle({ const { onFocusTargetAppear } = services.focus; const { releaseContinuousRender } = services.render; + /** + * The settled-view pass: thin the icons, queue the newly visible geometry, + * reselect cards, and tell subscribers (the camera picker) when the shown + * set changed since they were last told, including by motion passes. + */ + function settleView() { + const changed = parts.rendering.refreshHorizonCulling(); + noteViewPose(); + parts.geometryQueue.enqueueViewGeometry(); + parts.cards.refreshAmbientCards(); + if (changed || layerState._viewUnpublished) { + layerState._viewUnpublished = false; + parts.presentation.notifyListeners(); + } + } + + /** Records the camera pose the last view pass ran at. */ + function noteViewPose() { + const camera = layerState._viewer?.camera; + if (!camera?.positionWC) return; + layerState._viewPose = { + position: Cesium.Cartesian3.clone(camera.positionWC), + direction: + camera.directionWC && Cesium.Cartesian3.clone(camera.directionWC), + }; + } + + /** + * Whether the camera moved or turned enough since the last view pass to + * change what is on screen. A camera that tracks or flies without settling + * would otherwise rerun the full pass on every tick. + */ + function viewPoseChanged() { + const camera = layerState._viewer?.camera; + const pose = layerState._viewPose; + if (!pose || !camera?.positionWC) return true; + const height = Math.max(1, camera.positionCartographic?.height ?? 0); + const moved = Cesium.Cartesian3.distance(camera.positionWC, pose.position); + if (moved > height * VIEW_MOTION_MIN_MOVE_FRACTION) return true; + if (!pose.direction || !camera.directionWC) return false; + return ( + Cesium.Cartesian3.dot(camera.directionWC, pose.direction) < MIN_TURN_COS + ); + } + + function viewMotionTick() { + if (!layerState._enabled) return; + const now = performance.now(); + const pass = layerState._viewMotionPass; + if (pass && now - pass.at < pass.ms * VIEW_MOTION_COST_FACTOR) return; + if (!viewPoseChanged()) return; + if (parts.rendering.refreshHorizonCulling()) + layerState._viewUnpublished = true; + noteViewPose(); + parts.geometryQueue.enqueueViewGeometry(); + layerState._viewMotionPass = { at: now, ms: performance.now() - now }; + } + + function startViewMotionTimer() { + if (layerState._viewMotionTimer) return; + layerState._viewMotionTimer = setInterval( + viewMotionTick, + VIEW_MOTION_REFRESH_MS, + ); + } + + function stopViewMotionTimer() { + clearInterval(layerState._viewMotionTimer); + layerState._viewMotionTimer = 0; + } + /** Resets all module-scoped runtime state to initial values. */ function clearRuntimeState() { parts.geometryQueue.stopGeometryLoadQueue(); + stopViewMotionTimer(); // Idempotent — also covers a re-init without a prior destroy(). parts.cards.teardownAmbientCards(); parts.projection.clearProjectionOverlay(); layerState._records = []; layerState._recordById = new Map(); + layerState._viewRecords = []; + layerState._cameraIndexCache = null; + layerState._coverageVisibleIds = new Set(); + layerState._neighborCountCache = null; + layerState._viewUnpublished = false; + layerState._viewPose = null; + layerState._viewMotionPass = null; layerState._healthById = new Map(); layerState._count = 0; layerState._lastUpdate = null; @@ -71,6 +156,13 @@ export function createLifecycle({ layerState._calibrationById = parts.calibration.loadCalibrationStore(); layerState._billboards = new Cesium.BillboardCollection(); + // Cesium switches a property's buffer-usage hint whenever it starts or + // stops changing from one frame to the next, and every switch rewrites + // the vertex data of every billboard. The view pass toggles `show` on a + // few icons of a large catalog at a time, so on a 33K catalog each pass + // cost two full rewrites. With the hint fixed, Cesium uploads only the + // icons that changed. + layerState._billboards.computeNewBuffersUsage = () => false; layerState._viewer.scene.primitives.add(layerState._billboards); registerSpriteCollection('cctv', layerState._billboards); @@ -243,28 +335,76 @@ export function createLifecycle({ // Field-test fix (2026-07-06): horizon-cull on camera settle (pairs with // the billboards' always-on-top depth setting) + one initial pass so the // first paint is already culled. + // A re-init against a new viewer moves the move listeners to its camera. + if ( + layerState._viewListenerCamera && + layerState._viewListenerCamera !== layerState._viewer.camera + ) { + const previous = layerState._viewListenerCamera; + if (layerState._horizonCullListener) + previous.moveEnd?.removeEventListener( + layerState._horizonCullListener, + ); + if (layerState._moveStartListener) + previous.moveStart?.removeEventListener( + layerState._moveStartListener, + ); + layerState._horizonCullListener = null; + layerState._moveStartListener = null; + layerState._cameraMoving = false; + } + layerState._viewListenerCamera = layerState._viewer.camera; if (!layerState._horizonCullListener) { // Ambient cards piggyback the same settle event: moveEnd-driven // reselection only, never per frame (refreshAmbientCards no-ops while // the layer is disabled). layerState._horizonCullListener = () => { layerState._cameraMoving = false; - parts.rendering.refreshHorizonCulling(); - parts.cards.refreshAmbientCards(); + stopViewMotionTimer(); + settleView(); }; layerState._viewer.camera.moveEnd.addEventListener( layerState._horizonCullListener, ); } if (!layerState._moveStartListener) { - // Item B: hover picking pauses while the camera is in motion. + // Item B: hover picking pauses while the camera is in motion. A long + // move (cockpit flight, a drag) never settles, so the view pass also + // reruns on an interval until it does. layerState._moveStartListener = () => { layerState._cameraMoving = true; + // enable() starts it for a move already under way. + if (layerState._enabled) startViewMotionTimer(); }; layerState._viewer.camera.moveStart.addEventListener( layerState._moveStartListener, ); } + // A resize or rotation changes what is on screen without moving the + // camera. + const canvas = layerState._viewer.scene?.canvas; + if (layerState._viewResizeCanvas !== canvas) { + // A re-init against a new viewer observes its canvas instead. + layerState._viewResizeObserver?.disconnect(); + layerState._viewResizeObserver = null; + layerState._viewResizeCanvas = null; + } + if ( + !layerState._viewResizeObserver && + typeof ResizeObserver === 'function' && + canvas + ) { + let frame = 0; + layerState._viewResizeObserver = new ResizeObserver(() => { + if (frame || !layerState._enabled) return; + frame = requestAnimationFrame(() => { + frame = 0; + if (layerState._enabled) settleView(); + }); + }); + layerState._viewResizeObserver.observe(canvas); + layerState._viewResizeCanvas = canvas; + } parts.rendering.refreshHorizonCulling(); layerState._clickHandler = new Cesium.ScreenSpaceEventHandler( @@ -325,6 +465,12 @@ export function createLifecycle({ ); await parts.health.syncHealthState(true); + // Health ranks crowded cells: thin again now that it has arrived (a + // no-op unless enable() ran while health was loading). + if (parts.rendering.refreshHorizonCulling()) { + parts.geometryQueue.enqueueViewGeometry(); + parts.cards.refreshAmbientCards(); + } parts.rendering.refreshCoverageStyles(); parts.presentation.notifyListeners(); restoreSpriteOrder(layerState._viewer); @@ -370,6 +516,9 @@ export function createLifecycle({ parts.projection.ensureProjectionRuntime(activeRecord); parts.frames.refreshProjectionImage(activeRecord, true); } + parts.rendering.refreshHorizonCulling(); + // Re-enabled mid-flight: moveStart has already fired. + if (layerState._cameraMoving) startViewMotionTimer(); parts.geometryQueue.startGeometryLoadQueue(); parts.rendering.refreshCoverageStyles(); parts.projection.startProjectionLoop(); @@ -402,10 +551,14 @@ export function createLifecycle({ layerState._removeFocusAppearListener = null; parts.projection.stopProjectionLoop(); parts.geometryQueue.stopGeometryLoadQueue(); + stopViewMotionTimer(); // Ambient cards tear down COMPLETELY on disable (owner design point 6): // source entries, pacer timer, in-flight handlers, and caches. parts.cards.teardownAmbientCards(); parts.rendering.hideCctvVisuals(); + // Nothing is in view while the layer is off. + layerState._viewRecords = []; + layerState._cameraIndexCache = null; parts.presentation.notifyListeners(); }, @@ -443,6 +596,13 @@ export function createLifecycle({ ); layerState._moveStartListener = null; } + // The move listeners are gone; nothing will report the end of a move. + layerState._cameraMoving = false; + layerState._viewListenerCamera = null; + stopViewMotionTimer(); + layerState._viewResizeObserver?.disconnect(); + layerState._viewResizeObserver = null; + layerState._viewResizeCanvas = null; if (layerState._gizmo) { layerState._gizmo.destroy(); layerState._gizmo = null; diff --git a/src/layers/cctv/policy.js b/src/layers/cctv/policy.js index bc369c02a..574f87527 100644 --- a/src/layers/cctv/policy.js +++ b/src/layers/cctv/policy.js @@ -60,6 +60,45 @@ export const GEO_PROGRESS_NOTIFY_INTERVAL_MS = 300; export const GEO_PROGRESS_NOTIFY_BATCH_LIMIT = 10; +// View thinning: camera icons show only on or near the screen, and each +// camera competes for a world-anchored grid cell sized to about VIEW_CELL_PX +// at its distance from the viewer (in power-of-two metre steps, so a pan +// keeps the same winners until a camera's distance crosses a step). Cells +// smaller than VIEW_MIN_CELL_M do not thin: +// close up every camera shows, co-located ones included. + +export const VIEW_CELL_PX = 40; + +export const VIEW_MIN_CELL_M = 60; + +// Icons this far past the screen edge (fraction of its size) still show, so +// a pan does not reveal empty ground before the next view pass. + +export const VIEW_ICON_MARGIN = 0.5; + +// While the camera moves, the view pass reruns at most this often. + +export const VIEW_MOTION_REFRESH_MS = 250; +// A motion tick is skipped unless the camera moved this fraction of its +// ellipsoid height, or turned this many degrees, since the last pass. + +export const VIEW_MOTION_MIN_MOVE_FRACTION = 0.01; + +export const VIEW_MOTION_MIN_TURN_DEG = 0.5; + +// Motion passes are spaced at least this many times the last pass's cost, so +// a large catalog spends at most about a tenth of a long move on them. + +export const VIEW_MOTION_COST_FACTOR = 10; + +// A view camera's geometry is attempted at most this many times per surface +// regime (a cold elevation cell can leave the first attempt unresolved); the +// retry runs this long after the drain that left it unresolved. + +export const VIEW_GEOMETRY_ATTEMPTS = 2; + +export const VIEW_GEOMETRY_RETRY_MS = 1500; + // Throttle for placeholder repaints — the projection RAF loop must not // re-fill a 1080p canvas on every frame while a feed image is still loading. diff --git a/src/layers/cctv/presentation.i18n.test.mjs b/src/layers/cctv/presentation.i18n.test.mjs new file mode 100644 index 000000000..4bfa5186b --- /dev/null +++ b/src/layers/cctv/presentation.i18n.test.mjs @@ -0,0 +1,58 @@ +// The CCTV HUD summary shows the CAL badge, source kind and view band in the +// UI language; English keeps its codes, and unknown source codes stay codes. +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { setLocale } from '../../i18n/index.js'; +import { createPresentation } from './presentation.js'; + +function summary(sourceKind) { + const camera = { + id: 'c1', + city: 'Austin', + name: 'Cam', + rangeM: 100, + fovDeg: 60, + feedType: 'image', + }; + const record = { camera }; + const presentation = createPresentation({ + state: { + _records: [record], + _healthById: new Map(sourceKind ? [['c1', { sourceKind }]] : []), + _showProjection: false, + _coverageMode: 'sector', + }, + services: {}, + parts: { + selection: { getActiveRecord: () => record }, + model: { + sectorAreaKm2: () => 1, + currentViewContext: () => 'street:1:2', + }, + geometry: { coverageNeighborCount: () => 0 }, + calibration: { deriveCalBadge: () => 'raw-prior' }, + }, + source: {}, + }); + return presentation.buildSummaryText(); +} + +test('en: CAL, SRC and CONTEXT keep their English codes', () => { + setLocale('en'); + assert.match(summary('upstream'), /CAL RAW PRIOR · SRC UPSTREAM/); + assert.match(summary(null), /SRC IMAGE · STREET CONTEXT/); + assert.match(summary('upstream-image'), /SRC UPSTREAM-IMAGE/); +}); + +test('fr: CAL, SRC and CONTEXT values are translated', () => { + setLocale('fr'); + try { + assert.match( + summary('upstream'), + /CAL ESTIM\. INITIALE · SRC AMONT · CONTEXTE RUE/, + ); + assert.match(summary('upstream-image'), /SRC UPSTREAM-IMAGE/); + } finally { + setLocale('en'); + } +}); diff --git a/src/layers/cctv/presentation.js b/src/layers/cctv/presentation.js index e47e08194..16c67aa4b 100644 --- a/src/layers/cctv/presentation.js +++ b/src/layers/cctv/presentation.js @@ -1,5 +1,5 @@ import { CCTV_AMBIENT_CARD_MAX } from '../../data/cctvLod.js'; -import { t } from '../../i18n/index.js'; +import { msg, t } from '../../i18n/index.js'; import { ACTIVE_FRAME_REFRESH_MS, IDLE_FRAME_REFRESH_MS } from './policy.js'; import { headingHudToken, isHeadingEstimated } from './headingConfidence.js'; import { @@ -8,6 +8,59 @@ import { isDatasheetFov, } from './modelSpecs.js'; +// The summary line names the CAL badge, the source kind and the view band in +// the page language; the codes underneath stay English. +const CAL_BADGE_LABELS = Object.freeze({ + calibrated: msg('CALIBRATED'), + curated: msg('CURATED'), + 'raw-prior': msg('RAW PRIOR'), +}); + +// The same source-kind words as the CCTV panel (src/ui/cctvFrames.js). +const SOURCE_KIND_LABELS = Object.freeze({ + snapshot: msg('SNAPSHOT'), + live: msg('LIVE'), + fallback: msg('FALLBACK'), + upstream: msg('UPSTREAM'), + synthetic: msg('SYNTHETIC'), + configured: msg('CONFIGURED'), + seed: msg('SEED'), + image: msg('IMAGE'), + unknown: msg('UNKNOWN'), +}); + +/** CAL badge id ('raw-prior') as the summary shows it; unknown ids stay codes. */ +export function summaryCalLabel(badge) { + const key = String(badge || ''); + return CAL_BADGE_LABELS[key] + ? t(CAL_BADGE_LABELS[key]) + : key.replace('-', ' ').toUpperCase(); +} + +/** Source kind ('image', 'snapshot') for the summary; HLS, MJPEG
 stay codes. */ +export function summarySourceLabel(kind) { + const key = String(kind || 'image').toLowerCase(); + return SOURCE_KIND_LABELS[key] + ? t(SOURCE_KIND_LABELS[key]) + : key.toUpperCase(); +} + +/** View band id ('street', 'city'
) as the HUD names it. */ +export function summaryViewBandLabel(band) { + switch (band) { + case 'street': + return t('STREET', { context: 'view band' }); + case 'city': + return t('CITY', { context: 'view band' }); + case 'regional': + return t('REGIONAL', { context: 'view band' }); + case 'global': + return t('GLOBAL', { context: 'view band' }); + default: + return String(band || '').toUpperCase(); + } +} + export function createPresentation({ state: layerState, services, @@ -72,17 +125,13 @@ export function createPresentation({ : t('ISOLATED VIEW'), layerState._showProjection ? t('PROJ MONITOR') : t('PROJ OFF'), layerState._coverageMode === 'viewshed' ? t('VIEWSHED') : null, - t('CAL {value}', { - value: calBadge.replace('-', ' ').toUpperCase(), + t('CAL {value}', { value: summaryCalLabel(calBadge) }), + t('SRC {value}', { + value: summarySourceLabel( + health?.sourceKind || active.camera.feedType || 'image', + ), }), - health?.sourceKind - ? t('SRC {value}', { - value: String(health.sourceKind).toUpperCase(), - }) - : t('SRC {value}', { - value: String(active.camera.feedType || 'image').toUpperCase(), - }), - t('{value} CONTEXT', { value: viewBand.toUpperCase() }), + t('{value} CONTEXT', { value: summaryViewBandLabel(viewBand) }), // Identified hardware: append the model's datasheet specs + attribution. active.camera.spec ? t('{spec} · SPECS: CCTV-DATABASE.COM', { @@ -225,14 +274,53 @@ export function createPresentation({ }, activeCameraId: activeId, activeCamera: active ? getPublicCameraState(active, activeId) : null, - cameras: layerState._records.map((record) => - getPublicCameraState(record, activeId), - ), + cameraIndex: cameraIndex(), summary: buildSummaryText(), }; + // The full per-camera state is built only when a subscriber reads it: a + // catalog of tens of thousands would otherwise be rebuilt on every + // progress tick for listeners that only want the active camera. It reads + // the records live at that moment, and spreading or serializing the + // payload builds it, so callers that want a count use `count`. + let cameras = null; + Object.defineProperty(payload, 'cameras', { + enumerable: true, + get() { + cameras ??= layerState._records.map((record) => + getPublicCameraState(record, activeId), + ); + return cameras; + }, + }); return payload; } + /** + * `{ id, city, name }` for the active camera, then every camera the view + * pass shows: what the camera picker lists. A whole catalog would put tens + * of thousands of options in the DOM and slow every layout. The same array + * is returned until the view or the active camera changes, so a consumer + * can compare it by identity. + * @returns {{id: string, city: string, name: string}[]} + */ + + function cameraIndex() { + const view = layerState._viewRecords; + const active = parts.selection.getActiveRecord(); + const cached = layerState._cameraIndexCache; + if (cached?.view === view && cached.active === active) return cached.list; + const records = active + ? [active, ...view.filter((record) => record !== active)] + : view; + const list = records.map(({ camera }) => ({ + id: camera.id, + city: camera.city, + name: camera.name, + })); + layerState._cameraIndexCache = { view, active, list }; + return list; + } + /** Dispatches the current UI state to all registered subscriber callbacks. */ function notifyListeners() { diff --git a/src/layers/cctv/presentation.test.mjs b/src/layers/cctv/presentation.test.mjs new file mode 100644 index 000000000..a0600f9a4 --- /dev/null +++ b/src/layers/cctv/presentation.test.mjs @@ -0,0 +1,38 @@ +// The CCTV summary line names the CAL badge, the source kind and the view +// band in the page language; unknown codes stay as uppercase codes. +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { setLocale } from '../../i18n/index.js'; +import { + summaryCalLabel, + summarySourceLabel, + summaryViewBandLabel, +} from './presentation.js'; + +function inLocale(locale, run) { + setLocale(locale); + try { + return run(); + } finally { + setLocale('en'); + } +} + +test('English keeps the summary codes', () => { + assert.equal(summaryCalLabel('raw-prior'), 'RAW PRIOR'); + assert.equal(summarySourceLabel('image'), 'IMAGE'); + assert.equal(summarySourceLabel('hls'), 'HLS'); + assert.equal(summaryViewBandLabel('street'), 'STREET'); + assert.equal(summaryViewBandLabel('none'), 'NONE'); +}); + +test('Portuguese summary values are translated', () => { + inLocale('pt', () => { + assert.equal(summaryCalLabel('raw-prior'), 'ESTIMATIVA BRUTA'); + assert.equal(summaryCalLabel('calibrated'), 'CALIBRADA'); + assert.equal(summarySourceLabel('IMAGE'), 'IMAGEM'); + assert.equal(summarySourceLabel('mjpeg'), 'MJPEG'); + assert.equal(summaryViewBandLabel('street'), 'RUA'); + assert.equal(summaryViewBandLabel('city'), 'CIDADE'); + }); +}); diff --git a/src/layers/cctv/rendering.js b/src/layers/cctv/rendering.js index d10368d40..4b6f215e4 100644 --- a/src/layers/cctv/rendering.js +++ b/src/layers/cctv/rendering.js @@ -1,5 +1,4 @@ import * as Cesium from 'cesium'; -import { horizonOccluder } from '../../data/iconOrientation.js'; import { isHeadingEstimated } from './headingConfidence.js'; import { ACTIVE_CAMERA_COLOR, @@ -11,8 +10,21 @@ import { ACTIVE_COVERAGE_EDGE, IDLE_COVERAGE_EDGE_MUTED, ACTIVE_COVERAGE_EDGE_DEPTHFAIL, + VIEW_CELL_PX, + VIEW_ICON_MARGIN, + VIEW_MIN_CELL_M, } from './policy.js'; +/** FNV-1a over a camera id: a stable, well-spread order for crowded cells. */ +function idHash(id) { + let hash = 0x811c9dc5; + for (let i = 0; i < id.length; i++) { + hash ^= id.charCodeAt(i); + hash = Math.imul(hash, 0x01000193); + } + return hash >>> 0; +} + export function createRendering({ state: layerState, services, @@ -138,24 +150,186 @@ export function createRendering({ * (Google-3D regime) nothing writes far-side depth, and the billboards are now * always-on-top (`disableDepthTestDistance: INFINITY` — the far-zoom submerge * fix), so without this pass London's cluster would shine through the planet - * from a US viewpoint. Pure math over ≀ catalog-size points; runs on - * camera.moveEnd + init only (event-driven — no steady-state work). + * from a US viewpoint. + * + * The same pass thins the view so a large catalog stays readable and cheap: + * icons well off screen hide, and each camera competes for a world-anchored + * cell sized to VIEW_CELL_PX at its distance (healthiest first, then a stable + * id order). The active camera shows whenever it is above the horizon + * and near the screen, even in a crowded cell. The shown records become + * `_viewRecords`, the working set for geometry, cards and the camera picker; + * the array keeps its identity while the shown set is unchanged. + * + * Runs on camera settle, throttled during motion, on resize, enable and + * activation changes — never per frame. + * @returns {boolean} Whether the shown set changed. */ function refreshHorizonCulling() { if ( + !layerState._enabled || !layerState._viewer || layerState._viewer.isDestroyed() || !layerState._records.length ) - return; - const occluder = horizonOccluder(layerState._viewer.camera); + return false; + const { camera, scene } = layerState._viewer; + const width = scene.canvas.clientWidth || scene.canvas.width || 0; + const height = scene.canvas.clientHeight || scene.canvas.height || 0; + const minX = -width * VIEW_ICON_MARGIN; + const maxX = width * (1 + VIEW_ICON_MARGIN); + const minY = -height * VIEW_ICON_MARGIN; + const maxY = height * (1 + VIEW_ICON_MARGIN); + // Ground metres one pixel covers per metre of distance from the viewer. + const fovy = Number.isFinite(camera.frustum?.fovy) + ? camera.frustum.fovy + : Math.PI / 3; + const metresPerPixelPerMetre = + (2 * Math.tan(fovy / 2)) / Math.max(1, height); + const viewer = camera.positionWC; + // The horizon test of Cesium's EllipsoidalOccluder, inlined: this loop + // visits every camera in the catalog. + const inverseRadii = Cesium.Ellipsoid.WGS84.oneOverRadii; + const cx = viewer.x * inverseRadii.x; + const cy = viewer.y * inverseRadii.y; + const cz = viewer.z * inverseRadii.z; + const limbSquared = cx * cx + cy * cy + cz * cz - 1; + const activeId = layerState._activeCameraId; + const project = screenProjector(scene, camera, width, height); + const pass = (layerState._viewPassId = (layerState._viewPassId || 0) + 1); + const shown = []; + const cells = new Map(); + for (const record of layerState._records) { + const position = record.billboard?.position; + if (!position) continue; + const vx = position.x * inverseRadii.x - cx; + const vy = position.y * inverseRadii.y - cy; + const vz = position.z * inverseRadii.z - cz; + const vtDotVc = -(vx * cx + vy * cy + vz * cz); + if ( + limbSquared < 0 + ? vtDotVc > 0 + : vtDotVc > limbSquared && + (vtDotVc * vtDotVc) / (vx * vx + vy * vy + vz * vz) > limbSquared + ) + continue; + const screen = project(position); + if ( + !screen || + !(screen.x >= minX && screen.x <= maxX) || + !(screen.y >= minY && screen.y <= maxY) + ) + continue; + const dx = position.x - viewer.x; + const dy = position.y - viewer.y; + const dz = position.z - viewer.z; + const cellM = + VIEW_CELL_PX * + metresPerPixelPerMetre * + Math.sqrt(dx * dx + dy * dy + dz * dz); + if (record.camera.id === activeId || !(cellM >= VIEW_MIN_CELL_M)) { + record.viewPass = pass; + shown.push(record); + continue; + } + const key = worldCellKey(record, cellM); + const rank = viewRank(record); + const holder = cells.get(key); + if (!holder || rank < holder.rank) cells.set(key, { record, rank }); + } + for (const { record } of cells.values()) { + record.viewPass = pass; + shown.push(record); + } for (const record of layerState._records) { const bb = record.billboard; if (!bb) continue; - const visible = occluder.isPointVisible(bb.position); + const visible = record.viewPass === pass; if (bb.show !== visible) bb.show = visible; } + const previous = layerState._viewRecords; + const changed = + previous.length !== shown.length || + previous.some((record) => record.viewPass !== pass); + if (changed) layerState._viewRecords = shown; + return changed; + } + + /** + * Canvas coordinates for world positions. In 3D the pass multiplies by one + * view-projection matrix per call instead of Cesium's per-point + * cartesianToCanvasCoordinates, which dominated the pass on a large + * catalog; other scene modes keep Cesium's projection. + * @returns {(position: Cesium.Cartesian3) => ({x: number, y: number}|null)} + */ + function screenProjector(scene, camera, width, height) { + const out = layerState._scratchViewScreen; + const projection = camera.frustum?.projectionMatrix; + if ( + scene.mode !== Cesium.SceneMode.SCENE3D || + !projection || + !camera.viewMatrix + ) + return (position) => scene.cartesianToCanvasCoordinates(position, out); + const m = Cesium.Matrix4.multiply( + projection, + camera.viewMatrix, + layerState._scratchViewProjection, + ); + return (p) => { + const w = m[3] * p.x + m[7] * p.y + m[11] * p.z + m[15]; + const z = m[2] * p.x + m[6] * p.y + m[10] * p.z + m[14]; + // Behind the eye or before the near plane: Cesium does not draw it. + if (!(w > 0) || z < 0) return null; + out.x = + ((m[0] * p.x + m[4] * p.y + m[8] * p.z + m[12]) / w + 1) * 0.5 * width; + out.y = + (1 - (m[1] * p.x + m[5] * p.y + m[9] * p.z + m[13]) / w) * 0.5 * height; + return out; + }; + } + + /** + * A grid cell fixed to the ground: `cellM` rounded up to a power of two + * metres, so the cell (and its winner) only changes when the camera's + * distance crosses a doubling: a level pan keeps it, a tilted pan or a zoom + * can move cameras near the edge of a step to the next one. + */ + function worldCellKey(record, cellM) { + const level = Math.ceil(Math.log2(cellM)); + const { lat, lon } = record.camera; + // A camera's key changes only with the level (or an edited position), so + // it is kept per level. + if ( + record.viewCellLevel === level && + record.viewCellLat === lat && + record.viewCellLon === lon + ) + return record.viewCellKey; + const latStep = 2 ** level / 111_320; + const row = Math.floor(lat / latStep); + const rowLat = Cesium.Math.toRadians((row + 0.5) * latStep); + const lonStep = latStep / Math.max(0.05, Math.cos(rowLat)); + record.viewCellLevel = level; + record.viewCellLat = lat; + record.viewCellLon = lon; + record.viewCellKey = `${level}:${row}:${Math.floor(lon / lonStep)}`; + return record.viewCellKey; + } + + /** Lower ranks win a crowded cell: healthy feeds first, then a stable id order. */ + function viewRank(record) { + const status = layerState._healthById.get(record.camera.id)?.status; + const tier = + status === 'ok' + ? 0 + : status === 'degraded' + ? 1 + : status === 'offline' + ? 3 + : 2; + record.viewHash ??= idHash(record.camera.id); + return tier * 2 ** 32 + record.viewHash; } /** @@ -204,6 +378,8 @@ export function createRendering({ const activeId = activeRecord?.camera.id || null; const coverageVisible = parts.geometry.buildCoverageVisibleSet(activeRecord); + // Drawn coverage needs geometry too (geometryQueue's working set). + layerState._coverageVisibleIds = coverageVisible; const coverageOn = layerState._coverageMode !== 'off'; const viewshedOn = layerState._coverageMode === 'viewshed'; if (coverageOn) { @@ -215,8 +391,13 @@ export function createRendering({ for (const record of layerState._records) { const isActive = record.camera.id === activeId; if (record.billboard) { - record.billboard.color = cameraColorFor(record); - record.billboard.scale = isActive ? 1.25 : 1.0; + // Unchanged writes still dirty the collection, which then rewrites + // every icon's vertices: across a large catalog, write only changes. + const color = cameraColorFor(record); + if (!Cesium.Color.equals(record.billboard.color, color)) + record.billboard.color = color; + const scale = isActive ? 1.25 : 1.0; + if (record.billboard.scale !== scale) record.billboard.scale = scale; // disableDepthTestDistance stays POSITIVE_INFINITY for every billboard // (set at creation) — see the field-test far-zoom submerge fix there. } diff --git a/src/layers/cctv/selection.js b/src/layers/cctv/selection.js index 317d80c7e..c86425fd0 100644 --- a/src/layers/cctv/selection.js +++ b/src/layers/cctv/selection.js @@ -141,6 +141,11 @@ export function createSelection({ void parts.ground.resolveFootprintGround(record); record.activationDone = true; parts.rendering.refreshCoverageStyles(); + // The active camera's icon always shows; the previously active one + // competes for its cell again. Its coverage neighbours join the working + // set and are queued for grounding. + parts.rendering.refreshHorizonCulling(); + parts.geometryQueue.enqueueViewGeometry(); // The newly active camera leaves the ambient ring (its monitor plane takes // over); the freed slot re-fills on this same pass. parts.cards.refreshAmbientCards(); @@ -171,7 +176,9 @@ export function createSelection({ parts.ground.groundAltFor(previous), ); }); + parts.rendering.refreshHorizonCulling(); parts.rendering.refreshCoverageStyles(); + parts.geometryQueue.enqueueViewGeometry(); parts.cards.refreshAmbientCards(); layerState._gizmo?.refresh(); parts.presentation.notifyListeners(); diff --git a/src/layers/cctv/state.js b/src/layers/cctv/state.js index b78d18b73..78c2b8fa9 100644 --- a/src/layers/cctv/state.js +++ b/src/layers/cctv/state.js @@ -76,6 +76,63 @@ export function createState({ services }) { layerState._scratchFocusScreen = new Cesium.Cartesian2(); + layerState._scratchViewScreen = new Cesium.Cartesian2(); + + layerState._scratchViewProjection = new Cesium.Matrix4(); + + // Counts view passes; a record shown by the latest pass carries its number. + + layerState._viewPassId = 0; + + // Records whose icons the last view pass showed (see refreshHorizonCulling): + // geometry refinement, the tiles-ready completion pass and ambient cards + // work over these, not the whole catalog. + + layerState._viewRecords = []; + + // Coverage ids refreshCoverageStyles last drew: part of the geometry + // working set even when their icons are thinned out. + + layerState._coverageVisibleIds = new Set(); + + // View pass triggers besides camera settle: an interval while the camera + // moves, and a canvas resize observer. + + layerState._viewMotionTimer = 0; + + layerState._viewResizeObserver = null; + + layerState._viewResizeCanvas = null; + + // The camera the moveStart/moveEnd listeners are attached to. + + layerState._viewListenerCamera = null; + + // A motion pass changed the shown set and the settle pass has not yet told + // subscribers; the camera pose the last view pass ran at. + + layerState._viewUnpublished = false; + + layerState._viewPose = null; + + // { at, ms } — when the last motion pass ran and what it cost. + + layerState._viewMotionPass = null; + + // Retries the view geometry a drain left unresolved, once cells warm. + + layerState._viewGeometryRetryTimer = 0; + + // { key, count } — the active camera's coverage-overlap count, which the + // summary reads on every notification. + + layerState._neighborCountCache = null; + + // { view, active, list } — the camera picker's index uiState publishes, + // rebuilt only when the view pass or the active camera changes. + + layerState._cameraIndexCache = null; + // Staggered geometry-load queue state (see startGeometryLoadQueue). layerState._geoQueue = []; diff --git a/src/layers/cctv/testing.js b/src/layers/cctv/testing.js index 5c1e67956..c4aada9bb 100644 --- a/src/layers/cctv/testing.js +++ b/src/layers/cctv/testing.js @@ -79,6 +79,7 @@ export function createTesting({ state: layerState, services, parts, source }) { * @param {boolean} [options.enabled=true] Layer enabled state. * @param {'off'|'on'|'viewshed'} [options.coverageMode='on'] Coverage mode. * @param {boolean} [options.showProjection=false] Projection visibility. + * @param {Map} [options.healthById] Health rows by camera id. * @returns {void} */ @@ -89,6 +90,7 @@ export function createTesting({ state: layerState, services, parts, source }) { enabled = true, coverageMode = 'on', showProjection = false, + healthById = new Map(), } = {}) { layerState._viewer = viewer; layerState._records = Array.isArray(records) ? records : []; @@ -108,6 +110,11 @@ export function createTesting({ state: layerState, services, parts, source }) { 'on', ); layerState._showProjection = !!showProjection; + layerState._healthById = healthById; + layerState._viewRecords = []; + layerState._cameraIndexCache = null; + layerState._coverageVisibleIds = new Set(); + layerState._neighborCountCache = null; } return { _pushAmbientCardEntriesForTest, diff --git a/src/layers/cyclones/source.js b/src/layers/cyclones/source.js index 05c805fbd..50aa24ad2 100644 --- a/src/layers/cyclones/source.js +++ b/src/layers/cyclones/source.js @@ -1,7 +1,11 @@ import { readResponseJsonCapped } from '../../sources/httpBody.js'; +// Shared with the AI tools, so no i18n import: these errors stay English here +// and the cyclones layer translates them where it shows them (translateKnown). +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 { diff --git a/src/layers/directions/index.js b/src/layers/directions/index.js index 77d3118e9..ffc1497f1 100644 --- a/src/layers/directions/index.js +++ b/src/layers/directions/index.js @@ -18,9 +18,19 @@ import * as Cesium from 'cesium'; import { roadLabel } from '../../data/routeSteps.js'; -import { t, msg, formatNumber, translateKnown } from '../../i18n/index.js'; +import { + t, + msg, + formatNumber, + getLocale, + translateKnown, +} from '../../i18n/index.js'; import { pointerOwnerName } from '../../data/pointerOwnerNames.js'; -import { formatQuantity } from '../../ui/unitLabels.js'; +import { + formatQuantity, + quantitySeparator, + unitLabel, +} from '../../ui/unitLabels.js'; export const DIRECTIONS_STEP_OVERLAY_SOURCE_ID = 'directions-step'; export const DIRECTIONS_STEP_OVERLAY_SOURCE_OPTIONS = Object.freeze({ @@ -125,7 +135,9 @@ export function routeDurationText(seconds) { if (minutes < 60) return formatQuantity(minutes, 'min'); const hours = formatQuantity(Math.floor(minutes / 60), 'h'); const rest = minutes % 60; - return rest ? `${hours}\u00a0${formatQuantity(rest, 'min')}` : hours; + if (!rest) return hours; + // "1 h 5 min"; Japanese runs the parts together: 1時間5戆. + return `${hours}${quantitySeparator(unitLabel('h'))}${formatQuantity(rest, 'min')}`; } /** "left", "slightly right", 
 as it reads inside a maneuver sentence. */ @@ -394,6 +406,16 @@ export function normalizeDirectionsParams(params = {}) { return out; } +/** + * A travel-mode word inside a sentence: lower case, except in German, where + * the words are nouns and keep their capital ("Auto", "Fahrrad"). + * @param {string} word Translated mode word. + * @returns {string} + */ +function modeWordInSentence(word) { + return getLocale() === 'de' ? word : word.toLowerCase(); +} + /** * Row chips for a given state. Pure so the chip logic is testable without a DOM. * @param {{mode:string, armed:null|'a'|'b', a:object|null, b:object|null, status:string, route:object|null}} state @@ -409,7 +431,7 @@ export function directionsRowControls(state) { state: mode === id ? 'active' : 'idle', title: t('{mode} — reroute for {modeLower}', { mode: t(spec.word), - modeLower: t(spec.word).toLowerCase(), + modeLower: modeWordInSentence(t(spec.word)), }), params: { mode: id }, })); diff --git a/src/overlays/worldOverlay.js b/src/overlays/worldOverlay.js index ccf3cbd59..1fcfdd8dc 100644 --- a/src/overlays/worldOverlay.js +++ b/src/overlays/worldOverlay.js @@ -114,7 +114,6 @@ export const WORLD_OVERLAY_OCCLUDER_SELECTORS = Object.freeze([ '.hud-top-right', '.hud-bottom-left', '.hud-bottom-right', - '.hud-top-bar', '.hud-bottom-bar', '#space-mission-panel', '#space-mission-panel-host', diff --git a/src/panelEscape.test.mjs b/src/panelEscape.test.mjs index d3d5cfc6d..b906ecf67 100644 --- a/src/panelEscape.test.mjs +++ b/src/panelEscape.test.mjs @@ -166,11 +166,6 @@ test('Cockpit utility Escape leaves an expanded nested Parameters panel to the s /const kind = displayOpen \? 'display' : 'radio';[\s\S]*?escapedFromDisclosure[\s\S]*?returnFocus: !escapedFromDisclosure[\s\S]*?disclosure\?\.blur/, 'Cockpit utility disclosures clear their own focus when Escape closes them', ); - assert.match( - radioBindings, - /_contextRadioDock\?\.classList\.contains\('disclosure-open'\)[\s\S]*?escapedFromDisclosure[\s\S]*?setRadioDisclosure\(false, \{ returnFocus: !escapedFromDisclosure \}\)[\s\S]*?_contextRadioToggleBtn\?\.blur/, - 'compact Radio disclosure clears its own focus when Escape closes it', - ); }); diff --git a/src/radioMarkup.test.mjs b/src/radioMarkup.test.mjs index dfe5b4257..1774b1f43 100644 --- a/src/radioMarkup.test.mjs +++ b/src/radioMarkup.test.mjs @@ -206,10 +206,11 @@ test('no unchanged Realtime tool definition drifts silently', () => { .sort((a, b) => a.name.localeCompare(b.name)) .map((tool) => structuredClone(tool)) .filter((tool) => tool.name !== 'set_cyber_sonar'); - // Cyber adds one HUD choice and the sonar tool; retain the existing pin for every legacy field. + // Cyber adds one HUD choice and the sonar tool, and Operator was retired; + // retain the existing pin for every legacy field. const hudLayout = unchanged.find((tool) => tool.name === 'set_hud').parameters.properties.layout; - assert.deepEqual(hudLayout.enum, ['tactical', 'operator', 'minimal', 'cyber']); - hudLayout.enum = hudLayout.enum.filter((layout) => layout !== 'cyber'); + assert.deepEqual(hudLayout.enum, ['tactical', 'minimal', 'cyber']); + hudLayout.enum = ['tactical', 'operator', 'minimal']; // Globe rotation adds one motion and clarifies the two affected descriptions. // Check those edits explicitly, then keep the legacy pin for every other field. const camera = unchanged.find((tool) => tool.name === 'move_camera'); @@ -239,6 +240,19 @@ test('no unchanged Realtime tool definition drifts silently', () => { 'Direct the camera like a drone operator: orbit the current view target, pan, tilt, or rotate — one bounded nudge (mode=once) or continuous motion until stopped (mode=continuous). Continuous motion also stops on any manual camera input or when a navigation tool runs. Say the RESULTING state when confirming ("Orbiting slowly").'; camera.parameters.properties.direction.description = 'Required except for orbit (defaults right/clockwise) and stop.'; + // Snow is retired from set_visual_style; restore it to keep the legacy pin. + const visualStyle = unchanged.find( + (tool) => tool.name === 'set_visual_style', + ).parameters.properties.style; + assert.deepEqual(visualStyle.enum, [ + 'normal', + 'retro', + 'surveillance', + 'thermal', + 'anime', + 'noir', + ]); + visualStyle.enum = [...visualStyle.enum, 'snow']; assert.equal(unchanged.length, 14); const digest = createHash('sha256') .update(JSON.stringify(unchanged)) @@ -249,7 +263,7 @@ test('no unchanged Realtime tool definition drifts silently', () => { }); test('Radio volume and mission speed share the Sharpen slider visual language', () => { - for (const id of ['cockpit-radio-volume', 'context-radio-mini-volume', 'radio-volume', 'sdr-volume']) { + for (const id of ['cockpit-radio-volume', 'radio-volume', 'sdr-volume']) { assert.match( html, new RegExp(`id="${id}"[^>]*class="gev-quantitative-slider"[^>]*type="range"`), @@ -269,22 +283,17 @@ test('Radio volume and mission speed share the Sharpen slider visual language', assert.doesNotMatch(css, /#space-mission-panel \[data-mission-replay-speed\]::-webkit-slider-thumb/); }); -test('Radio is nested inside Context with separate disclosure and power controls', () => { +test('Radio is nested inside Context with its own disclosure and power controls', () => { const contextStart = html.indexOf('id="global-context-panel"'); const radioStart = html.indexOf('id="radio-panel"'); const contextEnd = html.indexOf('\n ', contextStart); assert.ok(contextStart >= 0 && radioStart > contextStart && radioStart < contextEnd); assert.match(html, /id="radio-panel"[^>]*data-panel-id="radio-panel"/); assert.match(html, /aria-label="Radio playback"/); - assert.match(html, /id="context-radio-toggle-btn"[^>]*aria-expanded="false"[^>]*aria-controls="context-radio-mini"/); - assert.doesNotMatch(html, /id="context-radio-toggle-btn"[^>]*aria-pressed=/); - assert.match(html, /id="context-radio-mini"[^>]*aria-label="Compact Radio controls"[^>]*hidden/); - assert.match(html, /id="context-radio-mini-enable-btn"[^>]*aria-pressed="false"/); - assert.match(html, /id="context-radio-details-btn"[^>]*aria-expanded="false"[^>]*aria-controls="radio-panel"/); - assert.match(html, /id="context-radio-details-btn"[\s\S]*?
-
@@ -122,7 +92,7 @@
diff --git a/src/ui/templates/display-controls.html b/src/ui/templates/display-controls.html index f6af31127..458a2fcd8 100644 --- a/src/ui/templates/display-controls.html +++ b/src/ui/templates/display-controls.html @@ -15,7 +15,6 @@ Layout diff --git a/src/ui/unitLabels.js b/src/ui/unitLabels.js index 1d9bd6a61..3b12da006 100644 --- a/src/ui/unitLabels.js +++ b/src/ui/unitLabels.js @@ -1,4 +1,4 @@ -import { formatNumber, msg, t } from '../i18n/index.js'; +import { formatNumber, getLocale, msg, t } from '../i18n/index.js'; // Unit ids stay English in data, params and AI-tool readings; only the label // shown on the page is translated. dBZ and °C read the same in every language. @@ -23,6 +23,17 @@ export function unitLabel(unit) { return Object.hasOwn(UNIT_LABELS, unit) ? t(UNIT_LABELS[unit]) : unit || ''; } +/** + * What goes between a number and its unit label: a no-break space, except + * before a Japanese unit word, which follows the number directly (5戆, 1時間). + */ +export function quantitySeparator(label) { + return getLocale() === 'ja' && + /^[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]/u.test(label) + ? '' + : '\u00a0'; +} + /** * A number and its unit that never break apart: "22,0 ĐșĐŒ/ч". Readings carry * no digit grouping ("1008 hPa"), as on weather charts. @@ -30,7 +41,7 @@ export function unitLabel(unit) { export function formatQuantity(value, unit, options) { const label = unitLabel(unit); const number = formatNumber(value, { useGrouping: false, ...options }); - return label ? `${number}\u00a0${label}` : number; + return label ? `${number}${quantitySeparator(label)}${label}` : number; } /** diff --git a/src/ui/unitLabels.test.mjs b/src/ui/unitLabels.test.mjs index c0b1932b1..14b6030e3 100644 --- a/src/ui/unitLabels.test.mjs +++ b/src/ui/unitLabels.test.mjs @@ -44,3 +44,14 @@ test('other languages get their decimal separator and no digit grouping', () => setLocale('en'); } }); + +test('Japanese unit words follow the number directly; symbols keep the space', () => { + try { + setLocale('ja'); + assert.equal(formatQuantity(5, 'min'), '5戆'); + assert.equal(formatQuantity(1, 'h'), '1時間'); + assert.equal(formatQuantity(95, 'kt'), '95\u00a0kt'); + } finally { + setLocale('en'); + } +}); diff --git a/src/ui/visualEffects.test.mjs b/src/ui/visualEffects.test.mjs index 9e9542c52..142bbbe4f 100644 --- a/src/ui/visualEffects.test.mjs +++ b/src/ui/visualEffects.test.mjs @@ -77,7 +77,7 @@ test('construction is inert and initialization creates one owned pipeline', () = assert.equal(f.frames.size, 0); f.effects.initStyles(); f.effects.initPostProcess(); - assert.equal(f.stages.size, 7); + assert.equal(f.stages.size, 6); assert.ok( Object.values(f.effects.stages).every( (stage) => !stage.enabled && stage.uniforms.intensity === 0, @@ -85,7 +85,7 @@ test('construction is inert and initialization creates one owned pipeline', () = ); f.effects.initStyles(); f.effects.initPostProcess(); - assert.equal(f.stages.size, 7); + assert.equal(f.stages.size, 6); f.effects.destroy(); }); @@ -252,7 +252,7 @@ test('stop revokes pending work immediately but retains stages until final destr assert.equal(f.frames.size, 0); assert.equal( f.stages.size, - 7, + 6, 'Context and Cockpit may still be releasing these stages', ); const intensity = f.effects.stages.retro.uniforms.intensity; @@ -281,7 +281,7 @@ test('destroying one instance does not remove another pipeline or clock', () => a.effects.destroy(); b.tick(250); assert.equal(a.stages.size, 0); - assert.equal(b.stages.size, 6); + assert.equal(b.stages.size, 5); assert.equal(b.effects.stages.retro.uniforms.intensity, 0.5); b.effects.destroy(); }); diff --git a/src/ui/visualInput.test.mjs b/src/ui/visualInput.test.mjs index c69c935ba..a87c9c815 100644 --- a/src/ui/visualInput.test.mjs +++ b/src/ui/visualInput.test.mjs @@ -73,13 +73,13 @@ function shortcuts() { return { documentRef, searchInput, calls, controller, press }; } -test('number keys retain the seven style mappings', () => { +test('number keys retain the six style mappings', () => { const f = shortcuts(); for (const key of ['1', '2', '3', '4', '5', '6', '7', '8', 'Space']) f.press(key); assert.deepEqual( f.calls, - ['normal', 'retro', 'surveillance', 'thermal', 'anime', 'noir', 'snow'].map( + ['normal', 'retro', 'surveillance', 'thermal', 'anime', 'noir'].map( (style) => ['setStyle', style], ), ); diff --git a/src/ui/visualPresets.js b/src/ui/visualPresets.js index e3830601a..ca251e48c 100644 --- a/src/ui/visualPresets.js +++ b/src/ui/visualPresets.js @@ -1,7 +1,6 @@ import { retroShader } from '../styles/retro.js'; import { animeShader } from '../styles/anime.js'; import { noirShader } from '../styles/noir.js'; -import { snowShader } from '../styles/snow.js'; import { nightVisionShader } from '../styles/surveillance.js'; import { thermalShader } from '../styles/thermal.js'; import { BLOOM_INTENSITY_DEFAULT } from '../bloom.js'; @@ -16,7 +15,6 @@ export const STYLES = { thermal: thermalShader, anime: animeShader, noir: noirShader, - snow: snowShader, }; /** @@ -156,5 +154,4 @@ export const STYLE_STATUS_LABELS = { thermal: msg('FLIR'), anime: msg('ANIME'), noir: msg('NOIR'), - snow: msg('SNOW'), }; diff --git a/src/ui/visualSettings.js b/src/ui/visualSettings.js index a6f7b5674..7c5a881eb 100644 --- a/src/ui/visualSettings.js +++ b/src/ui/visualSettings.js @@ -1,6 +1,7 @@ import { clampScopeFeatherPct } from '../scopeMaskPolicy.js'; import { syncScopeControls } from './displayControls.js'; import { STYLE_STATUS_LABELS } from './visualPresets.js'; +import { RETIRED_STYLES } from '../visualStylePolicy.js'; import { syncSegmentedControl } from './segmentedControl.js'; import { t } from '../i18n/index.js'; import { UiLifetime } from './uiLifetime.js'; @@ -1272,8 +1273,9 @@ export class VisualSettings { const superseded = () => typeof isCurrent === 'function' && !isCurrent(); if (superseded()) return false; - if (state.style && state.style !== this.activeStyle) { - this.setStyle(state.style, { applyPreset: false }); + const style = RETIRED_STYLES.includes(state.style) ? 'normal' : state.style; + if (style && style !== this.activeStyle) { + this.setStyle(style, { applyPreset: false }); } const bloomState = state.bloom || {}; diff --git a/src/view/index.js b/src/view/index.js index fc5385aaa..022914277 100644 --- a/src/view/index.js +++ b/src/view/index.js @@ -11,6 +11,7 @@ import { decodeLayerStateParams, encodeLayerStateParams, } from '../data/layerState.js'; +import { RETIRED_STYLES } from '../visualStylePolicy.js'; /** Visual styles by internal name, with the name share links use. */ export const STYLE_URL_NAMES = Object.freeze({ @@ -20,7 +21,6 @@ export const STYLE_URL_NAMES = Object.freeze({ thermal: 'flir', anime: 'anime', noir: 'noir', - snow: 'snow', }); const STYLES_BY_URL_NAME = Object.freeze( @@ -254,6 +254,7 @@ export function createView({ } = {}) { if (!Number.isFinite(camera?.lat) || !Number.isFinite(camera?.lon)) throw new TypeError('A view needs a camera lat and lon'); + if (RETIRED_STYLES.includes(style)) style = 'normal'; if (style !== null && !VIEW_STYLES.includes(style)) throw new TypeError(`Unknown view style: ${style}`); if (map !== null && !VIEW_MAPS.includes(map)) @@ -370,9 +371,11 @@ export function viewFromParams(params) { pitch_deg: number('pitch'), }, layers: state?.enabledLayerIds ?? [], - style: Object.hasOwn(STYLES_BY_URL_NAME, params.get('style')) - ? STYLES_BY_URL_NAME[params.get('style')] - : null, + style: RETIRED_STYLES.includes(params.get('style')) + ? 'normal' + : Object.hasOwn(STYLES_BY_URL_NAME, params.get('style')) + ? STYLES_BY_URL_NAME[params.get('style')] + : null, map: VIEW_MAPS.includes(map) ? map : null, follow, annotations: annotationsFromParams(params), diff --git a/src/view/index.test.mjs b/src/view/index.test.mjs index 34299c498..66630e6a0 100644 --- a/src/view/index.test.mjs +++ b/src/view/index.test.mjs @@ -127,6 +127,14 @@ test('annotations travel in the link, keeping only what the app draws', async () assert.equal(viewToParams(many).has('an'), false); }); +test('a view naming the retired Snow style opens on Normal', () => { + const camera = { lat: 1, lon: 2 }; + assert.equal(createView({ camera, style: 'snow' }).style, 'normal'); + const view = viewFromParams(new URLSearchParams('lat=1&lon=2&style=snow')); + assert.equal(view.style, 'normal'); + assert.equal(viewToParams(view).get('style'), 'normal'); +}); + test('inherited and unknown style keys do not corrupt a restored view', () => { for (const style of [ 'constructor', diff --git a/src/visualStylePolicy.js b/src/visualStylePolicy.js new file mode 100644 index 000000000..1a384a7a8 --- /dev/null +++ b/src/visualStylePolicy.js @@ -0,0 +1,7 @@ +/** + * Browser-free style vocabulary shared by views, share links and the UI. + * Styles the app no longer offers, by the name share links used: a view, + * link, scene or shot that names one opens on Normal instead of keeping + * whatever style was already showing. + */ +export const RETIRED_STYLES = Object.freeze(['snow']); diff --git a/src/voice/actionSchemas.js b/src/voice/actionSchemas.js index bf7e2f66d..a27907666 100644 --- a/src/voice/actionSchemas.js +++ b/src/voice/actionSchemas.js @@ -248,15 +248,7 @@ const schemas = [ properties: { style: { type: 'string', - enum: [ - 'normal', - 'retro', - 'surveillance', - 'thermal', - 'anime', - 'noir', - 'snow', - ], + enum: ['normal', 'retro', 'surveillance', 'thermal', 'anime', 'noir'], }, }, required: ['style'], diff --git a/src/voice/actionSchemas.test.mjs b/src/voice/actionSchemas.test.mjs index 97e5004b5..4e6586729 100644 --- a/src/voice/actionSchemas.test.mjs +++ b/src/voice/actionSchemas.test.mjs @@ -45,7 +45,9 @@ test('the complete Realtime tool payload pins the manifest-generated layer relea // S2 GhostMaps extends the generated layer enums. // Panel adds named voice targets and timeout; shared Panel/Cockpit guidance // is consolidated without changing either feature's arguments. - '9ee82c4214499280c208c93751b19d7b724c81b7727a2d0c6dab0184749fbe15', + // Snow leaves the set_visual_style enum. + // The Operator HUD layout leaves set_hud's layout enum. + 'f47a7f78f13b1f79978fa524fad2618e32bd813e1a5dfd746bf35d29909fc91b', ); }); @@ -166,9 +168,22 @@ test('all legacy action arguments are byte-identical after removing the delibera delete center.properties[axis].minimum; delete center.properties[axis].maximum; } - // Cyber adds one HUD layout. + // Cyber adds one HUD layout and Operator was retired. const hud = property('set_hud').layout; - hud.enum = hud.enum.filter((layout) => layout !== 'cyber'); + assert.deepEqual(hud.enum, ['tactical', 'minimal', 'cyber']); + hud.enum = ['tactical', 'operator', 'minimal']; + // Snow is retired from set_visual_style; restore it to keep the legacy pin. + const visualStyle = legacy.find((tool) => tool.name === 'set_visual_style') + .parameters.properties.style; + assert.deepEqual(visualStyle.enum, [ + 'normal', + 'retro', + 'surveillance', + 'thermal', + 'anime', + 'noir', + ]); + visualStyle.enum = [...visualStyle.enum, 'snow']; // Derived by applying the same removals to the 4b56d0e9 actionSchemas. assert.equal( createHash('sha256').update(JSON.stringify(legacy)).digest('hex'), diff --git a/src/voice/gevActions.js b/src/voice/gevActions.js index 0a43f02f1..299fbfc61 100644 --- a/src/voice/gevActions.js +++ b/src/voice/gevActions.js @@ -66,7 +66,6 @@ const ALLOWED_STYLES = new Set([ 'thermal', 'anime', 'noir', - 'snow', ]); const PANEL_ALIASES = new Map([ ['data', 'data-panel'], @@ -1660,9 +1659,8 @@ export async function controlCctv(dataManager, args = {}, styleManager = null) { return { activeCameraId: ui.activeCameraId || null, activeCamera: ui.activeCamera?.name || ui.activeCamera?.id || null, - cameraCount: Array.isArray(ui.cameras) - ? ui.cameras.length - : ui.count || 0, + // `count`, not `cameras.length`: reading `cameras` builds every camera. + cameraCount: Number.isFinite(ui.count) ? ui.count : 0, showCoverage: !!ui.showCoverage, coverageMode: ui.coverageMode || (ui.showCoverage ? 'on' : 'off'), showProjection: !!ui.showProjection, diff --git a/src/voice/speech.js b/src/voice/speech.js index c53881595..cbfae621f 100644 --- a/src/voice/speech.js +++ b/src/voice/speech.js @@ -963,7 +963,10 @@ export function progressStepLabel(step, label) { : step ? spokenLabel(step, 24) : t('Working'); - return label ? `${base}: ${spokenLabel(label, 32)}` : base; + // The join is a catalog string so each language spaces its colon. + return label + ? t('{name}: {state}', { name: base, state: spokenLabel(label, 32) }) + : base; } /** diff --git a/src/voice/speech.test.mjs b/src/voice/speech.test.mjs index 36482290d..cc11fef6e 100644 --- a/src/voice/speech.test.mjs +++ b/src/voice/speech.test.mjs @@ -9,6 +9,7 @@ import { spokenLabel, } from './speech.js'; import { countWords, findHedges } from './speechLint.js'; +import { setLocale } from '../i18n/index.js'; function envelope(name, result, args) { return attachVoiceResult(name, result, args); @@ -459,3 +460,15 @@ test('labels are bounded and cleaned before they are spoken', () => { 'background steps stay on screen', ); }); + +test('progress step labels join through the catalog colon', () => { + setLocale('fr'); + try { + assert.equal( + progressStepLabel('resolve', 'Capitol'), + 'Recherche de lieux\u202f: Capitol', + ); + } finally { + setLocale('en'); + } +});