diff --git a/changelog.json b/changelog.json index d383e60..5de2267 100644 --- a/changelog.json +++ b/changelog.json @@ -6,7 +6,7 @@ "Fixed 'Incorrect string value' (MySQL error 1366) when a QSO contained non-Latin characters — Cyrillic (Я), Polish ł, etc. — e.g. updating from QRZ. It happened when the shared MySQL database had been pre-created by the hosting panel as latin1, so OpsLog's tables couldn't store those letters. OpsLog now converts the database and its tables to utf8mb4 on connect (once, automatically), and everything stores correctly. Local SQLite logbooks were never affected.", "NET Control: the on-air list now follows a mic-pass order you control instead of log time. A pinned '#' column numbers the round, ⬆⬇ buttons move the selected station up/down the queue, new check-ins join the end, and 'Log & end' advances to the next in line. The order is remembered per net. Header sorting is disabled on this list so a click can't shuffle the round.", "The CW decoder (RX audio → text) is back, with a rebuilt decoding engine. The first version struggled on real signals; the new one adds a windowed tone detector, an adaptive dB envelope with noise squelch, two-way debouncing (a brief fade inside a dash no longer shatters it into dots), per-character dit/dah classification (even the first letter of an over decodes at any speed), and gap-fed speed tracking. It rides QSB, ignores QRM on other pitches, follows 12–40 WPM and sloppy hand keying — all proven by a synthetic-signal test suite. Tools → CW decoder (or the ear button): decodes while the mode is CW, with WPM/pitch/level display, pitch lock (follows the FlexRadio CW pitch automatically), and click-a-word to fill the callsign. Weak signals in heavy QRM remain hard — that's CW Skimmer territory — but clean-to-moderate signals now decode solidly.", - "The CW Keyer settings panel is now fully translated (it had stayed in English), and the long serial-engine explanation paragraph was removed to keep it clean.", + "Finished translating the Settings dialog: several panels that had stayed in English are now French too — the CW Keyer panel (and its long serial-engine paragraph removed for clarity), Password encryption, the ClubLog exceptions / Most Wanted blocks in General, and the External services tabs (HRDLOG, eQSL, LoTW, POTA).", "Serial CW keyer: fixed the rig dropping to RX between words during a macro (PTT not held). On USB-serial interfaces like the Yaesu SCU-17 (CP210x), the previous method of driving the DTR/RTS lines would drop the held RTS (PTT) as soon as DTR (CW) toggled. OpsLog now drives the lines with the direct Win32 method N1MM/WSJT use (EscapeCommFunction), so RTS stays asserted for the whole transmission. 'Key PTT line' also defaults on for the Serial engine, and PTT / key-line / speed changes apply immediately without reconnecting the keyer.", "New (Settings → General): show the ClubLog 'Most Wanted' rank in the entry-strip band matrix. When on, a 'MW #rank' pill appears next to the DXCC entity name (1 = the most wanted entity), coloured hotter the more wanted it is. The list is fetched from ClubLog and personalised to your callsign, refreshed daily.", "Fixed the colour theme sometimes resetting to light after an update/relaunch: an update can clear the WebView's localStorage, and the fallback that restores the theme from the local settings database gave up after ~2.4s — occasionally too soon during the brief startup window before that store is ready. It now keeps retrying until the store actually answers, so a dark theme is reliably restored." @@ -15,7 +15,7 @@ "Correction de « Incorrect string value » (erreur MySQL 1366) quand un QSO contenait des caractères non latins — cyrillique (Я), polonais ł, etc. — p. ex. lors d'une mise à jour depuis QRZ. Ça arrivait quand la base MySQL partagée avait été pré-créée en latin1 par le panel d'hébergement, empêchant les tables d'OpsLog de stocker ces lettres. OpsLog convertit désormais la base et ses tables en utf8mb4 à la connexion (une seule fois, automatiquement), et tout s'enregistre correctement. Les logbooks SQLite locaux n'étaient pas concernés.", "NET Control : la liste on-air suit maintenant un ordre de passage du micro que tu contrôles, au lieu de l'heure de log. Une colonne « # » épinglée numérote le tour, les boutons ⬆⬇ montent/descendent la station sélectionnée dans la file, les nouveaux arrivants rejoignent la fin, et « Logger & terminer » passe au suivant. L'ordre est mémorisé par NET. Le tri par en-tête est désactivé sur cette liste pour qu'un clic ne bouscule pas le tour.", "Le décodeur CW (audio RX → texte) est de retour, avec un moteur de décodage reconstruit. La première version peinait sur les vrais signaux ; la nouvelle ajoute un détecteur de tonalité fenêtré, une enveloppe dB adaptative avec squelch de bruit, un anti-rebond bilatéral (un bref fading dans un trait ne le brise plus en points), une classification point/trait par caractère (même la première lettre d'un over se décode à n'importe quelle vitesse) et un suivi de vitesse nourri par les espaces. Il tient le QSB, ignore le QRM sur d'autres tonalités, suit de 12 à 40 WPM et la manipulation humaine approximative — le tout prouvé par une suite de tests sur signaux synthétiques. Outils → Décodeur CW (ou le bouton oreille) : décode quand le mode est CW, avec affichage WPM/tonalité/niveau, verrouillage de tonalité (suit automatiquement le pitch CW du FlexRadio) et clic-sur-un-mot pour remplir l'indicatif. Les signaux faibles dans un fort QRM restent difficiles — c'est le territoire de CW Skimmer — mais les signaux propres à moyens se décodent maintenant solidement.", - "Le panneau de réglages du Manipulateur CW est maintenant entièrement traduit (il était resté en anglais), et le long paragraphe d'explication du moteur série a été retiré pour l'alléger.", + "Fin de la traduction de la fenêtre Réglages : plusieurs panneaux restés en anglais sont maintenant en français aussi — le Manipulateur CW (et son long paragraphe moteur série retiré pour l'alléger), le Chiffrement des mots de passe, les blocs Exceptions ClubLog / Most Wanted dans Général, et les onglets Services externes (HRDLOG, eQSL, LoTW, POTA).", "Keyer CW série : correction de la radio qui retombait en RX entre les mots pendant une macro (PTT non tenu). Sur les interfaces USB-série comme le Yaesu SCU-17 (CP210x), l'ancienne méthode de pilotage des lignes DTR/RTS faisait retomber le RTS (PTT) dès que DTR (CW) basculait. OpsLog pilote maintenant les lignes avec la méthode Win32 directe qu'utilisent N1MM/WSJT (EscapeCommFunction), donc RTS reste asserté toute l'émission. « Key PTT line » est aussi activé par défaut pour le moteur Série, et les changements PTT / ligne / vitesse s'appliquent immédiatement sans reconnecter le keyer.", "Nouveau (Réglages → Général) : afficher le rang « Most Wanted » de ClubLog dans la matrice de bandes de la barre de saisie. Activé, une pastille « MW #rang » apparaît à côté du nom de l'entité DXCC (1 = l'entité la plus recherchée), d'autant plus colorée qu'elle est recherchée. La liste est récupérée depuis ClubLog et personnalisée selon ton indicatif, rafraîchie quotidiennement.", "Correction du thème de couleur qui revenait parfois au clair après une mise à jour/relancement : une mise à jour peut vider le localStorage de la WebView, et le repli qui restaure le thème depuis la base de réglages locale abandonnait après ~2,4s — parfois trop tôt pendant le court instant de démarrage avant que ce store soit prêt. Il réessaie maintenant jusqu'à ce que le store réponde vraiment, donc un thème sombre est restauré de façon fiable." diff --git a/frontend/src/components/SettingsModal.tsx b/frontend/src/components/SettingsModal.tsx index 442141d..1696ed7 100644 --- a/frontend/src/components/SettingsModal.tsx +++ b/frontend/src/components/SettingsModal.tsx @@ -3805,20 +3805,20 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan {/* Tab strip */}
- {TABS.map((t) => ( + {TABS.map((tab) => ( ))}
@@ -3830,14 +3830,14 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan setQrz({ api_key: e.target.value })} - placeholder="QRZ.com logbook API key (XXXX-XXXX-XXXX-XXXX)" + placeholder={t('es.qrzApiPh')} className="font-mono text-xs" /> setQrz({ force_station_callsign: e.target.value.toUpperCase() })} - placeholder="e.g. F4BPO — optional" + placeholder={t('es.forceCallPh')} className="font-mono text-xs" /> @@ -3886,7 +3886,7 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan type="email" value={clublog.email} onChange={(e) => setClublog({ email: e.target.value })} - placeholder="your Club Log account email" + placeholder={t('es.clubEmailPh')} className="text-xs" /> @@ -3894,14 +3894,14 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan type="password" value={clublog.password} onChange={(e) => setClublog({ password: e.target.value })} - placeholder="Club Log account password" + placeholder={t('es.clubPwPh')} className="text-xs" /> setClublog({ callsign: e.target.value.toUpperCase() })} - placeholder="defaults to the active profile's callsign" + placeholder={t('es.callDefaultPh')} className="font-mono text-xs" /> @@ -3945,24 +3945,24 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan ) : extSvcTab === 'hrdlog' ? (
- + setHrdlog({ callsign: e.target.value.toUpperCase() })} - placeholder="defaults to the active profile's callsign" + placeholder={t('es.callDefaultPh')} className="font-mono text-xs" /> - + setHrdlog({ code: e.target.value })} - placeholder="HRDLog account → My Account → Upload code" + placeholder={t('es.hrdCodePh')} className="text-xs" />
- Find the upload code on HRDLog.net under My Account. It authorises uploads for this callsign. + {t('es.hrdHint')}
@@ -4004,11 +4004,11 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan ) : extSvcTab === 'eqsl' ? (
- + setEqsl({ username: e.target.value.toUpperCase() })} - placeholder="your eQSL.cc login (callsign)" + placeholder={t('es.eqslUserPh')} className="font-mono text-xs" /> @@ -4016,19 +4016,19 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan type="password" value={eqsl.password} onChange={(e) => setEqsl({ password: e.target.value })} - placeholder="eQSL.cc account password" + placeholder={t('es.eqslPwPh')} className="text-xs" /> - + setEqsl({ qth_nickname: e.target.value })} - placeholder="optional — required only if your eQSL account has several QTHs" + placeholder={t('es.qthNickPh')} className="text-xs" />
- The QTH nickname tells eQSL which location profile to file the QSO under. Leave blank if you have only one. + {t('es.eqslHint')}
@@ -4070,38 +4070,38 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan ) : extSvcTab === 'lotw' ? (
- + setLotw({ username: e.target.value })} - placeholder="LoTW website login (for downloading confirmations)" + placeholder={t('es.lotwUserPh')} className="font-mono text-xs" /> - + setLotw({ password: e.target.value })} - placeholder="LoTW website password" + placeholder={t('es.lotwPwPh')} className="text-xs" /> - + setLotw({ tqsl_path: e.target.value })} placeholder="C:\Program Files (x86)\TrustedQSL\tqsl.exe" className="font-mono text-xs" /> - +
-
@@ -4110,23 +4110,22 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan setLotw({ force_station_callsign: e.target.value.toUpperCase() })} - placeholder="e.g. F4BPO/P — leave blank to use the QSO's own call" + placeholder={t('es.lotwForcePh')} className="font-mono uppercase w-64" />
- Overrides STATION_CALLSIGN at sign time so one certificate can sign several calls - (F4BPO, F4BPO/P, TM2Q). Pick the matching Station Location above. + {t('es.lotwForceHint')}
- + setLotw({ key_password: e.target.value })} - placeholder="only if your certificate key has a password" + placeholder={t('es.keyPwPh')} className="text-xs" /> - +
{(['N', 'R'] as const).map((f) => { @@ -4143,15 +4142,13 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan setLotw({ upload_flags: next }); }} /> - {f === 'N' ? 'No (N)' : 'Requested (R)'} + {f === 'N' ? t('es.flagN') : t('es.flagR')} ); })}
- At app close, every QSO whose LoTW sent status is one of these is signed and - uploaded in one TQSL batch — including QSOs imported from an ADIF. Uploaded QSOs become - Y and won't be re-sent. Must include your default sent status from Confirmations. + {t('es.lotwUnsentHint')}
@@ -4162,14 +4159,14 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan checked={lotw.auto_upload} onCheckedChange={(c) => setLotw({ auto_upload: !!c, upload_mode: 'on_close' })} /> - Automatic upload on application close + {t('es.lotwAutoClose')}
@@ -4204,13 +4201,10 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan ) : extSvcTab === 'pota' ? (

- Update your QSOs with the park reference from your pota.app hunter log. - Paste your session token: log in at pota.app, open the browser - DevTools → Network tab, click any api.pota.app request, - and copy the full Authorization header value. The token expires after a while — re-copy it if the sync fails. + {t('es.potaHint')}

- +