i18n: plural forms and contexts the catalogs could only work around

The last translation review left four kinds of problem it could only
reword around in the catalogs. They are fixed in the code now, and the
catalogs go back to natural wording.

- Counts shown with plain t() are tn() plurals: the wildlife count, the
  Data Library "Showing {shown} of {total}", the News time window (which
  offers 1 h) and the GhostMaps event age (which offers 1 day). The
  English keys stay; the catalogs get real forms, as in "Última 1 h" and
  "Últimas 24 h", or "1 Tag" and "7 Tage".
- The bridge radar range and ring spacing are tn() plurals too. The
  spacing is fractional at the short ranges, and Intl.PluralRules gives
  0.75 and 1.5 their own form: ru "0,75 МОР. МИЛИ", "12 МОР. МИЛЬ".
- Street level no longer passes "the view centre" or "this spot" as
  {place}: each case has a message of its own, so a preposition no
  longer meets a phrase in the wrong case. The progress line had the
  same leak and showed the English phrase.
- Latest, FOCUS, CONFIRMED and "{label} · COURSE {heading}°" are split
  with a context where one key served two places: the News heading, the
  orbital site status, the Wildlife chip and a ship's course.

"CURRENTLY OVER" ended in a preposition that a country name in the
nominative cannot follow in uk, de, it and pt. It reads "under the
satellite" there now, as ru already did.

I18N.md gains the two rules behind these fixes.
This commit is contained in:
German Khokhlov committed 2026-11-13 18:50:34 +04:00
1 parent 42540ad85e
commit 209b135ff1
37 files changed
+1124 -196

No files matched your search

