feat(labels): print the labels — queue, address review, PDF, log update
The printing session in three steps. The worklist is the paper queue (ADIF qsl_sent R/Q), grouped by callsign since several QSOs of one station share a card. Each recipient is reviewed before anything prints: routing first — via manager when qsl_via says so, direct when an address is known, bureau otherwise — then the address itself, editable and fetchable from QRZ (the MANAGER's address when routing says via). What is printed is the reviewed text verbatim, not a re-resolution that could differ from what was checked. One PDF per label kind, never one file for all: a roll printer holds one stock at a time, and a file mixing 29 mm addresses with 62 mm QSO labels could not be printed at all. Pages are rasterised by the designer's own renderer at the stock's dpi and carried into the PDF untouched — internal/pdf is a hand-written image-page writer (DeviceGray + flate: monochrome, lossless, no cgo) because that is the entire need. Bureau stations get no address label (no envelope); return labels are printed one per envelope. Finishing offers the log update: QSL_SENT=Y, the chosen date, via B or D per routing — through the same BulkUpdateQSL the paper view uses.
This commit is contained in:
@@ -132,6 +132,27 @@ const en: Dict = {
|
||||
'wk.tciHint': "Keying goes through the radio's own macro keyer, over the link already open — no WinKeyer and no second serial port. The radio can stop a message but cannot un-type one, so there is no type-ahead correction here.",
|
||||
'gen.miles': 'Distances in miles', 'gen.milesHint': '(instead of kilometres)',
|
||||
'tools.labelDesigner': "Label Designer…",
|
||||
'tools.labelPrint': "Print QSL labels…",
|
||||
'lpr.title': "Print QSL labels",
|
||||
'lpr.step1': "1 · pick the contacts", 'lpr.step2': "2 · check the addresses", 'lpr.step3': "3 · print and record",
|
||||
'lpr.emptyQueue': "No paper QSL is waiting. Mark contacts as Requested or Queued (QSL sent status R/Q) — in the QSL Manager's Paper QSL view or the QSO editor — and they will appear here.",
|
||||
'lpr.all': "all", 'lpr.none': "none", 'lpr.pickSummary': "{s} station(s) · {q} QSO(s)",
|
||||
'lpr.direct': "Direct", 'lpr.bureau': "Bureau", 'lpr.viaMgr': "Via manager", 'lpr.mgrPh': "Manager callsign",
|
||||
'lpr.fetchQrz': "Fetch address (QRZ)", 'lpr.noAddress': "No address found for {call}.",
|
||||
'lpr.bureauHint': "Bureau: no envelope, so no address label — the QSO label is enough.",
|
||||
'lpr.addressPh': "Name\nStreet\nZIP City\nCountry",
|
||||
'lpr.missingAddr': "A direct or via-manager station still has an empty address.",
|
||||
'lpr.whatToPrint': "Labels to print", 'lpr.pickTpl': "Pick a template…",
|
||||
'lpr.kQso': "QSO labels", 'lpr.kAddr': "Address labels", 'lpr.kRet': "My return-address labels",
|
||||
'lpr.myAddress': "My address", 'lpr.build': "Build the labels",
|
||||
'lpr.noQsoTpl': "No QSO label template — create one in the Label Designer first.",
|
||||
'lpr.noAddrTpl': "No address label template — create one in the Label Designer first.",
|
||||
'lpr.pageCount': "{n} label(s) — one PDF page each",
|
||||
'lpr.savePdf': "Save PDF & open",
|
||||
'lpr.markTitle': "Record in the log", 'lpr.markBtn': "Mark {n} QSO(s) sent",
|
||||
'lpr.markHint': "Sets QSL sent = Y with this date; via becomes B for bureau and D for direct or manager.",
|
||||
'lpr.markDone': "{n} QSO(s) updated.",
|
||||
'lpr.back': "Back", 'lpr.next': "Next",
|
||||
'lbl.title': "Label Designer",
|
||||
'lbl.newQso': "QSO label", 'lbl.newAddr': "Address label",
|
||||
'lbl.newQsoName': "QSO label", 'lbl.newAddrName': "Address label",
|
||||
@@ -655,6 +676,27 @@ const fr: Dict = {
|
||||
'wk.tciHint': "La manipulation passe par le keyer à macros de la radio, sur la liaison déjà ouverte — ni WinKeyer ni second port série. La radio sait interrompre un message mais pas en effacer la fin, donc pas de correction en frappe anticipée ici.",
|
||||
'gen.miles': 'Distances en miles', 'gen.milesHint': '(au lieu des kilomètres)',
|
||||
'tools.labelDesigner': "Créateur d'étiquettes…",
|
||||
'tools.labelPrint': "Imprimer les étiquettes QSL…",
|
||||
'lpr.title': "Imprimer les étiquettes QSL",
|
||||
'lpr.step1': "1 · choisir les contacts", 'lpr.step2': "2 · vérifier les adresses", 'lpr.step3': "3 · imprimer et enregistrer",
|
||||
'lpr.emptyQueue': "Aucune QSL papier en attente. Marquez des contacts Demandée ou En file (statut QSL envoyée R/Q) — dans la vue QSL papier du gestionnaire ou l'éditeur de QSO — et ils apparaîtront ici.",
|
||||
'lpr.all': "tout", 'lpr.none': "aucun", 'lpr.pickSummary': "{s} station(s) · {q} QSO",
|
||||
'lpr.direct': "Direct", 'lpr.bureau': "Bureau", 'lpr.viaMgr': "Via manager", 'lpr.mgrPh': "Indicatif du manager",
|
||||
'lpr.fetchQrz': "Récupérer l'adresse (QRZ)", 'lpr.noAddress': "Aucune adresse trouvée pour {call}.",
|
||||
'lpr.bureauHint': "Bureau : pas d'enveloppe, donc pas d'étiquette adresse — l'étiquette QSO suffit.",
|
||||
'lpr.addressPh': "Nom\nRue\nCP Ville\nPays",
|
||||
'lpr.missingAddr': "Une station en direct ou via manager n'a pas encore d'adresse.",
|
||||
'lpr.whatToPrint': "Étiquettes à imprimer", 'lpr.pickTpl': "Choisir un modèle…",
|
||||
'lpr.kQso': "Étiquettes QSO", 'lpr.kAddr': "Étiquettes adresse", 'lpr.kRet': "Mes étiquettes adresse retour",
|
||||
'lpr.myAddress': "Mon adresse", 'lpr.build': "Composer les étiquettes",
|
||||
'lpr.noQsoTpl': "Aucun modèle d'étiquette QSO — créez-en un dans le Créateur d'étiquettes.",
|
||||
'lpr.noAddrTpl': "Aucun modèle d'étiquette adresse — créez-en un dans le Créateur d'étiquettes.",
|
||||
'lpr.pageCount': "{n} étiquette(s) — une page PDF chacune",
|
||||
'lpr.savePdf': "Enregistrer le PDF et ouvrir",
|
||||
'lpr.markTitle': "Enregistrer dans le log", 'lpr.markBtn': "Marquer {n} QSO envoyés",
|
||||
'lpr.markHint': "Passe QSL envoyée = Y à cette date ; le moyen devient B pour bureau et D pour direct ou manager.",
|
||||
'lpr.markDone': "{n} QSO mis à jour.",
|
||||
'lpr.back': "Retour", 'lpr.next': "Suivant",
|
||||
'lbl.title': "Créateur d'étiquettes",
|
||||
'lbl.newQso': "Étiquette QSO", 'lbl.newAddr': "Étiquette adresse",
|
||||
'lbl.newQsoName': "Étiquette QSO", 'lbl.newAddrName': "Étiquette adresse",
|
||||
|
||||
Reference in New Issue
Block a user