diff --git a/docs/translations/it.md b/docs/translations/it.md index 3b7bd2ec7..610d85b01 100644 --- a/docs/translations/it.md +++ b/docs/translations/it.md @@ -14,9 +14,10 @@ Translation source: abiyeenzo (#912). - 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: «28,2710° N». 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…». +- 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». - 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 @@ -51,6 +52,9 @@ The `many` form is the `other` text with «di» after the number when a noun fol | 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 | @@ -58,10 +62,14 @@ The `many` form is the `other` text with «di» after the number when a noun fol | mapped / observed | mappato / osservato | | camera (view) / camera, CCTV camera | camera / telecamera, telecamera CCTV | | earthquake / active fire / fire perimeter | terremoto / incendio attivo / perimetro dell'incendio | +| 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 | | 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 | @@ -88,6 +96,7 @@ The `many` form is the `other` text with «di» after the number when a noun fol | 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) | diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index 7afaa6335..ce5f7da1d 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -17,7 +17,7 @@ "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.": "{owner} sta usando il puntatore: chiudilo prima.", + "{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...", @@ -34,10 +34,10 @@ "Glider": "Aliante", "Turboprop": "Turboelica", "Airliner": "Aereo di linea", - "Widebody": "Fusoliera larga", + "Widebody": "Aereo a fusoliera larga", "Four-engine jet": "Quadrigetto", "Helicopter": "Elicottero", - "Fast jet": "Jet veloce", + "Fast jet": "Jet ad alte prestazioni", "Business jet": "Business jet", "Drone": "Drone", "General emergency": "Emergenza generale", @@ -51,12 +51,12 @@ "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 RISOLTA", + "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.": "Riferimento storico 2021 contro immagini 2026 successive all'evento; i cambiamenti sono cumulativi e includono l'alluvione di Rasuwagadhi del luglio 2025. Progressione schematica a valle, non un tempo di arrivo modellato; non è un modello ufficiale di pericolosità.", - "Immediate collapse viewpoint": "Punto di vista sul crollo immediato", - "Collapse viewpoint": "Punto di vista sul crollo", + "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", @@ -144,7 +144,7 @@ "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 sono conservate dalle immagini di origine.", + " 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", @@ -185,7 +185,7 @@ "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 FRANA M5.2", - "USGS EVENT us7000tbwb · OPEN SOURCE": "EVENTO USGS us7000tbwb · FONTE APERTA", + "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", @@ -197,8 +197,8 @@ "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": "REGISTRO", - "Reveal the trigger record while making a slow camera approach": "Mostra il registro dell'innesco con un lento avvicinamento della camera", + "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.", @@ -272,10 +272,10 @@ "GNSS navigation — GPS, GLONASS, Galileo": "Navigazione GNSS — GPS, GLONASS, Galileo", "GEO": "GEO", "Geostationary belt — comms and weather, fixed over the equator": "Fascia geostazionaria — comunicazioni e meteo, fissi sopra l'equatore", - "VISUAL": "VISIVO", + "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 broadband — mostrato solo in modalità DENSO", + "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", @@ -379,7 +379,7 @@ "{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 scrivere nell'archivio {store}", + "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.", @@ -418,7 +418,7 @@ "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.": "Accesso a ChatGPT scaduto. Fai clic su {button} per riprovare.", + "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.", @@ -491,7 +491,7 @@ "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 LA PROSSIMITÀ OSSERVATA / MAPPATA", "Unavailable": "Non disponibile", - "Focus {label}": "Focus su {label}", + "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", @@ -561,7 +561,7 @@ "many": "{count} di tempeste attive", "other": "{count} tempeste attive" }, - "Position as of {time}": "Posizione alle {time}", + "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", @@ -610,7 +610,7 @@ "lane direction|slightly right": "di destra", "lane direction|sharply left": "all'estrema sinistra", "lane direction|sharply right": "all'estrema destra", - "lane direction|straight": "centrale", + "lane direction|straight": "per proseguire dritto", "ordinal|{number}st": "{number}ª", "ordinal|{number}nd": "{number}ª", "ordinal|{number}rd": "{number}ª", @@ -685,8 +685,8 @@ "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}": "{name} è attivo: disattiva {name}, poi imposta {endpoint}", - "{name} is active — {leave}, then set {endpoint}": "{name} è attivo: {leave}, poi imposta {endpoint}", + "{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", @@ -705,7 +705,7 @@ "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}": "Focus sul rilevamento incendio {title}, {details}", + "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", @@ -716,7 +716,7 @@ "FIRE": "INCENDIO", "FIRES": "INCENDI", "max {value} MW": "max {value} MW", - "new {value}": "nuovo {value}", + "new {value}": "ultimo: {value} fa", "{value}°N": "{value}°N", "{value}°S": "{value}°S", "{value}°E": "{value}°E", @@ -903,7 +903,7 @@ "Type unknown": "Tipo sconosciuto", "Reg unknown": "Matricola sconosciuta", "Operator unknown": "Operatore sconosciuto", - "${amount}K": "{amount}K $", + "${amount}K": "{amount} mila $", "${amount}M": "{amount} mln $", "${amount}B": "{amount} mld $", "fire cause|Human": "Umana", @@ -914,7 +914,7 @@ "fire behavior|Moderate": "Moderato", "fire behavior|Active": "Attivo", "fire behavior|Extreme": "Estremo", - "Type {level} Incident": "Incidente di tipo {level}", + "Type {level} Incident": "Evento di tipo {level}", "age|{count}m": "{count} min", "{acres} ac": { "one": "{acres} acro", @@ -936,7 +936,7 @@ "part of {complex}": "parte di {complex}", "InciWeb ↗ · click card to open": "InciWeb ↗ · clic sulla scheda per aprirlo", "FIRE · {name}": "INCENDIO · {name}", - "Unnamed incident": "Incidente senza nome", + "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", @@ -1020,11 +1020,11 @@ "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 broadband Starlink (migliaia di punti in più)", + "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", + "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": "Mostra l'intero shell Starlink — clic per il solo catalogo principale", + "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", @@ -1131,7 +1131,7 @@ "occupancy|crushed standing room only": "solo posti in piedi, affollato", "occupancy|full": "pieno", "occupancy|not accepting passengers": "non accetta passeggeri", - "occupancy|not boardable": "non accessibile", + "occupancy|not boardable": "non è possibile salire", "Route {route}": "Linea {route}", "Vehicle {vehicle}": "Veicolo {vehicle}", "vehicle motion|Stopped": "Fermo", @@ -1140,9 +1140,9 @@ "Moving": "In movimento", "reported {speed} km/h": "{speed} km/h riportati", "reported hdg {heading}°": "direzione {heading}° riportata", - "Last report: stopped at stop {stop}": "Ultimo rapporto: fermo alla fermata {stop}", - "Last report: arriving at stop {stop}": "Ultimo rapporto: in arrivo alla fermata {stop}", - "Last report: next stop {stop}": "Ultimo rapporto: prossima fermata {stop}", + "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", @@ -1176,11 +1176,11 @@ "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 fermo: nuovi tentativi lenti (tentativo {attempt})", + "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 fermo: nuovi tentativi lenti", + "feed down — retrying slowly": "feed inattivo: nuovi tentativi lenti", "reconnecting to feed…": "riconnessione al feed…", - "Focus vessel {name}, MMSI {mmsi}": "Focus sulla nave {name}, MMSI {mmsi}", + "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}", @@ -1188,8 +1188,8 @@ "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 dalle {time}", - "No frame within {gap} h of {time}": "Nessun fotogramma entro {gap} h dalle {time}", + "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}", @@ -1462,7 +1462,7 @@ "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.": "Applica sostituisce il progetto attuale. Esporta prima il progetto attuale se vuoi conservarli entrambi.", + "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", @@ -1539,7 +1539,7 @@ "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. Andrà perso: {items}. Cambiare comunque?", + "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", @@ -1634,7 +1634,7 @@ "PARTLY CLOUDY": "POCO NUVOLOSO", "OVERCAST": "COPERTO", "FOG": "NEBBIA", - "DRIZZLE": "PIOGGERELLA", + "DRIZZLE": "PIOVIGGINE", "RAIN": "PIOGGIA", "RAIN SHOWERS": "ROVESCI DI PIOGGIA", "SNOW SHOWERS": "ROVESCI DI NEVE", @@ -1931,7 +1931,7 @@ "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", + "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", @@ -1946,7 +1946,7 @@ "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}": "CAN {index} / {total}", + "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}", @@ -1991,7 +1991,7 @@ " · degraded directory": " · elenco degradato", " · stale directory": " · elenco obsoleto", " · outside current filter": " · fuori dal filtro attuale", - "Ready — playback starts only from your action": "Pronta — la riproduzione parte solo su tua azione", + "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…", @@ -2002,10 +2002,10 @@ " · 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", + "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", + "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", @@ -2017,7 +2017,7 @@ "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": "{owner} sta usando il puntatore: chiudilo prima", + "{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", @@ -2080,10 +2080,10 @@ "start here": "inizia da qui", "No box": "Nessun riquadro", "Searching": "Ricerca", - "Every day is empty here": "Ogni giorno è vuoto qui", + "Every day is empty here": "Qui tutti i giorni sono vuoti", "Sources off": "Fonti disattivate", "VS": "VS", - "Not set": "Non impostato", + "Not set": "Nessuna immagine", "Basemap": "Mappa di base", "Source off": "Fonte disattivata", "Unpin {slot}": "Sblocca {slot}", @@ -2116,8 +2116,8 @@ "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": "RADA", - "BALANCED": "BILANCIATA", + "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", @@ -2145,7 +2145,7 @@ "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} 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 la posizione alle {time}", @@ -2230,7 +2230,7 @@ "other": "{count} feed live" }, "{feed} {count} ({seconds}s old)": "{feed} {count} ({seconds}s fa)", - "Street Level toggle failed": "Attivazione di Vista stradale non riuscita", + "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", @@ -2377,7 +2377,7 @@ "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 comanda", + "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.", @@ -2520,10 +2520,10 @@ "{items} {scope}": "{items} {scope}", "last 24 h": "ultime 24 h", "past 30 d and upcoming": "ultimi 30 g e prossimi", - "the flights layer loads by viewport": "il livello voli si carica per vista", + "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} off": "{label}: disattivato", "{label} loading": "{label} in caricamento", "{label} error": "{label} in errore", "counted the first {returned} loaded records": "contati i primi {returned} record caricati", @@ -2564,19 +2564,19 @@ "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 mezzo militare 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": "{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": "{layer} è attivo, ma nessun aereo in volo è ancora caricato nella vista di {place}", - "{layer} is enabled, but its aircraft feed is unavailable": "{layer} è attivo, ma il suo feed di aerei non è disponibile", - "{layer} is enabled, but its destination refresh did not complete": "{layer} è attivo, ma l'aggiornamento nel luogo di destinazione non è stato completato", - "{layer} is enabled, but {source} is unavailable": "{layer} è attivo, ma {source} non è disponibile", + "{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", + "{label} on": "{label}: attivato", "Frame aircraft": "Inquadra gli aerei", "Frame military aircraft": "Inquadra gli aerei militari", "Frame ships": "Inquadra le navi", @@ -2649,7 +2649,7 @@ "Change map stack": "Cambia lo stack mappa", "Adjust post-processing": "Regola la post-elaborazione", "Control scene": "Controlla la scena", - "Control CCTV": "Controlla le CCTV", + "Control CCTV": "Controlla le telecamere CCTV", "Control radio": "Controlla la radio", "Track contact": "Traccia il contatto", "Stop tracking": "Interrompi il tracciamento", @@ -2882,7 +2882,7 @@ "Detection label allocation": "Allocazione delle etichette di rilevamento", "Elastic": "Elastica", "Weighted": "Ponderata", - "Fade": "Dissolv.", + "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", diff --git a/src/i18n/same-as-english.json b/src/i18n/same-as-english.json index 81a6d1cc2..6b0b9eb4d 100644 --- a/src/i18n/same-as-english.json +++ b/src/i18n/same-as-english.json @@ -152,6 +152,7 @@ "CCTV", "CCTV OFF", "CCTV ON", + "CH {index} / {total}", "COCKPIT", "CRS {value}°", "CRT", diff --git a/src/scenes/recipes.js b/src/scenes/recipes.js index ba3940a57..1a886c541 100644 --- a/src/scenes/recipes.js +++ b/src/scenes/recipes.js @@ -1079,7 +1079,15 @@ export function displayShotTitle(title, shot = undefined, scene = undefined) { /** Whether the built-in recipe behind a scene declares a shot with this title. */ function recipeDeclaresShotTitle(sceneId, title) { const recipe = sceneId ? getSceneRecipeById(sceneId) : null; - return Boolean( - recipe?.cameraPath?.some((keyframe) => keyframe?.title === title), + if (!recipe) return false; + const declares = (path) => + Array.isArray(path) && path.some((keyframe) => keyframe?.title === title); + if (declares(recipe.cameraPath)) return true; + // A bootstrap recipe seeds legacy "Shot N" keyframes; the upgrade replaces + // them with the append recipe's bootstrap shots, which carry no source pack. + return SCENE_APPEND_RECIPES.some( + (append) => + append.legacySceneBootstrap?.targetSceneTitle === recipe.title && + declares(append.legacySceneBootstrap.cameraPath), ); } diff --git a/src/scenes/sceneTitleDisplay.test.mjs b/src/scenes/sceneTitleDisplay.test.mjs index 604e01c49..758800137 100644 --- a/src/scenes/sceneTitleDisplay.test.mjs +++ b/src/scenes/sceneTitleDisplay.test.mjs @@ -4,6 +4,7 @@ import test from 'node:test'; import assert from 'node:assert/strict'; import { + SCENE_APPEND_RECIPES, SCENE_RECIPES, displaySceneTitle, displayShotTitle, @@ -141,3 +142,28 @@ test('the scene context of a shot carries its display title by provenance', asyn title, ); }); + +test('bootstrap shots of a built-in scene localize without a source pack', () => { + setLocale('ru'); + const append = SCENE_APPEND_RECIPES.find( + (recipe) => recipe.legacySceneBootstrap?.cameraPath?.length, + ); + if (!append) return; + const bootstrap = append.legacySceneBootstrap; + const scene = SCENE_RECIPES.find( + (recipe) => recipe.title === bootstrap.targetSceneTitle, + ); + if (!scene) return; + for (const { title } of bootstrap.cameraPath) { + // The upgrade copies these keyframes into the scene without sourcePackId. + assert.equal( + displayShotTitle(title, { id: 'shot-old', title }, { id: scene.id }), + displayShotTitle(title), + ); + // The same title in an operator's own scene stays as typed. + assert.equal( + displayShotTitle(title, { id: 'shot-user', title }, { id: 'scene-user' }), + title, + ); + } +});