+2 -1
View File
@@ -87,7 +87,8 @@ menu.onChoose = (code) => switchLocale(code); // switched in place and stored (i
- **Pass literals.** `t('Close')`, not `t(label)` (unless `label` holds a `msg()` value) and never a template literal with `${…}`.
- **Use placeholders, not concatenation.** `t('Flying to {place}…', { place })`, not `t('Flying to') + ' ' + place`. Word order differs between languages.
- **Use `tn()` for counts**, not `count === 1 ? … : …`. Russian has three forms.
- **A placeholder takes a name, not a phrase.** When code has no name to pass and would fall back to a phrase ("the view centre", "this spot"), give that case a message of its own: `t('{source} at the view centre', { source })`. Other languages put a phrase in a different case after a preposition, which a name in its nominative form cannot follow.
- **Use `tn()` for counts**, not `count === 1 ? … : …`. Russian has three forms. That includes a number the English writes with a symbol or abbreviation, so both English forms read the same (`tn(hours, 'Last {hours} h', 'Last {hours} h', { hours })`): other languages inflect the words around it («Última 1 h», «Últimas 24 h»). Fractions have a form of their own too (ru «0,75 МОР. МИЛИ»).
- **Translate the label, not the value.** Layer ids, enums, share-link parameters, API fields, voice tool schemas and feed data (callsigns, vessel and place names) stay as they are; translate only the text shown for them.
- **No `t()` at module top level.** Keep the English in `msg()` and call `t()` when rendering.
- **Numbers and dates** go through `formatNumber`, `formatDate`, `formatRelativeTime` and `formatUtcDayMonth` from `src/i18n/index.js`, which follow the active language.
+1 -1
View File
@@ -8,7 +8,7 @@ Catalog: `src/i18n/locales/ru.json`. General rules: [TRANSLATORS.md](../TRANSLAT
- Sentence case, not Title Case: "Live Flights" → «Рейсы в реальном времени».
- Quotes inside Russian text are «ёлочки». Write ё where it belongs: её, ещё, всё.
- In short labels, a standard abbreviation with a period beats a wrapped line: НЕОПРЕД., СЛЕД.
- Units: км, м, км/ч, м/с, уз (knots), фт (feet), ч, мин, с; in UPPERCASE text КМ, М, КМ/С, УЗ, ФТ. MW is МВт in any case. `°` and `%` stay.
- Units: км, м, км/ч, м/с, уз (knots), фт (feet), ч, мин, с; in UPPERCASE text КМ, М, КМ/С, УЗ, ФТ. MW is МВт in any case. `°` and `%` stay. Nautical miles on the bridge radar are «мор. миля», a noun that follows the count: «3 МОР. МИЛИ», «12 МОР. МИЛЬ», «0,75 МОР. МИЛИ».
## Plurals
+1 -1
View File
@@ -12,7 +12,7 @@ Translation source: meirm (#312).
- The apostrophe is always ʼ (U+02BC): обʼєкт, звʼязок, памʼять. Not ' or ’.
- Quotes inside Ukrainian text are «ялинки»; a button or layer name inside a sentence goes in them: Увімкніть «Вуличні знімки».
- In short labels, a standard abbreviation with a period beats a wrapped line: ПОПЕР., ДАЛЬН., КАЛІБР.
- Units: км, м, км/год, м/с, вуз (knots), фт (feet), год, хв, с, МГц, дБ, гПа; in UPPERCASE text КМ, М, КМ/С, ВУЗ, ФТ. MW is МВт in any case. `°` and `%` stay. Decimal comma in coordinates written as text: 28,2710° пн. ш.
- Units: км, м, км/год, м/с, вуз (knots), фт (feet), год, хв, с, МГц, дБ, гПа; in UPPERCASE text КМ, М, КМ/С, ВУЗ, ФТ. Nautical miles on the bridge radar are «мор. миля», a noun that follows the count: «3 МОР. МИЛІ», «12 МОР. МИЛЬ», «0,75 МОР. МИЛІ». MW is МВт in any case. `°` and `%` stay. Decimal comma in coordinates written as text: 28,2710° пн. ш.
- Coordinates: пн. ш. / пд. ш. / сх. д. / зх. д.; the HUD hemisphere letters are Пн, Пд, Сх, Зх.
## Plurals
+89 -11
View File
@@ -77,8 +77,22 @@
"{severity} only": "{severity} فقط",
"All categories": "كل الفئات",
"Reading the news…": "جارٍ قراءة الأخبار…",
"News, last {hours} hours": "الأخبار، الساعات الأخيرة: {hours}",
"Last {hours} h": "آخر {hours} س",
"News, last {hours} hours": {
"zero": "الأخبار، آخر {hours} ساعة",
"one": "الأخبار، آخر ساعة ({hours})",
"two": "الأخبار، آخر ساعتين ({hours})",
"few": "الأخبار، آخر {hours} ساعات",
"many": "الأخبار، آخر {hours} ساعة",
"other": "الأخبار، آخر {hours} ساعة"
},
"Last {hours} h": {
"zero": "آخر {hours} ساعة",
"one": "آخر ساعة ({hours})",
"two": "آخر ساعتين ({hours})",
"few": "آخر {hours} ساعات",
"many": "آخر {hours} ساعة",
"other": "آخر {hours} ساعة"
},
"Time window": "الفترة الزمنية",
"Conflicts": "النزاعات",
"Local": "محلي",
@@ -87,9 +101,23 @@
"Hotspots": "بؤر ساخنة",
"Severity": "الخطورة",
"Category": "الفئة",
"Nothing reported near here in the last {hours} h": "لم يُبلَّغ عن شيء قريب من هنا في آخر {hours} س",
"Nothing reported near here in the last {hours} h": {
"zero": "لم يُبلَّغ عن شيء قريب من هنا في آخر {hours} ساعة",
"one": "لم يُبلَّغ عن شيء قريب من هنا في آخر ساعة ({hours})",
"two": "لم يُبلَّغ عن شيء قريب من هنا في آخر ساعتين ({hours})",
"few": "لم يُبلَّغ عن شيء قريب من هنا في آخر {hours} ساعات",
"many": "لم يُبلَّغ عن شيء قريب من هنا في آخر {hours} ساعة",
"other": "لم يُبلَّغ عن شيء قريب من هنا في آخر {hours} ساعة"
},
"Latest news": "آخر الأخبار",
"No news matches these filters in the last {hours} h": "لا أخبار تطابق هذه المرشحات في آخر {hours} س",
"No news matches these filters in the last {hours} h": {
"zero": "لا أخبار تطابق هذه المرشحات في آخر {hours} ساعة",
"one": "لا أخبار تطابق هذه المرشحات في آخر ساعة ({hours})",
"two": "لا أخبار تطابق هذه المرشحات في آخر ساعتين ({hours})",
"few": "لا أخبار تطابق هذه المرشحات في آخر {hours} ساعات",
"many": "لا أخبار تطابق هذه المرشحات في آخر {hours} ساعة",
"other": "لا أخبار تطابق هذه المرشحات في آخر {hours} ساعة"
},
"Load older news": "تحميل أخبار أقدم",
"How to read the map": "كيف تقرأ الخريطة",
"Colour: severity · icon: type of event": "اللون: الخطورة · الرمز: نوع الحدث",
@@ -259,7 +287,14 @@
"ALTITUDE": "الارتفاع",
"CONTACT": "الهدف",
"CONTACTS · 250 KM": "الأهداف · 250 كم",
"RINGS {spacing} NM": "الحلقات كل {spacing} ميل بحري",
"RINGS {spacing} NM": {
"zero": "الحلقات كل {spacing} ميل بحري",
"one": "الحلقات كل ميل بحري ({spacing})",
"two": "الحلقات كل ميلين بحريين ({spacing})",
"few": "الحلقات كل {spacing} أميال بحرية",
"many": "الحلقات كل {spacing} ميلًا بحريًا",
"other": "الحلقات كل {spacing} ميل بحري"
},
"{count} CONTACTS": {
"zero": "لا أهداف ({count})",
"one": "هدف واحد ({count})",
@@ -388,7 +423,14 @@
"ROUTE DATA UNAVAILABLE": "بيانات المسار غير متاحة",
"CONTACT NAVIGATION OFF": "التنقل بين الأهداف متوقف",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "تبقى غرفة القيادة مع السفينة المحددة",
"{range} NM": "{range} ميل بحري",
"{range} NM": {
"zero": "{range} ميل بحري",
"one": "ميل بحري واحد ({range})",
"two": "ميلان بحريان ({range})",
"few": "{range} أميال بحرية",
"many": "{range} ميلًا بحريًا",
"other": "{range} ميل بحري"
},
"AIS DESTINATION · CREW REPORTED": "وجهة AIS · أبلغ عنها الطاقم",
"FROM": "من",
"TO": "إلى",
@@ -472,6 +514,7 @@
"Current style: {style} — click for next": "النمط الحالي: {style} — انقر للتالي",
"TRACK ACQUIRED": "تم التقاط الهدف",
"{label} · COURSE {heading}°": "{label} · المسار {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · المسار {heading}°",
"{label} · HEADING {heading}°": "{label} · الاتجاه {heading}°",
"{label} · NO HEADING": "{label} · لا اتجاه",
"{label} · NADIR VIEW": "{label} · عرض باتجاه النظير",
@@ -673,6 +716,7 @@
"NEAREST": "الأقرب",
"CCTV camera": "كاميرا CCTV",
"FOCUS": "تركيز",
"site status|FOCUS": "تركيز",
"COVERAGE OFF": "التغطية متوقفة",
"AUTO HOP OFF": "التنقل التلقائي متوقف",
"PROJECTION ON": "الإسقاط مفعّل",
@@ -1063,6 +1107,7 @@
"awaiting first AIS message…": "بانتظار أول رسالة AIS…",
"EST. DOWNRANGE": "تقدير على امتداد المسار",
"CONFIRMED": "مؤكَّد",
"sightings filter|CONFIRMED": "مؤكَّدة",
"PAD / RTLS": "منصة الإطلاق / RTLS",
"Pick a shape, then click the map.": "اختر شكلًا، ثم انقر على الخريطة.",
"Enter to place the pin, Esc to cancel.": "Enter لوضع الدبوس، وEsc للإلغاء.",
@@ -2544,6 +2589,7 @@
"Observed history": "سجل الأرصاد",
"Later observation": "رصد لاحق",
"Latest": "الأحدث",
"news list|Latest": "الأحدث",
"Newest frame per product": "أحدث إطار لكل منتج",
"Replay observed history": "إعادة تشغيل سجل الأرصاد",
"Imagery on Esri · Google 3D returns when cleared": "الصور على Esri · تعود Google 3D عند المسح",
@@ -3716,7 +3762,14 @@
"Photo of {name}": "صورة {name}",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "المشاهدات في نطاق العرض: {count}",
"{count} sightings in view": {
"zero": "{count} مشاهدة في نطاق العرض",
"one": "مشاهدة واحدة ({count}) في نطاق العرض",
"two": "مشاهدتان ({count}) في نطاق العرض",
"few": "{count} مشاهدات في نطاق العرض",
"many": "{count} مشاهدة في نطاق العرض",
"other": "{count} مشاهدة في نطاق العرض"
},
"Close sighting": "إغلاق المشاهدة",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "حياة برية شوهدت خلال 48 ساعة (الحيتان 7 أيام). يوضح اللون ورمز الشارة المجموعة التصنيفية. تُعرض الأنواع الحساسة في خلايا بحجم 0.2° فقط؛ وتُقرّب مشاهدات الثدييات البحرية في بحر ساليش عبر Acartia إلى 0.01°. ليست إحصاءً شاملًا.",
"Open {name} on iNaturalist": "فتح {name} على iNaturalist",
@@ -3727,20 +3780,37 @@
"{days}d": "{days} ي",
"All markers": "كل العلامات",
"Show markers of every age": "عرض العلامات من جميع الأعمار",
"Maximum event age: {days}d; undated markers are kept": "الحد الأقصى لعمر الحدث: {days} ي؛ تبقى العلامات غير المؤرخة ظاهرة",
"Maximum event age: {days}d; undated markers are kept": {
"zero": "الحد الأقصى لعمر الحدث: {days} يوم؛ تبقى العلامات غير المؤرخة ظاهرة",
"one": "الحد الأقصى لعمر الحدث: يوم واحد ({days})؛ تبقى العلامات غير المؤرخة ظاهرة",
"two": "الحد الأقصى لعمر الحدث: يومان ({days})؛ تبقى العلامات غير المؤرخة ظاهرة",
"few": "الحد الأقصى لعمر الحدث: {days} أيام؛ تبقى العلامات غير المؤرخة ظاهرة",
"many": "الحد الأقصى لعمر الحدث: {days} يومًا؛ تبقى العلامات غير المؤرخة ظاهرة",
"other": "الحد الأقصى لعمر الحدث: {days} يوم؛ تبقى العلامات غير المؤرخة ظاهرة"
},
"event age filter|All": "الكل",
"Event age": "عمر الحدث",
"Event age: {days}d · undated kept": "عمر الحدث: {days} ي · غير المؤرخة تبقى ظاهرة",
"Event age: {days}d · undated kept": {
"zero": "عمر الحدث: {days} يوم · غير المؤرخة تبقى ظاهرة",
"one": "عمر الحدث: يوم واحد ({days}) · غير المؤرخة تبقى ظاهرة",
"two": "عمر الحدث: يومان ({days}) · غير المؤرخة تبقى ظاهرة",
"few": "عمر الحدث: {days} أيام · غير المؤرخة تبقى ظاهرة",
"many": "عمر الحدث: {days} يومًا · غير المؤرخة تبقى ظاهرة",
"other": "عمر الحدث: {days} يوم · غير المؤرخة تبقى ظاهرة"
},
"Close camera preview": "إغلاق معاينة الكاميرا",
"Refresh map still": "تحديث صورة الخريطة الثابتة",
"The map still uses a separate request and may show a different moment.": "تستخدم صورة الخريطة طلبًا منفصلًا وقد تعرض لحظة مختلفة.",
"Video plays from Québec 511, which sees your IP address.": "يُشغَّل الفيديو من Québec 511، الذي يرى عنوان IP الخاص بك.",
"Press OPEN to load the photo": "اضغط «فتح» لتحميل الصورة",
"Captured {month}": "التُقطت في {month}",
"this spot": "هذا الموضع",
"the view centre": "مركز العرض",
"{source} at {place}": "{source} في {place}",
"{source} at this spot": "{source} في هذا الموضع",
"{source} at the view centre": "{source} في مركز العرض",
"Street level at {place}": "مستوى الشارع في {place}",
"Street level at this spot": "مستوى الشارع في هذا الموضع",
"Street level at the view centre": "مستوى الشارع في مركز العرض",
"Switching map": "جارٍ تبديل الخريطة",
"Opening imagery": "جارٍ فتح الصور",
"Street View is ready: press {open} to load it": "Street View جاهز: اضغط «{open}» لتحميله",
@@ -3832,6 +3902,7 @@
"{source} imagery could not be opened": "تعذّر فتح صور {source}",
"{place} has no position to look for imagery at": "{place}: لا موضع للبحث عن الصور فيه",
"No {source} imagery near {place}": "لا توجد صور {source} قرب {place}",
"No {source} imagery near the view centre": "لا توجد صور {source} قرب مركز العرض",
"{reason} (filters on: {filters})": "{reason} (المرشحات المفعّلة: {filters})",
"tiles unavailable": "البلاطات غير متاحة",
"zoom in to load this layer": "قرّب لتحميل هذه الطبقة",
@@ -3952,6 +4023,13 @@
"REMOVE ALL": "إزالة الكل",
"Confirm: remove every added entry from Data Layers": "تأكيد: إزالة كل الإدخالات المُضافة من طبقات البيانات",
"Remove every added entry from Data Layers": "إزالة كل الإدخالات المُضافة من طبقات البيانات",
"Showing {shown} of {total}": "عرض {shown} من {total}",
"Showing {shown} of {total}": {
"zero": "عرض {shown} من {total}",
"one": "عرض {shown} من {total}",
"two": "عرض {shown} من {total}",
"few": "عرض {shown} من {total}",
"many": "عرض {shown} من {total}",
"other": "عرض {shown} من {total}"
},
"BROWSE DATA LIBRARY": "تصفّح مكتبة البيانات"
}
+50 -12
View File
@@ -65,8 +65,14 @@
"{severity} only": "Nur {severity}",
"All categories": "Alle Kategorien",
"Reading the news…": "Nachrichten werden gelesen…",
"News, last {hours} hours": "Nachrichten, letzte {hours} h",
"Last {hours} h": "Letzte {hours} h",
"News, last {hours} hours": {
"one": "Nachrichten der letzten {hours} Stunde",
"other": "Nachrichten der letzten {hours} Stunden"
},
"Last {hours} h": {
"one": "Letzte {hours} h",
"other": "Letzte {hours} h"
},
"Time window": "Zeitraum",
"Conflicts": "Konflikte",
"Local": "Lokal",
@@ -75,9 +81,15 @@
"Hotspots": "Brennpunkte",
"Severity": "Schweregrad",
"Category": "Kategorie",
"Nothing reported near here in the last {hours} h": "In den letzten {hours} h nichts in der Nähe gemeldet",
"Nothing reported near here in the last {hours} h": {
"one": "In der letzten {hours} h nichts in der Nähe gemeldet",
"other": "In den letzten {hours} h nichts in der Nähe gemeldet"
},
"Latest news": "Neueste Nachrichten",
"No news matches these filters in the last {hours} h": "Keine Nachrichten der letzten {hours} h passen zu diesen Filtern",
"No news matches these filters in the last {hours} h": {
"one": "Keine Nachrichten der letzten {hours} h passen zu diesen Filtern",
"other": "Keine Nachrichten der letzten {hours} h passen zu diesen Filtern"
},
"Load older news": "Ältere Nachrichten laden",
"How to read the map": "So liest man die Karte",
"Colour: severity · icon: type of event": "Farbe: Schweregrad · Symbol: Art des Ereignisses",
@@ -198,6 +210,7 @@
"Previous — prior visited contact in the 250 km window": "Zurück: zuvor besuchter Kontakt im 250-km-Fenster",
"PREVIOUS": "ZURÜCK",
"FOCUS": "FOKUS",
"site status|FOCUS": "FOKUS",
"Next — nearest unvisited contact in the 250 km window": "Weiter: nächstgelegener unbesuchter Kontakt im 250-km-Fenster",
"NEXT": "WEITER",
"Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "Kontext aus offenen Quellen, kartiert/beobachtet. Fehlende Funksignale, nicht geladene Kartenbereiche oder nicht kartierte Standorte sind kein Beleg für Abwesenheit.",
@@ -302,7 +315,7 @@
"ORBITAL VELOCITY": "BAHNGESCHWINDIGKEIT",
"SUB-SATELLITE POINT": "SUBSATELLITENPUNKT",
"NORTH UP": "NORDEN OBEN",
"CURRENTLY OVER": "AKTUELL ÜBER",
"CURRENTLY OVER": "UNTER DEM SATELLITEN",
"{division}, {country}": "{division}, {country}",
"{region} · near {place}": "{region} · nahe {place}",
"NORAD {id}": "NORAD {id}",
@@ -559,7 +572,10 @@
"ROUTE DATA UNAVAILABLE": "ROUTENDATEN NICHT VERFÜGBAR",
"CONTACT NAVIGATION OFF": "KONTAKTNAVIGATION AUS",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "DIE BRÜCKE BLEIBT BEIM GEWÄHLTEN SCHIFF",
"{range} NM": "{range} SM",
"{range} NM": {
"one": "{range} SM",
"other": "{range} SM"
},
"AIS DESTINATION · CREW REPORTED": "AIS-ZIEL · VON DER BESATZUNG GEMELDET",
"DEST {bearing}": "DEST {bearing}",
"Disable cockpit weather effects": "Cockpit-Wettereffekte deaktivieren",
@@ -605,6 +621,7 @@
"Reclassify as TR-3B": "Als TR-3B umklassifizieren",
"TRACK ACQUIRED": "TRACK ERFASST",
"{label} · COURSE {heading}°": "{label} · KURS {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · KURS {heading}°",
"{label} · HEADING {heading}°": "{label} · STEUERKURS {heading}°",
"{label} · NO HEADING": "{label} · KEIN STEUERKURS",
"{label} · NADIR VIEW": "{label} · NADIRANSICHT",
@@ -836,7 +853,10 @@
"Contact cockpit summary": "Cockpit-Zusammenfassung des Kontakts",
"CONTACT": "KONTAKT",
"CONTACTS · 250 KM": "KONTAKTE · 250 KM",
"RINGS {spacing} NM": "RINGE {spacing} SM",
"RINGS {spacing} NM": {
"one": "RINGE {spacing} SM",
"other": "RINGE {spacing} SM"
},
"{count} CONTACTS": {
"one": "{count} KONTAKT",
"other": "{count} KONTAKTE"
@@ -2404,6 +2424,7 @@
"Observed history": "Beobachteter Verlauf",
"Later observation": "Spätere Beobachtung",
"Latest": "Neueste",
"news list|Latest": "Neueste",
"Newest frame per product": "Neuester Frame je Produkt",
"Replay observed history": "Beobachteten Verlauf abspielen",
"Imagery on Esri · Google 3D returns when cleared": "Bilder auf Esri · nach LÖSCHEN wieder Google 3D",
@@ -3132,6 +3153,7 @@
"Left panels": "Linke Bereiche",
"Right panels": "Rechte Bereiche",
"CONFIRMED": "BESTÄTIGT",
"sightings filter|CONFIRMED": "BESTÄTIGT",
"PAD / RTLS": "STARTPLATZ / RTLS",
"fire confidence filter|All": "Alle",
"fire confidence filter|Nominal+": "Mittel+",
@@ -3392,7 +3414,10 @@
"Photo of {name}": "Foto von {name}",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "Beobachtungen im Bild: {count}",
"{count} sightings in view": {
"one": "{count} Beobachtung im Bild",
"other": "{count} Beobachtungen im Bild"
},
"Close sighting": "Beobachtung schließen",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "In den letzten 48 h beobachtete Wildtiere (Wale 7 Tage). Farbe und Symbol der Markierung zeigen die Artengruppe. Empfindliche Arten erscheinen nur als 0,2°-Zellen; Acartia-Meldungen zu Meeressäugern aus der Salish-See werden auf 0,01° gerundet. Keine Bestandszählung.",
"Open {name} on iNaturalist": "{name} auf iNaturalist öffnen",
@@ -3403,20 +3428,29 @@
"{days}d": "{days} T",
"All markers": "Alle Markierungen",
"Show markers of every age": "Markierungen jeden Alters anzeigen",
"Maximum event age: {days}d; undated markers are kept": "Maximales Ereignisalter: {days} T; undatierte Markierungen bleiben erhalten",
"Maximum event age: {days}d; undated markers are kept": {
"one": "Maximales Ereignisalter: {days} Tag; undatierte Markierungen bleiben erhalten",
"other": "Maximales Ereignisalter: {days} Tage; undatierte Markierungen bleiben erhalten"
},
"event age filter|All": "Alle",
"Event age": "Ereignisalter",
"Event age: {days}d · undated kept": "Ereignisalter: {days} T · undatierte bleiben",
"Event age: {days}d · undated kept": {
"one": "Ereignisalter: {days} Tag · undatierte bleiben",
"other": "Ereignisalter: {days} Tage · undatierte bleiben"
},
"Close camera preview": "Kameravorschau schließen",
"Refresh map still": "Kartenstandbild aktualisieren",
"The map still uses a separate request and may show a different moment.": "Das Kartenstandbild wird separat abgerufen und kann einen anderen Moment zeigen.",
"Video plays from Québec 511, which sees your IP address.": "Das Video wird von Québec 511 abgespielt; die IP-Adresse ist für diesen Anbieter sichtbar.",
"Press OPEN to load the photo": "Auf ÖFFNEN klicken, um das Foto zu laden",
"Captured {month}": "Aufgenommen im {month}",
"this spot": "diese Stelle",
"the view centre": "die Bildmitte",
"{source} at {place}": "{source}: {place}",
"{source} at this spot": "{source} an dieser Stelle",
"{source} at the view centre": "{source} in der Bildmitte",
"Street level at {place}": "Straßenebene: {place}",
"Street level at this spot": "Straßenebene an dieser Stelle",
"Street level at the view centre": "Straßenebene in der Bildmitte",
"Switching map": "Karte wird gewechselt",
"Opening imagery": "Bilder werden geöffnet",
"Street View is ready: press {open} to load it": "Street View ist bereit: Auf {open} klicken, um es zu laden",
@@ -3508,6 +3542,7 @@
"{source} imagery could not be opened": "Bilder von {source} konnten nicht geöffnet werden",
"{place} has no position to look for imagery at": "{place} hat keine Position, an der nach Bildern gesucht werden kann",
"No {source} imagery near {place}": "Keine Bilder von {source} in der Nähe von {place}",
"No {source} imagery near the view centre": "Keine Bilder von {source} in der Nähe der Bildmitte",
"{reason} (filters on: {filters})": "{reason} (aktive Filter: {filters})",
"tiles unavailable": "Kacheln nicht verfügbar",
"zoom in to load this layer": "hineinzoomen, um diese Ebene zu laden",
@@ -3604,6 +3639,9 @@
"REMOVE ALL": "ALLE ENTFERNEN",
"Confirm: remove every added entry from Data Layers": "Bestätigen: alle hinzugefügten Einträge aus Datenebenen entfernen",
"Remove every added entry from Data Layers": "Alle hinzugefügten Einträge aus Datenebenen entfernen",
"Showing {shown} of {total}": "{shown} von {total} angezeigt",
"Showing {shown} of {total}": {
"one": "{shown} von {total} angezeigt",
"other": "{shown} von {total} angezeigt"
},
"BROWSE DATA LIBRARY": "DATENBIBLIOTHEK DURCHSUCHEN"
}
+59 -11
View File
@@ -68,8 +68,16 @@
"{severity} only": "Solo {severity}",
"All categories": "Todas las categorías",
"Reading the news…": "Leyendo las noticias…",
"News, last {hours} hours": "Noticias desde hace {hours} h",
"Last {hours} h": "Desde hace {hours} h",
"News, last {hours} hours": {
"one": "Noticias de la última {hours} hora",
"many": "Noticias de las últimas {hours} de horas",
"other": "Noticias de las últimas {hours} horas"
},
"Last {hours} h": {
"one": "Última {hours} h",
"many": "Últimas {hours} h",
"other": "Últimas {hours} h"
},
"Time window": "Periodo",
"Conflicts": "Conflictos",
"Local": "Local",
@@ -78,9 +86,17 @@
"Hotspots": "Focos",
"Severity": "Gravedad",
"Category": "Categoría",
"Nothing reported near here in the last {hours} h": "No hay noticias cerca de aquí desde hace {hours} h",
"Nothing reported near here in the last {hours} h": {
"one": "No hay noticias cerca de aquí en la última {hours} h",
"many": "No hay noticias cerca de aquí en las últimas {hours} h",
"other": "No hay noticias cerca de aquí en las últimas {hours} h"
},
"Latest news": "Últimas noticias",
"No news matches these filters in the last {hours} h": "Desde hace {hours} h no hay noticias que coincidan con estos filtros",
"No news matches these filters in the last {hours} h": {
"one": "En la última {hours} h no hay noticias que coincidan con estos filtros",
"many": "En las últimas {hours} h no hay noticias que coincidan con estos filtros",
"other": "En las últimas {hours} h no hay noticias que coincidan con estos filtros"
},
"Load older news": "Cargar noticias anteriores",
"How to read the map": "Cómo leer el mapa",
"Colour: severity · icon: type of event": "Color: gravedad · icono: tipo de suceso",
@@ -139,7 +155,11 @@
"ALTITUDE": "ALTITUD",
"CONTACT": "CONTACTO",
"CONTACTS · 250 KM": "CONTACTOS · 250 KM",
"RINGS {spacing} NM": "ANILLOS {spacing} MN",
"RINGS {spacing} NM": {
"one": "ANILLOS {spacing} MN",
"many": "ANILLOS {spacing} MN",
"other": "ANILLOS {spacing} MN"
},
"{count} CONTACTS": {
"one": "{count} CONTACTO",
"many": "{count} DE CONTACTOS",
@@ -266,7 +286,11 @@
"ROUTE DATA UNAVAILABLE": "DATOS DE RUTA NO DISPONIBLES",
"CONTACT NAVIGATION OFF": "NAVEGACIÓN DE CONTACTOS DESACTIVADA",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "EL PUENTE PERMANECE EN EL BUQUE SELECCIONADO",
"{range} NM": "{range} MN",
"{range} NM": {
"one": "{range} MN",
"many": "{range} MN",
"other": "{range} MN"
},
"AIS DESTINATION · CREW REPORTED": "DESTINO AIS · NOTIFICADO POR LA TRIPULACIÓN",
"FROM": "DESDE",
"TO": "HACIA",
@@ -352,6 +376,7 @@
"Current style: {style} — click for next": "Estilo actual: {style} — haz clic para el siguiente",
"TRACK ACQUIRED": "RASTREO ADQUIRIDO",
"{label} · COURSE {heading}°": "{label} · RUMBO {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · RUMBO {heading}°",
"{label} · HEADING {heading}°": "{label} · PROA {heading}°",
"{label} · NO HEADING": "{label} · PROA N/D",
"{label} · NADIR VIEW": "{label} · VISTA AL NADIR",
@@ -546,6 +571,7 @@
"NEAREST": "MÁS CERCANA",
"CCTV camera": "Cámara CCTV",
"FOCUS": "ENFOCAR",
"site status|FOCUS": "ENFOCADO",
"COVERAGE OFF": "COBERTURA DESACTIVADA",
"AUTO HOP OFF": "SALTO AUTO: NO",
"PROJECTION ON": "PROYECCIÓN ACTIVADA",
@@ -899,6 +925,7 @@
"awaiting first AIS message…": "esperando el primer mensaje AIS…",
"EST. DOWNRANGE": "DIST. ESTIMADA",
"CONFIRMED": "CONFIRMADA",
"sightings filter|CONFIRMED": "CONFIRMADAS",
"PAD / RTLS": "PLATAFORMA / RTLS",
"MISSION CONTROL · FIRST LAUNCH": "CENTRO DE MANDO · PRIMER INICIO",
"Choose your first view": "Elige tu primera vista",
@@ -1669,6 +1696,7 @@
"Observed history": "Historial observado",
"Later observation": "Observación posterior",
"Latest": "Último",
"news list|Latest": "Últimas",
"Newest frame per product": "Fotograma más reciente por producto",
"Replay observed history": "Reproducir el historial observado",
"S on another day replaces it · × unpins": "S en otro día lo reemplaza · × quita la fijación",
@@ -3473,7 +3501,11 @@
"Photo of {name}": "Foto de {name}",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "Avistamientos a la vista: {count}",
"{count} sightings in view": {
"one": "{count} avistamiento a la vista",
"many": "{count} de avistamientos a la vista",
"other": "{count} avistamientos a la vista"
},
"Close sighting": "Cerrar avistamiento",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "Fauna y flora observadas en las últimas 48 h (cetáceos 7 días). El color y el símbolo de la insignia indican el grupo taxonómico. Las especies sensibles solo se muestran en celdas de 0,2°; los informes de mamíferos marinos de Acartia en el mar de Salish se redondean a 0,01°. No es un censo.",
"Open {name} on iNaturalist": "Abrir {name} en iNaturalist",
@@ -3484,20 +3516,31 @@
"{days}d": "{days} d",
"All markers": "Todos los marcadores",
"Show markers of every age": "Mostrar marcadores de cualquier antigüedad",
"Maximum event age: {days}d; undated markers are kept": "Antigüedad máxima: {days} d; se conservan los marcadores sin fecha",
"Maximum event age: {days}d; undated markers are kept": {
"one": "Antigüedad máxima: {days} día; se conservan los marcadores sin fecha",
"many": "Antigüedad máxima: {days} de días; se conservan los marcadores sin fecha",
"other": "Antigüedad máxima: {days} días; se conservan los marcadores sin fecha"
},
"event age filter|All": "Todos",
"Event age": "Antigüedad",
"Event age: {days}d · undated kept": "Antigüedad: {days} d · se conservan los marcadores sin fecha",
"Event age: {days}d · undated kept": {
"one": "Antigüedad: {days} día · se conservan los marcadores sin fecha",
"many": "Antigüedad: {days} de días · se conservan los marcadores sin fecha",
"other": "Antigüedad: {days} días · se conservan los marcadores sin fecha"
},
"Close camera preview": "Cerrar vista previa de la cámara",
"Refresh map still": "Actualizar imagen fija del mapa",
"The map still uses a separate request and may show a different moment.": "La imagen del mapa usa una solicitud independiente y puede mostrar otro momento.",
"Video plays from Québec 511, which sees your IP address.": "El vídeo se reproduce desde Québec 511, que ve tu dirección IP.",
"Press OPEN to load the photo": "Pulsa ABRIR para cargar la foto",
"Captured {month}": "Capturada en {month}",
"this spot": "este punto",
"the view centre": "el centro de la vista",
"{source} at {place}": "{source} en {place}",
"{source} at this spot": "{source} en este punto",
"{source} at the view centre": "{source} en el centro de la vista",
"Street level at {place}": "A pie de calle en {place}",
"Street level at this spot": "A pie de calle en este punto",
"Street level at the view centre": "A pie de calle en el centro de la vista",
"Switching map": "Cambiando de mapa",
"Opening imagery": "Abriendo imágenes",
"Street View is ready: press {open} to load it": "Street View está listo: pulsa {open} para cargarlo",
@@ -3589,6 +3632,7 @@
"{source} imagery could not be opened": "No se pudieron abrir las imágenes de {source}",
"{place} has no position to look for imagery at": "{place} no tiene una posición donde buscar imágenes",
"No {source} imagery near {place}": "No hay imágenes de {source} cerca de {place}",
"No {source} imagery near the view centre": "No hay imágenes de {source} cerca del centro de la vista",
"{reason} (filters on: {filters})": "{reason} (filtros activos: {filters})",
"tiles unavailable": "teselas no disponibles",
"Environment": "Medio ambiente",
@@ -3671,7 +3715,11 @@
"switch on a dataset to load features": "activa un conjunto de datos para cargar elementos",
"Data Library at a glance": "La biblioteca de datos de un vistazo",
"Map features": "Elementos del mapa",
"Showing {shown} of {total}": "Mostrando {shown} de {total}",
"Showing {shown} of {total}": {
"one": "Mostrando {shown} de {total}",
"many": "Mostrando {shown} de {total}",
"other": "Mostrando {shown} de {total}"
},
"Datasets": "Conjuntos de datos",
"Themes": "Temas",
"zoom in to load this layer": "acércate para cargar esta capa",
+59 -11
View File
@@ -68,8 +68,16 @@
"{severity} only": "{severity} uniquement",
"All categories": "Toutes les catégories",
"Reading the news…": "Lecture des actualités…",
"News, last {hours} hours": "Actualités sur {hours} h",
"Last {hours} h": "Sur {hours} h",
"News, last {hours} hours": {
"one": "Actualités de la dernière {hours} heure",
"many": "Actualités des dernières {hours} d'heures",
"other": "Actualités des dernières {hours} heures"
},
"Last {hours} h": {
"one": "Dernière {hours} h",
"many": "Dernières {hours} h",
"other": "Dernières {hours} h"
},
"Time window": "Période",
"Conflicts": "Conflits",
"Local": "Local",
@@ -78,9 +86,17 @@
"Hotspots": "Foyers",
"Severity": "Gravité",
"Category": "Catégorie",
"Nothing reported near here in the last {hours} h": "Rien de signalé près d'ici en {hours} h",
"Nothing reported near here in the last {hours} h": {
"one": "Rien de signalé près d'ici cette dernière {hours} h",
"many": "Rien de signalé près d'ici ces dernières {hours} h",
"other": "Rien de signalé près d'ici ces dernières {hours} h"
},
"Latest news": "Dernières actualités",
"No news matches these filters in the last {hours} h": "Aucune actualité ne correspond à ces filtres sur {hours} h",
"No news matches these filters in the last {hours} h": {
"one": "Aucune actualité de la dernière {hours} h ne correspond à ces filtres",
"many": "Aucune actualité des dernières {hours} h ne correspond à ces filtres",
"other": "Aucune actualité des dernières {hours} h ne correspond à ces filtres"
},
"Load older news": "Charger des actualités plus anciennes",
"How to read the map": "Comment lire la carte",
"Colour: severity · icon: type of event": "Couleur : gravité · icône : type d'événement",
@@ -584,6 +600,7 @@
"Previous — prior visited contact in the 250 km window": "Précédent — contact visité précédemment dans la fenêtre de 250 km",
"PREVIOUS": "PRÉC.",
"FOCUS": "CENTRER",
"site status|FOCUS": "VISÉ",
"Next — nearest unvisited contact in the 250 km window": "Suivant — contact non visité le plus proche dans la fenêtre de 250 km",
"NEXT": "SUIV.",
"Named areas ({n})": "Zones nommées ({n})",
@@ -1832,7 +1849,11 @@
"ROUTE DATA UNAVAILABLE": "DONNÉES DE ROUTE INDISPONIBLES",
"CONTACT NAVIGATION OFF": "NAVIGATION DES CONTACTS DÉSACTIVÉE",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "LA PASSERELLE RESTE SUR LE NAVIRE SÉLECTIONNÉ",
"{range} NM": "{range} NM",
"{range} NM": {
"one": "{range} NM",
"many": "{range} NM",
"other": "{range} NM"
},
"AIS DESTINATION · CREW REPORTED": "DESTINATION AIS · DÉCLARÉE PAR L'ÉQUIPAGE",
"DEST {bearing}": "DEST {bearing}",
"Disable cockpit weather effects": "Désactiver les effets météo du cockpit",
@@ -1880,6 +1901,7 @@
"Reclassify as TR-3B": "Reclasser en TR-3B",
"TRACK ACQUIRED": "PISTE ACQUISE",
"{label} · COURSE {heading}°": "{label} · ROUTE {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · ROUTE {heading}°",
"{label} · HEADING {heading}°": "{label} · CAP {heading}°",
"{label} · NO HEADING": "{label} · SANS CAP",
"{label} · NADIR VIEW": "{label} · VUE AU NADIR",
@@ -2152,6 +2174,7 @@
"Observed history": "Historique des observations",
"Later observation": "Observation suivante",
"Latest": "Dernière",
"news list|Latest": "Dernières",
"Newest frame per product": "Image la plus récente par produit",
"Replay observed history": "Rejouer l'historique des observations",
"Imagery on Esri · Google 3D returns when cleared": "Sur Esri · EFFACER rétablit Google 3D",
@@ -2880,7 +2903,11 @@
"Contact cockpit summary": "Résumé cockpit du contact",
"CONTACT": "CONTACT",
"CONTACTS · 250 KM": "CONTACTS · 250 KM",
"RINGS {spacing} NM": "CERCLES {spacing} NM",
"RINGS {spacing} NM": {
"one": "CERCLES {spacing} NM",
"many": "CERCLES {spacing} NM",
"other": "CERCLES {spacing} NM"
},
"{count} CONTACTS": {
"one": "{count} CONTACT",
"many": "{count} DE CONTACTS",
@@ -3207,6 +3234,7 @@
"Left panels": "Panneaux de gauche",
"Right panels": "Panneaux de droite",
"CONFIRMED": "CONFIRMÉE",
"sightings filter|CONFIRMED": "CONFIRMÉES",
"PAD / RTLS": "PAS DE TIR / RTLS",
"fire confidence filter|All": "Toutes",
"fire confidence filter|Nominal+": "Nominale+",
@@ -3473,7 +3501,11 @@
"Photo of {name}": "Photo : {name}",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "Observations dans la vue : {count}",
"{count} sightings in view": {
"one": "{count} observation dans la vue",
"many": "{count} d'observations dans la vue",
"other": "{count} observations dans la vue"
},
"Close sighting": "Fermer l'observation",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "Faune observée au cours des dernières 48 h (cétacés 7 jours). La couleur et le pictogramme du badge indiquent le groupe taxonomique. Les espèces sensibles sont limitées à des cellules de 0,2° ; les signalements de mammifères marins en mer des Salish provenant d'Acartia sont arrondis à 0,01°. Pas un recensement.",
"Open {name} on iNaturalist": "Ouvrir {name} sur iNaturalist",
@@ -3484,20 +3516,31 @@
"{days}d": "{days} j",
"All markers": "Tous les marqueurs",
"Show markers of every age": "Afficher les marqueurs de tout âge",
"Maximum event age: {days}d; undated markers are kept": "Ancienneté maximale : {days} j ; marqueurs sans date conservés",
"Maximum event age: {days}d; undated markers are kept": {
"one": "Ancienneté maximale : {days} j ; marqueurs sans date conservés",
"many": "Ancienneté maximale : {days} j ; marqueurs sans date conservés",
"other": "Ancienneté maximale : {days} j ; marqueurs sans date conservés"
},
"event age filter|All": "Tous",
"Event age": "Ancienneté",
"Event age: {days}d · undated kept": "Ancienneté : {days} j · marqueurs sans date conservés",
"Event age: {days}d · undated kept": {
"one": "Ancienneté : {days} j · marqueurs sans date conservés",
"many": "Ancienneté : {days} j · marqueurs sans date conservés",
"other": "Ancienneté : {days} j · marqueurs sans date conservés"
},
"Close camera preview": "Fermer l'aperçu de la caméra",
"Refresh map still": "Actualiser l'image fixe sur la carte",
"The map still uses a separate request and may show a different moment.": "L'image fixe de la carte utilise une requête distincte et peut montrer un autre moment.",
"Video plays from Québec 511, which sees your IP address.": "La vidéo est lue depuis Québec 511, qui voit votre adresse IP.",
"Press OPEN to load the photo": "Appuyez sur OUVRIR pour charger la photo",
"Captured {month}": "Prise en {month}",
"this spot": "cet endroit",
"the view centre": "le centre de la vue",
"{source} at {place}": "{source} : {place}",
"{source} at this spot": "{source} à cet endroit",
"{source} at the view centre": "{source} au centre de la vue",
"Street level at {place}": "Niveau rue : {place}",
"Street level at this spot": "Niveau rue à cet endroit",
"Street level at the view centre": "Niveau rue au centre de la vue",
"Switching map": "Changement de carte",
"Opening imagery": "Ouverture des images",
"Street View is ready: press {open} to load it": "Street View est prêt : appuyez sur {open} pour le charger",
@@ -3589,6 +3632,7 @@
"{source} imagery could not be opened": "Impossible d'ouvrir les images de {source}",
"{place} has no position to look for imagery at": "{place} n'a pas de position où chercher des images",
"No {source} imagery near {place}": "Aucune image {source} près de {place}",
"No {source} imagery near the view centre": "Aucune image {source} près du centre de la vue",
"{reason} (filters on: {filters})": "{reason} (filtres actifs : {filters})",
"tiles unavailable": "tuiles indisponibles",
"zoom in to load this layer": "zoomez pour charger cette couche",
@@ -3691,6 +3735,10 @@
"REMOVE ALL": "TOUT RETIRER",
"Confirm: remove every added entry from Data Layers": "Confirmer : retirer du panneau Couches toutes les entrées ajoutées",
"Remove every added entry from Data Layers": "Retirer du panneau Couches toutes les entrées ajoutées",
"Showing {shown} of {total}": "Affichées : {shown} sur {total}",
"Showing {shown} of {total}": {
"one": "{shown} sur {total} affichée",
"many": "{shown} sur {total} affichées",
"other": "{shown} sur {total} affichées"
},
"BROWSE DATA LIBRARY": "PARCOURIR LA BIBLIOTHÈQUE DE DONNÉES"
}
+59 -11
View File
@@ -478,6 +478,7 @@
"PREVIOUS": "הקודם",
"Previous — prior visited contact in the 250 km window": "הקודם — מגע שכבר ביקרת בו בחלון של 250 ק\"מ",
"FOCUS": "התמקד",
"site status|FOCUS": "במוקד",
"NEXT": "הבא",
"Next — nearest unvisited contact in the 250 km window": "הבא — המגע הקרוב ביותר שלא ביקרת בו בחלון של 250 ק\"מ",
"Named areas ({n})": "אזורים בעלי שם ({n})",
@@ -832,6 +833,7 @@
"ORBIT REPLAY · {mission}": "שחזור מסלול · {mission}",
"PAUSED · {title}": "מושהה · {title}",
"CONFIRMED": "מאושר",
"sightings filter|CONFIRMED": "מאושרות",
"PAD / RTLS": "כן שיגור / RTLS",
"UNSPECIFIED": "לא צוין",
"{value} KM DOWNRANGE": "{value} ק\"מ לאורך המסלול",
@@ -1268,7 +1270,11 @@
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "חיות בר נצפו ב-48 השעות האחרונות (לווייתנים · 7 ימים). הצבע וגליף התג מציגים את קבוצת הטקסון. מינים רגישים מוצגים כתאי 0.2° בלבד; דיווחי יונקי הים של Salish Sea דרך Acartia מעוגלים ל-0.01°. אינו מפקד אוכלוסין.",
"iNaturalist contributors · Acartia {count} (Salish Sea) · licences per record": "תורמי iNaturalist · Acartia {count} (Salish Sea) · רישיונות לכל רשומה",
"iNaturalist contributors · licences per record": "תורמי iNaturalist · רישיונות לכל רשומה",
"{count} sightings in view": "{count} תצפיות בתצוגה",
"{count} sightings in view": {
"one": "{count} תצפית בתצוגה",
"two": "{count} תצפיות בתצוגה",
"other": "{count} תצפיות בתצוגה"
},
"Zoom in for local sightings": "התקרב לתצפיות מקומיות",
"No recent sightings in view": "אין תצפיות אחרונות בתצוגה",
"Acartia feed unavailable": "פיד Acartia אינו זמין",
@@ -1737,6 +1743,7 @@
"SOURCE STATUS UNAVAILABLE": "מצב המקור אינו זמין",
"TRACK ACQUIRED": "המעקב ננעל",
"{label} · COURSE {heading}°": "{label} · מהלך {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · מהלך {heading}°",
"Context could not restore every layer; try again": "ההקשר לא שיחזר את כל השכבות; נסה שוב",
"No selected data layers": "אין שכבות נתונים נבחרות",
"{count} data layers could not be cleared": {
@@ -1998,6 +2005,7 @@
"Later observation": "תצפית מאוחרת",
"Newest frame per product": "השקופית החדשה לכל מוצר",
"Latest": "האחרונה",
"news list|Latest": "האחרונות",
"Replay observed history": "הצגת ההיסטוריה הנצפית שוב",
"Imagery on Esri · Google 3D returns when cleared": "צילומים ב-Esri · Google 3D חוזר כשמנקים",
"Point the camera at the ground to use the view": "כוון את המצלמה אל הקרקע כדי להשתמש בתצוגה",
@@ -3238,9 +3246,17 @@
"event age filter|All": "הכול",
"{days}d": "{days} ימ׳",
"Show markers of every age": "הצגת סמנים בכל גיל",
"Maximum event age: {days}d; undated markers are kept": "גיל אירוע מרבי: {days} ימ׳; סמנים ללא תאריך נשמרים",
"Maximum event age: {days}d; undated markers are kept": {
"one": "גיל אירוע מרבי: {days} יום; סמנים ללא תאריך נשמרים",
"two": "גיל אירוע מרבי: {days} ימים; סמנים ללא תאריך נשמרים",
"other": "גיל אירוע מרבי: {days} ימים; סמנים ללא תאריך נשמרים"
},
"All markers": "כל הסמנים",
"Event age: {days}d · undated kept": "גיל האירוע: {days} ימ׳ · ללא תאריך נשמרים",
"Event age: {days}d · undated kept": {
"one": "גיל האירוע: {days} יום · ללא תאריך נשמרים",
"two": "גיל האירוע: {days} ימים · ללא תאריך נשמרים",
"other": "גיל האירוע: {days} ימים · ללא תאריך נשמרים"
},
"30-DAY MISSION INDEX UNAVAILABLE": "רשימת המשימות ל-30 יום אינה זמינה",
"STATIONS": "תחנות",
"Crewed stations and the craft that visit them": "תחנות מאוישות והחלליות המבקרות בהן",
@@ -3276,7 +3292,11 @@
"LIVE AIS": "AIS חי",
"CONTACT NAVIGATION OFF": "ניווט המגעים כבוי",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "הגשר נשאר עם האונייה הנבחרת",
"{range} NM": "{range} NM",
"{range} NM": {
"one": "{range} NM",
"two": "{range} NM",
"other": "{range} NM"
},
"AIS DESTINATION · CREW REPORTED": "יעד AIS · דווח על ידי הצוות",
"FWD": "קדימה",
"AFT": "אחורה",
@@ -3295,10 +3315,13 @@
"Video plays from Québec 511, which sees your IP address.": "הווידאו זורם מ-Québec 511, שרואה את כתובת ה-IP שלך.",
"Press OPEN to load the photo": "לחץ על \"פתח\" כדי לטעון את התמונה",
"Captured {month}": "צולם ב-{month}",
"this spot": "המקום הזה",
"the view centre": "מרכז התצוגה",
"{source} at {place}": "{source}: {place}",
"{source} at this spot": "{source} במקום הזה",
"{source} at the view centre": "{source} במרכז התצוגה",
"Street level at {place}": "צילומי רחוב: {place}",
"Street level at this spot": "צילומי רחוב במקום הזה",
"Street level at the view centre": "צילומי רחוב במרכז התצוגה",
"Switching map": "מחליף מפה",
"Opening imagery": "פותח צילומים",
"Street View is ready: press {open} to load it": "Street View מוכן: לחץ על \"{open}\" כדי לטעון אותו",
@@ -3358,7 +3381,11 @@
"Zoom in (+)": "התקרבות (+)",
"Zoom to the imaging sensor swath": "זום אל רצועת הסריקה של חיישן הצילום",
"SENSOR": "חיישן",
"RINGS {spacing} NM": "טבעות {spacing} NM",
"RINGS {spacing} NM": {
"one": "טבעות {spacing} NM",
"two": "טבעות {spacing} NM",
"other": "טבעות {spacing} NM"
},
"{count} CONTACTS": {
"one": "{count} מגע",
"two": "{count} מגעים",
@@ -3504,20 +3531,36 @@
"{severity} and above": "{severity} ומעלה",
"{severity} only": "{severity} בלבד",
"All categories": "כל הקטגוריות",
"Last {hours} h": "{hours} שע׳ אחורה",
"Last {hours} h": {
"one": "השעה האחרונה ({hours})",
"two": "{hours} שע׳ אחרונות",
"other": "{hours} שע׳ אחרונות"
},
"News from {area}": "חדשות מ-{area}",
"Within {km} km of the view centre": "בטווח {km} ק\"מ ממרכז התצוגה",
"Reading the news…": "קורא את החדשות…",
"News, last {hours} hours": "חדשות, {hours} שע׳ אחורה",
"News, last {hours} hours": {
"one": "חדשות, השעה האחרונה ({hours})",
"two": "חדשות, {hours} השעות האחרונות",
"other": "חדשות, {hours} השעות האחרונות"
},
"Time window": "חלון זמן",
"News sections": "מדורי חדשות",
"Hotspots": "מוקדים",
"Severity": "חומרה",
"Category": "קטגוריה",
"Zoom in to see local news": "התקרב כדי לראות חדשות מקומיות",
"Nothing reported near here in the last {hours} h": "לא דווח דבר בסביבה בחלון של {hours} שע׳",
"Nothing reported near here in the last {hours} h": {
"one": "לא דווח דבר בסביבה בשעה האחרונה ({hours})",
"two": "לא דווח דבר בסביבה ב־{hours} השעות האחרונות",
"other": "לא דווח דבר בסביבה ב־{hours} השעות האחרונות"
},
"Latest news": "חדשות אחרונות",
"No news matches these filters in the last {hours} h": "אין חדשות התואמות למסננים אלה בחלון של {hours} שע׳",
"No news matches these filters in the last {hours} h": {
"one": "אין חדשות התואמות למסננים אלה בשעה האחרונה ({hours})",
"two": "אין חדשות התואמות למסננים אלה ב־{hours} השעות האחרונות",
"other": "אין חדשות התואמות למסננים אלה ב־{hours} השעות האחרונות"
},
"Load older news": "טעינת חדשות ישנות יותר",
"How to read the map": "איך לקרוא את המפה",
"Colour: severity · icon: type of event": "צבע: חומרה · סמל: סוג האירוע",
@@ -3589,6 +3632,7 @@
"{source} imagery could not be opened": "לא ניתן היה לפתוח את הצילומים של {source}",
"{place} has no position to look for imagery at": "ל-{place} אין מיקום לחיפוש צילומים",
"No {source} imagery near {place}": "אין צילומים של {source} ליד {place}",
"No {source} imagery near the view centre": "אין צילומים של {source} ליד מרכז התצוגה",
"{reason} (filters on: {filters})": "{reason} (מסננים פעילים: {filters})",
"tiles unavailable": "האריחים אינם זמינים",
"zoom in to load this layer": "התקרב כדי לטעון את השכבה הזאת",
@@ -3691,6 +3735,10 @@
"REMOVE ALL": "הסרת הכול",
"Confirm: remove every added entry from Data Layers": "אישור: הסרת כל הפריטים שנוספו משכבות נתונים",
"Remove every added entry from Data Layers": "הסרת כל הפריטים שנוספו משכבות נתונים",
"Showing {shown} of {total}": "מוצגים {shown} מתוך {total}",
"Showing {shown} of {total}": {
"one": "מוצג {shown} מתוך {total}",
"two": "מוצגים {shown} מתוך {total}",
"other": "מוצגים {shown} מתוך {total}"
},
"BROWSE DATA LIBRARY": "עיון בספריית הנתונים"
}
+60 -12
View File
@@ -68,8 +68,16 @@
"{severity} only": "Solo {severity}",
"All categories": "Tutte le categorie",
"Reading the news…": "Lettura delle notizie…",
"News, last {hours} hours": "Notizie, periodo in ore: {hours}",
"Last {hours} h": "Periodo: {hours} h",
"News, last {hours} hours": {
"one": "Notizie dell'ultima {hours} ora",
"many": "Notizie delle ultime {hours} di ore",
"other": "Notizie delle ultime {hours} ore"
},
"Last {hours} h": {
"one": "Ultima {hours} h",
"many": "Ultime {hours} h",
"other": "Ultime {hours} h"
},
"Time window": "Periodo",
"Conflicts": "Conflitti",
"Local": "Locale",
@@ -78,9 +86,17 @@
"Hotspots": "Focolai",
"Severity": "Gravità",
"Category": "Categoria",
"Nothing reported near here in the last {hours} h": "Nessuna segnalazione qui vicino · periodo: {hours} h",
"Nothing reported near here in the last {hours} h": {
"one": "Nessuna segnalazione qui vicino nell'ultima {hours} h",
"many": "Nessuna segnalazione qui vicino nelle ultime {hours} h",
"other": "Nessuna segnalazione qui vicino nelle ultime {hours} h"
},
"Latest news": "Ultime notizie",
"No news matches these filters in the last {hours} h": "Nessuna notizia corrisponde a questi filtri · periodo: {hours} h",
"No news matches these filters in the last {hours} h": {
"one": "Nessuna notizia dell'ultima {hours} h corrisponde a questi filtri",
"many": "Nessuna notizia delle ultime {hours} h corrisponde a questi filtri",
"other": "Nessuna notizia delle ultime {hours} h corrisponde a questi filtri"
},
"Load older news": "Carica notizie precedenti",
"How to read the map": "Come leggere la mappa",
"Colour: severity · icon: type of event": "Colore: gravità · icona: tipo di evento",
@@ -584,6 +600,7 @@
"Previous — prior visited contact in the 250 km window": "Precedente — contatto visitato in precedenza nella finestra di 250 km",
"PREVIOUS": "PREC",
"FOCUS": "FOCUS",
"site status|FOCUS": "FOCUS",
"Next — nearest unvisited contact in the 250 km window": "Successivo — contatto non visitato più vicino nella finestra di 250 km",
"NEXT": "SUCC",
"Named areas ({n})": "Aree con nome ({n})",
@@ -941,7 +958,7 @@
"ORBITAL VELOCITY": "VELOCITÀ ORBITALE",
"SUB-SATELLITE POINT": "PUNTO SUBSATELLITARE",
"NORTH UP": "NORD IN ALTO",
"CURRENTLY OVER": "ATTUALMENTE SOPRA",
"CURRENTLY OVER": "SOTTO IL SATELLITE",
"{division}, {country}": "{division}, {country}",
"{region} · near {place}": "{region} · vicino a {place}",
"NORAD {id}": "NORAD {id}",
@@ -1832,7 +1849,11 @@
"ROUTE DATA UNAVAILABLE": "DATI ROTTA NON DISPONIBILI",
"CONTACT NAVIGATION OFF": "NAVIGAZIONE CONTATTI DISATTIVATA",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "LA PLANCIA RESTA SULLA NAVE SELEZIONATA",
"{range} NM": "{range} MN",
"{range} NM": {
"one": "{range} MN",
"many": "{range} MN",
"other": "{range} MN"
},
"AIS DESTINATION · CREW REPORTED": "DESTINAZIONE AIS · DICHIARATA DALL'EQUIPAGGIO",
"DEST {bearing}": "DEST {bearing}",
"Disable cockpit weather effects": "Disattiva gli effetti meteo del cockpit",
@@ -1880,6 +1901,7 @@
"Reclassify as TR-3B": "Riclassifica come TR-3B",
"TRACK ACQUIRED": "TRACCIA ACQUISITA",
"{label} · COURSE {heading}°": "{label} · ROTTA {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · ROTTA {heading}°",
"{label} · HEADING {heading}°": "{label} · PRUA {heading}°",
"{label} · NO HEADING": "{label} · PRUA N/D",
"{label} · NADIR VIEW": "{label} · VISTA AL NADIR",
@@ -2152,6 +2174,7 @@
"Observed history": "Storico osservato",
"Later observation": "Osservazione successiva",
"Latest": "Più recente",
"news list|Latest": "Più recenti",
"Newest frame per product": "Fotogramma più recente per prodotto",
"Replay observed history": "Rivedi lo storico osservato",
"Imagery on Esri · Google 3D returns when cleared": "Immagini su Esri · Google 3D torna con CANCELLA",
@@ -2880,7 +2903,11 @@
"Contact cockpit summary": "Riepilogo contatto del cockpit",
"CONTACT": "CONTATTO",
"CONTACTS · 250 KM": "CONTATTI · 250 KM",
"RINGS {spacing} NM": "CERCHI {spacing} MN",
"RINGS {spacing} NM": {
"one": "CERCHI {spacing} MN",
"many": "CERCHI {spacing} MN",
"other": "CERCHI {spacing} MN"
},
"{count} CONTACTS": {
"one": "{count} CONTATTO",
"many": "{count} DI CONTATTI",
@@ -3207,6 +3234,7 @@
"Left panels": "Pannelli a sinistra",
"Right panels": "Pannelli a destra",
"CONFIRMED": "CONFERMATA",
"sightings filter|CONFIRMED": "CONFERMATE",
"PAD / RTLS": "RAMPA / RTLS",
"fire confidence filter|All": "Tutti",
"fire confidence filter|Nominal+": "Nominale+",
@@ -3473,7 +3501,11 @@
"Photo of {name}": "Foto di {name}",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "Avvistamenti nella vista: {count}",
"{count} sightings in view": {
"one": "{count} avvistamento nella vista",
"many": "{count} di avvistamenti nella vista",
"other": "{count} avvistamenti nella vista"
},
"Close sighting": "Chiudi avvistamento",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "Fauna osservata nelle ultime 48 h (cetacei 7 giorni). Colore e simbolo del contrassegno indicano il gruppo tassonomico. Le specie sensibili sono mostrate solo in celle di 0,2°; le segnalazioni di mammiferi marini di Acartia nel mar dei Salish sono arrotondate a 0,01°. Non è un censimento.",
"Open {name} on iNaturalist": "Apri {name} su iNaturalist",
@@ -3484,20 +3516,31 @@
"{days}d": "{days} g",
"All markers": "Tutti i marcatori",
"Show markers of every age": "Mostra i marcatori di qualsiasi età",
"Maximum event age: {days}d; undated markers are kept": "Età massima degli eventi: {days} g; marcatori senza data mantenuti",
"Maximum event age: {days}d; undated markers are kept": {
"one": "Età massima degli eventi: {days} giorno; marcatori senza data mantenuti",
"many": "Età massima degli eventi: {days} di giorni; marcatori senza data mantenuti",
"other": "Età massima degli eventi: {days} giorni; marcatori senza data mantenuti"
},
"event age filter|All": "Tutti",
"Event age": "Età degli eventi",
"Event age: {days}d · undated kept": "Età degli eventi: {days} g · senza data mantenuti",
"Event age: {days}d · undated kept": {
"one": "Età degli eventi: {days} giorno · senza data mantenuti",
"many": "Età degli eventi: {days} di giorni · senza data mantenuti",
"other": "Età degli eventi: {days} giorni · senza data mantenuti"
},
"Close camera preview": "Chiudi anteprima della telecamera",
"Refresh map still": "Aggiorna immagine fissa sulla mappa",
"The map still uses a separate request and may show a different moment.": "L'immagine sulla mappa usa una richiesta separata e può mostrare un momento diverso.",
"Video plays from Québec 511, which sees your IP address.": "Il video viene riprodotto da Québec 511, che vede il tuo indirizzo IP.",
"Press OPEN to load the photo": "Premi APRI per caricare la foto",
"Captured {month}": "Scattata: {month}",
"this spot": "questo punto",
"the view centre": "il centro della vista",
"{source} at {place}": "{source}: {place}",
"{source} at this spot": "{source} in questo punto",
"{source} at the view centre": "{source} al centro della vista",
"Street level at {place}": "Vista stradale: {place}",
"Street level at this spot": "Vista stradale in questo punto",
"Street level at the view centre": "Vista stradale al centro della vista",
"Switching map": "Cambio mappa",
"Opening imagery": "Apertura delle immagini",
"Street View is ready: press {open} to load it": "Street View è pronto: premi {open} per caricarlo",
@@ -3589,6 +3632,7 @@
"{source} imagery could not be opened": "Impossibile aprire le immagini di {source}",
"{place} has no position to look for imagery at": "{place} non ha una posizione in cui cercare immagini",
"No {source} imagery near {place}": "Nessuna immagine di {source} vicino a {place}",
"No {source} imagery near the view centre": "Nessuna immagine di {source} vicino al centro della vista",
"{reason} (filters on: {filters})": "{reason} (filtri attivi: {filters})",
"tiles unavailable": "tile non disponibili",
"zoom in to load this layer": "ingrandisci per caricare questo livello",
@@ -3691,6 +3735,10 @@
"REMOVE ALL": "RIMUOVI TUTTO",
"Confirm: remove every added entry from Data Layers": "Conferma: rimuovi da Livelli dati tutte le voci aggiunte",
"Remove every added entry from Data Layers": "Rimuovi da Livelli dati tutte le voci aggiunte",
"Showing {shown} of {total}": "Mostrati: {shown} su {total}",
"Showing {shown} of {total}": {
"one": "{shown} di {total} mostrata",
"many": "{shown} di {total} mostrate",
"other": "{shown} di {total} mostrate"
},
"BROWSE DATA LIBRARY": "ESPLORA LIBRERIA DATI"
}
+39 -11
View File
@@ -62,8 +62,12 @@
"{severity} only": "{severity}のみ",
"All categories": "すべてのカテゴリ",
"Reading the news…": "ニュースを読み込み中…",
"News, last {hours} hours": "直近{hours}時間のニュース",
"Last {hours} h": "直近{hours}時間",
"News, last {hours} hours": {
"other": "直近{hours}時間のニュース"
},
"Last {hours} h": {
"other": "直近{hours}時間"
},
"Time window": "期間",
"Conflicts": "紛争",
"Local": "ローカル",
@@ -72,9 +76,13 @@
"Hotspots": "ホットスポット",
"Severity": "深刻度",
"Category": "カテゴリ",
"Nothing reported near here in the last {hours} h": "直近{hours}時間、この付近の報道はありません",
"Nothing reported near here in the last {hours} h": {
"other": "直近{hours}時間、この付近の報道はありません"
},
"Latest news": "最新ニュース",
"No news matches these filters in the last {hours} h": "直近{hours}時間で条件に合うニュースはありません",
"No news matches these filters in the last {hours} h": {
"other": "直近{hours}時間で条件に合うニュースはありません"
},
"Load older news": "以前のニュースを読み込む",
"How to read the map": "地図の見方",
"Colour: severity · icon: type of event": "色:深刻度 · アイコン:出来事の種類",
@@ -564,6 +572,7 @@
"Previous — prior visited contact in the 250 km window": "前へ:250 km圏内で直前に訪れたコンタクト",
"PREVIOUS": "前へ",
"FOCUS": "フォーカス",
"site status|FOCUS": "フォーカス",
"Next — nearest unvisited contact in the 250 km window": "次へ:250 km圏内で最も近い未訪問のコンタクト",
"NEXT": "次へ",
"Named areas ({n})": "名前付きエリア({n})",
@@ -1776,7 +1785,9 @@
"ROUTE DATA UNAVAILABLE": "経路データなし",
"CONTACT NAVIGATION OFF": "コンタクトナビゲーション オフ",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "ブリッジは選択中の船舶に固定",
"{range} NM": "{range}海里",
"{range} NM": {
"other": "{range}海里"
},
"AIS DESTINATION · CREW REPORTED": "AIS目的地 · 乗組員入力",
"DEST {bearing}": "目的地 {bearing}",
"Disable cockpit weather effects": "コックピットの天候エフェクトを無効にする",
@@ -1822,6 +1833,7 @@
"Reclassify as TR-3B": "TR-3Bに再分類",
"TRACK ACQUIRED": "追跡開始",
"{label} · COURSE {heading}°": "{label} · 対地針路 {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · 対地針路 {heading}°",
"{label} · HEADING {heading}°": "{label} · 船首方位 {heading}°",
"{label} · NO HEADING": "{label} · 船首方位なし",
"{label} · NADIR VIEW": "{label} · 直下視",
@@ -2078,6 +2090,7 @@
"Observed history": "観測履歴",
"Later observation": "次の観測",
"Latest": "最新",
"news list|Latest": "最新",
"Newest frame per product": "プロダクトごとの最新フレーム",
"Replay observed history": "観測履歴を再生",
"Imagery on Esri · Google 3D returns when cleared": "画像はEsri上に表示 · 消去するとGoogle 3Dに戻ります",
@@ -2730,7 +2743,9 @@
"Contact cockpit summary": "コンタクトのコックピット概要",
"CONTACT": "コンタクト",
"CONTACTS · 250 KM": "コンタクト · 250 km",
"RINGS {spacing} NM": "距離環 {spacing}海里",
"RINGS {spacing} NM": {
"other": "距離環 {spacing}海里"
},
"{count} CONTACTS": {
"other": "コンタクト {count}件"
},
@@ -3057,6 +3072,7 @@
"Left panels": "左パネル",
"Right panels": "右パネル",
"CONFIRMED": "確認済み",
"sightings filter|CONFIRMED": "確認済み",
"PAD / RTLS": "射場 / RTLS",
"fire confidence filter|All": "すべて",
"fire confidence filter|Nominal+": "中以上",
@@ -3311,7 +3327,9 @@
"Photo of {name}": "{name}の写真",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "表示範囲に{count}件の目撃情報",
"{count} sightings in view": {
"other": "表示範囲に{count}件の目撃情報"
},
"Close sighting": "目撃情報を閉じる",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "過去48時間以内に観察された野生生物(クジラ類は7日間)。色とバッジのアイコンは分類群を表します。保護が必要な種は0.2°のセルとしてのみ表示し、セイリッシュ海のAcartiaによる海生哺乳類の目撃情報は0.01°に丸めます。個体数調査ではありません。",
"Open {name} on iNaturalist": "iNaturalistで{name}を開く",
@@ -3322,20 +3340,27 @@
"{days}d": "{days}日",
"All markers": "すべてのマーカー",
"Show markers of every age": "日付にかかわらずすべてのマーカーを表示",
"Maximum event age: {days}d; undated markers are kept": "イベントの最大経過日数:{days}日。日付のないマーカーは保持",
"Maximum event age: {days}d; undated markers are kept": {
"other": "イベントの最大経過日数:{days}日。日付のないマーカーは保持"
},
"event age filter|All": "すべて",
"Event age": "経過日数",
"Event age: {days}d · undated kept": "経過日数:{days}日以内 · 日付なしは保持",
"Event age: {days}d · undated kept": {
"other": "経過日数:{days}日以内 · 日付なしは保持"
},
"Close camera preview": "カメラのプレビューを閉じる",
"Refresh map still": "地図上の静止画を更新",
"The map still uses a separate request and may show a different moment.": "地図上の静止画は別のリクエストで取得されるため、異なる時点を表示する場合があります。",
"Video plays from Québec 511, which sees your IP address.": "動画はQuébec 511から再生され、お使いのIPアドレスはQuébec 511側から見えます。",
"Press OPEN to load the photo": "[開く]を押して写真を読み込む",
"Captured {month}": "{month}撮影",
"this spot": "この地点",
"the view centre": "表示中心",
"{source} at {place}": "{place}の{source}",
"{source} at this spot": "この地点の{source}",
"{source} at the view centre": "表示中心の{source}",
"Street level at {place}": "{place}のストリートレベル",
"Street level at this spot": "この地点のストリートレベル",
"Street level at the view centre": "表示中心のストリートレベル",
"Switching map": "地図を切り替え中",
"Opening imagery": "画像を開いています",
"Street View is ready: press {open} to load it": "ストリートビューの準備ができました:[{open}]を押して読み込んでください",
@@ -3427,6 +3452,7 @@
"{source} imagery could not be opened": "{source}の画像を開けませんでした",
"{place} has no position to look for imagery at": "{place}には画像を探す位置がありません",
"No {source} imagery near {place}": "{place}の近くに{source}の画像はありません",
"No {source} imagery near the view centre": "表示中心の近くに{source}の画像はありません",
"{reason} (filters on: {filters})": "{reason}(有効なフィルター:{filters})",
"tiles unavailable": "タイルを利用できません",
"zoom in to load this layer": "ズームインしてこのレイヤーを読み込む",
@@ -3517,6 +3543,8 @@
"REMOVE ALL": "すべて削除",
"Confirm: remove every added entry from Data Layers": "確認:追加したすべての項目をデータレイヤーから削除",
"Remove every added entry from Data Layers": "追加したすべての項目をデータレイヤーから削除",
"Showing {shown} of {total}": "{total}件中{shown}件を表示",
"Showing {shown} of {total}": {
"other": "{total}件中{shown}件を表示"
},
"BROWSE DATA LIBRARY": "データライブラリを見る"
}
+61 -13
View File
@@ -68,8 +68,16 @@
"{severity} only": "Apenas {severity}",
"All categories": "Todas as categorias",
"Reading the news…": "Lendo as notícias…",
"News, last {hours} hours": "Notícias de até {hours} h atrás",
"Last {hours} h": "Até {hours} h atrás",
"News, last {hours} hours": {
"one": "Notícias da última {hours} hora",
"many": "Notícias das últimas {hours} de horas",
"other": "Notícias das últimas {hours} horas"
},
"Last {hours} h": {
"one": "Última {hours} h",
"many": "Últimas {hours} h",
"other": "Últimas {hours} h"
},
"Time window": "Período",
"Conflicts": "Conflitos",
"Local": "Local",
@@ -78,9 +86,17 @@
"Hotspots": "Focos",
"Severity": "Gravidade",
"Category": "Categoria",
"Nothing reported near here in the last {hours} h": "Nada noticiado aqui perto desde {hours} h atrás",
"Nothing reported near here in the last {hours} h": {
"one": "Nada noticiado aqui perto na última {hours} h",
"many": "Nada noticiado aqui perto nas últimas {hours} h",
"other": "Nada noticiado aqui perto nas últimas {hours} h"
},
"Latest news": "Últimas notícias",
"No news matches these filters in the last {hours} h": "Nenhuma notícia de até {hours} h atrás corresponde a estes filtros",
"No news matches these filters in the last {hours} h": {
"one": "Nenhuma notícia da última {hours} h corresponde a estes filtros",
"many": "Nenhuma notícia das últimas {hours} h corresponde a estes filtros",
"other": "Nenhuma notícia das últimas {hours} h corresponde a estes filtros"
},
"Load older news": "Carregar notícias anteriores",
"How to read the map": "Como ler o mapa",
"Colour: severity · icon: type of event": "Cor: gravidade · ícone: tipo de evento",
@@ -584,6 +600,7 @@
"Previous — prior visited contact in the 250 km window": "Anterior — contato visitado anteriormente na janela de 250 km",
"PREVIOUS": "ANT.",
"FOCUS": "FOCAR",
"site status|FOCUS": "EM FOCO",
"Next — nearest unvisited contact in the 250 km window": "Próximo — contato não visitado mais próximo na janela de 250 km",
"NEXT": "PRÓX.",
"Named areas ({n})": "Áreas com nome ({n})",
@@ -939,7 +956,7 @@
"ORBITAL VELOCITY": "VELOCIDADE ORBITAL",
"SUB-SATELLITE POINT": "PONTO SUBSATÉLITE",
"NORTH UP": "NORTE PARA CIMA",
"CURRENTLY OVER": "SOBREVOANDO AGORA",
"CURRENTLY OVER": "SOB O SATÉLITE",
"{division}, {country}": "{division}, {country}",
"{region} · near {place}": "{region} · perto de {place}",
"NORAD {id}": "NORAD {id}",
@@ -1832,7 +1849,11 @@
"ROUTE DATA UNAVAILABLE": "DADOS DE ROTA INDISPONÍVEIS",
"CONTACT NAVIGATION OFF": "NAVEGAÇÃO DE CONTATOS DESLIGADA",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "O PASSADIÇO PERMANECE NA EMBARCAÇÃO SELECIONADA",
"{range} NM": "{range} MN",
"{range} NM": {
"one": "{range} MN",
"many": "{range} MN",
"other": "{range} MN"
},
"AIS DESTINATION · CREW REPORTED": "DESTINO AIS · INFORMADO PELA TRIPULAÇÃO",
"DEST {bearing}": "DEST {bearing}",
"Disable cockpit weather effects": "Desativar efeitos de clima na cabine",
@@ -1879,7 +1900,8 @@
"Restore real aircraft": "Restaurar a aeronave real",
"Reclassify as TR-3B": "Reclassificar como TR-3B",
"TRACK ACQUIRED": "RASTRO ADQUIRIDO",
"{label} · COURSE {heading}°": "{label} · RUMO {heading}°",
"{label} · COURSE {heading}°": "{label} · CURSO {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · RUMO {heading}°",
"{label} · HEADING {heading}°": "{label} · PROA {heading}°",
"{label} · NO HEADING": "{label} · SEM PROA",
"{label} · NADIR VIEW": "{label} · VISTA AO NADIR",
@@ -2152,6 +2174,7 @@
"Observed history": "Histórico observado",
"Later observation": "Observação posterior",
"Latest": "Mais recente",
"news list|Latest": "Mais recentes",
"Newest frame per product": "Quadro mais recente por produto",
"Replay observed history": "Reproduzir o histórico observado",
"Imagery on Esri · Google 3D returns when cleared": "Imagens sobre o Esri · LIMPAR restaura o Google 3D",
@@ -2882,7 +2905,11 @@
"Contact cockpit summary": "Resumo do contato na cabine",
"CONTACT": "CONTATO",
"CONTACTS · 250 KM": "CONTATOS · 250 KM",
"RINGS {spacing} NM": "ANÉIS {spacing} MN",
"RINGS {spacing} NM": {
"one": "ANÉIS {spacing} MN",
"many": "ANÉIS {spacing} MN",
"other": "ANÉIS {spacing} MN"
},
"{count} CONTACTS": {
"one": "{count} CONTATO",
"many": "{count} DE CONTATOS",
@@ -3207,6 +3234,7 @@
"Left panels": "Painéis à esquerda",
"Right panels": "Painéis à direita",
"CONFIRMED": "CONFIRMADA",
"sightings filter|CONFIRMED": "CONFIRMADOS",
"PAD / RTLS": "PLATAFORMA / RTLS",
"fire confidence filter|All": "Todas",
"fire confidence filter|Nominal+": "Nominal+",
@@ -3473,7 +3501,11 @@
"Photo of {name}": "Foto de {name}",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "Avistamentos na vista: {count}",
"{count} sightings in view": {
"one": "{count} avistamento na vista",
"many": "{count} de avistamentos na vista",
"other": "{count} avistamentos na vista"
},
"Close sighting": "Fechar avistamento",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "Vida selvagem observada nas últimas 48 h (cetáceos 7 dias). A cor e o símbolo do emblema indicam o grupo taxonômico. Espécies sensíveis aparecem apenas em células de 0,2°; os relatos de mamíferos marinhos do mar de Salish via Acartia são arredondados para 0,01°. Não é um censo.",
"Open {name} on iNaturalist": "Abrir {name} no iNaturalist",
@@ -3484,20 +3516,31 @@
"{days}d": "{days} d",
"All markers": "Todos os marcadores",
"Show markers of every age": "Mostrar marcadores de qualquer idade",
"Maximum event age: {days}d; undated markers are kept": "Idade máxima do evento: {days} d; marcadores sem data são mantidos",
"Maximum event age: {days}d; undated markers are kept": {
"one": "Idade máxima do evento: {days} dia; marcadores sem data são mantidos",
"many": "Idade máxima do evento: {days} de dias; marcadores sem data são mantidos",
"other": "Idade máxima do evento: {days} dias; marcadores sem data são mantidos"
},
"event age filter|All": "Todos",
"Event age": "Idade do evento",
"Event age: {days}d · undated kept": "Idade do evento: {days} d · sem data mantidos",
"Event age: {days}d · undated kept": {
"one": "Idade do evento: {days} dia · sem data mantidos",
"many": "Idade do evento: {days} de dias · sem data mantidos",
"other": "Idade do evento: {days} dias · sem data mantidos"
},
"Close camera preview": "Fechar prévia da câmera",
"Refresh map still": "Atualizar imagem fixa no mapa",
"The map still uses a separate request and may show a different moment.": "A imagem no mapa usa uma solicitação separada e pode mostrar outro momento.",
"Video plays from Québec 511, which sees your IP address.": "O vídeo é reproduzido a partir do Québec 511, que vê o seu endereço IP.",
"Press OPEN to load the photo": "Clique em ABRIR para carregar a foto",
"Captured {month}": "Capturada em {month}",
"this spot": "este ponto",
"the view centre": "o centro da vista",
"{source} at {place}": "{source}: {place}",
"{source} at this spot": "{source} neste ponto",
"{source} at the view centre": "{source} no centro da vista",
"Street level at {place}": "Nível da rua: {place}",
"Street level at this spot": "Nível da rua neste ponto",
"Street level at the view centre": "Nível da rua no centro da vista",
"Switching map": "Mudando de mapa",
"Opening imagery": "Abrindo imagens",
"Street View is ready: press {open} to load it": "O Street View está pronto: clique em {open} para carregar",
@@ -3589,6 +3632,7 @@
"{source} imagery could not be opened": "Não foi possível abrir as imagens de {source}",
"{place} has no position to look for imagery at": "{place} não tem uma posição para buscar imagens",
"No {source} imagery near {place}": "Nenhuma imagem de {source} perto de {place}",
"No {source} imagery near the view centre": "Nenhuma imagem de {source} perto do centro da vista",
"{reason} (filters on: {filters})": "{reason} (filtros ativos: {filters})",
"tiles unavailable": "blocos indisponíveis",
"zoom in to load this layer": "aproxime o zoom para carregar esta camada",
@@ -3691,6 +3735,10 @@
"REMOVE ALL": "REMOVER TUDO",
"Confirm: remove every added entry from Data Layers": "Confirmar: remover de \"Camadas de dados\" todas as entradas adicionadas",
"Remove every added entry from Data Layers": "Remover de \"Camadas de dados\" todas as entradas adicionadas",
"Showing {shown} of {total}": "Mostrando {shown} de {total}",
"Showing {shown} of {total}": {
"one": "Mostrando {shown} de {total}",
"many": "Mostrando {shown} de {total}",
"other": "Mostrando {shown} de {total}"
},
"BROWSE DATA LIBRARY": "EXPLORAR BIBLIOTECA DE DADOS"
}
+69 -11
View File
@@ -71,8 +71,18 @@
"{severity} only": "Только: {severity}",
"All categories": "Все категории",
"Reading the news…": "Читаем новости…",
"News, last {hours} hours": "Новости за последние {hours} ч",
"Last {hours} h": "За {hours} ч",
"News, last {hours} hours": {
"one": "Новости за последний {hours} час",
"few": "Новости за последние {hours} часа",
"many": "Новости за последние {hours} часов",
"other": "Новости за последние {hours} часа"
},
"Last {hours} h": {
"one": "За {hours} ч",
"few": "За {hours} ч",
"many": "За {hours} ч",
"other": "За {hours} ч"
},
"Time window": "Период",
"Conflicts": "Конфликты",
"Local": "Местные",
@@ -81,9 +91,19 @@
"Hotspots": "Горячие точки",
"Severity": "Тяжесть",
"Category": "Категория",
"Nothing reported near here in the last {hours} h": "За последние {hours} ч поблизости ничего не сообщалось",
"Nothing reported near here in the last {hours} h": {
"one": "За последний {hours} ч поблизости ничего не сообщалось",
"few": "За последние {hours} ч поблизости ничего не сообщалось",
"many": "За последние {hours} ч поблизости ничего не сообщалось",
"other": "За последние {hours} ч поблизости ничего не сообщалось"
},
"Latest news": "Последние новости",
"No news matches these filters in the last {hours} h": "За последние {hours} ч нет новостей по этим фильтрам",
"No news matches these filters in the last {hours} h": {
"one": "За последний {hours} ч нет новостей по этим фильтрам",
"few": "За последние {hours} ч нет новостей по этим фильтрам",
"many": "За последние {hours} ч нет новостей по этим фильтрам",
"other": "За последние {hours} ч нет новостей по этим фильтрам"
},
"Load older news": "Загрузить более ранние новости",
"How to read the map": "Как читать карту",
"Colour: severity · icon: type of event": "Цвет: тяжесть · значок: тип события",
@@ -179,6 +199,7 @@
"Previous — prior visited contact in the 250 km window": "Назад — предыдущий посещённый контакт в радиусе 250 км",
"PREVIOUS": "ПРЕД.",
"FOCUS": "ФОКУС",
"site status|FOCUS": "ФОКУС",
"Next — nearest unvisited contact in the 250 km window": "Далее — ближайший непосещённый контакт в радиусе 250 км",
"NEXT": "СЛЕД.",
"Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "Контекст из открытых источников. Отсутствие трансляций, незагруженные области карты или неотмеченные объекты — не доказательство отсутствия.",
@@ -346,6 +367,7 @@
"Cancel replay": "Отменить повтор",
"EST. DOWNRANGE": "РАСЧЁТ ПО ТРАССЕ",
"CONFIRMED": "ПОДТВЕРЖДЕНО",
"sightings filter|CONFIRMED": "ПОДТВЕРЖДЕНО",
"PAD / RTLS": "ПЛОЩАДКА / RTLS",
"PLANNED · ": "ПЛАН · ",
"SUPPLIED TRAJECTORY POINTS": "ПРЕДОСТАВЛЕННЫЕ ТОЧКИ ТРАЕКТОРИИ",
@@ -545,7 +567,12 @@
"ROUTE DATA UNAVAILABLE": "ДАННЫЕ МАРШРУТА НЕДОСТУПНЫ",
"CONTACT NAVIGATION OFF": "НАВИГАЦИЯ ПО КОНТАКТАМ ВЫКЛЮЧЕНА",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "МОСТИК ОСТАЁТСЯ НА ВЫБРАННОМ СУДНЕ",
"{range} NM": "{range} МОР. МИЛ.",
"{range} NM": {
"one": "{range} МОР. МИЛЯ",
"few": "{range} МОР. МИЛИ",
"many": "{range} МОР. МИЛЬ",
"other": "{range} МОР. МИЛИ"
},
"AIS DESTINATION · CREW REPORTED": "ПУНКТ НАЗНАЧЕНИЯ AIS · УКАЗАН ЭКИПАЖЕМ",
"DEST {bearing}": "НАЗН. {bearing}",
"Disable cockpit weather effects": "Выключить погодные эффекты кабины",
@@ -591,6 +618,7 @@
"Select flight {title}": "Выбрать рейс {title}",
"TRACK ACQUIRED": "ЦЕЛЬ ЗАХВАЧЕНА",
"{label} · COURSE {heading}°": "{label} · ПУТЕВОЙ УГОЛ {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · ПУТЕВОЙ УГОЛ {heading}°",
"{label} · HEADING {heading}°": "{label} · КУРС {heading}°",
"{label} · NO HEADING": "{label} · НЕТ КУРСА",
"{label} · NADIR VIEW": "{label} · ВИД В НАДИР",
@@ -842,7 +870,12 @@
"EXIT BRIDGE": "ВЫЙТИ С МОСТИКА",
"EXIT ORBIT": "ВЫЙТИ С ОРБИТЫ",
"CONTACTS · 250 KM": "КОНТАКТЫ · 250 КМ",
"RINGS {spacing} NM": "КОЛЬЦА {spacing} МОР. МИЛ.",
"RINGS {spacing} NM": {
"one": "КОЛЬЦА {spacing} МОР. МИЛЯ",
"few": "КОЛЬЦА {spacing} МОР. МИЛИ",
"many": "КОЛЬЦА {spacing} МОР. МИЛЬ",
"other": "КОЛЬЦА {spacing} МОР. МИЛИ"
},
"{count} CONTACTS": {
"one": "{count} КОНТАКТ",
"few": "{count} КОНТАКТА",
@@ -1699,6 +1732,7 @@
"Observed history": "История наблюдений",
"Later observation": "Более позднее наблюдение",
"Latest": "Последние",
"news list|Latest": "Последние",
"Newest frame per product": "Самый свежий кадр каждого продукта",
"Replay observed history": "Воспроизвести историю наблюдений",
"S on another day replaces it · × unpins": "S в другой день заменяет его · × открепляет",
@@ -3554,7 +3588,12 @@
"Photo of {name}": "Фото: {name}",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "Наблюдений в кадре: {count}",
"{count} sightings in view": {
"one": "{count} наблюдение в кадре",
"few": "{count} наблюдения в кадре",
"many": "{count} наблюдений в кадре",
"other": "{count} наблюдения в кадре"
},
"Close sighting": "Закрыть наблюдение",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "Наблюдения живой природы за 48 ч (китообразные — 7 дней). Цвет и символ значка обозначают таксономическую группу. Уязвимые виды показаны только ячейками 0,2°; сообщения Acartia о морских млекопитающих моря Селиш округлены до 0,01°. Это не учёт численности.",
"Open {name} on iNaturalist": "Открыть {name} в iNaturalist",
@@ -3565,20 +3604,33 @@
"{days}d": "{days} дн.",
"All markers": "Все метки",
"Show markers of every age": "Показать метки любого возраста",
"Maximum event age: {days}d; undated markers are kept": "Максимальный возраст события: {days} дн.; метки без даты остаются",
"Maximum event age: {days}d; undated markers are kept": {
"one": "Максимальный возраст события: {days} дн.; метки без даты остаются",
"few": "Максимальный возраст события: {days} дн.; метки без даты остаются",
"many": "Максимальный возраст события: {days} дн.; метки без даты остаются",
"other": "Максимальный возраст события: {days} дн.; метки без даты остаются"
},
"event age filter|All": "Все",
"Event age": "Возраст события",
"Event age: {days}d · undated kept": "Возраст события: {days} дн. · метки без даты остаются",
"Event age: {days}d · undated kept": {
"one": "Возраст события: {days} дн. · метки без даты остаются",
"few": "Возраст события: {days} дн. · метки без даты остаются",
"many": "Возраст события: {days} дн. · метки без даты остаются",
"other": "Возраст события: {days} дн. · метки без даты остаются"
},
"Close camera preview": "Закрыть просмотр камеры",
"Refresh map still": "Обновить кадр на карте",
"The map still uses a separate request and may show a different moment.": "Кадр на карте запрашивается отдельно и может показывать другой момент.",
"Video plays from Québec 511, which sees your IP address.": "Видео воспроизводится с Québec 511, который видит ваш IP-адрес.",
"Press OPEN to load the photo": "Нажмите ОТКРЫТЬ, чтобы загрузить снимок",
"Captured {month}": "Снято: {month}",
"this spot": "эта точка",
"the view centre": "центр вида",
"{source} at {place}": "{source}: {place}",
"{source} at this spot": "{source} в этой точке",
"{source} at the view centre": "{source} в центре вида",
"Street level at {place}": "Уличные снимки: {place}",
"Street level at this spot": "Уличные снимки в этой точке",
"Street level at the view centre": "Уличные снимки в центре вида",
"Switching map": "Смена карты",
"Opening imagery": "Открытие снимков",
"Street View is ready: press {open} to load it": "Просмотр улиц готов: нажмите {open}, чтобы загрузить",
@@ -3670,6 +3722,7 @@
"{source} imagery could not be opened": "Не удалось открыть снимки {source}",
"{place} has no position to look for imagery at": "У места «{place}» нет координат для поиска снимков",
"No {source} imagery near {place}": "Нет снимков {source} рядом с местом «{place}»",
"No {source} imagery near the view centre": "Нет снимков {source} рядом с центром вида",
"{reason} (filters on: {filters})": "{reason} (включены фильтры: {filters})",
"tiles unavailable": "тайлы недоступны",
"Environment": "Окружающая среда",
@@ -3758,7 +3811,12 @@
"switch on a dataset to load features": "включите набор данных, чтобы загрузить объекты",
"Data Library at a glance": "Библиотека данных вкратце",
"Map features": "Объекты на карте",
"Showing {shown} of {total}": "Показано {shown} из {total}",
"Showing {shown} of {total}": {
"one": "Показано {shown} из {total}",
"few": "Показано {shown} из {total}",
"many": "Показано {shown} из {total}",
"other": "Показано {shown} из {total}"
},
"Datasets": "Наборы данных",
"Themes": "Темы",
"zoom in to load this layer": "приблизьте, чтобы загрузить этот слой",
+49 -11
View File
@@ -67,18 +67,30 @@
"{severity} and above": "{severity} och uppåt",
"{severity} only": "Endast ”{severity}”",
"All categories": "Alla kategorier",
"Last {hours} h": "Senaste {hours} h",
"Last {hours} h": {
"one": "Senaste {hours} h",
"other": "Senaste {hours} h"
},
"Reading the news…": "Läser in nyheterna …",
"News, last {hours} hours": "Nyheter, senaste {hours} h",
"News, last {hours} hours": {
"one": "Nyheter, senaste {hours} h",
"other": "Nyheter, senaste {hours} h"
},
"Time window": "Tidsfönster",
"News sections": "Nyhetssektioner",
"Hotspots": "Oroshärdar",
"Severity": "Allvarlighetsgrad",
"Category": "Kategori",
"Zoom in to see local news": "Zooma in för att se lokala nyheter",
"Nothing reported near here in the last {hours} h": "Inget rapporterat i närheten senaste {hours} h",
"Nothing reported near here in the last {hours} h": {
"one": "Inget rapporterat i närheten senaste {hours} h",
"other": "Inget rapporterat i närheten senaste {hours} h"
},
"Latest news": "Senaste nyheterna",
"No news matches these filters in the last {hours} h": "Inga nyheter matchar filtren senaste {hours} h",
"No news matches these filters in the last {hours} h": {
"one": "Inga nyheter matchar filtren senaste {hours} h",
"other": "Inga nyheter matchar filtren senaste {hours} h"
},
"Load older news": "Ladda äldre nyheter",
"How to read the map": "Så läses kartan",
"Colour: severity · icon: type of event": "Färg: allvarlighetsgrad · ikon: typ av händelse",
@@ -198,6 +210,7 @@
"Previous — prior visited contact in the 250 km window": "Förra – senast besökta kontakt inom 250 km",
"PREVIOUS": "FÖRRA",
"FOCUS": "FOKUS",
"site status|FOCUS": "FOKUS",
"Next — nearest unvisited contact in the 250 km window": "Nästa – närmaste obesökta kontakt inom 250 km",
"NEXT": "NÄSTA",
"Open-source mapped/observed context. Missing broadcasts, unloaded map areas, or unmapped sites are not evidence of absence.": "Kartlagd/observerad kontext från öppna källor. Uteblivna sändningar, kartområden som inte har laddats eller platser som inte är kartlagda bevisar inte att något saknas.",
@@ -565,6 +578,7 @@
"Reclassify as TR-3B": "Klassa om som TR-3B",
"TRACK ACQUIRED": "SPÅR LÅST",
"{label} · COURSE {heading}°": "{label} · FÄRDRIKTNING {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · FÄRDRIKTNING {heading}°",
"Context could not restore every layer; try again": "Läget ”Kontext” kunde inte återställa alla lager – försök igen",
"No selected data layers": "Inga valda datalager",
"{count} data layers could not be cleared": {
@@ -2326,6 +2340,7 @@
"Observed history": "Observerad historik",
"Later observation": "Senare observation",
"Latest": "Senaste",
"news list|Latest": "Senaste",
"Newest frame per product": "Senaste bildruta per produkt",
"Replay observed history": "Spela upp observerad historik",
"Imagery on Esri · Google 3D returns when cleared": "Bilder på Esri · Google 3D återkommer när de rensas",
@@ -3049,6 +3064,7 @@
"Left panels": "Vänstra paneler",
"Right panels": "Högra paneler",
"CONFIRMED": "BEKRÄFTAD",
"sightings filter|CONFIRMED": "BEKRÄFTADE",
"PAD / RTLS": "RAMP / RTLS",
"fire confidence filter|All": "Alla",
"fire confidence filter|Nominal+": "Normal+",
@@ -3309,7 +3325,10 @@
"Photo of {name}": "Foto av {name}",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "Observationer i vyn: {count}",
"{count} sightings in view": {
"one": "{count} observation i vyn",
"other": "{count} observationer i vyn"
},
"Close sighting": "Stäng observationen",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "Djur, växter och svampar observerade de senaste 48 h (valar 7 d). Färg och symbol visar artgruppen. Känsliga arter visas bara som rutor på 0,2°; rapporter om marina däggdjur i Salish Sea via Acartia avrundas till 0,01°. Ingen inventering.",
"Open {name} on iNaturalist": "Öppna {name} på iNaturalist",
@@ -3320,20 +3339,29 @@
"{days}d": "{days} d",
"All markers": "Alla markörer",
"Show markers of every age": "Visa markörer oavsett ålder",
"Maximum event age: {days}d; undated markers are kept": "Högsta ålder på händelser: {days} d; markörer utan datum behålls",
"Maximum event age: {days}d; undated markers are kept": {
"one": "Högsta ålder på händelser: {days} d; markörer utan datum behålls",
"other": "Högsta ålder på händelser: {days} d; markörer utan datum behålls"
},
"event age filter|All": "Alla",
"Event age": "Händelsernas ålder",
"Event age: {days}d · undated kept": "Händelsernas ålder: {days} d · utan datum behålls",
"Event age: {days}d · undated kept": {
"one": "Händelsernas ålder: {days} d · utan datum behålls",
"other": "Händelsernas ålder: {days} d · utan datum behålls"
},
"Close camera preview": "Stäng förhandsvisningen av kameran",
"Refresh map still": "Uppdatera stillbilden på kartan",
"The map still uses a separate request and may show a different moment.": "Stillbilden på kartan hämtas separat och kan visa ett annat ögonblick.",
"Video plays from Québec 511, which sees your IP address.": "Videon spelas upp från Québec 511, som ser din IP-adress.",
"Press OPEN to load the photo": "Tryck på ÖPPNA för att ladda fotot",
"Captured {month}": "Tagen {month}",
"this spot": "den här platsen",
"the view centre": "vyns mitt",
"{source} at {place}": "{source} vid {place}",
"{source} at this spot": "{source} på den här platsen",
"{source} at the view centre": "{source} i vyns mitt",
"Street level at {place}": "Gatunivå vid {place}",
"Street level at this spot": "Gatunivå på den här platsen",
"Street level at the view centre": "Gatunivå i vyns mitt",
"Switching map": "Byter karta",
"Opening imagery": "Öppnar bilder",
"Street View is ready: press {open} to load it": "Street View är redo: tryck på {open} för att ladda den",
@@ -3367,7 +3395,10 @@
"LIVE AIS": "LIVE-AIS",
"CONTACT NAVIGATION OFF": "KONTAKTNAVIGERING AV",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "BRYGGAN STANNAR PÅ DET VALDA FARTYGET",
"{range} NM": "{range} NM",
"{range} NM": {
"one": "{range} NM",
"other": "{range} NM"
},
"AIS DESTINATION · CREW REPORTED": "AIS-DESTINATION · ANGIVEN AV BESÄTTNINGEN",
"{label} · NADIR VIEW": "{label} · NADIRVY",
"SITES STANDBY": "PLATSER I VÄNTLÄGE",
@@ -3446,7 +3477,10 @@
"Zoom in (+)": "Zooma in (+)",
"Zoom to the imaging sensor swath": "Zooma till sensorns avbildningsstråk",
"SENSOR": "SENSOR",
"RINGS {spacing} NM": "RINGAR {spacing} NM",
"RINGS {spacing} NM": {
"one": "RINGAR {spacing} NM",
"other": "RINGAR {spacing} NM"
},
"{count} CONTACTS": {
"one": "{count} KONTAKT",
"other": "{count} KONTAKTER"
@@ -3500,6 +3534,7 @@
"{source} imagery could not be opened": "Bilder från {source} kunde inte öppnas",
"{place} has no position to look for imagery at": "{place} har ingen position att söka efter bilder vid",
"No {source} imagery near {place}": "Inga bilder från {source} nära {place}",
"No {source} imagery near the view centre": "Inga bilder från {source} nära vyns mitt",
"{reason} (filters on: {filters})": "{reason} (aktiva filter: {filters})",
"1 h/s": "1 h/s",
"1 d/s": "1 d/s",
@@ -3604,6 +3639,9 @@
"REMOVE ALL": "TA BORT ALLA",
"Confirm: remove every added entry from Data Layers": "Bekräfta: ta bort alla tillagda poster från Datalager",
"Remove every added entry from Data Layers": "Ta bort alla tillagda poster från Datalager",
"Showing {shown} of {total}": "Visar {shown} av {total}",
"Showing {shown} of {total}": {
"one": "Visar {shown} av {total}",
"other": "Visar {shown} av {total}"
},
"BROWSE DATA LIBRARY": "BLÄDDRA I DATABIBLIOTEKET"
}
+70 -12
View File
@@ -71,8 +71,18 @@
"{severity} only": "Лише {severity}",
"All categories": "Усі категорії",
"Reading the news…": "Читаємо новини…",
"News, last {hours} hours": "Новини за {hours} год",
"Last {hours} h": "За {hours} год",
"News, last {hours} hours": {
"one": "Новини за останню {hours} годину",
"few": "Новини за останні {hours} години",
"many": "Новини за останні {hours} годин",
"other": "Новини за останні {hours} години"
},
"Last {hours} h": {
"one": "За {hours} год",
"few": "За {hours} год",
"many": "За {hours} год",
"other": "За {hours} год"
},
"Time window": "Період",
"Conflicts": "Конфлікти",
"Local": "Місцеві",
@@ -81,9 +91,19 @@
"Hotspots": "Гарячі точки",
"Severity": "Тяжкість",
"Category": "Категорія",
"Nothing reported near here in the last {hours} h": "За {hours} год поблизу нічого не повідомлялося",
"Nothing reported near here in the last {hours} h": {
"one": "За останню {hours} год поблизу нічого не повідомлялося",
"few": "За останні {hours} год поблизу нічого не повідомлялося",
"many": "За останні {hours} год поблизу нічого не повідомлялося",
"other": "За останні {hours} год поблизу нічого не повідомлялося"
},
"Latest news": "Останні новини",
"No news matches these filters in the last {hours} h": "За {hours} год немає новин за цими фільтрами",
"No news matches these filters in the last {hours} h": {
"one": "За останню {hours} год немає новин за цими фільтрами",
"few": "За останні {hours} год немає новин за цими фільтрами",
"many": "За останні {hours} год немає новин за цими фільтрами",
"other": "За останні {hours} год немає новин за цими фільтрами"
},
"Load older news": "Завантажити давніші новини",
"How to read the map": "Як читати карту",
"Colour: severity · icon: type of event": "Колір: тяжкість · значок: тип події",
@@ -594,6 +614,7 @@
"Previous — prior visited contact in the 250 km window": "Назад — попередній переглянутий контакт у радіусі 250 км",
"PREVIOUS": "НАЗАД",
"FOCUS": "ФОКУС",
"site status|FOCUS": "ФОКУС",
"Next — nearest unvisited contact in the 250 km window": "Далі — найближчий ще не переглянутий контакт у радіусі 250 км",
"NEXT": "ДАЛІ",
"Named areas ({n})": "Іменовані зони ({n})",
@@ -956,7 +977,7 @@
"ORBITAL VELOCITY": "ОРБІТАЛЬНА ШВИДКІСТЬ",
"SUB-SATELLITE POINT": "ПІДСУПУТНИКОВА ТОЧКА",
"NORTH UP": "ПІВНІЧ УГОРІ",
"CURRENTLY OVER": "ЗАРАЗ НАД",
"CURRENTLY OVER": "ПІД СУПУТНИКОМ",
"{division}, {country}": "{division}, {country}",
"{region} · near {place}": "{region} · поблизу: {place}",
"NORAD {id}": "NORAD {id}",
@@ -1859,7 +1880,12 @@
"ROUTE DATA UNAVAILABLE": "ДАНІ МАРШРУТУ НЕДОСТУПНІ",
"CONTACT NAVIGATION OFF": "НАВІГАЦІЮ КОНТАКТАМИ ВИМКНЕНО",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "МІСТОК ЗАЛИШАЄТЬСЯ НА ВИБРАНОМУ СУДНІ",
"{range} NM": "{range} МОР. МИЛ.",
"{range} NM": {
"one": "{range} МОР. МИЛЯ",
"few": "{range} МОР. МИЛІ",
"many": "{range} МОР. МИЛЬ",
"other": "{range} МОР. МИЛІ"
},
"AIS DESTINATION · CREW REPORTED": "ПРИЗНАЧЕННЯ AIS · ВКАЗАНО ЕКІПАЖЕМ",
"DEST {bearing}": "ПРИЗН. {bearing}",
"Disable cockpit weather effects": "Вимкнути погодні ефекти кабіни",
@@ -1908,6 +1934,7 @@
"Reclassify as TR-3B": "Перекласифікувати як TR-3B",
"TRACK ACQUIRED": "ТРЕК ЗАХОПЛЕНО",
"{label} · COURSE {heading}°": "{label} · ШЛЯХОВИЙ КУТ {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · ШЛЯХОВИЙ КУТ {heading}°",
"{label} · HEADING {heading}°": "{label} · КУРС {heading}°",
"{label} · NO HEADING": "{label} · НЕМАЄ КУРСУ",
"{label} · NADIR VIEW": "{label} · ВИГЛЯД У НАДИР",
@@ -2188,6 +2215,7 @@
"Observed history": "Історія спостережень",
"Later observation": "Наступне спостереження",
"Latest": "Останні",
"news list|Latest": "Останні",
"Newest frame per product": "Найсвіжіший кадр кожного продукту",
"Replay observed history": "Відтворити історію спостережень",
"Imagery on Esri · Google 3D returns when cleared": "Підкладка: Esri · скидання поверне Google 3D",
@@ -2954,7 +2982,12 @@
"Contact cockpit summary": "Зведення контакту в кабіні",
"CONTACT": "КОНТАКТ",
"CONTACTS · 250 KM": "КОНТАКТИ · 250 КМ",
"RINGS {spacing} NM": "КІЛЬЦЯ {spacing} МОР. МИЛ.",
"RINGS {spacing} NM": {
"one": "КІЛЬЦЯ {spacing} МОР. МИЛЯ",
"few": "КІЛЬЦЯ {spacing} МОР. МИЛІ",
"many": "КІЛЬЦЯ {spacing} МОР. МИЛЬ",
"other": "КІЛЬЦЯ {spacing} МОР. МИЛІ"
},
"{count} CONTACTS": {
"one": "{count} КОНТАКТ",
"few": "{count} КОНТАКТИ",
@@ -3295,6 +3328,7 @@
"Left panels": "Ліві панелі",
"Right panels": "Праві панелі",
"CONFIRMED": "ПІДТВЕРДЖЕНО",
"sightings filter|CONFIRMED": "ПІДТВЕРДЖЕНО",
"PAD / RTLS": "МІСЦЕ ЗАПУСКУ / RTLS",
"Name of {name}": "Назва: {name}",
"Change the colour of {name}": "Змінити колір: {name}",
@@ -3554,7 +3588,12 @@
"Photo of {name}": "Фото {name}",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "Спостережень у кадрі: {count}",
"{count} sightings in view": {
"one": "{count} спостереження в кадрі",
"few": "{count} спостереження в кадрі",
"many": "{count} спостережень у кадрі",
"other": "{count} спостереження в кадрі"
},
"Close sighting": "Закрити спостереження",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "Спостереження живої природи за 48 год (китоподібні — 7 днів). Колір і символ значка позначають таксономічну групу. Вразливі види показано лише комірками 0,2°; повідомлення Acartia про морських ссавців моря Селіш округлено до 0,01°. Не перепис.",
"Open {name} on iNaturalist": "Відкрити {name} в iNaturalist",
@@ -3565,20 +3604,33 @@
"{days}d": "{days} дн",
"All markers": "Усі мітки",
"Show markers of every age": "Показати мітки будь-якого віку",
"Maximum event age: {days}d; undated markers are kept": "Максимальний вік події: {days} дн; мітки без дати залишаються",
"Maximum event age: {days}d; undated markers are kept": {
"one": "Максимальний вік події: {days} дн; мітки без дати залишаються",
"few": "Максимальний вік події: {days} дн; мітки без дати залишаються",
"many": "Максимальний вік події: {days} дн; мітки без дати залишаються",
"other": "Максимальний вік події: {days} дн; мітки без дати залишаються"
},
"event age filter|All": "Усі",
"Event age": "Вік події",
"Event age: {days}d · undated kept": "Вік події: {days} дн · мітки без дати залишаються",
"Event age: {days}d · undated kept": {
"one": "Вік події: {days} дн · мітки без дати залишаються",
"few": "Вік події: {days} дн · мітки без дати залишаються",
"many": "Вік події: {days} дн · мітки без дати залишаються",
"other": "Вік події: {days} дн · мітки без дати залишаються"
},
"Close camera preview": "Закрити перегляд камери",
"Refresh map still": "Оновити кадр на карті",
"The map still uses a separate request and may show a different moment.": "Кадр на карті запитується окремо та може показувати інший момент.",
"Video plays from Québec 511, which sees your IP address.": "Відео відтворюється з Québec 511, який бачить вашу IP-адресу.",
"Press OPEN to load the photo": "Натисніть «ВІДКРИТИ», щоб завантажити фото",
"Captured {month}": "Знято: {month}",
"this spot": "це місце",
"the view centre": "центр карти",
"{source} at {place}": "{source}: {place}",
"{source} at this spot": "{source} у цьому місці",
"{source} at the view centre": "{source} у центрі карти",
"Street level at {place}": "Вуличні знімки: {place}",
"Street level at this spot": "Вуличні знімки в цьому місці",
"Street level at the view centre": "Вуличні знімки в центрі карти",
"Switching map": "Перемикання карти",
"Opening imagery": "Відкриття знімків",
"Street View is ready: press {open} to load it": "Перегляд вулиць готовий: натисніть «{open}», щоб завантажити",
@@ -3670,6 +3722,7 @@
"{source} imagery could not be opened": "Не вдалося відкрити знімки {source}",
"{place} has no position to look for imagery at": "Для місця «{place}» немає координат для пошуку знімків",
"No {source} imagery near {place}": "Немає знімків {source} поблизу: {place}",
"No {source} imagery near the view centre": "Немає знімків {source} поблизу центру карти",
"{reason} (filters on: {filters})": "{reason} (увімкнено фільтри: {filters})",
"tiles unavailable": "тайли недоступні",
"zoom in to load this layer": "наблизьте карту, щоб завантажити цей шар",
@@ -3778,6 +3831,11 @@
"REMOVE ALL": "ВИДАЛИТИ ВСЕ",
"Confirm: remove every added entry from Data Layers": "Підтвердити: видалити всі додані записи з «Шарів даних»",
"Remove every added entry from Data Layers": "Видалити всі додані записи з «Шарів даних»",
"Showing {shown} of {total}": "Показано {shown} з {total}",
"Showing {shown} of {total}": {
"one": "Показано {shown} з {total}",
"few": "Показано {shown} з {total}",
"many": "Показано {shown} з {total}",
"other": "Показано {shown} з {total}"
},
"BROWSE DATA LIBRARY": "ВІДКРИТИ БІБЛІОТЕКУ ДАНИХ"
}
+39 -11
View File
@@ -62,8 +62,12 @@
"{severity} only": "仅{severity}",
"All categories": "所有类别",
"Reading the news…": "正在读取新闻…",
"News, last {hours} hours": "最近 {hours} 小时的新闻",
"Last {hours} h": "最近 {hours} 小时",
"News, last {hours} hours": {
"other": "最近 {hours} 小时的新闻"
},
"Last {hours} h": {
"other": "最近 {hours} 小时"
},
"Time window": "时间范围",
"Conflicts": "冲突",
"Local": "本地",
@@ -72,9 +76,13 @@
"Hotspots": "热点",
"Severity": "严重程度",
"Category": "类别",
"Nothing reported near here in the last {hours} h": "最近 {hours} 小时附近无报道",
"Nothing reported near here in the last {hours} h": {
"other": "最近 {hours} 小时附近无报道"
},
"Latest news": "最新新闻",
"No news matches these filters in the last {hours} h": "最近 {hours} 小时没有符合这些筛选条件的新闻",
"No news matches these filters in the last {hours} h": {
"other": "最近 {hours} 小时没有符合这些筛选条件的新闻"
},
"Load older news": "加载更早的新闻",
"How to read the map": "如何解读地图",
"Colour: severity · icon: type of event": "颜色:严重程度 · 图标:事件类型",
@@ -563,6 +571,7 @@
"Previous — prior visited contact in the 250 km window": "上一个:250 km 范围内先前访问过的目标",
"PREVIOUS": "上一个",
"FOCUS": "聚焦",
"site status|FOCUS": "聚焦",
"Next — nearest unvisited contact in the 250 km window": "下一个:250 km 范围内最近的未访问目标",
"NEXT": "下一个",
"Named areas ({n})": "已命名区域({n})",
@@ -929,6 +938,7 @@
"Cancel replay": "取消回放",
"EST. DOWNRANGE": "预估落点距离",
"CONFIRMED": "已确认",
"sightings filter|CONFIRMED": "已确认",
"PAD / RTLS": "发射台 / RTLS",
"PLANNED · ": "计划 · ",
"SUPPLIED TRAJECTORY POINTS": "提供的轨迹点",
@@ -1750,7 +1760,9 @@
"ROUTE DATA UNAVAILABLE": "航线数据不可用",
"CONTACT NAVIGATION OFF": "目标导航已关闭",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "驾驶台保持在所选船舶上",
"{range} NM": "{range} 海里",
"{range} NM": {
"other": "{range} 海里"
},
"AIS DESTINATION · CREW REPORTED": "AIS 目的地 · 船员申报",
"DEST {bearing}": "目的地 {bearing}",
"Disable cockpit weather effects": "停用座舱天气效果",
@@ -1796,6 +1808,7 @@
"Reclassify as TR-3B": "重新归类为 TR-3B",
"TRACK ACQUIRED": "已获取航迹",
"{label} · COURSE {heading}°": "{label} · 对地航向 {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · 对地航向 {heading}°",
"{label} · HEADING {heading}°": "{label} · 船首向 {heading}°",
"{label} · NO HEADING": "{label} · 无船首向",
"{label} · NADIR VIEW": "{label} · 天底视图",
@@ -2048,6 +2061,7 @@
"Observed history": "观测历史",
"Later observation": "较晚观测",
"Latest": "最新",
"news list|Latest": "最新",
"Newest frame per product": "每个产品的最新一帧",
"Replay observed history": "回放观测历史",
"Imagery on Esri · Google 3D returns when cleared": "影像显示在 Esri 底图上 · 清除后恢复 Google 3D",
@@ -2629,7 +2643,9 @@
"Contact cockpit summary": "目标座舱摘要",
"CONTACT": "目标",
"CONTACTS · 250 KM": "目标 · 250 km",
"RINGS {spacing} NM": "距标圈 {spacing} 海里",
"RINGS {spacing} NM": {
"other": "距标圈 {spacing} 海里"
},
"{count} CONTACTS": {
"other": "{count} 个目标"
},
@@ -3311,7 +3327,9 @@
"Photo of {name}": "{name} 的照片",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "视野内有 {count} 次目击",
"{count} sightings in view": {
"other": "视野内有 {count} 次目击"
},
"Close sighting": "关闭目击记录",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "近 48 小时内观察到的野生生物(鲸类为 7 天)。颜色与徽章图标表示分类群。敏感物种仅以 0.2° 网格显示;Acartia 提供的萨利希海海洋哺乳动物目击位置四舍五入到 0.01°。并非种群普查。",
"Open {name} on iNaturalist": "在 iNaturalist 上打开 {name}",
@@ -3322,20 +3340,27 @@
"{days}d": "{days} 天",
"All markers": "所有标记",
"Show markers of every age": "显示所有时间的标记",
"Maximum event age: {days}d; undated markers are kept": "仅显示 {days} 天内的事件;保留无日期标记",
"Maximum event age: {days}d; undated markers are kept": {
"other": "仅显示 {days} 天内的事件;保留无日期标记"
},
"event age filter|All": "全部",
"Event age": "事件时间",
"Event age: {days}d · undated kept": "事件时间:{days} 天内 · 保留无日期标记",
"Event age: {days}d · undated kept": {
"other": "事件时间:{days} 天内 · 保留无日期标记"
},
"Close camera preview": "关闭摄像头预览",
"Refresh map still": "刷新地图静止画面",
"The map still uses a separate request and may show a different moment.": "地图静止画面通过单独的请求获取,可能显示不同的时刻。",
"Video plays from Québec 511, which sees your IP address.": "视频从 Québec 511 播放,Québec 511 会看到你的 IP 地址。",
"Press OPEN to load the photo": "点击“打开”加载照片",
"Captured {month}": "拍摄于 {month}",
"this spot": "此处",
"the view centre": "视野中心",
"{source} at {place}": "{place} 的 {source}",
"{source} at this spot": "此处的 {source}",
"{source} at the view centre": "视图中心的 {source}",
"Street level at {place}": "{place} 的街景",
"Street level at this spot": "此处的街景",
"Street level at the view centre": "视图中心的街景",
"Switching map": "正在切换地图",
"Opening imagery": "正在打开影像",
"Street View is ready: press {open} to load it": "街景已就绪:点击“{open}”加载",
@@ -3427,6 +3452,7 @@
"{source} imagery could not be opened": "无法打开 {source} 影像",
"{place} has no position to look for imagery at": "{place} 没有可查找影像的位置",
"No {source} imagery near {place}": "{place} 附近没有 {source} 影像",
"No {source} imagery near the view centre": "视图中心附近没有 {source} 影像",
"{reason} (filters on: {filters})": "{reason}(已开启筛选:{filters})",
"tiles unavailable": "瓦片不可用",
"zoom in to load this layer": "放大以加载此图层",
@@ -3517,6 +3543,8 @@
"REMOVE ALL": "全部移除",
"Confirm: remove every added entry from Data Layers": "确认:从数据图层中移除所有已添加条目",
"Remove every added entry from Data Layers": "从数据图层中移除所有已添加条目",
"Showing {shown} of {total}": "显示 {shown} / {total}",
"Showing {shown} of {total}": {
"other": "显示 {shown} / {total}"
},
"BROWSE DATA LIBRARY": "浏览数据资源库"
}
+39 -11
View File
@@ -62,8 +62,12 @@
"{severity} only": "僅{severity}",
"All categories": "所有類別",
"Reading the news…": "正在讀取新聞…",
"News, last {hours} hours": "最近 {hours} 小時的新聞",
"Last {hours} h": "最近 {hours} 小時",
"News, last {hours} hours": {
"other": "最近 {hours} 小時的新聞"
},
"Last {hours} h": {
"other": "最近 {hours} 小時"
},
"Time window": "時間範圍",
"Conflicts": "衝突",
"Local": "本地",
@@ -72,9 +76,13 @@
"Hotspots": "熱點",
"Severity": "嚴重程度",
"Category": "類別",
"Nothing reported near here in the last {hours} h": "最近 {hours} 小時附近無報道",
"Nothing reported near here in the last {hours} h": {
"other": "最近 {hours} 小時附近無報道"
},
"Latest news": "最新新聞",
"No news matches these filters in the last {hours} h": "最近 {hours} 小時沒有符合這些篩選條件的新聞",
"No news matches these filters in the last {hours} h": {
"other": "最近 {hours} 小時沒有符合這些篩選條件的新聞"
},
"Load older news": "加載更早的新聞",
"How to read the map": "如何解讀地圖",
"Colour: severity · icon: type of event": "顏色:嚴重程度 · 圖標:事件類型",
@@ -563,6 +571,7 @@
"Previous — prior visited contact in the 250 km window": "上一個:250 km 範圍內先前訪問過的目標",
"PREVIOUS": "上一個",
"FOCUS": "聚焦",
"site status|FOCUS": "聚焦",
"Next — nearest unvisited contact in the 250 km window": "下一個:250 km 範圍內最近的未訪問目標",
"NEXT": "下一個",
"Named areas ({n})": "已命名區域({n})",
@@ -924,6 +933,7 @@
"Cancel replay": "取消回放",
"EST. DOWNRANGE": "預估落點距離",
"CONFIRMED": "已確認",
"sightings filter|CONFIRMED": "已確認",
"PAD / RTLS": "發射臺 / RTLS",
"PLANNED · ": "計劃 · ",
"SUPPLIED TRAJECTORY POINTS": "提供的軌跡點",
@@ -1742,7 +1752,9 @@
"ROUTE DATA UNAVAILABLE": "航線數據不可用",
"CONTACT NAVIGATION OFF": "目標導航已關閉",
"THE BRIDGE STAYS WITH THE SELECTED VESSEL": "駕駛臺保持在所選船舶上",
"{range} NM": "{range} 海里",
"{range} NM": {
"other": "{range} 海里"
},
"AIS DESTINATION · CREW REPORTED": "AIS 目的地 · 船員申報",
"DEST {bearing}": "目的地 {bearing}",
"Disable cockpit weather effects": "停用座艙天氣效果",
@@ -1788,6 +1800,7 @@
"Reclassify as TR-3B": "重新歸類為 TR-3B",
"TRACK ACQUIRED": "已獲取航跡",
"{label} · COURSE {heading}°": "{label} · 對地航向 {heading}°",
"vessel|{label} · COURSE {heading}°": "{label} · 對地航向 {heading}°",
"{label} · HEADING {heading}°": "{label} · 船首向 {heading}°",
"{label} · NO HEADING": "{label} · 無船首向",
"{label} · NADIR VIEW": "{label} · 天底視圖",
@@ -2038,6 +2051,7 @@
"Observed history": "觀測歷史",
"Later observation": "較晚觀測",
"Latest": "最新",
"news list|Latest": "最新",
"Newest frame per product": "每個產品的最新一幀",
"Replay observed history": "回放觀測歷史",
"Imagery on Esri · Google 3D returns when cleared": "影像顯示在 Esri 底圖上 · 清除後恢復 Google 3D",
@@ -2619,7 +2633,9 @@
"Contact cockpit summary": "目標座艙摘要",
"CONTACT": "目標",
"CONTACTS · 250 KM": "目標 · 250 km",
"RINGS {spacing} NM": "距標圈 {spacing} 海里",
"RINGS {spacing} NM": {
"other": "距標圈 {spacing} 海里"
},
"{count} CONTACTS": {
"other": "{count} 個目標"
},
@@ -3311,7 +3327,9 @@
"Photo of {name}": "{name} 的照片",
"Acartia": "Acartia",
"CC BY 4.0": "CC BY 4.0",
"{count} sightings in view": "視野內有 {count} 次目擊",
"{count} sightings in view": {
"other": "視野內有 {count} 次目擊"
},
"Close sighting": "關閉目擊記錄",
"Wildlife observed within 48 h (whales 7 d). Color and badge glyph show the taxon group. Sensitive species are shown only as 0.2° cells; Salish Sea marine mammal reports via Acartia are rounded to 0.01°. Not a census.": "近 48 小時內觀察到的野生生物(鯨類為 7 天)。顏色與徽章圖標表示分類群。敏感物種僅以 0.2° 網格顯示;Acartia 提供的薩利希海海洋哺乳動物目擊位置四捨五入到 0.01°。並非種群普查。",
"Open {name} on iNaturalist": "在 iNaturalist 上打開 {name}",
@@ -3322,20 +3340,27 @@
"{days}d": "{days} 天",
"All markers": "所有標記",
"Show markers of every age": "顯示所有時間的標記",
"Maximum event age: {days}d; undated markers are kept": "僅顯示 {days} 天內的事件;保留無日期標記",
"Maximum event age: {days}d; undated markers are kept": {
"other": "僅顯示 {days} 天內的事件;保留無日期標記"
},
"event age filter|All": "全部",
"Event age": "事件時間",
"Event age: {days}d · undated kept": "事件時間:{days} 天內 · 保留無日期標記",
"Event age: {days}d · undated kept": {
"other": "事件時間:{days} 天內 · 保留無日期標記"
},
"Close camera preview": "關閉攝像頭預覽",
"Refresh map still": "刷新地圖靜止畫面",
"The map still uses a separate request and may show a different moment.": "地圖靜止畫面通過單獨的請求獲取,可能顯示不同的時刻。",
"Video plays from Québec 511, which sees your IP address.": "視頻從 Québec 511 播放,Québec 511 會看到你的 IP 地址。",
"Press OPEN to load the photo": "點擊“打開”加載照片",
"Captured {month}": "拍攝於 {month}",
"this spot": "此處",
"the view centre": "視野中心",
"{source} at {place}": "{place} 的 {source}",
"{source} at this spot": "此處的 {source}",
"{source} at the view centre": "視圖中心的 {source}",
"Street level at {place}": "{place} 的街景",
"Street level at this spot": "此處的街景",
"Street level at the view centre": "視圖中心的街景",
"Switching map": "正在切換地圖",
"Opening imagery": "正在打開影像",
"Street View is ready: press {open} to load it": "街景已就緒:點擊“{open}”加載",
@@ -3427,6 +3452,7 @@
"{source} imagery could not be opened": "無法打開 {source} 影像",
"{place} has no position to look for imagery at": "{place} 沒有可查找影像的位置",
"No {source} imagery near {place}": "{place} 附近沒有 {source} 影像",
"No {source} imagery near the view centre": "視圖中心附近沒有 {source} 影像",
"{reason} (filters on: {filters})": "{reason}(已開啟篩選:{filters})",
"tiles unavailable": "瓦片不可用",
"zoom in to load this layer": "放大以加載此圖層",
@@ -3517,6 +3543,8 @@
"REMOVE ALL": "全部移除",
"Confirm: remove every added entry from Data Layers": "確認:從數據圖層中移除所有已添加條目",
"Remove every added entry from Data Layers": "從數據圖層中移除所有已添加條目",
"Showing {shown} of {total}": "顯示 {shown} / {total}",
"Showing {shown} of {total}": {
"other": "顯示 {shown} / {total}"
},
"BROWSE DATA LIBRARY": "瀏覽數據資源庫"
}
+1
View File
@@ -685,6 +685,7 @@
"FLIR",
"FM MHZ",
"FOCUS",
"site status|FOCUS",
"FOV",
"FOV {value}°",
"FT",
+7 -4
View File
@@ -762,9 +762,12 @@ export function createGhostMapsLayer({
title:
days === null
? t('Show markers of every age')
: t('Maximum event age: {days}d; undated markers are kept', {
days: formatNumber(days),
}),
: tn(
days,
'Maximum event age: {days}d; undated markers are kept',
'Maximum event age: {days}d; undated markers are kept',
{ days: formatNumber(days) },
),
active: days === _ageDays,
onClick: () => setAgeDays(days),
})),
@@ -799,7 +802,7 @@ export function createGhostMapsLayer({
};
}),
legend: [],
info: `${_ageDays === null ? t('All markers') : t('Event age: {days}d · undated kept', { days: formatNumber(_ageDays) })} · ${info}`,
info: `${_ageDays === null ? t('All markers') : tn(_ageDays, 'Event age: {days}d · undated kept', 'Event age: {days}d · undated kept', { days: formatNumber(_ageDays) })} · ${info}`,
infoTitle: t(
'S2 Underground publishes these KMZ products to GitHub. New uploads are detected within seconds and replace the previous edition automatically. Click a marker for its report.',
),
+30
View File
@@ -1,6 +1,7 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import * as Cesium from 'cesium';
import { setLocale } from '../../i18n/index.js';
import { createGhostMapsLayer } from './index.js';
import { GHOSTMAPS_PRODUCTS, GHOSTMAPS_LATEST_DROP } from './catalog.js';
@@ -248,6 +249,35 @@ test('age controls default to seven days and widening restores filtered and expi
assert.equal(ageChip(layer, null).active, true);
});
test('the event age agrees with its number of days', async (t) => {
t.after(() => setLocale('en'));
const { layer, viewer } = fixture(t, { reports: [{ name: 'Undated' }] });
await layer.update(viewer);
const info = () =>
layer.getRowControls().info.split(' · ').slice(0, 2).join(' · ');
assert.equal(
ageChip(layer, 1).title,
'Maximum event age: 1d; undated markers are kept',
);
setLocale('de');
assert.equal(
ageChip(layer, 1).title,
'Maximales Ereignisalter: 1 Tag; undatierte Markierungen bleiben erhalten',
);
assert.equal(
ageChip(layer, 7).title,
'Maximales Ereignisalter: 7 Tage; undatierte Markierungen bleiben erhalten',
);
assert.equal(info(), 'Ereignisalter: 7 Tage · undatierte bleiben');
await ageChip(layer, 1).onClick();
assert.equal(info(), 'Ereignisalter: 1 Tag · undatierte bleiben');
setLocale('es');
assert.equal(
info(),
'Antigüedad: 1 día · se conservan los marcadores sin fecha',
);
});
test('age preferences persist independently of product choices and reject invalid storage', async (t) => {
const values = new Map([['gev.ghostmaps.products', '["cip"]']]);
const storage = {
@@ -69,3 +69,38 @@ test('the mission panel translates only the fallback status', (t) => {
assert.equal(shownStatus(UNKNOWN_LAUNCH_STATUS), 'Desconocido');
assert.equal(shownStatus('Launch Successful'), 'Launch Successful');
});
test('a confirmed landing position is worded apart from the CONFIRMED sightings chip', (t) => {
t.after(() => setLocale('en'));
const position = () =>
createPanel({
state: {
_selectedLaunchId: 'mission-1',
_launches: [
{
id: 'mission-1',
name: 'Example',
status: 'Launch Successful',
payloads: [],
recoveryStages: [
{
name: 'B1080',
endpoint: { lat: 28.41, lon: -80.6, accuracy: 'CONFIRMED' },
},
],
},
],
_replayTracks: new Map(),
},
parts: {
overlays: { shortMissionLabel: (name) => name },
policyHelpers: { missionPathPresentation: () => ({}) },
replay: { presentReplay: () => ({}) },
},
}).presentMission().stages[0].position;
assert.match(position(), / · CONFIRMED$/);
// One landing, singular: sv BEKRÄFTAD, where the sightings chip says
// BEKRÄFTADE.
setLocale('sv');
assert.match(position(), / · BEKRÄFTAD$/);
});
@@ -542,7 +542,7 @@ test('retention never revives an incumbent card after the observation window exp
test('all heights and the sampled fallback use the same sightings-in-view count label', () => {
const h = harness();
h.state.renderedRows = [sighting];
assert.equal(h.layer.getStats().countLabel, '1 sightings in view');
assert.equal(h.layer.getStats().countLabel, '1 sighting in view');
h.state.sightingCount = 2000;
assert.equal(h.layer.getStats().count, 2000);
assert.equal(
@@ -560,6 +560,32 @@ test('all heights and the sampled fallback use the same sightings-in-view count
}
});
test('the sightings count takes the plural form of its number', (t) => {
t.after(() => setLocale('en'));
const h = harness();
const label = (count) => {
h.state.sightingCount = count;
return h.layer.getStats().countLabel;
};
setLocale('ru');
assert.equal(label(1), '1 наблюдение в кадре');
assert.equal(label(3), '3 наблюдения в кадре');
assert.equal(label(5), '5 наблюдений в кадре');
setLocale('de');
assert.equal(label(1), '1 Beobachtung im Bild');
assert.equal(label(2000), '2.000 Beobachtungen im Bild');
});
test('the CONFIRMED chip names the sightings, apart from a confirmed launch landing', (t) => {
t.after(() => setLocale('en'));
const h = harness();
assert.equal(h.chip('quality-confirmed').label, 'CONFIRMED');
setLocale('sv');
assert.equal(h.chip('quality-confirmed').label, 'BEKRÄFTADE');
setLocale('es');
assert.equal(h.chip('quality-confirmed').label, 'CONFIRMADAS');
});
test('a stale fallback with a failed-refresh deadline remains DEGRADED, retryable and dated to the cached data', async () => {
const h = harness({
getSnapshotDetail: async () => ({
+9 -5
View File
@@ -1,4 +1,4 @@
import { t, formatNumber, translateKnown } from '../../i18n/index.js';
import { t, tn, formatNumber, translateKnown } from '../../i18n/index.js';
import { msg } from '../../i18n/marker.js';
import { translateFeedError } from '../../ui/statusText.js';
import { wildlifeIconicGroup } from './model.js';
@@ -137,7 +137,8 @@ export function createControls({ state, services, parts }) {
const chips = [
chip({
id: WILDLIFE_CONFIRMED_CHIP_ID,
label: t('CONFIRMED'),
// The sightings, plural; a launch landing is CONFIRMED alone.
label: t('CONFIRMED', { context: 'sightings filter' }),
title: t('Show only community-confirmed (research-grade) sightings'),
params: {
confirmed: confirmedFailed ? state.confirmed : !state.confirmed,
@@ -214,9 +215,12 @@ export function createControls({ state, services, parts }) {
stale: state.stale,
loading,
refreshing,
countLabel: t('{count} sightings in view', {
count: formatNumber(count),
}),
countLabel: tn(
count,
'{count} sighting in view',
'{count} sightings in view',
{ count: formatNumber(count) },
),
loadingLabel: loading
? t('loading...')
: refreshing
@@ -1987,7 +1987,7 @@ test('unavailable grids fail closed to visible sampled sprites without a global
assert.equal(h.clicks.collection.values[0].id, 'wildlife:inat:1');
assert.ok(h.clicks.collection.values[0].width * 0.5 >= 8);
assert.equal(h.layer.getStats().count, 1);
assert.match(h.layer.getStats().countLabel, /sightings in view/);
assert.equal(h.layer.getStats().countLabel, '1 sighting in view');
assert.equal(h.layer.getStats().partial, undefined);
assert.equal(layerFeedState(h.layer.getStats()), 'degraded');
assert.match(h.layer.getStats().error, /Malformed iNaturalist grid response/);
@@ -2024,7 +2024,7 @@ test('an oversized view coarsens to a complete grid within the six-tile cap', as
await h.update();
assert.equal(h.clicks.collection.values.length, 1);
assert.equal(h.clicks.collection.values[0].id, 'wildlife:inat:1');
assert.match(h.layer.getStats().countLabel, /sightings in view/);
assert.match(h.layer.getStats().countLabel, /sightings? in view/);
assert.equal(layerFeedState(h.layer.getStats()), 'nominal');
h.layer.destroy();
});
+40
View File
@@ -7,6 +7,7 @@ import assert from 'node:assert/strict';
import { createPinia } from 'pinia';
import { createApp, defineComponent, h, nextTick } from 'vue';
import { CockpitViewController } from './cockpitController.js';
import { setLocale } from '../i18n/index.js';
import { useCockpitStore } from './stores/cockpit.js';
import CockpitView from './views/CockpitView.vue';
import ContextView from './views/ContextView.vue';
@@ -355,6 +356,33 @@ test('the bridge radar shows nearby ships without its own and steps its range',
assert.ok(!$('#cockpit-radar') || $('#cockpit-radar').hidden);
});
test('the radar range and ring spacing agree with their distance (ru)', async (t) => {
const { $, cockpit } = fixture(t);
t.after(() => setLocale('en'));
setLocale('ru');
cockpit.enter();
await settle();
const shown = () => [
$('#cockpit-radar-range').textContent.trim(),
$('.cockpit-radar-rings').textContent.trim(),
];
// The ring spacing is a fraction at the short ranges: Intl.PluralRules
// gives 0.75 and 1.5 the form of their own.
const expected = [
['3 МОР. МИЛИ', 'КОЛЬЦА 0,75 МОР. МИЛИ'],
['6 МОР. МИЛЬ', 'КОЛЬЦА 1,5 МОР. МИЛИ'],
['12 МОР. МИЛЬ', 'КОЛЬЦА 3 МОР. МИЛИ'],
['24 МОР. МИЛИ', 'КОЛЬЦА 6 МОР. МИЛЬ'],
];
for (const [index, labels] of expected.entries()) {
if (index) {
$('#cockpit-radar-range').click();
await settle();
}
assert.deepEqual(shown(), labels);
}
});
test('contact navigation does not jump ship from the bridge', async (t) => {
const { cockpit, navigations } = fixture(t);
cockpit.enter();
@@ -1201,6 +1229,18 @@ test('a ship with no true heading is held, and labelled, on its course', async (
signals.some(([, , , detail]) => /COURSE 095°/.test(detail)),
JSON.stringify(signals),
);
// A ship's course has a word of its own: pt RUMO, an aircraft's CURSO.
t.after(() => setLocale('en'));
setLocale('pt');
signals.length = 0;
cockpit.exit();
await settle();
cockpit.enter();
await settle();
assert.ok(
signals.some(([, , , detail]) => /· RUMO 095°$/.test(detail)),
JSON.stringify(signals),
);
});
test('both entries name the subject the same way', async () => {
+5 -2
View File
@@ -1,5 +1,5 @@
/** Instrument values, routes and vision controls for the Cockpit controller. */
import { formatNumber, t } from '../i18n/index.js';
import { formatNumber, t, tn } from '../i18n/index.js';
import {
COCKPIT_VISION_MODES,
normalizeCockpitVisionMode,
@@ -379,7 +379,10 @@ export function updateRadar(info) {
);
this.publishRadar({
...picture,
rangeLabel: t('{range} NM', { range: formatNumber(rangeNm) }),
// A plural, as the ring spacing is: ru «3 МОР. МИЛИ», «12 МОР. МИЛЬ».
rangeLabel: tn(rangeNm, '{range} NM', '{range} NM', {
range: formatNumber(rangeNm),
}),
});
}
+8
View File
@@ -13,6 +13,7 @@ import { createPinia } from 'pinia';
import { createApp, defineComponent, h, nextTick } from 'vue';
import * as Cesium from 'cesium';
import { CockpitViewController } from './cockpitController.js';
import { setLocale, t as translate } from '../i18n/index.js';
import { useCockpitStore } from './stores/cockpit.js';
import { useHudStore } from './stores/hud.js';
import CockpitView from './views/CockpitView.vue';
@@ -534,6 +535,13 @@ test('a site row turns the camera onto it, holds it, and reads its off-nadir ang
assert.match(held.className, /^track actionable$/);
assert.match(held.detail, /^FOCUS · BASE · OFF-NADIR/);
assert.equal(siteRow(scene, 'alpha').getAttribute('aria-label'), 'Release the camera from Camp Alpha');
// The held site's FOCUS is a status, worded apart from the FOCUS command.
t.after(() => setLocale('en'));
setLocale('es');
await refreshRows(scene);
const heldEs = rows(scene).find((row) => row.target?.id === SITES.alpha.id);
assert.match(heldEs.detail, /^ENFOCADO · /);
assert.equal(translate('FOCUS'), 'ENFOCAR', 'the command keeps its verb');
});
test('another site row switches the focus; the held site row ends it', async (t) => {
+2 -1
View File
@@ -132,7 +132,8 @@ function siteRows(info, { settled = true } = {}) {
}),
});
const words = [installationClassLabel(site.class), angle];
if (focused) words.unshift(t('FOCUS'));
// A status, not the FOCUS command: es «ENFOCADO», not «ENFOCAR».
if (focused) words.unshift(t('FOCUS', { context: 'site status' }));
return {
key: `site:${site.id}`,
// The held site reads as the subject does.
+14
View File
@@ -7,6 +7,7 @@ import assert from 'node:assert/strict';
import { createPinia } from 'pinia';
import { createApp, defineComponent, h, nextTick } from 'vue';
import { CockpitViewController } from './cockpitController.js';
import { setLocale } from '../i18n/index.js';
import { useCockpitStore } from './stores/cockpit.js';
import CockpitView from './views/CockpitView.vue';
import ContextView from './views/ContextView.vue';
@@ -255,3 +256,16 @@ test('entering asks for a panel layout before Vue shows the cards', async (t) =>
await new Promise((resolve) => setTimeout(resolve, 50));
assert.deepEqual(laid, ['context', 'signals']);
});
test('an aircraft is acquired on its CURSO in Portuguese; a ship keeps RUMO', async (t) => {
const { cockpit } = fixture(t);
t.after(() => setLocale('en'));
setLocale('pt');
const signals = [];
cockpit.pushCockpitSignal = (...args) => signals.push(args);
cockpit.enter();
await nextTick();
const acquired = signals.find(([key]) => key === 'track');
assert.ok(acquired, JSON.stringify(signals));
assert.equal(acquired[3], 'UAL123 · CURSO 092°');
});
+3 -1
View File
@@ -326,9 +326,11 @@ export function enter({ kind = null } = {}) {
'track',
t('TRACK ACQUIRED'),
// A ship with no true heading is held on its course over ground; one
// with neither is named without a direction.
// with neither is named without a direction. A ship's course has a
// word of its own: pt «RUMO», where an aircraft's is «CURSO».
info.trackSource === 'course'
? t('{label} · COURSE {heading}°', {
context: 'vessel',
label: info.name,
heading: trackHeading,
})
+34 -11
View File
@@ -1,6 +1,6 @@
<script setup>
import { computed } from 'vue';
import { t } from '../../i18n/index.js';
import { formatNumber, t, tn } from '../../i18n/index.js';
import UiButton from '../kit/UiButton.vue';
import UiEmpty from '../kit/UiEmpty.vue';
import UiSelect from '../kit/UiSelect.js';
@@ -63,9 +63,15 @@ const categoryOptions = computed(() => [
const windowOptions = computed(() =>
(props.view?.windowChoices ?? []).map((hours) => ({
value: String(hours),
label: t('Last {hours} h', { hours }),
label: lastHours(hours),
})),
);
// The window offers 1 h, so every hour count is a plural: es «Última 1 h».
function lastHours(hours) {
return tn(hours, 'Last {hours} h', 'Last {hours} h', {
hours: formatNumber(hours),
});
}
// The longest choice is the server's whole window, kept as no choice.
const chooseWindow = (hours) =>
setFilter('hours', hours === props.view?.windowChoices?.[0] ? null : hours);
@@ -109,7 +115,16 @@ const clear = () => props.onParams({ clear: true });
<section
v-if="view"
class="news-readout"
:aria-label="t('News, last {hours} hours', { hours: view.windowHours })"
:aria-label="
tn(
view.windowHours,
'News, last {hours} hour',
'News, last {hours} hours',
{
hours: formatNumber(view.windowHours),
},
)
"
>
<UiSelect
v-if="windowOptions.length > 1"
@@ -120,7 +135,7 @@ const clear = () => props.onParams({ clear: true });
@update:model-value="chooseWindow(Number($event))"
/>
<p v-else class="news-readout__window ui-mono">{{
t('Last {hours} h', { hours: view.windowHours })
lastHours(view.windowHours)
}}</p>
<div
class="news-readout__sections"
@@ -196,9 +211,12 @@ const clear = () => props.onParams({ clear: true });
v-else-if="!view.inView.items.length && !view.inView.loading"
class="news-readout__empty"
:title="
t('Nothing reported near here in the last {hours} h', {
hours: view.windowHours,
})
tn(
view.windowHours,
'Nothing reported near here in the last {hours} h',
'Nothing reported near here in the last {hours} h',
{ hours: formatNumber(view.windowHours) },
)
"
/>
<ol
@@ -223,7 +241,9 @@ const clear = () => props.onParams({ clear: true });
class="news-readout__section"
:aria-label="t('Latest news')"
>
<h3 class="news-readout__head ui-mono">{{ t('Latest') }}</h3>
<h3 class="news-readout__head ui-mono">{{
t('Latest', { context: 'news list' })
}}</h3>
<UiEmpty
v-if="view.key"
class="news-readout__empty"
@@ -247,9 +267,12 @@ const clear = () => props.onParams({ clear: true });
v-else-if="!view.loading && !view.error"
class="news-readout__empty"
:title="
t('No news matches these filters in the last {hours} h', {
hours: view.windowHours,
})
tn(
view.windowHours,
'No news matches these filters in the last {hours} h',
'No news matches these filters in the last {hours} h',
{ hours: formatNumber(view.windowHours) },
)
"
/>
<div class="news-readout__footer">
+50
View File
@@ -1,6 +1,7 @@
import '../testSupport/registerDom.mjs';
import test from 'node:test';
import assert from 'node:assert/strict';
import { setLocale, t as translate } from '../i18n/index.js';
import { createNewsPanel } from './newsPanel.js';
import {
NEWS_CATEGORIES,
@@ -385,6 +386,55 @@ test('the window choice offers shorter windows; the longest is the server window
assert.deepEqual(calls.at(-1)[1], { filters: { hours: null } });
});
test('the time window agrees with its number of hours', (t) => {
t.after(() => setLocale('en'));
setLocale('es');
const { news, panel } = fixture();
news.update(view({ windowHours: 24, windowChoices: [24, 12, 6, 3, 1] }));
const choice = panel.querySelector(
'select.news-readout__window-choice, .news-readout__window-choice select',
);
assert.deepEqual(
[...choice.options].map((option) => option.textContent),
['Últimas 24 h', 'Últimas 12 h', 'Últimas 6 h', 'Últimas 3 h', 'Última 1 h'],
);
news.update(view({ windowHours: 1, items: [], hasMore: false }));
assert.equal(
panel.querySelector('.news-readout__window').textContent,
'Última 1 h',
);
assert.equal(
panel.querySelector('.news-readout').getAttribute('aria-label'),
'Noticias de la última 1 hora',
);
assert.match(
panel.textContent,
/En la última 1 h no hay noticias que coincidan con estos filtros/,
);
setLocale('ru');
news.update(view({ windowHours: 1, items: [], hasMore: false }));
assert.equal(
panel.querySelector('.news-readout').getAttribute('aria-label'),
'Новости за последний 1 час',
);
news.update(view({ windowHours: 12, items: [], hasMore: false }));
assert.equal(
panel.querySelector('.news-readout').getAttribute('aria-label'),
'Новости за последние 12 часов',
);
news.destroy();
});
test('the Latest news heading is worded apart from the timeline button (fr)', (t) => {
t.after(() => setLocale('en'));
setLocale('fr');
const { news, panel } = fixture();
news.update(view());
assert.equal(panel.querySelector('.news-readout__head').textContent, 'Dernières');
assert.equal(translate('Latest'), 'Dernière', 'the timeline keeps its own');
news.destroy();
});
test('the panel names the window the server serves', () => {
const { news, panel } = fixture();
news.update(view({ windowHours: 12 }));
+3 -1
View File
@@ -118,9 +118,11 @@ const ringFractions = computed(() =>
? radar.value.ringsNm.map((ring) => ring / radar.value.rangeNm)
: [],
);
// The spacing is a fraction at the shorter ranges (0.75, 1.5 NM), which
// Intl.PluralRules gives a form of its own: ru «0,75 МОР. МИЛИ».
const ringLabel = computed(() =>
radar.value?.ringsNm.length
? t('RINGS {spacing} NM', {
? tn(radar.value.ringsNm[0], 'RINGS {spacing} NM', 'RINGS {spacing} NM', {
spacing: formatNumber(radar.value.ringsNm[0]),
})
: '',
@@ -163,6 +163,20 @@ test('filters narrow the list as the viewer types and picks', async (t_) => {
assert.deepEqual(shownIds(), ['nasa-eonet-events']);
});
test('the shown count agrees with its number (he)', async (t_) => {
const { owner } = mount(t_);
setLocale('he');
owner.open();
await settle();
const status = () => $('.data-library-status').textContent.trim();
assert.match(status(), /^מוצגים\s+\S*3\S*\s+מתוך/);
const search = $('#data-library input[type="search"]');
search.value = 'eonet';
search.dispatchEvent(new Event('input'));
await settle();
assert.match(status(), /^מוצג\s+\S*1\S*\s+מתוך/);
});
test('Add becomes Remove on the same focused button; Zoom closes first', async (t_) => {
const { owner, library } = mount(t_);
owner.open();
+11 -5
View File
@@ -1,7 +1,7 @@
<script setup>
import { storeToRefs } from 'pinia';
import { computed, nextTick, useTemplateRef, watch } from 'vue';
import { t, tn } from '../../../i18n/index.js';
import { formatNumber, t, tn } from '../../../i18n/index.js';
import UiButton from '../../kit/UiButton.vue';
import UiSelect from '../../kit/UiSelect.js';
import {
@@ -53,12 +53,18 @@ watch(
const tiles = computed(() => libraryStatTiles(props.view.summary));
const themes = computed(() => libraryThemeOptions());
// The words for the shown entries agree with their count: he «מוצג 1».
const status = computed(() =>
props.view.ready
? t('Showing {shown} of {total}', {
shown: props.view.shown.length,
total: props.view.total,
})
? tn(
props.view.shown.length,
'Showing {shown} of {total}',
'Showing {shown} of {total}',
{
shown: formatNumber(props.view.shown.length),
total: formatNumber(props.view.total),
},
)
: t('Checking what this instance serves…'),
);
const resetText = computed(() => {
+2
View File
@@ -3917,6 +3917,8 @@ async function requestStreetLevel(
};
// Then the place: a name that geocodes to nothing changes nothing else.
// "the view centre" is English for the model; the card (speech.js) gives
// it messages of its own, since it is a phrase and not a place name.
label =
query ||
(entity ? String(entity.label || entity.id) : '') ||
+32 -11
View File
@@ -332,6 +332,16 @@ const ERROR_PATTERNS = [
place: localizePlaceName(place),
}),
],
// show_street_level names no place when it looks at the view centre. The
// phrase is not a name: it has a message of its own, so each language
// words it in the case its preposition asks for.
[
/^No (.+) imagery near the view centre$/,
([, source]) =>
t('No {source} imagery near the view centre', {
source: translateKnown(source),
}),
],
[
/^No (.+) imagery near (.+)$/,
([, source, place]) =>
@@ -1112,14 +1122,21 @@ export function planStepLabel(name, args = {}) {
}
case 'show_street_level': {
const source = STREET_LEVEL_SOURCE_NAMES[args.provider];
const place = args.query
? shownPlace(args.query, 32)
: args.latitude != null
? t('this spot')
: t('the view centre');
// "This spot" and "the view centre" are phrases, not place names:
// each is a message of its own, worded in the grammar of the language.
if (args.query) {
const place = shownPlace(args.query, 32);
return source
? t('{source} at {place}', { source, place })
: t('Street level at {place}', { place });
}
if (args.latitude != null)
return source
? t('{source} at this spot', { source })
: t('Street level at this spot');
return source
? t('{source} at {place}', { source, place })
: t('Street level at {place}', { place });
? t('{source} at the view centre', { source })
: t('Street level at the view centre');
}
case 'set_layer_visibility': {
const on = args.enabled !== false;
@@ -1195,6 +1212,9 @@ export function narrationLabel(name, args = {}) {
}
}
/** The place show_street_level reports when it names none (gevActions). */
const VIEW_CENTRE_LABEL = 'the view centre';
/** On-screen labels for progress steps. */
const STEP_LABELS = Object.freeze({
resolve: msg('Finding places'),
@@ -1219,10 +1239,11 @@ export function progressStepLabel(step, label) {
: step
? spokenLabel(step, 24)
: t('Working');
// The join is a catalog string so each language spaces its colon.
return label
? t('{name}: {state}', { name: base, state: spokenLabel(label, 32) })
: base;
// The join is a catalog string so each language spaces its colon. The
// view centre is a phrase show_street_level reports in English, not a name.
const state =
label === VIEW_CENTRE_LABEL ? t('the view centre') : spokenLabel(label, 32);
return label ? t('{name}: {state}', { name: base, state }) : base;
}
/**
+49 -1
View File
@@ -10,7 +10,7 @@ import {
} from './speech.js';
import { presentResult } from './resultDisplay.js';
import { countWords, findHedges } from './speechLint.js';
import { setLocale } from '../i18n/index.js';
import { setLocale, t } from '../i18n/index.js';
function envelope(name, result, args) {
return attachVoiceResult(name, result, args);
@@ -779,3 +779,51 @@ test('progress step labels join through the catalog colon', () => {
setLocale('en');
}
});
test('the street-level card words "the view centre" and "this spot" as phrases, not names', () => {
setLocale('de');
try {
assert.equal(
planStepLabel('show_street_level', { provider: 'mapillary' }),
'Mapillary in der Bildmitte',
);
assert.equal(
planStepLabel('show_street_level', { latitude: 1, longitude: 2 }),
'Straßenebene an dieser Stelle',
);
assert.equal(
planStepLabel('show_street_level', { query: 'Alexanderplatz', provider: 'kartaview' }),
'KartaView: Alexanderplatz',
);
const empty = envelope('show_street_level', {
ok: false,
stage: 'imagery',
noImagery: true,
atViewCentre: true,
label: 'the view centre',
providerName: 'Mapillary',
error: 'No Mapillary imagery near the view centre',
});
assert.deepEqual(empty.display.lines, [
'Keine Bilder von Mapillary in der Nähe der Bildmitte',
]);
assert.equal(empty.say, 'No Mapillary imagery near the view centre.');
const named = envelope('show_street_level', {
ok: false,
stage: 'imagery',
noImagery: true,
label: 'Alexanderplatz',
providerName: 'Mapillary',
error: 'No Mapillary imagery near Alexanderplatz',
});
assert.deepEqual(named.display.lines, [
'Keine Bilder von Mapillary in der Nähe von Alexanderplatz',
]);
assert.equal(
progressStepLabel('imagery', 'the view centre'),
`${t('Opening imagery')}: die Bildmitte`,
);
} finally {
setLocale('en');
}
});