An operator was about to build band→relay mapping into the custom URL rows.
It already exists, and better: relay auto-control has a per-relay "band" rule
driving webswitch, KMTronic, Dingtian, Denkovi and USB boards. It holds state
so a relay is only commanded when its wanted position changed, reads the
boards live before the first apply so it does not re-command one already in
place, and carries per-relay labels. A URL fired on a band change has none of
that, and would have been a second definition of "which antenna on which band"
— the drift that cost us a week on counties.
So the gap was only the hardware: a hand-made switch is none of the five named
types. It is now the sixth, "HTTP relay": an ON URL and an OFF URL, either as
one pattern with {relay} substituted, or one pair per relay. The per-relay
form is the reason it exists — these boxes often have URLs with nothing in
common between channels (…/FF0101 and …/FF0201), which no pattern can express.
Status is remembered rather than read: most have no endpoint worth trusting.
The cost is stated in the code and the panel — after a restart every relay is
re-commanded once, which is harmless on a board with no memory and far better
than assuming an antenna is already selected.
And the Connections panel now says so, exactly where the wrong choice is made:
picking a band change with a URL transport shows a note pointing at Station
Control. The URL transport stays — a lookup pushed to a webhook or a QSO to a
dashboard is an event, not a state, and Station Control has no place for it.
constTYPE_LABEL: Record<string,string>={webswitch:'WebSwitch 1216H',kmtronic:'KMTronic 8-relay',denkovi:'Denkovi USB (FT245)',usbrelay:'Denkovi USB (serial)',dingtian:'Dingtian IOT relay'};
'uscty.backfillIntro':'Resolve county (and grid) for US QSOs already in your log that are missing them. Existing values are kept — only blanks are filled.',
'uscty.backfillRun':'Fill missing counties',
'uscty.backfillDone':'{s} US QSOs scanned · {c} counties, {g} grids filled.',
'station.typeHttpGen':'HTTP relay (home-made / generic)','station.onPattern':'ON URL pattern','station.offPattern':'OFF URL pattern','station.patternHint':'{relay} is replaced by the relay number. Leave blank if every relay has its own URL below.','station.perRelayUrls':'Per-relay URLs (optional)','station.perRelayHint':'Filled in here, these win over the patterns — for a switch whose channels have nothing in common. State is remembered, not read back: after a restart every relay is re-commanded once.','station.onUrlPh':'ON URL','station.offUrlPh':'OFF URL',
'station.title':'Station Control','station.rotator':'Rotator','station.rotateTo':'Rotate to {az}°','station.rotatorNoRead':'No heading read','station.bands':'Bands','station.nudgeUp':'Up {n} kHz','station.nudgeDown':'Down {n} kHz','station.trackOn':'Tracking on','station.trackOff':'Tracking off','station.trackStepTip':'Re-tune only when the rig has moved this far','station.trackModeTip':'When the antenna is allowed to re-tune','station.trackAlways':'Every frequency change','station.trackStep':'Past a step','station.trackBand':'Band change only','station.trackAlwaysTip':'Follow every frequency change. Best resonance, but the motors run constantly — and on a SteppIR every move blocks transmit while the elements travel.','station.trackStepTipMode':'Re-tune only once the rig has moved further than the step. Follows a QSY, ignores tuning around.','station.trackBandTip':'Re-tune only when the band changes. The motors move a few times a day and are left alone within a band.','station.pattern':'Pattern','station.bi':'Bi','station.retract':'Retract elements','station.moving':'MOVING','station.elements':'Elements (mm)','station.read':'Read','station.readLengths':'Read current element lengths from the controller','station.noLengths':'Lengths unknown — click Read to fetch them from the controller.','station.element':'Element','station.reflector':'Reflector','station.driven':'Driven','station.director':'Dir','station.set':'Set','station.elementsHint':'Each press lengthens/shortens the element by 2 mm (like the physical console). Verify which element responds on your antenna.','station.setExactLen':'Click to type the exact current length (fixes the baseline if the auto-read is off).','station.atMax':'Controller refused — the element is likely at its maximum length for this band, so it can\'t extend further.','station.go':'Go','station.stop':'Stop','station.dragHint':'Drag the grip handle on the left of a panel to move it. Pick a column count to lay them out in a grid.','station.dragMove':'Drag to move this panel','station.colsAuto':'Auto','station.addDevice':'Add device','station.editDevice':'Edit device','station.empty':'No relay boards yet. Add a WebSwitch 1216H or a KMTronic 8-relay board to control your station power and accessories.','station.online':'Online','station.offline':'Offline','station.edit':'Edit','station.delete':'Delete','station.relay':'Relay','station.on':'ON','station.off':'OFF','station.type':'Device type','station.name':'Name','station.host':'Host / IP','station.hostHint':'LAN IP for local use. To reach the board from OUTSIDE, put a full URL here — e.g. https://relay.yourdomain.com — pointing at a reverse proxy (Nginx Proxy Manager…) that fronts the board’s HTTP port.','station.user':'Username','station.pass':'Password','station.optional':'optional','station.ftdiSerial':'FTDI serial number','station.detect':'Detect','station.ftdiHint':'The Denkovi board is driven via FTDI bit-bang (not the COM port). Pick its serial (e.g. DAE0006K). Needs the FTDI D2XX driver installed.','station.channels':'Relays','station.comPort':'COM port','station.noPorts':'No ports found','station.usbRelayHint':'Cheap USB-serial relay boards (CH340/LCUS) using the A0 command protocol. If yours does not switch, tell me its model / command set.','station.labels':'Relay labels','station.cancel':'Cancel','station.save':'Save','station.test':'Test connection','station.testOk':'Connected — {n} relays','station.testFail':'Not connected','station.detectNone':'No FTDI board found — check the cable and that the D2XX driver is installed.','station.detectFound':'{n} board(s) detected.',
'awards.followHint':'Awards shown in the Awards tab. Leave the right side empty to show them all.','awards.available':'All awards','awards.followed':'Followed','awards.search':'Filter…','awards.addAll':'Add all','awards.clear':'Clear','awards.allTracked':'All awards are followed.','awards.noneFollowed':'Nothing followed yet — the Awards tab shows all.',
'altm.filterPh':'Filter…','altm.noMatch':'no match','altm.noneAll':'none selected = ALL','altm.nSelected':'{n} selected','altm.giveName':'Give the rule a name','altm.deleteConfirm':'Delete alert "{name}"?','altm.title':'Alert management','altm.desc':'Alert when a spot matches a rule. Empty filters = ANY; the filters you set are ANDed (e.g. France + 20m = French stations on 20m).','altm.rules':'Rules','altm.noRules':'No rules yet — click +','altm.emailTo':'Alert e-mail to','altm.selectOrCreate':'Select or create a rule.','altm.tabDef':'Definition','altm.tabCall':'Call / DXCC','altm.tabBandMode':'Band / Mode','altm.tabOrigin':'Origin','altm.ruleName':'Rule name','altm.alertEnabled':'Alert enabled','altm.againAfter':'Alert again after (min)','altm.againHint':'0 = once/session · -1 = always','altm.actions':'Actions','altm.visual':'Visual','altm.sound':'Sound','altm.email':'E-mail','altm.skipWorked':'Skip calls already worked (same band + mode)','altm.callsigns':'Callsigns (one per line, wildcards: IW3*, */P)','altm.countries':'Countries (DXCC)','altm.continents':'Continents','altm.bands':'Bands','altm.modes':'Modes','altm.spotterCall':'Spotter callsign (wildcard)','altm.spotterCallPh':'e.g. F* or DL1ABC','altm.spotterContinents':'Spotter continents','altm.spotterCountries':'Spotter countries','altm.delete':'Delete','altm.saveRule':'Save rule','altm.close':'Close',
'ncp.newNetPrompt':'New NET name:','ncp.renamePrompt':'Rename NET:','ncp.deleteConfirm':'Delete NET "{name}" and its roster? This cannot be undone.','ncp.closeConfirm':"{n} station(s) still on the air will be dropped WITHOUT logging. Close anyway?",'ncp.removeConfirm':"Remove {n} station(s) from this NET's roster?",'ncp.colCallsign':'Callsign','ncp.colName':'Name','ncp.colTimeOn':'Time on','ncp.colBand':'Band','ncp.colMode':'Mode','ncp.colComment':'Comment','ncp.colCountry':'Country','ncp.colDate':'Date','ncp.workedBefore':'Worked before','ncp.wbHint':'Click a station (on air or roster) to see prior QSOs','ncp.wbNone':'No prior QSO with','ncp.wbFirst':'first','ncp.wbLast':'last','ncp.wbResize':'Drag to resize','ncp.newNet':'New NET','ncp.closeToSwitch':'Close the NET to switch','ncp.selectNetTitle':'Select a NET','ncp.selectNetOption':'— select a NET —','ncp.closeNet':'Close NET','ncp.openNet':'Open NET','ncp.rename':'Rename','ncp.delete':'Delete','ncp.netOpenBadge':'NET OPEN','ncp.onAir':'On air:','ncp.roster':'Roster:','ncp.onAirActive':'On air — active QSOs','ncp.activeHint':'mic-pass order · ⬆⬇ to reorder · double-click → edit · "Log & end" to save','ncp.moveUp':'Move up the mic-pass order','ncp.moveDown':'Move down the mic-pass order','ncp.logEndSelected':'Log & end selected','ncp.logAll':'Log everyone ({n})','ncp.logAllConfirm':'Log all {n} on-air station(s) to the logbook?','ncp.netUsersRoster':'NET users — roster','ncp.rosterHint':'double-click → put on air','ncp.addContact':'Add contact','ncp.remove':'Remove','ncp.putOnAir':'Put selected on air','ncp.addContactTitle':'Add contact to NET','ncp.addContactDesc':"Saved in this NET's roster (reused next time you open it).",'ncp.callsign':'Callsign','ncp.search':'Search','ncp.name':'Name','ncp.country':'Country','ncp.cancel':'Cancel','ncp.saveInNet':'Save in NET',
'udpp.relayInstead':'For an antenna switch or a relay board, use Station Control → relays instead: it holds the state, reads the boards at startup and does not re-switch while you tune inside a band. A home-made switch is the “HTTP relay” type there.',
'udpp.svcCustomLabel':'Custom message','udpp.svcCustomHint':'You choose what fires it and what it says. A UDP datagram or an HTTP request — the latter is how most antenna switches are driven.','udpp.trigger':'Fires on','udpp.trgBand':'Band change (radio)','udpp.trgQso':'QSO logged','udpp.trgRotator':'Rotator command','udpp.trgLookup':'Callsign lookup','udpp.transport':'Sends as','udpp.transportUdp':'UDP message','udpp.transportUrl':'URL (HTTP GET)','udpp.url':'URL','udpp.urlHint':'Values are URL-encoded. Credentials may be included as http://user:pass@host/… — stored as typed, so keep it to your own network.','udpp.template':'Message','udpp.lineEnd':'Line end','udpp.lineEndNone':'None','udpp.fieldsAvailable':'Fields for this trigger','udpp.fieldsHint':'Anything else renders empty.',
'udpp.svcWsjtLabel':'WSJT-X / JTDX / MSHV','udpp.svcWsjtHint':'Auto-logs FT8/FT4/etc. QSOs and fills the entry callsign live.','udpp.svcAdifLabel':'ADIF message (JTAlert, GridTracker)','udpp.svcAdifHint':'Receives a single ADIF record per packet and logs it.','udpp.svcN1mmLabel':'N1MM Logger+ (contest XML)','udpp.svcN1mmHint':'Receives contest QSOs as XML messages.','udpp.svcRemoteLabel':'Remote callsign (DXHunter, custom)','udpp.svcRemoteHint':'A short text packet containing just a callsign — fills the entry field.','udpp.svcWsjtLogLabel':'WSJT-X logged QSO','udpp.svcWsjtLogHint':'Announces each logged QSO on the WSJT-X UDP interface — both messages WSJT-X itself sends. For any logger that listens there rather than for plain-text ADIF (Logger32’s additional UDP sockets, for one).','udpp.svcDbLabel':'ADIF Message','udpp.svcDbHint':'Sends the ADIF of every QSO you log to a remote listener (Cloudlog UDP, N1MM, …).','udpp.svcPstLabel':'PstRotator frequency','udpp.svcPstHint':'Sends the rig frequency as <PST><FREQUENCY> whenever it changes — set PstRotatorAz tracker to DXLog.net (default port 12040).','udpp.svcN1mmRadioLabel':'N1MM RadioInfo (freq + mode)','udpp.svcN1mmRadioHint':'Broadcasts the rig frequency/mode as N1MM Logger+ RadioInfo XML on every change — consumed by PstRotator (N1MM tracker) and many other tools.','udpp.deleteConfirm':'Delete this UDP connection?','udpp.loading':'Loading…','udpp.intro':'Connections let OpsLog talk to other ham radio software. Inbound connections receive QSOs or callsigns and update the logbook live; outbound connections notify other apps when you log a QSO locally. Enable multicast to share a port with another listener without conflict — required for the typical WSJT-X 2237 setup.','udpp.inboundTitle':'Inbound — OpsLog listens','udpp.outboundTitle':'Outbound — OpsLog sends','udpp.reloadAll':'Reload all','udpp.reloadHint':'Restarts every enabled listener after a manual change.','udpp.add':'Add','udpp.noConnection':'No connection.','udpp.unnamed':'(unnamed)','udpp.dialogTitle':'{action} {direction} connection','udpp.new':'New','udpp.edit':'Edit','udpp.directionInbound':'inbound','udpp.directionOutbound':'outbound','udpp.name':'Name','udpp.namePhInbound':'WSJT-X log','udpp.namePhOutbound':'Cloudlog notify','udpp.serviceType':'Service type','udpp.port':'Port','udpp.multicast':'Multicast','udpp.multicastGroup':'Multicast group','udpp.multicastHint':'Use the same group address as the sending app. WSJT-X default is 224.0.0.1.','udpp.destinationIp':'Destination IP','udpp.enabled':'Enabled','udpp.cancel':'Cancel','udpp.save':'Save',
'fltb.fCallsign':'Callsign','fltb.fDate':'Date / time (UTC)','fltb.fEndDate':'End date / time','fltb.fBand':'Band','fltb.fRxBand':'RX band','fltb.fMode':'Mode','fltb.fSubmode':'Submode','fltb.fFreq':'Frequency (Hz)','fltb.fRxFreq':'RX frequency (Hz)','fltb.fRstSent':'RST sent','fltb.fRstRcvd':'RST rcvd','fltb.fName':'Name','fltb.fQth':'QTH','fltb.fAddress':'Address','fltb.fEmail':'E-mail','fltb.fGrid':'Grid','fltb.fCountry':'Country','fltb.fState':'State','fltb.fCounty':'County','fltb.fDxcc':'DXCC #','fltb.fContinent':'Continent','fltb.fCqz':'CQ zone','fltb.fItuz':'ITU zone','fltb.fIota':'IOTA','fltb.fSota':'SOTA ref','fltb.fPota':'POTA ref','fltb.fWwff':'WWFF ref','fltb.fRig':'Rig','fltb.fAntenna':'Antenna','fltb.fQslSent':'Paper QSL sent status','fltb.fQslSentDate':'Paper QSL sent date','fltb.fQslRcvd':'Paper QSL received status','fltb.fQslRcvdDate':'Paper QSL received date','fltb.fQslSentVia':'QSL sent via','fltb.fQslRcvdVia':'QSL rcvd via','fltb.fQslVia':'QSL via','fltb.fLotwSent':'LoTW sent status','fltb.fLotwSentDate':'LoTW sent date','fltb.fLotwRcvd':'LoTW received status','fltb.fLotwRcvdDate':'LoTW received date','fltb.fEqslSent':'eQSL sent status','fltb.fEqslSentDate':'eQSL sent date','fltb.fEqslRcvd':'eQSL received status','fltb.fEqslRcvdDate':'eQSL received date','fltb.fQrzSent':'QRZ.com sent status','fltb.fQrzSentDate':'QRZ.com sent date','fltb.fQrzRcvd':'QRZ.com received status','fltb.fQrzRcvdDate':'QRZ.com received date','fltb.fClublogSent':'Club Log sent status','fltb.fClublogSentDate':'Club Log sent date','fltb.fHrdlogSent':'HRDLog sent status','fltb.fHrdlogSentDate':'HRDLog sent date','fltb.fContestId':'Contest ID','fltb.fSerialRcvd':'Serial rcvd','fltb.fSerialSent':'Serial sent','fltb.fPropMode':'Propagation mode','fltb.fSatellite':'Satellite','fltb.fMyCallsign':'Station callsign (my call)','fltb.fOperator':'Operator','fltb.fOwnerCallsign':'Owner callsign','fltb.fMyGrid':'My grid','fltb.fMyCountry':'My country','fltb.fMyState':'My state','fltb.fMyCounty':'My county','fltb.fMyIota':'My IOTA','fltb.fMySota':'My SOTA ref','fltb.fMyPota':'My POTA ref','fltb.fMyWwff':'My WWFF ref','fltb.fMyStreet':'My street','fltb.fMyCity':'My city','fltb.fMyPostal':'My postal code','fltb.fMyRig':'My rig','fltb.fMyAntenna':'My antenna','fltb.fTxPower':'TX power (W)','fltb.fComment':'Comment','fltb.fNotes':'Notes','fltb.opEq':'equals (=)','fltb.opNe':'not equal (≠)','fltb.opContains':'contains','fltb.opStartsWith':'starts with','fltb.opEndsWith':'ends with','fltb.opGt':'greater than (>)','fltb.opLt':'less than (<)','fltb.opGe':'greater or equal (≥)','fltb.opLe':'less or equal (≤)','fltb.opEmpty':'is empty','fltb.opIn':'is one of','fltb.opNotIn':'is none of','fltb.listPh':'2m, 70cm — comma separated','fltb.opNotEmpty':'is not empty','fltb.title':'QSO filter','fltb.match':'Match','fltb.all':'ALL (AND)','fltb.any':'ANY (OR)','fltb.loadPreset':'Load preset…','fltb.noConditions':'No conditions — the list shows all QSOs. Add one below.','fltb.where':'WHERE','fltb.valuePh':'value','fltb.remove':'Remove','fltb.addCondition':'Add condition','fltb.presetNamePh':'Preset name…','fltb.savePreset':'Save preset','fltb.clear':'Clear','fltb.cancel':'Cancel','fltb.applyClose':'Apply & close',
@@ -586,6 +588,7 @@ const fr: Dict = {
'uscty.backfillIntro':"Résout le comté (et le locator) pour les QSO US déjà dans ton log qui n'en ont pas. Les valeurs existantes sont conservées — seuls les vides sont remplis.",
'uscty.backfillRun':'Remplir les comtés manquants',
'uscty.backfillDone':'{s} QSO US analysés · {c} comtés, {g} locators remplis.',
'station.typeHttpGen':'Relais HTTP (fait main / générique)','station.onPattern':'Modèle d’URL ON','station.offPattern':'Modèle d’URL OFF','station.patternHint':'{relay} est remplacé par le numéro du relais. Laissez vide si chaque relais a sa propre URL ci-dessous.','station.perRelayUrls':'URL par relais (optionnel)','station.perRelayHint':'Renseignées ici, elles l’emportent sur les modèles — pour un commutateur dont les voies n’ont rien en commun. L’état est mémorisé, pas relu : après un redémarrage chaque relais est recommandé une fois.','station.onUrlPh':'URL ON','station.offUrlPh':'URL OFF',
'station.title':'Contrôle station','station.rotator':'Rotator','station.rotateTo':'Tourner vers {az}°','station.rotatorNoRead':'Azimut non lu','station.bands':'Bandes','station.nudgeUp':'Monter de {n} kHz','station.nudgeDown':'Descendre de {n} kHz','station.trackOn':'Suivi actif','station.trackOff':'Suivi inactif','station.trackStepTip':'Ne réaccorder que si le rig a bougé d au moins ça','station.trackModeTip':"Quand l'antenne a le droit de se réaccorder",'station.trackAlways':'À chaque changement','station.trackStep':'Au-delà d un pas','station.trackBand':'Changement de bande','station.trackAlwaysTip':"Suivre chaque changement de fréquence. Résonance idéale, mais les moteurs tournent en permanence — et sur une SteppIR chaque déplacement bloque l'émission le temps du mouvement.",'station.trackStepTipMode':"Ne réaccorder qu'une fois le rig sorti du pas. Suit un QSY, ignore la recherche autour.",'station.trackBandTip':"Ne réaccorder qu'au changement de bande. Les moteurs bougent quelques fois par jour et restent tranquilles dans une bande.",'station.pattern':'Diagramme','station.bi':'Bi','station.retract':'Rétracter les éléments','station.moving':'EN MOUVEMENT','station.elements':'Éléments (mm)','station.read':'Lire','station.readLengths':'Lire les longueurs actuelles depuis le contrôleur','station.noLengths':'Longueurs inconnues — clique sur Lire pour les récupérer depuis le contrôleur.','station.element':'Élément','station.reflector':'Réflecteur','station.driven':'Radiateur','station.director':'Dir','station.set':'Régler','station.elementsHint':"Chaque appui allonge/raccourcit l'élément de 2 mm (comme le pupitre). Vérifie quel élément répond sur ton antenne.",'station.setExactLen':"Clique pour taper la longueur actuelle exacte (recale la base si la lecture auto est fausse).",'station.atMax':"Refusé par le contrôleur — l'élément est probablement en butée (longueur max pour cette bande), il ne peut plus s'allonger.",'station.go':'Aller','station.stop':'Stop','station.dragHint':'Glisse la poignée à gauche d un panneau pour le déplacer. Choisis un nombre de colonnes pour la disposition.','station.dragMove':'Glisser pour déplacer ce panneau','station.colsAuto':'Auto','station.addDevice':'Ajouter un appareil','station.editDevice':"Modifier l'appareil",'station.empty':"Aucune carte relais. Ajoute un WebSwitch 1216H ou une carte KMTronic 8 relais pour piloter l'alimentation et les accessoires de ta station.",'station.online':'En ligne','station.offline':'Hors ligne','station.edit':'Modifier','station.delete':'Supprimer','station.relay':'Relais','station.on':'ON','station.off':'OFF','station.type':"Type d'appareil",'station.name':'Nom','station.host':'Hôte / IP','station.hostHint':"IP du LAN en local. Pour joindre la carte depuis L'EXTÉRIEUR, saisis une URL complète ici — ex. https://relais.tondomaine.com — pointant vers un reverse proxy (Nginx Proxy Manager…) qui expose le port HTTP de la carte.",'station.user':"Nom d'utilisateur",'station.pass':'Mot de passe','station.optional':'optionnel','station.ftdiSerial':'Numéro de série FTDI','station.detect':'Détecter','station.ftdiHint':"La carte Denkovi se pilote en FTDI bit-bang (pas via le port COM). Choisis son numéro de série (ex. DAE0006K). Nécessite le driver FTDI D2XX installé.",'station.channels':'Relais','station.comPort':'Port COM','station.noPorts':'Aucun port','station.usbRelayHint':"Cartes USB-série bon marché (CH340/LCUS) protocole A0. Si la tienne ne commute pas, donne-moi le modèle / jeu de commandes.",'station.labels':'Libellés des relais','station.cancel':'Annuler','station.save':'Enregistrer','station.test':'Tester la connexion','station.testOk':'Connecté — {n} relais','station.testFail':'Non connecté','station.detectNone':'Aucune carte FTDI trouvée — vérifie le câble et que le driver D2XX est installé.','station.detectFound':'{n} carte(s) détectée(s).',
'awards.followHint':'Diplômes affichés dans l’onglet Awards. Laisse la colonne de droite vide pour tous les afficher.','awards.available':'Tous les diplômes','awards.followed':'Suivis','awards.search':'Filtrer…','awards.addAll':'Tout ajouter','awards.clear':'Vider','awards.allTracked':'Tous les diplômes sont suivis.','awards.noneFollowed':'Aucun pour l’instant — l’onglet Awards les montre tous.',
'altm.filterPh':'Filtrer…','altm.noMatch':'aucun résultat','altm.noneAll':'aucune sélection = TOUT','altm.nSelected':'{n} sélectionné(s)','altm.giveName':'Donne un nom à la règle','altm.deleteConfirm':"Supprimer l'alerte « {name} » ?",'altm.title':'Gestion des alertes','altm.desc':'Alerte quand un spot correspond à une règle. Filtres vides = TOUT ; les filtres définis sont combinés par ET (ex. France + 20m = stations françaises sur 20m).','altm.rules':'Règles','altm.noRules':'Aucune règle — clique sur +','altm.emailTo':"E-mail d'alerte à",'altm.selectOrCreate':'Sélectionne ou crée une règle.','altm.tabDef':'Définition','altm.tabCall':'Indicatif / DXCC','altm.tabBandMode':'Bande / Mode','altm.tabOrigin':'Origine','altm.ruleName':'Nom de la règle','altm.alertEnabled':'Alerte activée','altm.againAfter':'Réalerter après (min)','altm.againHint':'0 = une fois/session · -1 = toujours','altm.actions':'Actions','altm.visual':'Visuel','altm.sound':'Son','altm.email':'E-mail','altm.skipWorked':'Ignorer les indicatifs déjà contactés (même bande + mode)','altm.callsigns':'Indicatifs (un par ligne, jokers : IW3*, */P)','altm.countries':'Pays (DXCC)','altm.continents':'Continents','altm.bands':'Bandes','altm.modes':'Modes','altm.spotterCall':'Indicatif du spotteur (joker)','altm.spotterCallPh':'ex. F* ou DL1ABC','altm.spotterContinents':'Continents du spotteur','altm.spotterCountries':'Pays du spotteur','altm.delete':'Supprimer','altm.saveRule':'Enregistrer la règle','altm.close':'Fermer',
'spm.callRequired':'Indicatif requis','spm.freqRequired':'Fréquence (kHz) requise','spm.title':'Envoyer un spot DX','spm.callsign':'Indicatif','spm.callPh':'Indicatif DX','spm.frequency':'Fréquence (kHz)','spm.message':'Message','spm.messagePh':'ex. CW · TNX QSO','spm.latestQsos':'Derniers QSO','spm.spotSent':'Spot envoyé ✓','spm.masterCluster':'Cluster maître','spm.cancel':'Annuler','spm.sending':'Envoi…','spm.sendSpot':'Envoyer le spot',
'ncp.newNetPrompt':'Nom du nouveau NET :','ncp.renamePrompt':'Renommer le NET :','ncp.deleteConfirm':'Supprimer le NET « {name} » et son répertoire ? Cette action est irréversible.','ncp.closeConfirm':"{n} station(s) encore en l'air seront retirées SANS être enregistrées. Fermer quand même ?",'ncp.removeConfirm':'Retirer {n} station(s) du répertoire de ce NET ?','ncp.colCallsign':'Indicatif','ncp.colName':'Nom','ncp.colTimeOn':'Heure début','ncp.colBand':'Bande','ncp.colMode':'Mode','ncp.colComment':'Commentaire','ncp.colCountry':'Pays','ncp.colDate':'Date','ncp.workedBefore':'Déjà contacté','ncp.wbHint':'Cliquer une station (on air ou roster) pour voir les QSO précédents','ncp.wbNone':'Aucun QSO précédent avec','ncp.wbFirst':'premier','ncp.wbLast':'dernier','ncp.wbResize':'Glisser pour redimensionner','ncp.newNet':'Nouveau NET','ncp.closeToSwitch':'Ferme le NET pour changer','ncp.selectNetTitle':'Sélectionne un NET','ncp.selectNetOption':'— sélectionner un NET —','ncp.closeNet':'Fermer le NET','ncp.openNet':'Ouvrir le NET','ncp.rename':'Renommer','ncp.delete':'Supprimer','ncp.netOpenBadge':'NET OUVERT','ncp.onAir':"En l'air :",'ncp.roster':'Répertoire :','ncp.onAirActive':"En l'air — QSO actifs",'ncp.activeHint':'ordre de passage du micro · ⬆⬇ pour réordonner · double-clic → éditer · « Logger & terminer »','ncp.moveUp':"Monter dans l'ordre de passage",'ncp.moveDown':"Descendre dans l'ordre de passage",'ncp.logEndSelected':'Logger & terminer la sélection','ncp.logAll':'Logger tout le monde ({n})','ncp.logAllConfirm':'Logger les {n} station(s) on air dans le logbook ?','ncp.netUsersRoster':'Membres du NET — répertoire','ncp.rosterHint':"double-clic → mettre en l'air",'ncp.addContact':'Ajouter un contact','ncp.remove':'Retirer','ncp.putOnAir':"Mettre la sélection en l'air",'ncp.addContactTitle':'Ajouter un contact au NET','ncp.addContactDesc':'Enregistré dans le répertoire de ce NET (réutilisé à la prochaine ouverture).','ncp.callsign':'Indicatif','ncp.search':'Rechercher','ncp.name':'Nom','ncp.country':'Pays','ncp.cancel':'Annuler','ncp.saveInNet':'Enregistrer dans le NET',
'udpp.relayInstead':'Pour un commutateur d’antennes ou une carte de relais, préférez Station Control → relais : il tient l’état, relit les cartes au démarrage et ne recommute pas quand vous bougez dans la même bande. Un commutateur fait main s’y déclare en type « Relais HTTP ».',
'udpp.svcCustomLabel':'Message personnalisé','udpp.svcCustomHint':'Vous choisissez ce qui le déclenche et ce qu’il dit. Datagramme UDP ou requête HTTP — cette dernière est la façon dont se pilotent la plupart des commutateurs d’antennes.','udpp.trigger':'Déclencheur','udpp.trgBand':'Changement de bande (radio)','udpp.trgQso':'QSO enregistré','udpp.trgRotator':'Commande de rotor','udpp.trgLookup':'Recherche d’indicatif','udpp.transport':'Envoi','udpp.transportUdp':'Message UDP','udpp.transportUrl':'URL (HTTP GET)','udpp.url':'URL','udpp.urlHint':'Les valeurs sont encodées pour l’URL. Les identifiants peuvent s’écrire http://user:pass@hôte/… — stockés tels quels, à réserver à votre réseau local.','udpp.template':'Message','udpp.lineEnd':'Fin de ligne','udpp.lineEndNone':'Aucune','udpp.fieldsAvailable':'Champs de ce déclencheur','udpp.fieldsHint':'Tout autre champ rendra du vide.',
'udpp.svcWsjtLabel':'WSJT-X / JTDX / MSHV','udpp.svcWsjtHint':"Logue automatiquement les QSO FT8/FT4/etc. et remplit l'indicatif de saisie en direct.",'udpp.svcAdifLabel':'Message ADIF (JTAlert, GridTracker)','udpp.svcAdifHint':'Reçoit un seul enregistrement ADIF par paquet et le logue.','udpp.svcN1mmLabel':'N1MM Logger+ (XML contest)','udpp.svcN1mmHint':'Reçoit les QSO de contest sous forme de messages XML.','udpp.svcRemoteLabel':'Indicatif distant (DXHunter, personnalisé)','udpp.svcRemoteHint':'Un court paquet texte contenant juste un indicatif — remplit le champ de saisie.','udpp.svcWsjtLogLabel':'QSO enregistré WSJT-X','udpp.svcWsjtLogHint':'Annonce chaque QSO enregistré sur l’interface UDP WSJT-X — les deux messages que WSJT-X émet lui-même. Pour tout logger qui écoute là plutôt que l’ADIF en texte brut (les sockets UDP supplémentaires de Logger32, par exemple).','udpp.svcDbLabel':"ADIF Message",'udpp.svcDbHint':"Envoie l'ADIF de chaque QSO enregistré vers un écouteur distant (Cloudlog UDP, N1MM…).",'udpp.svcPstLabel':'Fréquence PstRotator','udpp.svcPstHint':"Envoie la fréquence du poste en <PST><FREQUENCY> à chaque changement — règle le tracker de PstRotatorAz sur DXLog.net (port 12040 par défaut).",'udpp.svcN1mmRadioLabel':'N1MM RadioInfo (fréq + mode)','udpp.svcN1mmRadioHint':"Diffuse la fréquence/mode du poste en XML RadioInfo N1MM Logger+ à chaque changement — lu par PstRotator (tracker N1MM) et beaucoup d'autres outils.",'udpp.deleteConfirm':'Supprimer cette connexion UDP ?','udpp.loading':'Chargement…','udpp.intro':"Les connexions permettent à OpsLog de dialoguer avec d'autres logiciels radioamateurs. Les connexions entrantes reçoivent des QSO ou des indicatifs et mettent le journal à jour en direct ; les connexions sortantes notifient d'autres apps quand tu enregistres un QSO localement. Active le multicast pour partager un port avec un autre écouteur sans conflit — nécessaire pour la config WSJT-X 2237 classique.",'udpp.inboundTitle':'Entrant — OpsLog écoute','udpp.outboundTitle':'Sortant — OpsLog envoie','udpp.reloadAll':'Tout recharger','udpp.reloadHint':'Redémarre chaque écouteur activé après une modification manuelle.','udpp.add':'Ajouter','udpp.noConnection':'Aucune connexion.','udpp.unnamed':'(sans nom)','udpp.dialogTitle':'{action} connexion {direction}','udpp.new':'Nouvelle','udpp.edit':'Modifier','udpp.directionInbound':'entrante','udpp.directionOutbound':'sortante','udpp.name':'Nom','udpp.namePhInbound':'Log WSJT-X','udpp.namePhOutbound':'Notification Cloudlog','udpp.serviceType':'Type de service','udpp.port':'Port','udpp.multicast':'Multicast','udpp.multicastGroup':'Groupe multicast','udpp.multicastHint':"Utilise la même adresse de groupe que l'app émettrice. Le défaut WSJT-X est 224.0.0.1.",'udpp.destinationIp':'IP de destination','udpp.enabled':'Activé','udpp.cancel':'Annuler','udpp.save':'Enregistrer',
'fltb.fCallsign':'Callsign','fltb.fDate':'Date / time (UTC)','fltb.fEndDate':'End date / time','fltb.fBand':'Band','fltb.fRxBand':'RX band','fltb.fMode':'Mode','fltb.fSubmode':'Submode','fltb.fFreq':'Frequency (Hz)','fltb.fRxFreq':'RX frequency (Hz)','fltb.fRstSent':'RST sent','fltb.fRstRcvd':'RST rcvd','fltb.fName':'Name','fltb.fQth':'QTH','fltb.fAddress':'Address','fltb.fEmail':'E-mail','fltb.fGrid':'Grid','fltb.fCountry':'Country','fltb.fState':'State','fltb.fCounty':'County','fltb.fDxcc':'DXCC #','fltb.fContinent':'Continent','fltb.fCqz':'CQ zone','fltb.fItuz':'ITU zone','fltb.fIota':'IOTA','fltb.fSota':'SOTA ref','fltb.fPota':'POTA ref','fltb.fWwff':'WWFF ref','fltb.fRig':'Rig','fltb.fAntenna':'Antenna','fltb.fQslSent':'Paper QSL sent status','fltb.fQslSentDate':'Paper QSL sent date','fltb.fQslRcvd':'Paper QSL received status','fltb.fQslRcvdDate':'Paper QSL received date','fltb.fQslSentVia':'QSL envoyée via','fltb.fQslRcvdVia':'QSL reçue via','fltb.fQslVia':'QSL via','fltb.fLotwSent':'LoTW sent status','fltb.fLotwSentDate':'LoTW sent date','fltb.fLotwRcvd':'LoTW received status','fltb.fLotwRcvdDate':'LoTW received date','fltb.fEqslSent':'eQSL sent status','fltb.fEqslSentDate':'eQSL sent date','fltb.fEqslRcvd':'eQSL received status','fltb.fEqslRcvdDate':'eQSL received date','fltb.fQrzSent':'QRZ.com sent status','fltb.fQrzSentDate':'QRZ.com sent date','fltb.fQrzRcvd':'QRZ.com received status','fltb.fQrzRcvdDate':'QRZ.com received date','fltb.fClublogSent':'Club Log sent status','fltb.fClublogSentDate':'Club Log sent date','fltb.fHrdlogSent':'HRDLog sent status','fltb.fHrdlogSentDate':'HRDLog sent date','fltb.fContestId':'Contest ID','fltb.fSerialRcvd':'Serial rcvd','fltb.fSerialSent':'Serial sent','fltb.fPropMode':'Propagation mode','fltb.fSatellite':'Satellite','fltb.fMyCallsign':'Station callsign (my call)','fltb.fOperator':'Operator','fltb.fOwnerCallsign':'Owner callsign','fltb.fMyGrid':'My grid','fltb.fMyCountry':'My country','fltb.fMyState':'My state','fltb.fMyCounty':'My county','fltb.fMyIota':'My IOTA','fltb.fMySota':'My SOTA ref','fltb.fMyPota':'My POTA ref','fltb.fMyWwff':'My WWFF ref','fltb.fMyStreet':'My street','fltb.fMyCity':'My city','fltb.fMyPostal':'My postal code','fltb.fMyRig':'My rig','fltb.fMyAntenna':'My antenna','fltb.fTxPower':'TX power (W)','fltb.fComment':'Comment','fltb.fNotes':'Notes','fltb.opEq':'égal (=)','fltb.opNe':'différent (≠)','fltb.opContains':'contient','fltb.opStartsWith':'commence par','fltb.opEndsWith':'finit par','fltb.opGt':'supérieur à (>)','fltb.opLt':'inférieur à (<)','fltb.opGe':'supérieur ou égal (≥)','fltb.opLe':'inférieur ou égal (≤)','fltb.opEmpty':'est vide','fltb.opIn':'est parmi','fltb.opNotIn':'n est pas parmi','fltb.listPh':'2m, 70cm — séparés par des virgules','fltb.opNotEmpty':"n'est pas vide",'fltb.title':'Filtre QSO','fltb.match':'Correspondance','fltb.all':'TOUS (ET)','fltb.any':'AU MOINS UN (OU)','fltb.loadPreset':'Charger un préréglage…','fltb.noConditions':'Aucune condition — la liste affiche tous les QSO. Ajoutes-en une ci-dessous.','fltb.where':'OÙ','fltb.valuePh':'valeur','fltb.remove':'Retirer','fltb.addCondition':'Ajouter une condition','fltb.presetNamePh':'Nom du préréglage…','fltb.savePreset':'Enregistrer le préréglage','fltb.clear':'Effacer','fltb.cancel':'Annuler','fltb.applyClose':'Appliquer & fermer',
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.