diff --git a/docs/TRANSLATORS.md b/docs/TRANSLATORS.md index d08711193..ed94fbcbe 100644 --- a/docs/TRANSLATORS.md +++ b/docs/TRANSLATORS.md @@ -45,9 +45,10 @@ Edit `src/i18n/locales/.json` and run `npm run i18n`. To see your change, 1. Create `src/i18n/locales/.json`, fill it from `npm run i18n -- --missing ` (start from `{}`), and translate every entry. 2. Import it in `src/i18n/index.js` and add it to `CATALOGS`. 3. Add the code to `LOCALES` and its own-language name to `LOCALE_NAMES` in `src/i18n/locale.js`. Right-to-left languages also go in `RTL_LOCALES`; the chrome mirrors through logical CSS properties (`inset-inline-*`, `margin-inline-*`), and `src/ui/styles/rtl.css` holds what those cannot express (see the Arabic notes). If the language should keep Western digits, map it in `INTL_TAGS` in `locale.js`. -4. Add `src/i18n/locales/.json` next to `ru.json` in `scripts/package-boundaries.json`. +4. Add `src/i18n/locales/.json` next to `ru.json` in `scripts/package-boundaries.json` and in `scripts/format-scope.json`. 5. Write `docs/translations/.md`: glossary, plural forms, units and style (copy the structure of `ru.md`). -6. Run `npm run i18n` and `npm test`, then check the panels in the app at narrow widths. +6. If the language is not written in Latin letters, also add it to `NON_LATIN_LOCALES` in `src/hudSummaryResponse.js` — that guard falls back to the translated text when a summary provider answers in English. +7. Run `npm run i18n` and `npm test`, then check the panels in the app at narrow widths. ## Rules diff --git a/docs/translations/he.md b/docs/translations/he.md index 6d531cab5..44bb6f0c6 100644 --- a/docs/translations/he.md +++ b/docs/translations/he.md @@ -7,7 +7,7 @@ Catalog: `src/i18n/locales/he.json`. General rules: [TRANSLATORS.md](../TRANSLAT - Address the user with a masculine imperative, Google style: הסתר, הצג, נסה שוב, התקרב. Menu items and tooltips take the noun form: הסרת {name}, הרחבת {name}, שינוי הצבע של {name}. - Sentence case: Hebrew has no case forms, so UPPERCASE English is normal sentence style here; short HUD labels stay short, favor an abbreviation over a wrapped line. - Keep the `·`, `—`, `→`, `↗`, `…` separators. Latin codes read inside RTL text because the app isolates interpolated values; leave them alone. -- Units follow the catalog: ק"מ, מ׳, קמ"ש, שנ', דק', שע'; instrument chips keep the Latin unit (MW, KM, FT, KTS, kn) and codes (HDG, FOV, CAL, SRC, REC) exactly as in English — see `same-as-english.json`. +- Units follow the catalog: ק"מ, מ׳, קמ"ש, שנ', דק', שע'. Instrument readouts and formatted shared-unit labels keep the Latin units (km, NM, FT, KTS, MW, KM/S); catalog prose outside those readouts keeps ק"מ/מ׳. Codes like HDG, FOV, CAL, SRC, REC stay exactly as in English — see `same-as-english.json`. ## Digits and direction @@ -19,11 +19,11 @@ Catalog: `src/i18n/locales/he.json`. General rules: [TRANSLATORS.md](../TRANSLAT A `tn()` entry needs three forms under `Intl.PluralRules('he')`: -| Form | Counts | Example | -| ------- | ------------------------- | -------------- | -| `one` | 1 | 1 מצלמה | -| `two` | 2 | 2 מצלמות | -| `other` | 0, 3, 10, 100, fractions… | 5 מצלמות | +| Form | Counts | Example | +| ------- | ---------------------------- | -------------- | +| `one` | 1 and fractions below 1 | 1 מצלמה · 0.5 | +| `two` | 2 | 2 מצלמות | +| `other` | 0, 3, 10, 100, integers… | 5 מצלמות | With {count} shown as a digit, `two` and `other` share the plural noun (2 מצלמות, 5 מצלמות); `one` takes the singular (1 מצלמה). For constructs that resist agreement with a noun (אין, הכול, זמין), phrase around the number: "{count} תחנות מדווחות" is fine, but prefer "ממתין: {count}" over a mismatched genitive chain. @@ -37,7 +37,7 @@ With {count} shown as a digit, `two` and `other` share the plural noun (2 מצל | LIVE / live data / LIVE TRACK | חי / נתונים חיים / מעקב חי | | SIMULATED | מדומה | | stale / degraded / unavailable | מיושן / מופחת / לא זמין | -| key (API key) / POWER UP | מפתח / אתחול | +| key (API key) / POWER UP | מפתח / שדרוג | | globe / map / map source / basemap | גלובוס / מפה / מקור מפה / מפת בסיס | | aircraft / flight / military flight | מטוס (כלי טיס in class lists) / טיסה / טיסה צבאית | | vessel / ship / ships | אונייה / אוניות | @@ -48,10 +48,10 @@ With {count} shown as a digit, `two` and `other` share the plural noun (2 מצל | camera / CCTV camera / ALPR camera | מצלמה / מצלמת CCTV / מצלמת ALPR | | earthquake / active fire / cyclone | רעידת אדמה / שרפה פעילה / ציקלון | | scene / shot | סצנה / שוט | -| briefing / panel / dock | דיווח / פאנל / עגינה | +| briefing / panel / dock | תדריך / פאנל / עגינה | | visual preset / style | ערכת ראייה / סגנון | | Scope (circular viewport mask) / keyhole | סקופ / חור המנעול | -| heading (compass °) / course | כיוון / מסלול | +| heading (compass °) / course | כיוון / מהלך | | HDG / BRG / CRS / FOV / DEST / SPD / RANGE | בלי שינוי — קודי מכשיר | | advisory (NHC/CPHC cyclone) | ייעוץ; Advisory center — מרכז הייעוץ | | Street View (Google) | Street View, בלי תרגום | @@ -59,7 +59,7 @@ With {count} shown as a digit, `two` and `other` share the plural noun (2 מצל | WHOT/BHOT, Ironbow, CRT, NVG, FLIR | בלי שינוי — קודים ושמות מצבים | | PREV / NEXT | הקודם / הבא | | anchor / data pack / asset bundle (scene) | עוגן / חבילת נתונים / חבילת נכסים | +| forecast (weather) | תחזית | | witness / geolocated source | עד ראייה / מקור נתון גיאוגרפית | | contained (wildland fire) / FRP | הכלה / FRP, בלי שינוי | -Latin product, provider and dataset names stay as printed: Google Maps, Cesium ion, OpenSky, ADS-B, AIS, KartaView, Mapillary, Panoramax, Overpass, InciWeb, iNaturalist, Acartia, NASA FIRMS, NOAA, USGS, CelesTrak, TomTom, Sentinel-2, Landsat, VIIRS, HLS, S2 GhostMaps, TeleGeography. diff --git a/scripts/format-scope.json b/scripts/format-scope.json index 7dbd9d2b7..7c78179de 100644 --- a/scripts/format-scope.json +++ b/scripts/format-scope.json @@ -1293,6 +1293,7 @@ "src/i18n/locales/de.json", "src/i18n/locales/es.json", "src/i18n/locales/fr.json", + "src/i18n/locales/he.json", "src/i18n/locales/it.json", "src/i18n/locales/ja.json", "src/i18n/locales/pt.json", diff --git a/src/hudSummaryLine.test.mjs b/src/hudSummaryLine.test.mjs index 2e8845e88..ae4f15b43 100644 --- a/src/hudSummaryLine.test.mjs +++ b/src/hudSummaryLine.test.mjs @@ -143,6 +143,7 @@ for (const [locale, summary] of [ ['ja', '東京上空のLive Flights'], ['zh-CN', '北京航班stale数据'], ['ru', 'Остин Live-Flights частично'], + ['he', 'תל אביב stale טיסות'], ]) { test(`English flush against other text is an echo: ${summary}`, () => { assert.ok(hudSummaryHasEnglish(summary, locale, ['stale', 'Live Flights'])); diff --git a/src/hudSummaryResponse.js b/src/hudSummaryResponse.js index 1f41b994d..b12daf4f4 100644 --- a/src/hudSummaryResponse.js +++ b/src/hudSummaryResponse.js @@ -110,7 +110,7 @@ const SUMMARY_LANGUAGES = Object.freeze({ const UNSPACED_LOCALES = /^(?:ja|zh)(?:-|$)/; /** Shipped locales not written in Latin letters. */ -const NON_LATIN_LOCALES = /^(?:ar|ja|ru|uk|zh)(?:-|$)/; +const NON_LATIN_LOCALES = /^(?:ar|ja|ru|uk|zh|he)(?:-|$)/; /** Scripts whose letters extend a word; any other neighbour ends it. */ const WORD_SCRIPTS = [ diff --git a/src/i18n/i18n.test.mjs b/src/i18n/i18n.test.mjs index f0b9645c7..7d44b4f8a 100644 --- a/src/i18n/i18n.test.mjs +++ b/src/i18n/i18n.test.mjs @@ -41,9 +41,12 @@ test('normalizeLocale folds regional variants and rejects unshipped tags', () => assert.equal(normalizeLocale('de'), 'de'); assert.equal(normalizeLocale('de-AT'), 'de'); assert.equal(normalizeLocale('de_CH'), 'de'); - // Hebrew keeps Western digits like its catalog; regional tags fold to he. + // Hebrew keeps Western digits like its catalog; regional tags fold to he, + // and the legacy tag iw is still what some browsers and OSes label Hebrew. assert.equal(normalizeLocale('he'), 'he'); assert.equal(normalizeLocale('he-IL'), 'he'); + assert.equal(normalizeLocale('iw'), 'he'); + assert.equal(normalizeLocale('iw-IL'), 'he'); assert.equal(normalizeLocale('fr'), 'fr'); assert.equal(normalizeLocale('fr-CA'), 'fr'); assert.equal(normalizeLocale('FR_be'), 'fr'); diff --git a/src/i18n/locale.js b/src/i18n/locale.js index 9b73444ec..7e8f37ffc 100644 --- a/src/i18n/locale.js +++ b/src/i18n/locale.js @@ -64,7 +64,8 @@ export function intlLocale(locale) { /** * Map any language tag to a shipped locale: 'ru-RU' and 'RU' → 'ru', - * 'ar-EG' and 'ar-SA' → 'ar', 'he-IL' and 'he' → 'he', + * 'ar-EG' and 'ar-SA' → 'ar', 'he-IL' and 'he' → 'he', and the + * legacy tag 'iw'/'iw-IL' → 'he', * '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'; @@ -80,6 +81,7 @@ export function normalizeLocale(candidate) { ? 'zh-Hant' : 'zh-CN'; } + if (primary === 'iw') return 'he'; return LOCALES.includes(primary) ? primary : null; } diff --git a/src/i18n/locales/he.json b/src/i18n/locales/he.json index a864840f8..d614063b4 100644 --- a/src/i18n/locales/he.json +++ b/src/i18n/locales/he.json @@ -40,7 +40,7 @@ "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}.": "Space Missions מנתק את נתוני השמעה חוזרת. צא מהמצב כדי להפעיל את {layer}.", + "Space Missions isolates replay data. Exit the mode to enable {layer}.": "משימות החלל מנתקות את נתוני ההשמעה החוזרת. צא מהמצב כדי להפעיל את {layer}.", "Data attribution": "ייחוס נתונים", "Data provided by:": "הנתונים מסופקים על ידי:", "Close data attribution": "סגירת ייחוס הנתונים", @@ -242,7 +242,7 @@ "Overpass temporarily unavailable": "Overpass אינו זמין זמנית", "Retrying mapped sites…": "מנסה שוב אתרים ממופים…", "Fetching mapped sites…": "שולף אתרים ממופים…", - "{reason} — retrying in {seconds}s": "{reason} — מנסה שוב בעוד {seconds} שניות", + "{reason} — retrying in {seconds}s": "{reason} — מנסה שוב בעוד {seconds} שנ", "{reason} — retry pending": "{reason} — ניסיון חוזר בתור", "Zoom in to search mapped installations": "התקרב כדי לחפש מתקנים ממופים", "Showing cached mapped sites": "מציג אתרים ממופים מהמטמון", @@ -307,7 +307,7 @@ "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}. נסה שוב או חקור בידנית.", + "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", @@ -348,11 +348,11 @@ "hemisphere|E": "E", "hemisphere|W": "W", "POWER UP · {count} KEYS WAITING": { - "one": "אתחול · {count} מפתח בהמתנה", - "two": "אתחול · {count} מפתחות בהמתנה", - "other": "אתחול · {count} מפתחות בהמתנה" + "one": "שדרוג · {count} מפתח בהמתנה", + "two": "שדרוג · {count} מפתחות בהמתנה", + "other": "שדרוג · {count} מפתחות בהמתנה" }, - "POWERED UP": "מופעל", + "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": "הגדרות הספקים עונות רק למכונה שמריצה את השרת", @@ -371,7 +371,7 @@ "{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} 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": "המפתח לא נשמר: לא הצליח להגביל את קובץ הפרטים לחשבון שלך; לא נשמר דבר", @@ -413,7 +413,7 @@ "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": "צילומי רחוב וכיסוי בשכבת Street Level. חינם: רשמו אפליקציה במרכז השליטה המפתחים של Mapillary והדביקו את ה-Client Token שלה", - "Public space-missions access needs no key. Leave blank for standard use; paid tokens only raise request limits.": "הגישה הציבורית למשימות החלל אינה דורשת מפתח. השאר לריקה לשימוש הרגיל; אסימונים בתשלום מעלים רק מגבלות בקשות.", + "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": "אין מדידות נוכחיות", @@ -469,7 +469,7 @@ "At least {count}": "{count} לפחות", "CONTEXT READY": "ההקשר מוכן", "GLOBAL CONTEXT OFF": "ההקשר הגלובלי כבוי", - "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "בחר טיסה, כלי שיט או מתקן ממופה", + "SELECT A FLIGHT, VESSEL, OR MAPPED INSTALLATION": "בחר טיסה, אונייה או מתקן ממופה", "ENABLE TO LOAD OBSERVED / MAPPED PROXIMITY": "הפעל כדי לטעון קרבה נצפית / ממופה", "Unavailable": "לא זמין", "Focus {label}": "התמקד ב-{label}", @@ -480,8 +480,8 @@ "NEXT": "הבא", "Next — nearest unvisited contact in the 250 km window": "הבא — המגע הקרוב ביותר שלא ביקרת בו בחלון של 250 ק\"מ", "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.": "הקשר ממופה/נצפה בקוד פתח. שידורים חסרים, אזורי מפה שלא נטענו או אתרים שלא ממופו אינם הוכחה להיעדר.", + "{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} ק\"מ מהעצם", "none mapped within {km} km; not a complete 250 km survey": "אין התאמות ממופות בטווח {km} ק\"מ; אינו מיפוי מלא של 250 ק\"מ", "mapped matches from the loaded viewport": "התאמות ממופות מתוך התצוגה שנטענה", @@ -494,7 +494,7 @@ "WITHIN {km} KM": "בטווח {km} ק\"מ", "Flights": "טיסות", "Military flights": "טיסות צבאיות", - "AIS vessels": "כלי שיט AIS", + "AIS vessels": "אוניות AIS", "Mapped installations": "מתקנים ממופים", "syncing {count} city feeds...": "מסנכרן {count} פידי ערים...", "scanning nearby systems...": "סורק מערכות סמוכות...", @@ -564,9 +564,9 @@ "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. החרוט מתאר אי-ודאות של מסלול המרכז בחזוי, לא את גודל הסערה ולא את מלוא אזור הסכנה. תוויות נקודות החזוי הן שעות חיזוי של המקור, לא זמנים שחושבו מפרסום הייעוץ. הגאומטריה נצמדת לפני הקרקע; הגובה אינו גובה מטאורולוגי. היווע בייעוץ הרשמי.", + "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. החרוט מתאר אי-ודאות של מסלול המרכז בתחזית, לא את גודל הסערה ולא את מלוא אזור הסכנה. תוויות נקודות התחזית הן שעות חיזוי של המקור, לא זמנים שחושבו מפרסום הייעוץ. הגאומטריה נצמדת לפני הקרקע; הגובה אינו גובה מטאורולוגי. היוועץ בייעוץ הרשמי.", "Malformed cyclone snapshot": "תמונת מצב של ציקלון פגומה", "Cyclone request timed out": "בקשת הציקלון חרגה מהזמן הקצוב", "DRIVE": "נסיעה", @@ -584,7 +584,7 @@ "direction|sharply left": "שמאלה בחדות", "direction|sharply right": "ימינה בחדות", "direction|straight": "ישר", - "direction|around": "דרך המעגל", + "direction|around": "לאחור", "fork direction|left": "שמאלה", "fork direction|right": "ימינה", "fork direction|slightly left": "שמאלה קלות", @@ -592,13 +592,13 @@ "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": "ישר", + "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}.", @@ -667,8 +667,8 @@ "Swap A and B": "החלפה בין A ל-B", "FLY ···": "עף ···", "FLYING": "בטיסה", - "FLY": "עף", - "Fly the camera along the route": "עיפה את המצלמה לאורך המסלול", + "FLY": "טוס", + "Fly the camera along the route": "טוס עם המצלמה לאורך המסלול", "Place A and B first": "קבע קודם את A ו-B", "action|CLEAR": "נקה", "Remove the route and both markers": "הסרת המסלול ושני הסמנים", @@ -696,12 +696,12 @@ "From {lower}": "מ-{lower}", "Informational only · not for flight planning": "למידע בלבד · לא לתכנון טיסה", "Unnamed zone": "אזור ללא שם", - "Restricted airspace source unavailable": "מקור שמורות הטיס אינו זמין", + "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 או מגבלות טיסה של UAS. למידע בלבד — אינו תחליף לכלי תכנון טיסה רשמיים של UAS (B4UFLY / LAANC).", + "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).": "השמיים האסורים (P) והמוגבלים (R) לשימוש מיוחד של ה-FAA בלבד, לא מפת ה-UAS Facility ולא מגבלות הטיסה של UAS. למידע בלבד — אינו תחליף לכלי תכנון הטיסה הרשמיים של UAS (B4UFLY / LAANC).", "Prohibited": "אסור", - "Restricted": "שמור", + "Restricted": "מוגבל", "Earthquake source unavailable": "מקור רעידות האדמה אינו זמין", "Focus fire detection {title}, {details}": "התמקדות בזיהוי שריפה {title}, {details}", "live feed unavailable": "פיד חי אינו זמין", @@ -714,7 +714,7 @@ "max {value} MW": "מקס {value} MW", "new {value}": "חדש לפני {value}", "{n} fires": { - "one": "{n} שריפות", + "one": "{n} שריפה", "two": "{n} שריפות", "other": "{n} שריפות" }, @@ -730,7 +730,7 @@ "fire confidence|nominal": "רגילה", "fire confidence|low": "נמוכה", "age|<1h": "פחות משעה", - "age|{count}h": "{count} שעות", + "age|{count}h": "{count} שע", "age|{count}d": "{count} ימים", "fire confidence filter|All": "הכול", "fire confidence filter|Nominal+": "רגילה+", @@ -739,17 +739,17 @@ "Nominal and high confidence detections": "זיהויים בוודאות רגילה וגבוהה", "High confidence detections only": "זיהויים בוודאות גבוהה בלבד", "Fire intensity (FRP)": "עוצמת השריפה (FRP)", - "Minimum fire radiative power, megawatts": "ספק קרינת שריפה מינימלי, מגה-ואט", + "Minimum fire radiative power, megawatts": "הספק קרינת השריפה המינימלי, במגה-ואט", "≥ {value} MW": "≥ {value} MW", "fire intensity filter|All": "הכול", "Confidence": "ודאות", - "Detection confidence": "ודאת הזיהוי", + "Detection confidence": "ודאות הזיהוי", "{shown} of {total} shown": "{shown} מתוך {total} מוצגים", "STALE · cached {age}": "מיושן · מהמטמון לפני {age}", "refreshing...": "מרענן...", "loading...": "טוען...", "KEY REQUIRED": "נדרש מפתח", - "LIVE · updated {age}": "חי · עודכן לפני {age}", + "LIVE · updated {age}": "חי · עודכן {age}", "FIRE": "שריפה", "Source snapshot time unavailable": "זמן תמונת המצב של המקור אינו זמין", "Live data unavailable": "נתונים חיים אינם זמינים", @@ -770,7 +770,7 @@ "Report": "דוח", "Open the source for {title}": "פתיחת המקור של {title}", "GhostMaps catalog unavailable": "קטלוג GhostMaps אינו זמין", - "LIVE · GitHub {commit} · {message} · checked every {seconds}s": "חי · GitHub {commit} · {message} · בדיקה כל {seconds} שניות", + "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": { @@ -804,13 +804,13 @@ "installation class|INSTALLATION": "מתקן", "No mapped sites within {km} km of the contact": "אין אתרים ממופים בטווח {km} ק\"מ מהמגע", "{count} mapped sites within {km} km of the contact": { - "one": "{count} אתרים ממופים בטווח {km} ק\"מ מהמגע", + "one": "{count} אתר ממופה בטווח {km} ק\"מ מהמגע", "two": "{count} אתרים ממופים בטווח {km} ק\"מ מהמגע", "other": "{count} אתרים ממופים בטווח {km} ק\"מ מהמגע" }, "No mapped sites in view": "אין אתרים ממופים בתצוגה", "{count} mapped sites in view": { - "one": "{count} אתרים ממופים בתצוגה", + "one": "{count} אתר ממופה בתצוגה", "two": "{count} אתרים ממופים בתצוגה", "other": "{count} אתרים ממופים בתצוגה" }, @@ -826,7 +826,7 @@ "LIFTOFF · {mission}": "ניתוק מהקרקע · {mission}", "ASCENT REPLAY · {mission}": "שחזור עלייה · {mission}", "ASCENT ESTIMATE · {mission}": "הערכת עלייה · {mission}", - "STAGE RE-ENTRY / RECOVERY · {mission}": "חדירה חזרה / שחזור שלב · {mission}", + "STAGE RE-ENTRY / RECOVERY · {mission}": "כניסה חוזרת / השבת שלב · {mission}", "ORBIT REPLAY · {mission}": "שחזור מסלול · {mission}", "PAUSED · {title}": "מושהה · {title}", "CONFIRMED": "מאושר", @@ -843,14 +843,14 @@ "{count} / 30D": "{count} / 30D", "NO MISSIONS AVAILABLE IN THE CURRENT 30-DAY WINDOW": "אין משימות זמינות בחלון 30 הימים הנוכחי", "{value} KM": "{value} ק\"מ", - "{value} KM/S": "{value} ק\"מ/ש", + "{value} KM/S": "{value} KM/S", "EST. DOWNRANGE": "הערכה במורד הטווח", "PLANNED · ": "מתוכנן · ", "SUPPLIED TRAJECTORY POINTS": "נקודות מסלול שסופקו", "RECONSTRUCTED ESTIMATE": "הערכת שחזור", "Resume replay": "המשך השמעה חוזרת", "Pause replay": "השהה השמעה חוזרת", - "T minus {seconds}": "נותרו {seconds} שניות לשיגור", + "T minus {seconds}": "נותרו {seconds} שנ לשיגור", "Preparing launch site": "מכין את אתר השיגור", "Liftoff": "ניתוק", "Ascent replay": "שחזור עלייה", @@ -865,14 +865,14 @@ "Your RTL-SDR receiver and decoder feed": "מקלט ה-RTL-SDR שלך ופיד הדקודר", "Your decoder feed": "פיד הדקודר שלך", "Your RTL-SDR receiver": "מקלט ה-RTL-SDR שלך", - "NO CALLSIGN": "אין קריאת קוד", + "NO CALLSIGN": "אין אות קריאה", "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}": "מיקום לפני {age}", - "POSITION {seconds} S AGO": "מיקום לפני {seconds} שניות", + "POSITION {seconds} S AGO": "מקום לפני {seconds} שנ", "{count} MSGS": { - "one": "{count} הודעות", + "one": "{count} הודעה", "two": "{count} הודעות", "other": "{count} הודעות" }, @@ -973,7 +973,7 @@ "Metal": "מטאל", "Oldies": "קלאסיקות", "Pop": "פופ", - "Punk": "פאנק", + "Punk": "פאנק רוק", "R&B": "R&B", "Reggae": "רגאיי", "Rock": "רוק", @@ -1161,7 +1161,7 @@ "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 {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})", @@ -1188,24 +1188,24 @@ "{detail} · nearest": "{detail} · הקרוב", "RADAR · {units}": "רדאר · {units}", "RADAR REFLECTIVITY · dBZ": "רפלקטיביות רדאר · dBZ", - "LIGHTNING DENSITY · 15 min accumulation": "צפיפות מכות · צבירה של 15 דק", + "LIGHTNING DENSITY · 15 min accumulation": "צפיפות ברקים · צבירה של 15 דק", "GLOBAL INFRARED · hourly": "אינפרא-אדום גלובלי · לכל שעה", "GOES INFRARED · ~5 min": "אינפרא-אדום GOES · ~5 דק", "{state}: {time}": "{state}: {time}", "Latest observation": "התצפית האחרונה", - "frame {index}/{total}": "שקופית {index}/{total}", + "frame {index}/{total}": "שקופית {index} מתוך {total}", "loading": "טוען", "Observation: unavailable": "תצפית: לא זמינה", "Contiguous US · gaps ≠ no rain": "ארה\"ב הרציפה · פערים ≠ אין גשם", - "Americas + Pacific · not individual strikes": "האמריקות + הפסיפיק · לא מכות בודדות", + "Americas + Pacific · not individual strikes": "האמריקות + הפסיפיק · לא פגיעות בודדות", "60°S–60°N · typically 2–3 h delayed": "60°S–60°N · בדרך כלל בפער 2–3 שע", "North America · infrared imagery": "אמריקה הצפונית · צילומי אינפרא-אדום", - "Color: strikes/km²/min ×10³": "צבע: מכות/קמ\"ר/דק ×10³", + "Color: strikes/km²/min ×10³": "צבע: פגיעות ברק/קמ\"ר/דק ×10³", "Color: {units}": "צבע: {units}", "Reduced motion · history playback unavailable": "תנועה מופחתת · הצגת ההיסטוריה אינה זמינה", "Reduced motion · manual history available": "תנועה מופחתת · היסטוריה ידנית זמינה", "Rain radar · US": "רדאר גשם · ארה\"ב", - "Lightning density · 15 min": "צפיפות מכות · 15 דק", + "Lightning density · 15 min": "צפיפות ברקים · 15 דק", "Satellite clouds": "עננים מלוויין", "Americas + Pacific": "האמריקות + הפסיפיק", "Global · 60°S–60°N": "גלובלית · 60°S–60°N", @@ -1214,7 +1214,7 @@ "Stale source": "מקור מיושן", "Loading next frame…": "טוען את השקופית הבאה…", "Map center outside coverage": "מרכז המפה מחוץ לכיסוי", - "strikes/km²/min ×10³": "מכות/קמ\"ר/דק ×10³", + "strikes/km²/min ×10³": "פגיעות ברק/קמ\"ר/דק ×10³", "N. America": "צפ. אמריקה", "Global": "גלובלי", "Hourly global mosaic; usually 2–3 hours delayed": "פסיפס גלובלי של שעה; בדרך כלל בפער 2–3 שעות", @@ -1229,13 +1229,13 @@ "View coverage": "הצג כיסוי", "View US radar": "הצג רדאר ארה\"ב", "View Americas & Pacific": "הצג האמריקות והפסיפיק", - "{value} strikes/km²/min ×10³ (15-minute density)": "{value} מכות/קמ\"ר/דק ×10³ (צפיפות 15 דק)", + "{value} strikes/km²/min ×10³ (15-minute density)": "{value} פגיעות ברק/קמ\"ר/דק ×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.": "צפיפות מכות של 15 דק מ-NOAA/NWS, נגזרת מ-Vaisala NLDN/GLD360. כיסוי מ-110°צ דרך הפסיפיק/אמריקות עד 0°, בין 25°S–80°N. אינו מנייה חיה של מכות, כיסוי גלובלי, ולא אזהרת בטיחות.", + "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.": "צפיפות ברקים של 15 דק מ-NOAA/NWS, נגזרת מ-Vaisala NLDN/GLD360. כיסוי מ-110°E דרך הפסיפיק/האמריקות עד 0°, בין 25°S–80°N. אינו מנייה חיה של פגיעות, כיסוי גלובלי, ולא אזהרת בטיחות.", "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 ק\"מ; התצוגה מוגבלת לרמה 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.": "אינפרא-אדום גלים ארוכים מוכ״ס 14 של GOES-19/18, אזורי; פסיפס גלים ארוכים גלובלי של NESDIS. „עננים בלבד“ מעמעם הכול מלבד ראשי עננים קרים ובהירים; זהו מסנן בהירות, לא מסך עננים. הכיסוי והרעננות משתנים לפי אזור.", + "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": "אזור", "FILTER": "מסנן", "Cloud filter strength": "עוצמת סינון עננים", @@ -1290,23 +1290,23 @@ "{source} HTTP {status}": "{source} HTTP {status}", "Wind": "רוח", "Wind source unavailable": "מקור הרוח אינו זמין", - "Forecast · does not follow history": "חזוי · אינו מתאים להיסטוריה", + "Forecast · does not follow history": "תחזית · אינה נעה עם ההיסטוריה", "Wind motion": "תנועת רוח", "Wind speed": "מהירות רוח", "Sea-level pressure": "לחץ בגובה פני הים", "Air temperature · 2 m": "טמפרטורת אוויר · 2 מ׳", "Global · 1° grid": "גלובלי · סריג 1°", - "{model} forecast · {time}": "חזוי {model} · {time}", - "Loading forecast": "טוען חזוי", + "{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", + "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": "השהה את הזרימה החזותית; זמן החזוי אינו מתקדם עם ההנפשה", + "Pause visual flow; forecast time does not advance with animation": "השהה את הזרימה החזותית; זמן התחזית אינו מתקדם עם ההנפשה", "None": "ללא", "Speed": "מהירות", "Pressure": "לחץ", @@ -1317,19 +1317,19 @@ "Air temperature two meters above the surface": "טמפרטורת אוויר שני מטרים מעל הקרקע", "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})", + "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 מ׳. סריג גלובלי בערך 1°. העקומות עוקבות שדה הרוח ב-10 מ׳, מוגבהות 12 ק\"מ לראות; גובה התצוגה אינו גובה מטאורולוגי. תאורת הצפייה לצורך קריאות. ההנפשה מציגה זרימה בחזוי קבוע אחד; היא מתקה מעט זמן. שדות הצבע מכסים את מפת בסיס הגלובלי, או את Google 3D Tiles הפעיל.", + "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 מ׳, על סריג של כ-1°. העקומות עוקבות את שדה הרוח בגובה 10 מ׳, מוגבהות 12 ק\"מ לקריאות; גובה התצוגה אינו גובה מטאורולוגי. תאורת התצוגה נועדה לקריאות. ההנפשה מציגה זרימה בתחזית אחת קבועה; היא אינה מקדמת את הזמן. שדות הצבע נפרשים מעל מפת הבסיס של הגלובוס או מעל ה-3D Tiles הפוטוריאליסטיים הפעילים.", "MODEL": "מודל", "FIELD": "שדה", "UNITS": "יחידות", "MOTION": "תנועה", - "Forecast": "חזוי", + "Forecast": "תחזית", "N": "N", "NNE": "NNE", "NE": "NE", @@ -1348,8 +1348,8 @@ "NNW": "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°. דפוסי מזג אוויר רחבים, לא מדידה ברמת הרחוב.", + "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}", @@ -1400,12 +1400,12 @@ "Cannot update {scene}: evidence beats changed": "לא ניתן לעדכן את {scene}: קטעי הראיות השתנו", "Cannot update {scene}: shot bindings are incomplete": "לא ניתן לעדכן את {scene}: קשירות השוטים אינן שלמות", "Updated {count} shots: {scene}": { - "one": "עודכנו {count} שוטים: {scene}", + "one": "עודכן {count} שוט: {scene}", "two": "עודכנו {count} שוטים: {scene}", "other": "עודכנו {count} שוטים: {scene}" }, "Appended {count} shots: {scene}": { - "one": "צורפו {count} שוטים: {scene}", + "one": "צורף {count} שוט: {scene}", "two": "צורפו {count} שוטים: {scene}", "other": "צורפו {count} שוטים: {scene}" }, @@ -1433,7 +1433,7 @@ "Action unavailable or cancelled": "הפעולה אינה זמינה או בוטלה", "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}", + "Running {index}/{total}: {scene} / {shot}": "מריץ {index} מתוך {total}: {scene} / {shot}", "Scene run complete": "ריצת הסצנה הושלמה", "Bhote Koshi Evidence Sequence": "רצף הראיות של Bhote Koshi", "Nepal Flood Incident": "אירוע השיטפון בנפאל", @@ -1466,17 +1466,17 @@ "the scene data failed validation": "נתוני הסצנה נכשלו באימות", "Could not complete this action. Check the file, references and selected assets.": "לא ניתן להשלים את הפעולה הזאת. בדוק את הקובץ, ההתייחסויות והנכסים הנבחרים.", "{count} scenes": { - "one": "{count} סצנות", + "one": "{count} סצנה", "two": "{count} סצנות", "other": "{count} סצנות" }, "{count} shots": { - "one": "{count} שוטים", + "one": "{count} שוט", "two": "{count} שוטים", "other": "{count} שוטים" }, "{count} data packs": { - "one": "{count} חבילות נתונים", + "one": "{count} חבילת נתונים", "two": "{count} חבילות נתונים", "other": "{count} חבילות נתונים" }, @@ -1526,7 +1526,7 @@ "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": "שמע הדפדפן מושהה; הקש Connect שוב כדי לחדש אותו", + "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 שוב כדי לחדש אותו", @@ -1560,9 +1560,9 @@ "Scanlines": "קווי סריקה", "Sensitivity": "רגישות", "WHOT/BHOT": "WHOT/BHOT", - "Ironbow": "קשת ברזל", - "Left panels": "פאנלים שמאליים", - "Right panels": "פאנלים ימניים", + "Ironbow": "Ironbow", + "Left panels": "פאנלים ימניים", + "Right panels": "פאנלים שמאליים", "Contacts could not complete the requested transition; try again": "המגעים לא השלימו את המעבר המבוקש; נסה שוב", "CCTV layer unavailable": "שכבת CCTV אינה זמינה", "Link shared": "הקישור שותף", @@ -1604,7 +1604,7 @@ "FRAME · LOADING": "שקופית · בטעינה", "FRAME · UNAVAILABLE": "שקופית · לא זמינה", "{count} more cameras outside this view · pan or zoom out": { - "one": "{count} מצלמות נוספות מחוץ לתצוגה הזאת · הזז או זום החוצה", + "one": "{count} מצלמה נוספת מחוץ לתצוגה הזאת · הזז או זום החוצה", "two": "{count} מצלמות נוספות מחוץ לתצוגה הזאת · הזז או זום החוצה", "other": "{count} מצלמות נוספות מחוץ לתצוגה הזאת · הזז או זום החוצה" }, @@ -1621,12 +1621,12 @@ "OFF": "כבוי", "{city} · HDG {heading} · FOV {fov} · RANGE {range}m · {projection}{calBadge} · {provider}{status}": "{city} · HDG {heading} · FOV {fov} · טווח {range} מ׳ · {projection}{calBadge} · {provider}{status}", "{count} cameras loaded · click a camera to activate": { - "one": "{count} מצלמות נטענו · לחץ על מצלמה להפעלה", + "one": "{count} מצלמה נטענה · לחץ על מצלמה להפעלה", "two": "{count} מצלמות נטענו · לחץ על מצלמה להפעלה", "other": "{count} מצלמות נטענו · לחץ על מצלמה להפעלה" }, "{count} cameras loaded · enable CCTV to activate": { - "one": "{count} מצלמות נטענו · הפעל CCTV להפעלה", + "one": "{count} מצלמה נטענה · הפעל CCTV להפעלה", "two": "{count} מצלמות נטענו · הפעל CCTV להפעלה", "other": "{count} מצלמות נטענו · הפעל CCTV להפעלה" }, @@ -1650,9 +1650,9 @@ "CYCLE OFF": "מחזור כבוי", "ACQUIRING REGIONAL NEWS": "אוסף חדשות אזוריות", "RESOLVING REGION": "מזהה אזור", - "CONDITIONS UNKNOWN": "מחיזים לא ידועים", + "CONDITIONS UNKNOWN": "תנאים לא ידועים", "CLEAR": "בהיר", - "PARTLY CLOUDY": "חלקי מעונן", + "PARTLY CLOUDY": "מעונן חלקית", "OVERCAST": "מעונן", "FOG": "ערפל", "DRIZZLE": "טפטוף", @@ -1666,7 +1666,7 @@ "REGIONAL NEWS UNAVAILABLE": "חדשות אזוריות אינן זמינות", "REGION UNAVAILABLE": "אזור אינו זמין", "NO RECENT LOCATION MATCHES": "אין התאמות מיקום אחרונות", - "{domain} · {age}": "{domain} · לפני {age}", + "{domain} · {age}": "{domain} · {age}", "{value} KM/H": "{value} קמ\"ש", "CLOUD {pct}%": "עננות {pct}%", "CLOUD UNKNOWN": "עננות לא ידועה", @@ -1689,9 +1689,9 @@ "L": "L", "R": "R", "{count} INPUTS UNKNOWN · NOT AN ALL-CLEAR": { - "one": "{count} קלטים לא ידועים · ללא אישור מלא", - "two": "{count} קלטים לא ידועים · ללא אישור מלא", - "other": "{count} קלטים לא ידועים · ללא אישור מלא" + "one": "{count} קלט לא ידוע · לא אות הרגעה", + "two": "{count} קלטים לא ידועים · לא אות הרגעה", + "other": "{count} קלטים לא ידועים · לא אות הרגעה" }, "AVAILABLE INPUTS CURRENT · NOT AN ALL-CLEAR": "הקלטים הזמינים עדכניים · ללא אישור מלא", "CONTACTS · 250 KM": "מגעים · 250 ק\"מ", @@ -1702,7 +1702,7 @@ "Anime": "אנימה", "Noir": "נואר", "AIRCRAFT": "מטוס", - "LIVE TRACK · COURSE ALIGNED": "מעקב חי · מסלול תואם", + "LIVE TRACK · COURSE ALIGNED": "מעקב חי · מהלך תואם", "ROUTE DATA UNAVAILABLE": "נתוני המסלול אינם זמינים", "DEST ---°": "DEST ---°", "SQUAWK {code} · {status}": "SQUAWK {code} · {status}", @@ -1714,13 +1714,13 @@ "LIVE TRACK": "מעקב חי", "COMMERCIAL": "מסחרי", "{aircraftClass} · {emergency} · {feedState}": "{aircraftClass} · {emergency} · {feedState}", - "{aircraftClass} · {feedState} · COURSE ALIGNED": "{aircraftClass} · {feedState} · מסלול תואם", + "{aircraftClass} · {feedState} · COURSE ALIGNED": "{aircraftClass} · {feedState} · מהלך תואם", "ARROW · ESTIMATED DIRECTION": "חץ · כיוון מוערך", "DEST {bearing}": "DEST {bearing}", "TIME UNKNOWN": "זמן לא ידוע", - "{count}M AGO": "לפני {count} דק'", - "{count}H AGO": "לפני {count} שע'", - "{count}D AGO": "לפני {count} יום", + "{count}M AGO": "לפני {count} דק", + "{count}H AGO": "לפני {count} שע", + "{count}D AGO": "לפני {count} ימ", "DIR UNKNOWN": "כיוון לא ידוע", "COCKPIT": "תא טייס", "Select flight {title}": "בחירת הטיסה {title}", @@ -1736,34 +1736,34 @@ }, "SOURCE STATUS UNAVAILABLE": "מצב המקור אינו זמין", "TRACK ACQUIRED": "המעקב נתפס", - "{label} · COURSE {heading}°": "{label} · מסלול {heading}°", + "{label} · COURSE {heading}°": "{label} · מהלך {heading}°", "Context could not restore every layer; try again": "ההקשר לא שיחזר את כל השכבות; נסה שוב", "No selected data layers": "אין שכבות נתונים נבחרות", "{count} data layers could not be cleared": { - "one": "{count} שכבות נתונים לא נוקו", + "one": "{count} שכבת נתונים לא נוקתה", "two": "{count} שכבות נתונים לא נוקו", "other": "{count} שכבות נתונים לא נוקו" }, "Cleared {count} data layers": { - "one": "נוקו {count} שכבות נתונים", + "one": "נוקתה {count} שכבת נתונים", "two": "נוקו {count} שכבות נתונים", "other": "נוקו {count} שכבות נתונים" }, "Selected data layers could not be cleared": "שכבות הנתונים הנבחרות לא נוקו", - "Space Missions could not complete the requested transition; try again": "Space Missions לא השלים את המעבר המבוקש; נסה שוב", + "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": "ביטול Space Missions לא שיחזר את מצב השכבה הקודם", + "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": "Space Missions", + "Space Missions": "משימות חלל", "Context": "ההקשר", "Ground heights could not be refreshed. Try the file again when the map has loaded.": "את גבהי הקרקע לא ניתן לרענן. נסה שוב את הקובץ כשהמפה נטענת.", "{count} map objects": { - "one": "{count} אובייקטי מפה", + "one": "{count} אובייקט מפה", "two": "{count} אובייקטי מפה", "other": "{count} אובייקטי מפה" }, @@ -1772,12 +1772,12 @@ "Reading {name}…": "קורא את {name}…", "That file could not be read.": "את הקובץ לא ניתן לקרוא.", "Added {count} files.": { - "one": "נוספו {count} קבצים.", + "one": "נוסף {count} קובץ.", "two": "נוספו {count} קבצים.", "other": "נוספו {count} קבצים." }, "{count} files could not be added ({name}: {error})": { - "one": "{count} קבצים לא התווספו ({name}: {error})", + "one": "{count} קובץ לא התווסף ({name}: {error})", "two": "{count} קבצים לא התווספו ({name}: {error})", "other": "{count} קבצים לא התווספו ({name}: {error})" }, @@ -1806,17 +1806,17 @@ "Datacenters": "מרכזי נתונים", "Dams": "סכרים", "Submarine Cables": "כבלים תת-ימיים", - "FIRMS Active Fires": "שרפות פעילות FIRMS", + "FIRMS Active Fires": "שריפות פעילות FIRMS", "Local ADS-B": "ADS-B מקומי", "OSM Places": "מקומות OSM", "Transit": "תחבורה ציבורית", "Recent Imagery": "צילומים אחרונים", "Fire Perimeters": "היקפי שרפות", "GNSS Integrity": "שלמות GNSS", - "Prohibited & Restricted Airspace": "שמיים אסורים ושמורים", + "Prohibited & Restricted Airspace": "מרחב אווירי אסור ומוגבל", "S2 GhostMaps": "S2 GhostMaps", "Rain radar": "רדאר גשם", - "Lightning density": "צפיפות מכות", + "Lightning density": "צפיפות ברקים", "Cyclone advisories": "ייעוצי ציקלונים", "ALPR Cameras": "מצלמות ALPR", "Sea Marks": "סימני ים", @@ -1827,12 +1827,12 @@ "Street Level": "Street Level", "Mapped ALPR Cameras": "מצלמות ALPR ממופות", "Data Centers": "מרכזי נתונים", - "Active Fires": "שרפות פעילות", + "Active Fires": "שריפות פעילות", "Military aircraft": "מטוס צבאי", "Vessels": "אוניות", "CCTV + Street View fallback": "CCTV + גיבוי Street View", "OpenStreetMap + optional Google Maps Places": "OpenStreetMap + Google Maps Places אופציונלי", - "GFS / ECMWF IFS · FORECAST": "GFS / ECMWF IFS · חזוי", + "GFS / ECMWF IFS · FORECAST": "GFS / ECMWF IFS · תחזית", "NOAA nowCOAST · OBSERVED": "NOAA nowCOAST · נצפה", "NASA FIRMS · LIVE": "NASA FIRMS · חי", "OSM routing": "ניתוב OSM", @@ -1854,14 +1854,14 @@ "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} · retry {seconds}s": "{state} · {source} · {detail} · ניסיון חוזר בעוד {seconds} שנ", "{state} · {source} · {detail}": "{state} · {source} · {detail}", "never": "לעולם לא", "{source} · {loadingLabel}": "{source} · {loadingLabel}", "{accepted} of {raw} records accepted": "התקבלו {accepted} מתוך {raw} רשומות", "incomplete snapshot": "תמונת מצב שאינה שלמה", "{state} · {source} · {detail} · {ago}": "{state} · {source} · {detail} · {ago}", - "{state} · {source} · {ago} · retrying in {seconds}s": "{state} · {source} · {ago} · מנסה שוב בעוד {seconds} שנ'", + "{state} · {source} · {ago} · retrying in {seconds}s": "{state} · {source} · {ago} · מנסה שוב בעוד {seconds} שנ", "{state} · {source} · {ago}": "{state} · {source} · {ago}", "{source} · {ago}": "{source} · {ago}", "{count}s ago": "לפני {count} שנ'", @@ -1881,12 +1881,12 @@ "feed status|invalid": "בלתי תקין", "waiting for IQ": "ממתין ל-IQ", "{count} messages": { - "one": "{count} הודעות", + "one": "{count} הודעה", "two": "{count} הודעות", "other": "{count} הודעות" }, "DSP {count} blocks": { - "one": "{count} בלוקים DSP", + "one": "{count} בלוק DSP", "two": "{count} בלוקים DSP", "other": "{count} בלוקים DSP" }, @@ -1895,7 +1895,7 @@ "audio signal --": "אות שמע --", "audio {state}": "שמע {state}", "{count} HEARD": { - "one": "{count} נשמעו", + "one": "{count} נשמע", "two": "{count} נשמעו", "other": "{count} נשמעו" }, @@ -1939,7 +1939,7 @@ "Washington DC": "וושינגטון די. סי.", "Tallinn": "טאלין", "Los Angeles": "לוס אנג׳לס", - "CH {index} / {total}": "ערוץ {index} / {total}", + "CH {index} / {total}": "ערוץ {index} מתוך {total}", "NO STATIONS": "אין תחנות", "NO STATION AVAILABLE": "אין תחנה זמינה", "{name}, station {index} of {total}": "{name}, תחנה {index} מתוך {total}", @@ -2027,7 +2027,7 @@ "NO BOX": "אין תיבה", "SEARCHING": "מחפש", "{count} DAYS": { - "one": "{count} ימים", + "one": "{count} יום", "two": "{count} ימים", "other": "{count} ימים" }, @@ -2035,7 +2035,7 @@ "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": "גרור את המפריד · SWAP מחליף צדדים", + "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 ביום אחר מחליף אותו · × מסיר את הקיבוע", @@ -2147,7 +2147,7 @@ "REFRESHING LIVE DATA": "מרענן נתונים חיים", "syncing road network": "מסנכרן את רשת הכבישים", "retry pending": "ניסיון חוזר בתור", - "retrying in {seconds}s": "מנסה שוב בעוד {seconds} שנ'", + "retrying in {seconds}s": "מנסה שוב בעוד {seconds} שנ", "ALPR cameras": "מצלמות ALPR", "OpenSky OAuth client missing/invalid": "לקוח ה-OAuth של OpenSky חסר או בלתי תקין", "OpenSky OAuth rejected credentials": "אישורי ה-OAuth של OpenSky נדחו", @@ -2162,7 +2162,7 @@ "Vector tiles unavailable (HTTP {status})": "אריחים וקטוריים אינם זמינים (HTTP {status})", "GNSS feed unavailable (HTTP {status})": "פיד GNSS אינו זמין (HTTP {status})", "{count} CelesTrak groups unavailable": { - "one": "{count} קבוצות CelesTrak אינן זמינות", + "one": "{count} קבוצת CelesTrak אינה זמינה", "two": "{count} קבוצות CelesTrak אינן זמינות", "other": "{count} קבוצות CelesTrak אינן זמינות" }, @@ -2184,30 +2184,30 @@ "{error} — try again in a moment": "{error} — נסה שוב בעוד רגע", "entry {n}": "פריט {n}", "feeds {names} stale": { - "one": "הפידים {names} מיושנים", + "one": "הפיד {names} מיושן", "two": "הפידים {names} מיושנים", "other": "הפידים {names} מיושנים" }, "feeds {names} unreachable": { - "one": "הפידים {names} בלתי נגישים", + "one": "הפיד {names} בלתי נגיש", "two": "הפידים {names} בלתי נגישים", "other": "הפידים {names} בלתי נגישים" }, "feeds {names} invalid": { - "one": "הפידים {names} בלתי תקינים", + "one": "הפיד {names} אינו תקין", "two": "הפידים {names} בלתי תקינים", "other": "הפידים {names} בלתי תקינים" }, "Loading {feeds}": "טוען {feeds}", "{count} heard": { - "one": "{count} נשמעו", + "one": "{count} נשמע", "two": "{count} נשמעו", "other": "{count} נשמעו" }, "USB {rate} msg/s": "USB {rate} הודעות/שנ", "{rate} msg/s": "{rate} הודעות/שנ", "{count} feeds live": { - "one": "{count} פידים חיים", + "one": "{count} פיד חי", "two": "{count} פידים חיים", "other": "{count} פידים חיים" }, @@ -2224,7 +2224,7 @@ "LAST 3 MONTHS": "3 החודשים האחרונים", "LAST MONTH": "החודש האחרון", "LAST {count} DAYS": { - "one": "{count} הימים האחרונים", + "one": "היום האחרון ({count})", "two": "{count} הימים האחרונים", "other": "{count} הימים האחרונים" }, @@ -2242,24 +2242,24 @@ "Every provider is switched off: light a chip to draw its coverage.": "כל הספקים כבויים: הדלק שבב כדי לצייר את כיסויו.", "Loading this sequence…": "טוען את הרצף הזה…", "{n} images in this sequence · Esc clears": { - "one": "{n} תמונות ברצף הזה · Esc מנקה", + "one": "{n} תמונה ברצף הזה · Esc מנקה", "two": "{n} תמונות ברצף הזה · Esc מנקה", "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": { - "one": "{n} רחובות בתצוגה · לחץ על קו לתמונתו הקרובה", + "one": "{n} רחוב בתצוגה · לחץ על קו לתמונתו הקרובה", "two": "{n} רחובות בתצוגה · לחץ על קו לתמונתו הקרובה", "other": "{n} רחובות בתצוגה · לחץ על קו לתמונתו הקרובה" }, "{n} sequences in view · click a line for its nearest photo": { - "one": "{n} רצפים בתצוגה · לחץ על קו לתמונתו הקרובה", + "one": "{n} רצף בתצוגה · לחץ על קו לתמונתו הקרובה", "two": "{n} רצפים בתצוגה · לחץ על קו לתמונתו הקרובה", "other": "{n} רצפים בתצוגה · לחץ על קו לתמונתו הקרובה" }, "{n} sequences in view · click a line for its photos": { - "one": "{n} רצפים בתצוגה · לחץ על קו לתמונותיו", + "one": "{n} רצף בתצוגה · לחץ על קו לתמונותיו", "two": "{n} רצפים בתצוגה · לחץ על קו לתמונותיו", "other": "{n} רצפים בתצוגה · לחץ על קו לתמונותיו" }, @@ -2279,7 +2279,7 @@ "Current cockpit vision style: {style}. Activate for next style.": "סגנון הראייה הנוכחי בתא הטייס: {style}. הפעל למעבר לסגנון הבא.", "Current style: {style} — click for next": "הסגנון הנוכחי: {style} — לחץ לסגנון הבא", "Aircraft cockpit view": "תצוגת תא הטייס", - "LEVEL": "LEVEL", + "LEVEL": "מאוזן", "Estimated destination direction": "הכיוון המוערך אל היעד", "OPTICAL PLANE · 01": "מישור אופטי · 01", "VISOR LOCK · ACTIVE": "ויזור נעול · פעיל", @@ -2374,11 +2374,11 @@ "SHARE SCENE": "שיתוף הסצנה", "The Google Maps key buys the photorealistic planet — everything else stacks on top.": "מפתח Google Maps קונה את כוכב הלכת הפוטוריאליסטי — כל היתר נבנה עליו.", "Remove {title} from this app's saved keys": "הסרת {title} מהמפתחות השמורים של האפליקציה", - "POWER UP": "אתחול", + "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 רצים בדפדפן וחייבים הגבלה אצל הספק. מפתחות שהגדרת במקום אחר מוצגים אך לא נעולים.", + "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 רצים בדפדפן וחייבים הגבלה אצל הספק. מפתחות שהגדרת במקום אחר מוצגים, אך האפליקציה לעולם אינה משנה אותם.", "This key runs in the browser by design — restrict it at the provider (see SECURITY.md)": "מפתח זה רץ בדפדפן מתוך תכנון — הגבל אותו אצל הספק (ראה SECURITY.md)", "browser-side": "בצד הדפדפן", "Supplied by your environment, Keychain, or launcher — change it where it was set": "מסופק על ידי הסביבה, ה-Keychain או מריץ ההפעלה — שנה אותו במקום שבו הוגדר", @@ -2478,14 +2478,14 @@ "Ask GEV anything about the map…": "שאל את GEV כל דבר על המפה…", "Stop reply": "עצירת תשובה", "Send message": "שליחת הודעה", - "Cockpit briefing carousel": "קרוסלת דיווחי תא הטייס", - "Cockpit briefing controls": "פקדי דיווחי תא הטייס", - "Previous briefing page": "עמוד הדיווח הקודם", - "Next briefing page": "עמוד הדיווח הבא", - "Expand cockpit briefing panel": "הרחבת פאנל דיווחי תא הטייס", - "Collapse cockpit briefing panel": "קיפול פאנל דיווחי תא הטייס", - "Expand briefing panel": "הרחבת פאנל הדיווח", - "Collapse briefing panel": "קיפול פאנל הדיווח", + "Cockpit briefing carousel": "קרוסלת תדריכי תא הטייס", + "Cockpit briefing controls": "פקדי תדריכי תא הטייס", + "Previous briefing page": "עמוד התדריך הקודם", + "Next briefing page": "עמוד התדריך הבא", + "Expand cockpit briefing panel": "הרחבת פאנל תדריכי תא הטייס", + "Collapse cockpit briefing panel": "קיפול פאנל תדריכי תא הטייס", + "Expand briefing panel": "הרחבת פאנל התדריך", + "Collapse briefing panel": "קיפול פאנל התדריך", "Live signals": "אותות חיים", "Latest regional news": "חדשות אזוריות אחרונות", "Location-based information": "מידע לפי מקום", @@ -2495,7 +2495,7 @@ "PRECIP": "משקעים", "MM": "מ״מ", "Weather data by Open-Meteo.com": "נתוני מזג אוויר מאת Open-Meteo.com", - "Cockpit briefing pages": "עמודי הדיווח של תא הטייס", + "Cockpit briefing pages": "עמודי התדריך של תא הטייס", "Show Live Signals": "הצגת אותות חיים", "SIG": "אות", "Show Regional News": "הצגת חדשות אזוריות", @@ -2635,11 +2635,11 @@ "TYPE": "סוג", "DESTINATION": "יעד", "PAYLOAD DATA UNAVAILABLE": "נתוני המטען אינם זמינים", - "STAGE / RE-ENTRY / RECOVERY": "שלב / חדירה / שחזור", + "STAGE / RE-ENTRY / RECOVERY": "שלב / כניסה חוזרת / השבה", "STAGE": "שלב", "STATUS": "מצב", "FINAL POSITION": "המיקום הסופי", - "NO STAGE RE-ENTRY / RECOVERY DATA": "אין נתוני חדירה / שחזור שלב", + "NO STAGE RE-ENTRY / RECOVERY DATA": "אין נתוני כניסה חוזרת / השבת שלב", "REPLAY SPEED": "מהירות ההצגה החוזרת", "Replay speed multiplier": "מכפיל מהירות ההצגה החוזרת", "Replay the estimated ascent with a following camera": "הצגת העלייה המשוערת שוב, עם מצלמה עוקבת", @@ -2652,10 +2652,10 @@ "AVAILABLE MISSIONS": "המשימות הזמינות", "SELECT A MISSION TO INSPECT": "בחר משימה לבחינה", "LOADING 30-DAY MISSION INDEX": "טוען את מפתח המשימות ל-30 יום", - "TAB PREVIEWS · ENTER / SPACE SELECTS": "TAB מראה פרצים · Enter / מקש הרווח בוחר", + "TAB PREVIEWS · ENTER / SPACE SELECTS": "Tab לתצוגה מקדימה · Enter / מקש הרווח בוחר", "Panel position": "מקום הפאנל", "Move above the dock": "מעבר מעל העגינה", - "Dock to the right": "עגינה מימין", + "Dock to the right": "עגינה משמאל", "Expand panel": "הרחבת הפאנל", "Minimize panel": "מזעור הפאנל", "Panels": "פאנלים", @@ -2681,7 +2681,7 @@ "ALL · DRAG THE NEEDLE": "הכול · גרור את המחט", "SNAPS TO AVAILABLE STATIONS": "נצמד לתחנות הזמינות", "{count} files selected": { - "one": "נבחרו {count} קבצים", + "one": "נבחר {count} קובץ", "two": "נבחרו {count} קבצים", "other": "נבחרו {count} קבצים" }, @@ -2694,7 +2694,7 @@ "Use your location for faster ADS-B position decoding": "שימוש במיקומך לפענוח מהיר יותר של מיקומי ADS-B", "Choose a different RTL-SDR or receiver channel": "בחירת RTL-SDR או ערוץ מקלט אחר", "CHANGE DEVICE": "החלפת מכשיר", - "RTL-SDR receiver mode": "מצב מקלן ה-RTL-SDR", + "RTL-SDR receiver mode": "מצב המקלט RTL-SDR", "GAIN": "הגברה", "RTL-SDR tuner gain for the current mode": "הגברת מכוון ה-RTL-SDR למצב הנוכחי", "AUTO": "אוטומטי", @@ -2754,7 +2754,7 @@ "Show quick commands": "הצגת פקודות מהירות", "Chat replies are silent. No microphone access is needed.": "תשובות הצ׳אט שקטות. אין צורך בגישה למיקרופון.", "Show Voice Preview": "הצגת תצוגה מקדימה לקול", - "Voice inactivity timeout": "תם זמן המנוחה של הקול", + "Voice inactivity timeout": "כיבוי הקול לאחר חוסר פעילות", "Custom": "מותאם", "Minutes": "דקות", "Voice model tier — applies next session": "דרגת מודל הקול — חלה מההפעלה הבאה", @@ -2784,9 +2784,9 @@ "Active weather": "מזג אוויר פעיל", "{time} · {minutes} min ago": "{time} · לפני {minutes} דק", "LATEST · newest per product": "האחרון · החדש ביותר לכל מוצר", - "Forecast · valid {valid} · issued {issued}": "חזוי · תקף {valid} · פורסם {issued}", + "Forecast · valid {valid} · issued {issued}": "תחזית · תקפה {valid} · פורסמה {issued}", "{detail} · Does not follow history": "{detail} · אינו נע עם ההיסטוריה", - "Forecast · valid {valid}": "חזוי · תקף {valid}", + "Forecast · valid {valid}": "תחזית · תקפה {valid}", "You can attach up to four items.": "ניתן לצרף עד ארבעה פריטים.", "Attachments are too large together. Use smaller files.": "הקבצים המצורפים גדולים יחד. השתמש בקבצים קטנים יותר.", "Choose a TXT, Markdown, CSV, JSON or GeoJSON file.": "בחר קובץ TXT, Markdown, CSV, JSON או GeoJSON.", @@ -2831,7 +2831,7 @@ "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 לא כללה פרטי גישה זנים", + "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 דורש בקשה ממקור אחיד", @@ -2909,12 +2909,12 @@ "Which {place}?": "איזו {place}?", "Which place?": "איזה מקום?", "{n} aircraft": { - "one": "{n} מטוסים", + "one": "{n} מטוס", "two": "{n} מטוסים", "other": "{n} מטוסים" }, "{n} military aircraft": { - "one": "{n} מטוסים צבאיים", + "one": "{n} מטוס צבאי", "two": "{n} מטוסים צבאיים", "other": "{n} מטוסים צבאיים" }, @@ -2939,9 +2939,9 @@ "other": "{n} רעידות אדמה" }, "{n} fire perimeters": { - "one": "{n} היקפי שרפות", - "two": "{n} היקפי שרפות", - "other": "{n} היקפי שרפות" + "one": "{n} היקף שריפה", + "two": "{n} היקפי שריפות", + "other": "{n} היקפי שריפות" }, "{n} cyclones": { "one": "{n} ציקלונים", @@ -2979,9 +2979,9 @@ "other": "{n} סכרים" }, "{n} air quality": { - "one": "{n} תחנות אוויר נקי", - "two": "{n} תחנות אוויר נקי", - "other": "{n} תחנות אוויר נקי" + "one": "{n} תחנת איכות אוויר", + "two": "{n} תחנות איכות אוויר", + "other": "{n} תחנות איכות אוויר" }, "{n} results": { "one": "{n} תוצאות", @@ -3013,17 +3013,17 @@ "{label} error": "{label} שגיאה", "{radius} m around the landmark": "{radius} מ׳ סביב ציון הדרך", "{count} parts": { - "one": "{count} חלקים", + "one": "{count} חלק", "two": "{count} חלקים", "other": "{count} חלקים" }, "{drawn} of {total} parts drawn": { - "one": "שורטטו {drawn} מתוך {total} חלקים", + "one": "שורטט {drawn} מתוך {total} חלק", "two": "שורטטו {drawn} מתוך {total} חלקים", "other": "שורטטו {drawn} מתוך {total} חלקים" }, "{count} duplicate mappings merged": { - "one": "מוזגו {count} מיפויים כפולים", + "one": "מוזג {count} מיפוי כפול", "two": "מוזגו {count} מיפויים כפולים", "other": "מוזגו {count} מיפויים כפולים" }, @@ -3036,7 +3036,7 @@ "Contacts panel snapshot — the same retained cohort supplies the card, speech, and follow-up memory": "תמונת מצב של פאנל המגעים — אותה קבוצה נשמרת מספקת את הכרטיס, הדיבור והזיכרון להמשך", "Fly below {km} km to a covered region": "עוף מטה מתחת ל-{km} ק\"מ אל אזור הזנה", "No feed here yet · {n} regions available": { - "one": "אין עדיין הזנה כאן · {n} אזורים זמינים", + "one": "אין עדיין הזנה כאן · {n} אזור זמין", "two": "אין עדיין הזנה כאן · {n} אזורים זמינים", "other": "אין עדיין הזנה כאן · {n} אזורים זמינים" }, @@ -3106,12 +3106,12 @@ "Frame satellites": "מסגור הלוויינים", "Frame contacts": "מסגור המגעים", "{count} aircraft in frame": { - "one": "{count} מטוסים במסגרת", + "one": "{count} מטוס במסגרת", "two": "{count} מטוסים במסגרת", "other": "{count} מטוסים במסגרת" }, "{count} military aircraft in frame": { - "one": "{count} מטוסים צבאיים במסגרת", + "one": "{count} מטוס צבאי במסגרת", "two": "{count} מטוסים צבאיים במסגרת", "other": "{count} מטוסים צבאיים במסגרת" }, @@ -3149,7 +3149,7 @@ "Registration {registration}": "רישום {registration}", "View state": "מצב התצוגה", "Marked {count} places": { - "one": "סומנו {count} מקומות", + "one": "סומן {count} מקום", "two": "סומנו {count} מקומות", "other": "סומנו {count} מקומות" }, @@ -3267,14 +3267,14 @@ "Monthly traffic allowance used": "הקצבה החודשית לתנועה נוצלה", "Traffic rate limit reached": "הגעת למגבלת הקצב של שירות התנועה", "Traffic service unavailable": "שירות התנועה אינו זמין", - "LOOK STBD {bearing}°": "LOOK STBD {bearing}°", - "LOOK PORT {bearing}°": "LOOK PORT {bearing}°", - "LOOK ASTERN": "LOOK ASTERN", + "LOOK STBD {bearing}°": "מבט ימין {bearing}°", + "LOOK PORT {bearing}°": "מבט שמאל {bearing}°", + "LOOK ASTERN": "מבט אחורה", "UP {angle}°": "מעלה {angle}°", "DOWN {angle}°": "מטה {angle}°", "{direction} · {elevation}": "{direction} · {elevation}", "LOOK {elevation}": "LOOK {elevation}", - "{vesselType} · {feedState} · EYE {height}": "{vesselType} · {feedState} · EYE {height}", + "{vesselType} · {feedState} · EYE {height}": "{vesselType} · {feedState} · עין {height}", "LIVE AIS": "AIS חי", "CONTACT NAVIGATION OFF": "ניווט המגעים כבוי", "THE BRIDGE STAYS WITH THE SELECTED VESSEL": "הגשר נשאר עם האונייה הנבחרת", @@ -3290,7 +3290,7 @@ "{label} · NADIR VIEW": "{label} · תצוגת נדיר", "{label} · HEADING {heading}°": "{label} · כיוון {heading}°", "{label} · NO HEADING": "{label} · ללא כיוון", - "Space Missions unavailable: the mission index could not load. Try again later.": "Space Missions אינן זמינות: טעינת מפתח המשימות נכשלה. נסה שוב מאוחר יותר.", + "Space Missions unavailable: the mission index could not load. Try again later.": "משימות החלל אינן זמינות: טעינת מפתח המשימות נכשלה. נסה שוב מאוחר יותר.", "Close camera preview": "סגירת תצוגת המצלמה", "Refresh map still": "רענון תמונת המפה", "The map still uses a separate request and may show a different moment.": "תמונת המפה נשלפת בבקשה נפרדת ועשויה להראות רגע שונה.", @@ -3328,8 +3328,8 @@ "NORAD {id}": "NORAD {id}", "EPOCH {time}": "EPOCH {time}", "<1 H OLD": "פחות משעה", - "{value} H OLD": "{value} שעות", - "{value} D OLD": "{value} ימים", + "{value} H OLD": "{value} שע", + "{value} D OLD": "{value} ימ", "Orbital view": "תצוגה מסלולית", "CURRENTLY OVER": "כעת מעל", "ORBITAL VIEW · OFF-NADIR": "תצוגה מסלולית · OFF-NADIR", @@ -3382,5 +3382,11 @@ "SATELLITE": "לוויין", "Ride {name}": "רכיבה על {name}", "FOCUS · {name}": "מוקד · {name}", - "Place names": "שמות מקומות" + "Place names": "שמות מקומות", + "Fly below {km} km to a covered city": "טוס מטה מתחת ל-{km} ק\"מ אל עיר עם הזנה", + "No bike share here yet · {n} systems available": { + "one": "אין עדיין שיתוף אופניים כאן · {n} מערכת זמינה", + "two": "אין עדיין שיתוף אופניים כאן · {n} מערכות זמינות", + "other": "אין עדיין שיתוף אופניים כאן · {n} מערכות זמינות" + } } diff --git a/src/i18n/same-as-english.json b/src/i18n/same-as-english.json index 3e24182df..34ca8c016 100644 --- a/src/i18n/same-as-english.json +++ b/src/i18n/same-as-english.json @@ -1250,7 +1250,6 @@ "DEST ---°", "SQUAWK {code} · {status}", "DEST {bearing}", - "Space Missions", "CCTV", "S2 GhostMaps", "Street Level", @@ -1264,7 +1263,6 @@ "km", "min", "dB", - "LEVEL", "KTS", "FT", "FLT", @@ -1281,16 +1279,14 @@ "STARLINK", "STARLINK ···", "STARLINK ✕", - "LOOK STBD {bearing}°", - "LOOK PORT {bearing}°", - "LOOK ASTERN", "LOOK {elevation}", - "{vesselType} · {feedState} · EYE {height}", "{range} NM", "OFF-NADIR {angle}° · {offset}", "NORAD {id}", "EPOCH {time}", "TLE", - "OFF-NADIR {angle}°" + "OFF-NADIR {angle}°", + "{value} KM/S", + "Ironbow" ] } diff --git a/src/overlays/worldOverlayTokens.js b/src/overlays/worldOverlayTokens.js index f00ae5cf4..c03383148 100644 --- a/src/overlays/worldOverlayTokens.js +++ b/src/overlays/worldOverlayTokens.js @@ -7,9 +7,10 @@ */ /** Shared visual tokens used by every world-overlay source. */ -// Map-card fonts: JetBrains Mono has no Arabic glyphs and the generic -// monospace fallback is a fixed-pitch Arabic face that stretches every word; -// Arabic text falls through to Noto Sans Arabic (loaded with the page fonts). +// Map-card fonts: JetBrains Mono has no Arabic or Hebrew glyphs and the +// generic monospace fallback is a fixed-pitch Arabic face that stretches every +// word; Arabic falls through to Noto Sans Arabic, Hebrew to Noto Sans Hebrew +// (both loaded with the page fonts). export const WORLD_OVERLAY_STYLE = Object.freeze({ background: 'rgba(4, 12, 16, 0.82)', selectedBackground: 'rgba(5, 18, 24, 0.94)', @@ -19,13 +20,20 @@ export const WORLD_OVERLAY_STYLE = Object.freeze({ detail: 'rgba(147, 161, 173, 0.92)', leader: 'rgba(147, 213, 228, 0.58)', accent: '#6be8ff', - fontLabel: '500 10px "JetBrains Mono", "Noto Sans Arabic", monospace', - fontTrack: '600 10px "JetBrains Mono", "Noto Sans Arabic", monospace', - fontTitle: '600 12px "JetBrains Mono", "Noto Sans Arabic", monospace', - fontDetail: '500 10.5px "JetBrains Mono", "Noto Sans Arabic", monospace', - fontSelected: '600 13px "JetBrains Mono", "Noto Sans Arabic", monospace', - fontTrackedTitle: '600 13px "JetBrains Mono", "Noto Sans Arabic", monospace', - fontTrackedDetail: '500 11px "JetBrains Mono", "Noto Sans Arabic", monospace', + fontLabel: + '500 10px "JetBrains Mono", "Noto Sans Arabic", "Noto Sans Hebrew", monospace', + fontTrack: + '600 10px "JetBrains Mono", "Noto Sans Arabic", "Noto Sans Hebrew", monospace', + fontTitle: + '600 12px "JetBrains Mono", "Noto Sans Arabic", "Noto Sans Hebrew", monospace', + fontDetail: + '500 10.5px "JetBrains Mono", "Noto Sans Arabic", "Noto Sans Hebrew", monospace', + fontSelected: + '600 13px "JetBrains Mono", "Noto Sans Arabic", "Noto Sans Hebrew", monospace', + fontTrackedTitle: + '600 13px "JetBrains Mono", "Noto Sans Arabic", "Noto Sans Hebrew", monospace', + fontTrackedDetail: + '500 11px "JetBrains Mono", "Noto Sans Arabic", "Noto Sans Hebrew", monospace', radius: 4, anchorDotRadius: 3.2, anchorDotStrokeWidth: 1, diff --git a/src/ui/styles/rtl.css b/src/ui/styles/rtl.css index 8e7288b3e..2106b1bca 100644 --- a/src/ui/styles/rtl.css +++ b/src/ui/styles/rtl.css @@ -1,6 +1,7 @@ -/* Right-to-left languages (Arabic). The chrome mirrors through logical - properties in the component sheets (inset-inline-*, margin-inline-*); this - sheet holds only what logical properties cannot express. */ +/* Right-to-left languages (Arabic, Hebrew). The chrome mirrors through + logical properties in the component sheets (inset-inline-*, + margin-inline-*); this sheet holds only what logical properties cannot + express. */ /* Arabic letters join: letter-spacing tears every word into separate glyphs. Latin marked translate="no" and the intel HUD's Latin telemetry keep their @@ -63,10 +64,9 @@ html:lang(ar) :is(#intel-hud, #cockpit-hud) { /* Hebrew: JetBrains Mono and Inter also lack Hebrew glyphs. Noto Sans Hebrew (loaded with the other Google fonts; its files download only when the page shows Hebrew) leads the stack so the body text keeps one proportional - Hebrew face across platforms. Hebrew letters do not join like Arabic, but - tracking still reads as gaps inside a word, so the body is released from it - the same way; Latin marked translate="no" keeps its tracking. The intel and - cockpit HUDs keep JetBrains Mono for their Latin telemetry. */ + Hebrew face across platforms. Hebrew letters do not join, so tracking on + them only spaces a word out; the body is released the same way, and the + HUDs keep their instrument tracking inside. */ html:lang(he) { --font-mono: 'Noto Sans Hebrew', 'JetBrains Mono', 'SF Mono', 'Fira Code', Tahoma, @@ -75,7 +75,10 @@ html:lang(he) { 'Inter', 'Noto Sans Hebrew', -apple-system, BlinkMacSystemFont, Tahoma, sans-serif; } -html:lang(he) +/* The Global Context lines and their buttons set ui-monospace through the + `font` shorthand; in both RTL languages the words come from the page's + own font stack. */ +html:is(:lang(ar), :lang(he)) :is( #military-awareness-panel, .military-awareness-controls button, @@ -87,6 +90,13 @@ html:lang(he) ) { font-family: var(--font-mono); } +/* The intel and cockpit HUDs keep JetBrains Mono leading for their Latin + telemetry and column-aligned digits, with the language's face behind it. */ +html:lang(ar) :is(#intel-hud, #cockpit-hud) { + --font-mono: + 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Noto Sans Arabic', 'Geeza Pro', + Tahoma, monospace; +} html:lang(he) :is(#intel-hud, #cockpit-hud) { --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Noto Sans Hebrew', Tahoma,