+ {/* The mode leads, because it decides everything below it. */}
+
+
+
{tp?.label ?? '—'}
+
+ {tp?.inverting && (
+
{t('sat.inverting')}
+ )}
+ {tp?.linear && (
+
+ {Math.round((tp.down_hi - tp.down_lo) / 1000)} kHz
+
+ )}
+ {bird?.geostationary && (
+
{t('sat.geo')}
+ )}
+
+
-
- {!!tp?.mode && {tp.mode}}
- {!!tp?.ctcss && CTCSS {tp.ctcss.toFixed(1)}}
- {tp?.inverting && {t('sat.inverting')}}
- {tp?.linear && {Math.round((tp.down_hi - tp.down_lo) / 1000)} kHz}
- {bird?.geostationary && {t('sat.geo')}}
-
+
+ {/* The tone, on the FM birds, with the same weight as a frequency.
+ It IS one, as far as the outcome goes: a repeater called without
+ its tone does not answer, and the operator hears an empty
+ channel and concludes the satellite is not up. Said explicitly
+ when there is none, too — a blank line cannot tell "no tone"
+ from "OpsLog does not know". */}
+ {tp?.mode === 'FM' && (
+
+
+ {t('sat.tone')}
+
+ {tp.ctcss ? (
+ <>
+
+ {tp.ctcss.toFixed(1)} Hz
+
+ {t('sat.toneHint')}
+ >
+ ) : (
+ {t('sat.toneNone')}
+ )}
+
+ )}
{/* What is coming. */}
diff --git a/frontend/src/lib/i18n.tsx b/frontend/src/lib/i18n.tsx
index 499c01d..559f2d8 100644
--- a/frontend/src/lib/i18n.tsx
+++ b/frontend/src/lib/i18n.tsx
@@ -604,6 +604,7 @@ const en: Dict = {
'sat.aos': 'Rises in', 'sat.los': 'Sets in', 'sat.rise': 'Rise', 'sat.peak': 'Peak', 'sat.set': 'Set',
'sat.range': 'Distance', 'sat.altitude': 'Altitude', 'sat.footprint': 'Footprint',
'sat.tipEl': 'Elevation', 'sat.tipAz': 'Azimuth', 'sat.tipRange': 'Distance', 'sat.tipAlt': 'Altitude',
+ 'sat.tone': 'Tone', 'sat.toneHint': 'CTCSS on the uplink', 'sat.toneNone': 'no tone needed',
'sat.tipAos': 'Rises', 'sat.tipLos': 'Sets', 'sat.tipMaxEl': 'Peak',
'sat.tipBelow': 'below the horizon', 'sat.tipNoPass': 'no pass in the prediction window',
'sat.approaching': 'approaching', 'sat.receding': 'receding', 'sat.below': 'below the horizon',
@@ -1218,6 +1219,7 @@ const fr: Dict = {
'sat.aos': 'Lever dans', 'sat.los': 'Coucher dans', 'sat.rise': 'Lever', 'sat.peak': 'Culmination', 'sat.set': 'Coucher',
'sat.range': 'Distance', 'sat.altitude': 'Altitude', 'sat.footprint': 'Empreinte',
'sat.tipEl': 'Élévation', 'sat.tipAz': 'Azimut', 'sat.tipRange': 'Distance', 'sat.tipAlt': 'Altitude',
+ 'sat.tone': 'Tonalité', 'sat.toneHint': 'CTCSS sur la montée', 'sat.toneNone': 'aucune tonalité requise',
'sat.tipAos': 'Lever', 'sat.tipLos': 'Coucher', 'sat.tipMaxEl': 'Culmination',
'sat.tipBelow': 'sous l’horizon', 'sat.tipNoPass': 'aucun passage dans la fenêtre de prévision',
'sat.approaching': 'se rapproche', 'sat.receding': 's’éloigne', 'sat.below': 'sous l’horizon',