diff --git a/changelog.json b/changelog.json index 98095bc..9d49aea 100644 --- a/changelog.json +++ b/changelog.json @@ -10,7 +10,7 @@ "PowerGenius XL: the amplifier's real state is read at startup. Its status frame carries no 'operate' field — the state is in 'state' — so on the direct GSCP link the flag was never read at all and OpsLog opened claiming STANDBY on an amp that was in line, with the first press of the button then commanding the state it was already in. IDLE means in line, not keyed.", "Antenna Genius: an option to write the SELECTED antenna into MY_ANTENNA, under the name it carries on the switch, ahead of the band default from Operating conditions. Which of the two ports counts is decided by the antenna jack the radio is transmitting on (ANT1/ANT2 on a Flex), with the jack-to-port wiring set once in Preferences — neither device can report it. When the port cannot be told, the log keeps the band default rather than naming an antenna at random.", "The awards tab beside the entry form (F3) now offers only the awards this station follows, and drops the ones switched off — the same list the Awards tab reads. It offered every award that existed, so a station chasing three of them picked references out of a list of twenty.", - "Kenwood / Elecraft CAT: the connection is a choice of three — USB / serial, RS-232 to Ethernet (a serial bridge carrying the same CAT), or the radio's own network protocol, which is named and refused rather than silently absent. Only the fields of the chosen one are shown. Before, the COM port and the network address sat side by side with nothing to say that the address wins whenever it is filled in, and the example address named port 4532 — Hamlib rigctld, a different protocol, and the one OpsLog itself serves under Share CAT." + "CAT settings ask two questions instead of one: WHICH RADIO, then HOW IT IS CONNECTED — USB / serial, RS-232 over Ethernet (a serial bridge carrying the same CAT), or the manufacturer's own network protocol. The old list mixed the two ('Icom (USB)' and 'Icom (network)' were separate entries, while Kenwood and Elecraft hid the same choice in a field further down), and where an option does not exist for a radio it is now named and refused rather than silently absent. The example network address also named port 4532 — Hamlib rigctld, a different protocol, and the one OpsLog itself serves under Share CAT." ], "fr": [ "Console Elecraft : les mesures d'émission sont lues dès que la RADIO se déclare en émission, et plus seulement quand OpsLog l'a mise en émission. Passer en émission par le PTT de façade, une pédale ou le bouton du micro laissait le panneau croire à une réception — et comme les barres de puissance et de ROS ne sont lues qu'en émission, elles ne l'étaient jamais pour qui manipule à la main.", @@ -20,7 +20,7 @@ "Power Genius XL : l'état réel de l'amplificateur est lu au démarrage. Sa trame d'état ne contient pas de champ « operate » — l'état est dans « state » — si bien que sur la liaison GSCP directe l'indicateur n'était jamais lu : OpsLog s'ouvrait en annonçant STANDBY sur un ampli en ligne, et le premier appui commandait l'état dans lequel il se trouvait déjà. IDLE veut dire en ligne, pas en émission.", "Antenna Genius : une option pour inscrire l'antenne SÉLECTIONNÉE dans MY_ANTENNA, sous le nom qu'elle porte sur le switch, avant l'antenne par défaut des conditions de trafic. C'est la prise d'antenne sur laquelle la radio émet (ANT1/ANT2 sur un Flex) qui décide du port retenu, le câblage prise→port se règlant une fois dans les préférences — aucun des deux appareils ne peut le dire. Quand le port ne peut pas être déterminé, le journal conserve l'antenne par défaut plutôt que d'en nommer une au hasard.", "L'onglet des diplômes à côté de la saisie (F3) ne propose plus que les diplômes suivis par la station, et écarte ceux qui sont désactivés — la même liste que l'onglet Diplômes. Il proposait tous les diplômes existants : une station qui en chasse trois choisissait ses références dans une liste de vingt.", - "CAT Kenwood / Elecraft : la connexion devient un choix entre trois — USB / série, RS-232 vers Ethernet (un pont série qui transporte le même CAT), ou le protocole réseau propre à la radio, qui est nommé et refusé plutôt qu'absent en silence. Seuls les champs du mode retenu s'affichent. Auparavant, le port COM et l'adresse réseau coexistaient sans rien indiquer que l'adresse l'emporte dès qu'elle est renseignée, et l'exemple citait le port 4532 — Hamlib rigctld, un autre protocole, et celui qu'OpsLog propose lui-même sous « Partager le CAT »." + "Les réglages CAT posent deux questions au lieu d'une : QUELLE RADIO, puis COMMENT ELLE EST RELIÉE — USB / série, RS-232 sur Ethernet (un pont série qui transporte le même CAT), ou le protocole réseau propre au constructeur. L'ancienne liste mélangeait les deux (« Icom (USB) » et « Icom (réseau) » étaient deux entrées, tandis que Kenwood et Elecraft cachaient le même choix dans un champ plus bas), et là où une option n'existe pas pour une radio, elle est désormais nommée et refusée plutôt qu'absente en silence. L'exemple d'adresse réseau citait par ailleurs le port 4532 — Hamlib rigctld, un autre protocole, et celui qu'OpsLog propose lui-même sous « Partager le CAT »." ] }, { diff --git a/frontend/src/components/SettingsModal.tsx b/frontend/src/components/SettingsModal.tsx index ad7198a..239c7fb 100644 --- a/frontend/src/components/SettingsModal.tsx +++ b/frontend/src/components/SettingsModal.tsx @@ -1476,6 +1476,43 @@ const ICOM_MODELS: { name: string; addr: number }[] = [ { name: 'IC-9700', addr: 0xA2 }, ]; +// The radios OpsLog talks to, by BRAND, and the ways each one can be reached. +// +// Three connections exist in the world and each brand has its own subset: +// usb — a COM port, the radio's own USB or a serial cable +// bridge — RS-232 carried over Ethernet by a serial bridge (ser2net, an +// Ethernet-serial box): the SAME CAT bytes, a socket instead of wire +// native — the manufacturer's own network protocol, a session of its own +// +// The backend NAME stored in settings is unchanged — 'icom-net' is still +// 'icom-net' — because a settings file written by an older build has to keep +// working. This table is only how the two questions map onto it. +const CAT_BRANDS: { id: string; label: string; links: string[]; backend: (link: string) => string }[] = [ + { id: 'elecraft', label: 'Elecraft K3 / K4', links: ['usb', 'bridge', 'native'], backend: () => 'elecraft' }, + { id: 'kenwood', label: 'Kenwood', links: ['usb', 'bridge', 'native'], backend: () => 'kenwood' }, + { id: 'yaesu', label: 'Yaesu', links: ['usb'], backend: () => 'yaesu' }, + { id: 'icom', label: 'Icom', links: ['usb', 'native'], backend: (l) => (l === 'native' ? 'icom-net' : 'icom') }, + { id: 'flex', label: 'FlexRadio (SmartSDR)', links: ['native'], backend: () => 'flex' }, + { id: 'tci', label: 'Expert Electronics / SunSDR (TCI)', links: ['native'], backend: () => 'tci' }, + { id: 'xiegu', label: 'Xiegu', links: ['usb'], backend: () => 'xiegu' }, + { id: 'omnirig', label: 'OmniRig (any rig)', links: ['usb'], backend: () => 'omnirig' }, +]; + +// brandOfBackend reads the stored backend back into the two questions. +function brandOfBackend(backend: string, kenwoodLink?: string): { brand: string; link: string } { + switch (backend) { + case 'icom-net': return { brand: 'icom', link: 'native' }; + case 'icom': return { brand: 'icom', link: 'usb' }; + case 'flex': return { brand: 'flex', link: 'native' }; + case 'tci': return { brand: 'tci', link: 'native' }; + case 'yaesu': return { brand: 'yaesu', link: 'usb' }; + case 'xiegu': return { brand: 'xiegu', link: 'usb' }; + case 'kenwood': case 'elecraft': + return { brand: backend, link: kenwoodLink || 'usb' }; + default: return { brand: 'omnirig', link: 'usb' }; + } +} + export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChanged, flexAvailable, icomAvailable, yaesuAvailable }: Props) { const { t } = useI18n(); const [selected, setSelected] = useState((initialSection as SectionId) || 'station'); @@ -1520,6 +1557,25 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan digital_default: 'FT8', share_enabled: false, share_port: 4532, share_proto: 'rigctl', share_tci_port: 40001, ptt_hotkey_enabled: false, ptt_hotkey: '', ptt_hotkey_toggle: false, }); + // Brand + connection, derived from the stored backend rather than held + // separately: two sources for one fact drift apart the first time something + // else writes the backend (loading a profile, an older settings file). + const catBrand = brandOfBackend(catCfg.backend, (catCfg as any).kenwood_link).brand; + const catLink = brandOfBackend(catCfg.backend, (catCfg as any).kenwood_link).link; + const applyCatBrand = (id: string) => { + const b = CAT_BRANDS.find((x) => x.id === id); + if (!b) return; + // Keep the connection when the new brand offers it, otherwise take its + // first — picking Flex from Kenwood-over-USB has to land on something. + const link = b.links.includes(catLink) ? catLink : b.links[0]; + setCatCfg((s) => ({ ...s, backend: b.backend(link), kenwood_link: link } as any)); + }; + const applyCatLink = (link: string) => { + const b = CAT_BRANDS.find((x) => x.id === catBrand); + if (!b || !b.links.includes(link)) return; + setCatCfg((s) => ({ ...s, backend: b.backend(link), kenwood_link: link } as any)); + }; + // While true, the next key press is captured as the PTT hotkey. const [capturingPtt, setCapturingPtt] = useState(false); const [rotors, setRotors] = useState([]); @@ -3019,24 +3075,42 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan {t('cat.enable')} -
+ {/* BRAND, then CONNECTION. + The backend list mixed the two: "Icom (USB)" and "Icom (network)" + were separate entries, while Kenwood and Elecraft hid the same + choice in a field further down. An operator picks a radio, then + says how it is plugged in — so that is what the panel asks, in + that order, and the two answers together choose the backend. */} +
- - applyCatBrand(v)}> - {t('cat.optOmnirig')} - {t('cat.optFlex')} - {t('cat.optYaesu')} - {t('cat.optKenwood')} - {t('cat.optElecraft')} - {t('cat.optXiegu')} - {t('cat.optIcom')} - {t('cat.optIcomNet')} - {t('cat.optTci')} + {CAT_BRANDS.map((b) => {b.label})}
+
+ + {/* One button per connection the brand actually has. A brand with + a single way in still shows it, greyed: "there is no choice + here" is an answer, and an empty space is not. */} +
+ {(CAT_BRANDS.find((b) => b.id === catBrand)?.links ?? ['usb']).map((l) => ( + + ))} +
+ {catLink === 'native' && catBrand !== 'flex' && catBrand !== 'tci' && catBrand !== 'icom' && ( +

{t('cat.kwLinkNativeHint')}

+ )} +
{catCfg.backend === 'omnirig' && (
@@ -3185,21 +3259,6 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan The two were offered side by side with nothing to say which one the backend would use — it prefers the network address whenever the field is not empty, which is invisible from here. */} -
- - - {((catCfg as any).kenwood_link || 'usb') === 'native' && ( -

{t('cat.kwLinkNativeHint')}

- )} -
{(((catCfg as any).kenwood_link || 'usb') === 'usb') && (<>
diff --git a/frontend/src/lib/i18n.tsx b/frontend/src/lib/i18n.tsx index 9fd8882..17642b4 100644 --- a/frontend/src/lib/i18n.tsx +++ b/frontend/src/lib/i18n.tsx @@ -339,7 +339,7 @@ const en: Dict = { 'extsvc.hint': 'Upload logged QSOs to online logbooks. Each service uploads automatically on a new QSO when enabled; timing is per-service (immediate, or a 1–2 min delay so a mis-logged QSO can still be fixed first).', 'hw.motorTxInhibit': 'Inhibit transmission while the antenna is moving', 'hw.motorTxInhibitHint': 'Blocks the FlexRadio from transmitting while the elements move (needs FlexRadio in API mode + this antenna enabled). No effect with other radios.', 'hw.motorAntenna': 'Ultrabeam / Steppir', 'hw.motorEnable': 'Enable antenna control', 'hw.motorType': 'Antenna type', 'hw.motorTransport': 'Connection', 'hw.motorTcp': 'Network (TCP)', 'hw.motorSerial': 'Serial (COM)', 'hw.motorCom': 'Serial port', 'hw.motorComUb': '(2nd port of the USB cable)', 'hw.motorBaud': 'Baud', 'hw.steppirHint': 'SteppIR controllers are RS-232 serial (the DATA OUT DB9 port). Serial = a USB↔RS-232 (FTDI) adapter, shown as a COM port. Network = a serial-to-Ethernet bridge (as for the Ultrabeam).', 'hw.steppirRange': 'Tunable range', 'hw.steppirRangeHint': "The SteppIR's frequency coverage. On a band outside this range (e.g. 30 m on a 20 m–6 m SteppIR) OpsLog won't try to tune the antenna and won't inhibit transmission. Default 13–54 MHz (20 m–6 m); widen the low edge (e.g. 6) for a 40 m-equipped SteppIR.", 'hw.motorBands': 'Covered bands', 'hw.motorStep': 'Re-tune step', 'hw.motorBandFreqHint': 'Frequency each band button tunes the antenna to (kHz). Leave empty for the default shown.', 'hw.motorFollow': 'Follow rig frequency (auto-tune the antenna)', 'hw.ultrabeam': 'Antenna (Ultrabeam)', 'hw.audioVoice': 'Audio devices & voice keyer', // CAT panel body - 'cat.enable': 'Enable CAT', 'cat.backend': 'Backend', 'cat.optOmnirig': 'OmniRig', 'cat.optFlex': 'FlexRadio (API)', 'cat.share': 'Share CAT with other programs', 'cat.shareHint': 'Another program then reaches the radio through OpsLog — with every backend, not only the native ones. For Hamlib pick the rig model "Hamlib NET rigctl" and enter 127.0.0.1:4532; for TCI point the program at 127.0.0.1:40001.', 'cat.shareProto': 'Protocol', 'cat.shareRigctl': 'Hamlib NET rigctl — WSJT-X, JTDX, MSHV, Log4OM', 'cat.shareTci': 'TCI — Expert Electronics', 'cat.shareTciClash': 'The CAT backend is TCI too: ExpertSDR is probably already using port 40001 on this PC. Give the server another port, or share over Hamlib instead.', 'cat.sharePort': 'Sharing port', 'cat.pttKey': 'Enable PTT hotkey', 'cat.pttKeyPress': 'Press a key…', 'cat.pttKeyNone': 'Click to set a key', 'cat.pttKeyClear': 'Clear', 'cat.pttKeyToggle': 'Toggle mode (press to key, press again to unkey)', 'cat.pttKeyHint': 'While OpsLog is focused, this key keys the transmitter — held down by default (release to stop), or latched in toggle mode. It uses the Audio → PTT method (CAT / RTS / DTR), falling back to CAT keying. Pick a key you never type while logging (e.g. Pause, ScrollLock, or a footswitch mapped to one) — OpsLog swallows it so it never lands in a field.', 'cat.optXiegu': 'Xiegu (USB)', 'cat.xieguPort': 'Xiegu CAT port', 'cat.xieguBaudHint': 'Must match the radio menu (G90 default: 19200).', 'cat.xieguAddrHint': 'Factory CI-V address of the G90/X6100 family: 0x70.', 'cat.xieguPTTLine': 'How the rig is keyed', 'cat.xieguPTTCiv': 'CI-V command', 'cat.xieguPTTHint': 'A G90 does not transmit on the CI-V command: interfaces like the DE-19 key it on RTS or DTR. Pick the line yours uses \u2014 it is also what lets WSJT-X transmit through the shared CAT link.', 'cat.optYaesu': 'Yaesu (USB)', 'cat.optKenwood': 'Kenwood (USB, network)', 'cat.optElecraft': 'Elecraft K3/K4 (USB, network)', 'cat.elecraftHint': 'Digital modes automatically use DATA A (MD6+DT0) — the sub-mode FT8 audio needs.', 'cat.civTrace': 'Log the CAT protocol', 'cat.civTraceHint': 'Writes every CAT frame to and from the radio into the log \u2014 CI-V as hex, Kenwood as the text it exchanges. For reporting a rig that answers oddly \u2014 a button that does the wrong thing, a frequency that jumps. Session only: it is a diagnostic, and it makes the log large.', 'cat.kenwoodPort': 'Kenwood COM port', 'cat.kenwoodPortHint': 'The rig\u2019s CAT/USB serial port (TS-590, TS-890, TS-990, TS-2000, and Elecraft K3/K4 which speak the same dialect).', 'cat.kenwoodBaudHint': 'Must match MENU on the radio: a TS-590 leaves the factory at 9600, a TS-890 at 115200.', 'cat.kwLink': 'Connection', 'cat.kwLinkBridge': 'RS-232 to Ethernet (serial bridge)', 'cat.kwLinkNative': 'The radio\u2019s own network protocol', 'cat.kwLinkNativeHint': 'Not supported yet. It is a session with its own framing and login, not the CAT byte stream over a socket, so it has to be implemented per radio — and against one. Use USB, or a serial-to-Ethernet bridge, until then.', 'cat.kwLinkUsb': 'USB / serial', 'cat.kwLinkNet': 'Network', 'cat.kenwoodHostHint': 'The network option carries the SAME CAT commands over TCP instead of a cable: a serial-over-network bridge (ser2net, an Ethernet-serial adapter, a Raspberry Pi in the shack), or a radio that exposes its raw CAT port. It is NOT Hamlib — port 4532 is rigctld, a different protocol, and it is what OpsLog itself SERVES under \u201cShare CAT\u201d.', 'cat.kenwoodHost': 'Or over the network (host:port)', 'cat.yaesuPort': 'Yaesu CAT port', 'cat.yaesuPortHint': 'The rig CAT port — on an FTDX10/FTDX101 over USB this is the ENHANCED COM port, not the standard one.', 'cat.yaesuBaudHint': 'Must match the radio menu (FTDX10/FTDX101 default: 38400).', 'cat.lowerLines': 'Lower the DTR and RTS lines on connect', 'cat.lowerLinesHint': 'If your radio is always on TX, tick this.', 'cat.kwDataMode': 'Data modes (FT8/PSK…) use', 'cat.kwDataUsb': 'USB', 'cat.kwDataMd6': 'DATA A — MD6+DT0 (Elecraft K3/K4)', 'cat.kwDataKeep': 'Leave the rig’s mode unchanged', 'cat.kwDataHint': 'What OpsLog sets on the rig for a data mode. No single command fits every rig: an Elecraft K3/K4 wants DATA (MD6); a TS-590SG/TS-990S data mode is a USB modifier set on the rig, so pick USB or, safest, "Leave unchanged" and switch the rig to DATA yourself. On MD6 a plain Kenwood (TS-590/990) would land on FSK/RTTY — do not use it there.', 'cat.optIcom': 'Icom (CI-V USB)', 'cat.optIcomNet': 'Icom (CI-V network)', 'cat.optTci': 'TCI', 'flxpw.title': 'FlexRadio \u2014 power per band and mode', 'flxpw.hint': 'TX power applied when the band or mode changes. Leave a box empty to leave the power alone.', 'flxpw.band': 'Band', 'flxb.title': 'FlexRadio \u2014 per-band antennas and power', 'flxb.hint': 'Antennas are applied when the band changes; power when the band or the mode changes. Leave a power box empty to leave it alone.', 'flxb.rxAnt': 'RX antenna', 'flxb.txAnt': 'TX antenna', 'flxb.noRadio': 'No antennas reported yet \u2014 connect the FlexRadio, then reopen this panel.', 'flxpw.phone': 'Phone', 'flxpw.digi': 'Digital', 'flxpw.noBands': 'No bands configured \u2014 add them in Lists \u2192 Bands.', 'flxpw.saved': 'Saved', + 'cat.enable': 'Enable CAT', 'cat.brand': 'Radio', 'cat.backend': 'Backend', 'cat.optOmnirig': 'OmniRig', 'cat.optFlex': 'FlexRadio (API)', 'cat.share': 'Share CAT with other programs', 'cat.shareHint': 'Another program then reaches the radio through OpsLog — with every backend, not only the native ones. For Hamlib pick the rig model "Hamlib NET rigctl" and enter 127.0.0.1:4532; for TCI point the program at 127.0.0.1:40001.', 'cat.shareProto': 'Protocol', 'cat.shareRigctl': 'Hamlib NET rigctl — WSJT-X, JTDX, MSHV, Log4OM', 'cat.shareTci': 'TCI — Expert Electronics', 'cat.shareTciClash': 'The CAT backend is TCI too: ExpertSDR is probably already using port 40001 on this PC. Give the server another port, or share over Hamlib instead.', 'cat.sharePort': 'Sharing port', 'cat.pttKey': 'Enable PTT hotkey', 'cat.pttKeyPress': 'Press a key…', 'cat.pttKeyNone': 'Click to set a key', 'cat.pttKeyClear': 'Clear', 'cat.pttKeyToggle': 'Toggle mode (press to key, press again to unkey)', 'cat.pttKeyHint': 'While OpsLog is focused, this key keys the transmitter — held down by default (release to stop), or latched in toggle mode. It uses the Audio → PTT method (CAT / RTS / DTR), falling back to CAT keying. Pick a key you never type while logging (e.g. Pause, ScrollLock, or a footswitch mapped to one) — OpsLog swallows it so it never lands in a field.', 'cat.optXiegu': 'Xiegu (USB)', 'cat.xieguPort': 'Xiegu CAT port', 'cat.xieguBaudHint': 'Must match the radio menu (G90 default: 19200).', 'cat.xieguAddrHint': 'Factory CI-V address of the G90/X6100 family: 0x70.', 'cat.xieguPTTLine': 'How the rig is keyed', 'cat.xieguPTTCiv': 'CI-V command', 'cat.xieguPTTHint': 'A G90 does not transmit on the CI-V command: interfaces like the DE-19 key it on RTS or DTR. Pick the line yours uses \u2014 it is also what lets WSJT-X transmit through the shared CAT link.', 'cat.optYaesu': 'Yaesu (USB)', 'cat.optKenwood': 'Kenwood (USB, network)', 'cat.optElecraft': 'Elecraft K3/K4 (USB, network)', 'cat.elecraftHint': 'Digital modes automatically use DATA A (MD6+DT0) — the sub-mode FT8 audio needs.', 'cat.civTrace': 'Log the CAT protocol', 'cat.civTraceHint': 'Writes every CAT frame to and from the radio into the log \u2014 CI-V as hex, Kenwood as the text it exchanges. For reporting a rig that answers oddly \u2014 a button that does the wrong thing, a frequency that jumps. Session only: it is a diagnostic, and it makes the log large.', 'cat.kenwoodPort': 'Kenwood COM port', 'cat.kenwoodPortHint': 'The rig\u2019s CAT/USB serial port (TS-590, TS-890, TS-990, TS-2000, and Elecraft K3/K4 which speak the same dialect).', 'cat.kenwoodBaudHint': 'Must match MENU on the radio: a TS-590 leaves the factory at 9600, a TS-890 at 115200.', 'cat.kwLink': 'Connection', 'cat.kwLinkBridge': 'RS-232 to Ethernet (serial bridge)', 'cat.kwLinkNative': 'The radio\u2019s own network protocol', 'cat.kwLinkNativeHint': 'Not supported yet. It is a session with its own framing and login, not the CAT byte stream over a socket, so it has to be implemented per radio — and against one. Use USB, or a serial-to-Ethernet bridge, until then.', 'cat.kwLinkUsb': 'USB / serial', 'cat.kwLinkNet': 'Network', 'cat.kenwoodHostHint': 'The network option carries the SAME CAT commands over TCP instead of a cable: a serial-over-network bridge (ser2net, an Ethernet-serial adapter, a Raspberry Pi in the shack), or a radio that exposes its raw CAT port. It is NOT Hamlib — port 4532 is rigctld, a different protocol, and it is what OpsLog itself SERVES under \u201cShare CAT\u201d.', 'cat.kenwoodHost': 'Or over the network (host:port)', 'cat.yaesuPort': 'Yaesu CAT port', 'cat.yaesuPortHint': 'The rig CAT port — on an FTDX10/FTDX101 over USB this is the ENHANCED COM port, not the standard one.', 'cat.yaesuBaudHint': 'Must match the radio menu (FTDX10/FTDX101 default: 38400).', 'cat.lowerLines': 'Lower the DTR and RTS lines on connect', 'cat.lowerLinesHint': 'If your radio is always on TX, tick this.', 'cat.kwDataMode': 'Data modes (FT8/PSK…) use', 'cat.kwDataUsb': 'USB', 'cat.kwDataMd6': 'DATA A — MD6+DT0 (Elecraft K3/K4)', 'cat.kwDataKeep': 'Leave the rig’s mode unchanged', 'cat.kwDataHint': 'What OpsLog sets on the rig for a data mode. No single command fits every rig: an Elecraft K3/K4 wants DATA (MD6); a TS-590SG/TS-990S data mode is a USB modifier set on the rig, so pick USB or, safest, "Leave unchanged" and switch the rig to DATA yourself. On MD6 a plain Kenwood (TS-590/990) would land on FSK/RTTY — do not use it there.', 'cat.optIcom': 'Icom (CI-V USB)', 'cat.optIcomNet': 'Icom (CI-V network)', 'cat.optTci': 'TCI', 'flxpw.title': 'FlexRadio \u2014 power per band and mode', 'flxpw.hint': 'TX power applied when the band or mode changes. Leave a box empty to leave the power alone.', 'flxpw.band': 'Band', 'flxb.title': 'FlexRadio \u2014 per-band antennas and power', 'flxb.hint': 'Antennas are applied when the band changes; power when the band or the mode changes. Leave a power box empty to leave it alone.', 'flxb.rxAnt': 'RX antenna', 'flxb.txAnt': 'TX antenna', 'flxb.noRadio': 'No antennas reported yet \u2014 connect the FlexRadio, then reopen this panel.', 'flxpw.phone': 'Phone', 'flxpw.digi': 'Digital', 'flxpw.noBands': 'No bands configured \u2014 add them in Lists \u2192 Bands.', 'flxpw.saved': 'Saved', 'cat.icomNetHost': 'Rig IP / hostname', 'cat.icomNetUser': 'Network user (ID)', 'cat.icomNetPass': 'Network password', 'cat.icomNetHint': "Connects to the rig's built-in LAN server directly — no RS-BA1 or Remote Utility needed (close them first). Use the Network User1 ID/Password set in the rig's Network menu. A rig in standby is powered on automatically.", 'cat.icomNetAudio': 'Stream RX audio over the network (experimental)', @@ -816,7 +816,7 @@ const fr: Dict = { 'rot.enable': 'Activer le contrôle du rotator', 'rot.testOkRG': 'Connecté — le Rotator Genius a accepté la commande (rotation vers 0°).', 'rot.testOkRead': 'Connecté — le contrôleur a répondu avec son azimut. Rien n’a bougé : ce test ne fait que lire la position.', 'rot.type': 'Type de rotator', 'rot.rotatorNum': 'Rotator n°', 'rot.dual': 'Deux rotors', 'rot.rotor1': 'Rotor 1', 'rot.rotor2': 'Rotor 2', 'rot.name': 'Nom', 'rot.antenna': 'Antenne', 'rot.antenna1': 'Antenne rotor 1', 'rot.antenna2': 'Antenne rotor 2', 'rot.name1': 'Nom du rotor 1', 'rot.name2': 'Nom du rotor 2', 'rot.antStd': 'Antenne standard', 'rot.antMotor': 'Motorisée (Ultrabeam/SteppIR)', 'rot.add': 'Ajouter un rotor', 'rot.remove': 'Supprimer le rotor', 'rot.none': 'Aucun rotor configuré. Cliquez sur « Ajouter un rotor ».', 'rot.rgDual': 'Ce Rotator Genius pilote deux rotors (en ajoute un second)', 'rot.testRotor1': 'Tester rotor 1', 'rot.testRotor2': 'Tester rotor 2', 'rot.dualHint': 'Deux rotors indépendants de n\'importe quel type — par exemple un ARCO et un Rotator Genius côte à côte. Configurez chacun ci-dessous ; OpsLog affiche un sélecteur Rotor 1/2 sur le compas pour choisir celui qu\'il tourne et affiche. Réglez chaque rotor sur « Motorisée » pour que les tracés de boom/diagramme (inverse, bidirectionnel) n\'apparaissent que pour celui qui porte l\'Ultrabeam/SteppIR. (Pour un seul Rotator Genius pilotant deux rotors, réglez les deux sur Rotator Genius avec le même hôte et le rotator n° 1 et 2.)', 'rot.rgHint': 'Parle directement à un Rotator Genius 4O3A en TCP (port 9006 par défaut) — sans PstRotator. Le n° choisit lequel des deux rotators du boîtier piloter.', 'rot.arcoHint': "Parle directement à tout contrôleur réglé sur Yaesu GS-232A — sans PstRotator. microHAM ARCO : régler Config → LAN → CONTROL PROTOCOL (ou USB CONTROL PROTOCOL) sur « Yaesu GS-232A » ; en USB la vitesse est sans importance. ERC (Easy Rotor Control, ERC Mini compris) : son émulation DOIT être réglée sur GS-232 — un ERC laissé en Hy-Gain DCU-1 parle un autre jeu de commandes et ne répondra pas — puis choisir son port COM et la même vitesse que dans la configuration de l'ERC.", 'rot.dcu1Hint': "Parle le jeu de commandes Hy-Gain DCU-1 (RotorCard DXA, Idiom Press Rotor-EZ, Green Heron). Connexion via le port COM du contrôleur (un DCU-1 est à 4800 bauds ; RotorCard/Green Heron peuvent différer — reprendre la vitesse du contrôleur) ou en TCP via un pont série-sur-IP. Azimut uniquement, pas d'élévation. Nouveau pilote — signalez si votre contrôleur nécessite une autre commande ou vitesse.", 'rot.hint': "OpsLog envoie des commandes UDP à PstRotator. Active l'écouteur UDP de PstRotator (Setup → Communication → UDP) avant de tester.", 'extsvc.hint': "Envoie les QSO enregistrés vers des carnets en ligne. Chaque service upload automatiquement à chaque nouveau QSO si activé ; le délai est propre à chaque service (immédiat, ou 1–2 min pour corriger un QSO mal saisi avant).", 'hw.motorTxInhibit': "Inhiber la transmission pendant que l'antenne bouge", 'hw.motorTxInhibitHint': "Empêche le FlexRadio d'émettre pendant que les éléments bougent (nécessite le FlexRadio en API + cette antenne activée). Sans effet avec les autres radios.", 'hw.motorAntenna': 'Antenne motorisée', 'hw.motorEnable': "Activer le contrôle de l'antenne", 'hw.motorType': "Type d'antenne", 'hw.motorTransport': 'Connexion', 'hw.motorTcp': 'Réseau (TCP)', 'hw.motorSerial': 'Série (COM)', 'hw.motorCom': 'Port série', 'hw.motorComUb': '(2e port du câble USB)', 'hw.motorBaud': 'Débit', 'hw.steppirHint': "Les contrôleurs SteppIR sont en RS-232 série (port DB9 « DATA OUT »). Série = un adaptateur USB↔RS-232 (FTDI), vu comme un port COM. Réseau = un pont série-Ethernet (comme pour l'Ultrabeam).", 'hw.steppirRange': 'Plage accordable', 'hw.steppirRangeHint': "La couverture en fréquence de la SteppIR. Sur une bande hors de cette plage (p. ex. 30 m avec une SteppIR 20 m-6 m), OpsLog n'essaie pas d'accorder l'antenne et n'inhibe pas l'émission. Défaut 13-54 MHz (20 m-6 m) ; abaisse la borne basse (p. ex. 6) pour une SteppIR équipée 40 m.", 'hw.motorBands': 'Bandes couvertes', 'hw.motorStep': 'Pas de réaccord', 'hw.motorBandFreqHint': "Fréquence sur laquelle chaque bouton de bande accorde l'antenne (kHz). Laisser vide pour le défaut affiché.", 'hw.motorFollow': "Suivre la fréquence du rig (accord auto de l'antenne)", 'hw.ultrabeam': 'Antenne (Ultrabeam)', 'hw.audioVoice': 'Périphériques audio & manipulateur vocal', - 'cat.enable': 'Activer le CAT', 'cat.backend': 'Backend', 'cat.optOmnirig': 'OmniRig', 'cat.optFlex': 'FlexRadio (API)', 'cat.share': 'Partager le CAT avec les autres logiciels', 'cat.shareHint': "Un autre logiciel atteint alors la radio à travers OpsLog — avec tous les backends, pas seulement les natifs. Pour Hamlib, choisissez le modèle « Hamlib NET rigctl » et saisissez 127.0.0.1:4532 ; pour TCI, pointez le logiciel sur 127.0.0.1:40001.", 'cat.shareProto': 'Protocole', 'cat.shareRigctl': 'Hamlib NET rigctl — WSJT-X, JTDX, MSHV, Log4OM', 'cat.shareTci': 'TCI — Expert Electronics', 'cat.shareTciClash': 'Le backend CAT est aussi en TCI : ExpertSDR occupe probablement déjà le port 40001 sur ce PC. Donnez un autre port au serveur, ou partagez en Hamlib.', 'cat.sharePort': 'Port de partage', 'cat.pttKey': 'Activer la touche PTT', 'cat.pttKeyPress': 'Appuyez sur une touche…', 'cat.pttKeyNone': 'Cliquez pour définir une touche', 'cat.pttKeyClear': 'Effacer', 'cat.pttKeyToggle': 'Mode bascule (appui = émission, nouvel appui = arrêt)', 'cat.pttKeyHint': "Quand OpsLog a le focus, cette touche passe la radio en émission — maintenue par défaut (relâcher pour arrêter), ou verrouillée en mode bascule. Elle utilise la méthode PTT de Audio → PTT (CAT / RTS / DTR), avec repli sur le CAT. Choisissez une touche que vous ne tapez jamais en journalisant (ex. Pause, Arrêt défil., ou une pédale mappée dessus) — OpsLog l'intercepte pour qu'elle n'atterrisse pas dans un champ.", 'cat.optXiegu': 'Xiegu (USB)', 'cat.xieguPort': 'Port CAT Xiegu', 'cat.xieguBaudHint': 'Doit correspondre au menu de la radio (G90 par défaut : 19200).', 'cat.xieguAddrHint': "Adresse CI-V d'usine de la famille G90/X6100 : 0x70.", 'cat.xieguPTTLine': 'Passage en \u00e9mission', 'cat.xieguPTTCiv': 'Commande CI-V', 'cat.xieguPTTHint': 'Un G90 ne passe pas en \u00e9mission sur la commande CI-V : les interfaces comme le DE-19 le pilotent par RTS ou DTR. Choisissez la ligne de la v\u00f4tre \u2014 c\u2019est aussi ce qui permet \u00e0 WSJT-X d\u2019\u00e9mettre via le partage CAT.', 'cat.optYaesu': 'Yaesu (USB)', 'cat.optKenwood': 'Kenwood (USB, réseau)', 'cat.optElecraft': 'Elecraft K3/K4 (USB, réseau)', 'cat.elecraftHint': 'Les modes numériques passent automatiquement en DATA A (MD6+DT0) — le sous-mode dont l’audio FT8 a besoin.', 'cat.civTrace': 'Journaliser le protocole CAT', 'cat.civTraceHint': '\u00c9crit dans le journal chaque trame CAT \u00e9chang\u00e9e avec la radio \u2014 CI-V en hexad\u00e9cimal, Kenwood en texte. Pour signaler une radio qui r\u00e9pond de travers \u2014 un bouton qui fait autre chose, une fr\u00e9quence qui saute. Valable pour la session seulement : c\u2019est un diagnostic, et le journal grossit vite.', 'cat.kenwoodPort': 'Port COM Kenwood', 'cat.kenwoodPortHint': 'Le port s\u00e9rie CAT/USB de la radio (TS-590, TS-890, TS-990, TS-2000, ainsi que les Elecraft K3/K4 qui parlent le m\u00eame dialecte).', 'cat.kenwoodBaudHint': 'Doit correspondre au MENU de la radio : un TS-590 sort d\u2019usine \u00e0 9600, un TS-890 \u00e0 115200.', 'cat.kwLink': 'Connexion', 'cat.kwLinkBridge': 'RS-232 vers Ethernet (pont s\u00e9rie)', 'cat.kwLinkNative': 'Protocole r\u00e9seau propre \u00e0 la radio', 'cat.kwLinkNativeHint': "Pas encore pris en charge. C'est une session avec son propre encapsulage et son identification, pas le flux CAT dans une socket : cela s'impl\u00e9mente radio par radio, et face \u00e0 une vraie. En attendant : USB, ou un pont s\u00e9rie-Ethernet.", 'cat.kwLinkUsb': 'USB / série', 'cat.kwLinkNet': 'Réseau', 'cat.kenwoodHostHint': "L'option réseau transporte les MÊMES commandes CAT en TCP au lieu d'un câble : un pont série-réseau (ser2net, adaptateur Ethernet-série, Raspberry Pi au shack), ou une radio qui expose son port CAT brut. Ce n'est PAS du Hamlib — le port 4532 est celui de rigctld, un autre protocole, et c'est celui qu'OpsLog lui-même PROPOSE sous « Partager le CAT ».", 'cat.kenwoodHost': 'Ou par le r\u00e9seau (h\u00f4te:port)', 'cat.yaesuPort': 'Port CAT Yaesu', 'cat.yaesuPortHint': "Le port CAT de la radio — sur un FTDX10/FTDX101 en USB c'est le port COM ENHANCED, pas le standard.", 'cat.yaesuBaudHint': 'Doit correspondre au menu de la radio (FTDX10/FTDX101 par défaut : 38400).', 'cat.lowerLines': 'Abaisser les lignes DTR et RTS à la connexion', 'cat.lowerLinesHint': 'Si votre radio est toujours en émission, cochez ceci.', 'cat.kwDataMode': 'Modes data (FT8/PSK…)', 'cat.kwDataUsb': 'USB', 'cat.kwDataMd6': 'DATA A — MD6+DT0 (Elecraft K3/K4)', 'cat.kwDataKeep': 'Ne pas changer le mode de la radio', 'cat.kwDataHint': "Ce qu'OpsLog règle sur la radio pour un mode data. Aucune commande unique ne convient à toutes : un Elecraft K3/K4 veut DATA (MD6) ; sur un TS-590SG/TS-990S le mode data est un modificateur d'USB réglé sur la radio, choisissez donc USB ou, plus sûr, « Ne pas changer » et passez la radio en DATA vous-même. En MD6 un Kenwood classique (TS-590/990) tomberait en FSK/RTTY — à ne pas utiliser là.", 'cat.optIcom': 'Icom (CI-V USB)', 'cat.optIcomNet': 'Icom (CI-V réseau)', 'cat.optTci': 'TCI', 'flxpw.title': 'FlexRadio \u2014 puissance par bande et par mode', 'flxpw.hint': 'Puissance d\u2019\u00e9mission appliqu\u00e9e au changement de bande ou de mode. Laissez une case vide pour ne pas toucher \u00e0 la puissance.', 'flxpw.band': 'Bande', 'flxb.title': 'FlexRadio \u2014 antennes et puissance par bande', 'flxb.hint': 'Les antennes sont appliqu\u00e9es au changement de bande ; la puissance au changement de bande ou de mode. Laissez une case de puissance vide pour ne pas y toucher.', 'flxb.rxAnt': 'Antenne RX', 'flxb.txAnt': 'Antenne TX', 'flxb.noRadio': 'Aucune antenne remont\u00e9e \u2014 connectez le FlexRadio, puis rouvrez ce panneau.', 'flxpw.phone': 'Phonie', 'flxpw.digi': 'Num\u00e9rique', 'flxpw.noBands': 'Aucune bande configur\u00e9e \u2014 ajoutez-les dans Listes \u2192 Bandes.', 'flxpw.saved': 'Enregistr\u00e9', + 'cat.enable': 'Activer le CAT', 'cat.brand': 'Radio', 'cat.backend': 'Backend', 'cat.optOmnirig': 'OmniRig', 'cat.optFlex': 'FlexRadio (API)', 'cat.share': 'Partager le CAT avec les autres logiciels', 'cat.shareHint': "Un autre logiciel atteint alors la radio à travers OpsLog — avec tous les backends, pas seulement les natifs. Pour Hamlib, choisissez le modèle « Hamlib NET rigctl » et saisissez 127.0.0.1:4532 ; pour TCI, pointez le logiciel sur 127.0.0.1:40001.", 'cat.shareProto': 'Protocole', 'cat.shareRigctl': 'Hamlib NET rigctl — WSJT-X, JTDX, MSHV, Log4OM', 'cat.shareTci': 'TCI — Expert Electronics', 'cat.shareTciClash': 'Le backend CAT est aussi en TCI : ExpertSDR occupe probablement déjà le port 40001 sur ce PC. Donnez un autre port au serveur, ou partagez en Hamlib.', 'cat.sharePort': 'Port de partage', 'cat.pttKey': 'Activer la touche PTT', 'cat.pttKeyPress': 'Appuyez sur une touche…', 'cat.pttKeyNone': 'Cliquez pour définir une touche', 'cat.pttKeyClear': 'Effacer', 'cat.pttKeyToggle': 'Mode bascule (appui = émission, nouvel appui = arrêt)', 'cat.pttKeyHint': "Quand OpsLog a le focus, cette touche passe la radio en émission — maintenue par défaut (relâcher pour arrêter), ou verrouillée en mode bascule. Elle utilise la méthode PTT de Audio → PTT (CAT / RTS / DTR), avec repli sur le CAT. Choisissez une touche que vous ne tapez jamais en journalisant (ex. Pause, Arrêt défil., ou une pédale mappée dessus) — OpsLog l'intercepte pour qu'elle n'atterrisse pas dans un champ.", 'cat.optXiegu': 'Xiegu (USB)', 'cat.xieguPort': 'Port CAT Xiegu', 'cat.xieguBaudHint': 'Doit correspondre au menu de la radio (G90 par défaut : 19200).', 'cat.xieguAddrHint': "Adresse CI-V d'usine de la famille G90/X6100 : 0x70.", 'cat.xieguPTTLine': 'Passage en \u00e9mission', 'cat.xieguPTTCiv': 'Commande CI-V', 'cat.xieguPTTHint': 'Un G90 ne passe pas en \u00e9mission sur la commande CI-V : les interfaces comme le DE-19 le pilotent par RTS ou DTR. Choisissez la ligne de la v\u00f4tre \u2014 c\u2019est aussi ce qui permet \u00e0 WSJT-X d\u2019\u00e9mettre via le partage CAT.', 'cat.optYaesu': 'Yaesu (USB)', 'cat.optKenwood': 'Kenwood (USB, réseau)', 'cat.optElecraft': 'Elecraft K3/K4 (USB, réseau)', 'cat.elecraftHint': 'Les modes numériques passent automatiquement en DATA A (MD6+DT0) — le sous-mode dont l’audio FT8 a besoin.', 'cat.civTrace': 'Journaliser le protocole CAT', 'cat.civTraceHint': '\u00c9crit dans le journal chaque trame CAT \u00e9chang\u00e9e avec la radio \u2014 CI-V en hexad\u00e9cimal, Kenwood en texte. Pour signaler une radio qui r\u00e9pond de travers \u2014 un bouton qui fait autre chose, une fr\u00e9quence qui saute. Valable pour la session seulement : c\u2019est un diagnostic, et le journal grossit vite.', 'cat.kenwoodPort': 'Port COM Kenwood', 'cat.kenwoodPortHint': 'Le port s\u00e9rie CAT/USB de la radio (TS-590, TS-890, TS-990, TS-2000, ainsi que les Elecraft K3/K4 qui parlent le m\u00eame dialecte).', 'cat.kenwoodBaudHint': 'Doit correspondre au MENU de la radio : un TS-590 sort d\u2019usine \u00e0 9600, un TS-890 \u00e0 115200.', 'cat.kwLink': 'Connexion', 'cat.kwLinkBridge': 'RS-232 vers Ethernet (pont s\u00e9rie)', 'cat.kwLinkNative': 'Protocole r\u00e9seau propre \u00e0 la radio', 'cat.kwLinkNativeHint': "Pas encore pris en charge. C'est une session avec son propre encapsulage et son identification, pas le flux CAT dans une socket : cela s'impl\u00e9mente radio par radio, et face \u00e0 une vraie. En attendant : USB, ou un pont s\u00e9rie-Ethernet.", 'cat.kwLinkUsb': 'USB / série', 'cat.kwLinkNet': 'Réseau', 'cat.kenwoodHostHint': "L'option réseau transporte les MÊMES commandes CAT en TCP au lieu d'un câble : un pont série-réseau (ser2net, adaptateur Ethernet-série, Raspberry Pi au shack), ou une radio qui expose son port CAT brut. Ce n'est PAS du Hamlib — le port 4532 est celui de rigctld, un autre protocole, et c'est celui qu'OpsLog lui-même PROPOSE sous « Partager le CAT ».", 'cat.kenwoodHost': 'Ou par le r\u00e9seau (h\u00f4te:port)', 'cat.yaesuPort': 'Port CAT Yaesu', 'cat.yaesuPortHint': "Le port CAT de la radio — sur un FTDX10/FTDX101 en USB c'est le port COM ENHANCED, pas le standard.", 'cat.yaesuBaudHint': 'Doit correspondre au menu de la radio (FTDX10/FTDX101 par défaut : 38400).', 'cat.lowerLines': 'Abaisser les lignes DTR et RTS à la connexion', 'cat.lowerLinesHint': 'Si votre radio est toujours en émission, cochez ceci.', 'cat.kwDataMode': 'Modes data (FT8/PSK…)', 'cat.kwDataUsb': 'USB', 'cat.kwDataMd6': 'DATA A — MD6+DT0 (Elecraft K3/K4)', 'cat.kwDataKeep': 'Ne pas changer le mode de la radio', 'cat.kwDataHint': "Ce qu'OpsLog règle sur la radio pour un mode data. Aucune commande unique ne convient à toutes : un Elecraft K3/K4 veut DATA (MD6) ; sur un TS-590SG/TS-990S le mode data est un modificateur d'USB réglé sur la radio, choisissez donc USB ou, plus sûr, « Ne pas changer » et passez la radio en DATA vous-même. En MD6 un Kenwood classique (TS-590/990) tomberait en FSK/RTTY — à ne pas utiliser là.", 'cat.optIcom': 'Icom (CI-V USB)', 'cat.optIcomNet': 'Icom (CI-V réseau)', 'cat.optTci': 'TCI', 'flxpw.title': 'FlexRadio \u2014 puissance par bande et par mode', 'flxpw.hint': 'Puissance d\u2019\u00e9mission appliqu\u00e9e au changement de bande ou de mode. Laissez une case vide pour ne pas toucher \u00e0 la puissance.', 'flxpw.band': 'Bande', 'flxb.title': 'FlexRadio \u2014 antennes et puissance par bande', 'flxb.hint': 'Les antennes sont appliqu\u00e9es au changement de bande ; la puissance au changement de bande ou de mode. Laissez une case de puissance vide pour ne pas y toucher.', 'flxb.rxAnt': 'Antenne RX', 'flxb.txAnt': 'Antenne TX', 'flxb.noRadio': 'Aucune antenne remont\u00e9e \u2014 connectez le FlexRadio, puis rouvrez ce panneau.', 'flxpw.phone': 'Phonie', 'flxpw.digi': 'Num\u00e9rique', 'flxpw.noBands': 'Aucune bande configur\u00e9e \u2014 ajoutez-les dans Listes \u2192 Bandes.', 'flxpw.saved': 'Enregistr\u00e9', 'cat.icomNetHost': 'IP / nom d\'hôte du poste', 'cat.icomNetUser': 'Utilisateur réseau (ID)', 'cat.icomNetPass': 'Mot de passe réseau', 'cat.icomNetHint': "Se connecte directement au serveur LAN intégré du poste — sans RS-BA1 ni Remote Utility (ferme-les d'abord). Utilise l'ID/mot de passe Network User1 configurés dans le menu Network du poste. Un poste en veille est allumé automatiquement.", 'cat.icomNetAudio': 'Diffuser l’audio RX par le réseau (expérimental)',