fix(print): the Print dialog waits for the printer list instead of offering Save as PDF (#160) (#2332)

* fix(print): the Print dialog waits for the printer list instead of offering Save as PDF (#160)

The first time the dialog opens, the printer list is read in the
background and no printer is selected yet, so the dialog showed Save as
PDF and its button saved a PDF. It now says it is looking for printers
and the button waits until the list arrives or the user chooses Save as
PDF. An empty list says that no printers were found. The button's
Print / Save as PDF label is translated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PCdPYhYkggLJVYoME2kr5R

* Refresh catalog hashes after merging main

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
This commit is contained in:
mtlcl410
2026-10-15 02:55:22 -04:00
committed by GitHub
co-authored by Claude Opus 5.5 Brandon Thomas
parent 8356665d7b
commit b33445aa2e
24 changed files with 96 additions and 25 deletions
+21 -21
View File
@@ -7,7 +7,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Greek UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "a97939665a6e4ac58111a27982f6b1bfdcb85db9cbd6ce023dbd8659a73e6118"
sha256 = "dadc21af04311f400962fab2008e4cc1215097ee48bd15d8171ce8d5be1ed995"
# ATTRIBUTION.toml: one entry per asset (AGENTS.md §1). The source of truth for provenance and licences.
# ATTRIBUTION.md is generated from this file: `cargo xtask assets --write`. Checked by `cargo xtask assets` (part of `xtask ci`).
@@ -30,7 +30,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Simplified Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "a5fe624ab5684a330ddad485a1ae4a2ff7439cb2ada85afd10ffc4fb0791522c"
sha256 = "49c2d8b5c765ad32839837ca0e2316adc81c7ad9bdce03004ddf3b8b1a2fb444"
[[asset]]
path = "crates/ui-egui/src/i18n/zh-hant.tsv"
@@ -41,7 +41,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Traditional Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "5da04b4ef08f9ba2bf4433a51b1cff596d700e55170c28cc12ef34ad19c9b1fd"
sha256 = "1c41a76c4af3aa31477cd623fd33fc263c20b7a000d2c72f626d487460df4b97"
[[asset]]
path = "crates/ui-egui/src/i18n/cs.tsv"
@@ -52,7 +52,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Czech UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "d714effcab6ae014ad5b0e964b93d313758db1ce9523b1340a60a5397bf123d8"
sha256 = "cc5ab5afd85cbf878c90efa227d078c8ec9de2984ff26d472c17c1708eb9f8f8"
[[asset]]
path = "crates/ui-egui/src/i18n/pt-br.tsv"
@@ -63,7 +63,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Brazilian Portuguese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "244fecf2976aec60450528de322f1048a8d2aafe977f1f1a919fcf876d36e593"
sha256 = "697bc6101239a291fe8530ddf874c811c694f26e01df710dc7ee61b41773c948"
[[asset]]
path = "crates/ui-egui/src/i18n/es.tsv"
@@ -74,7 +74,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Spanish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "f6fba535ad253a7661bcec3c274fd1d1116430c65628da8ffb74532172e9dd04"
sha256 = "b3f75c272623a778bbc3819939fd4e09e399d687882b291d629d1f05064976fc"
[[asset]]
path = "crates/ui-egui/src/i18n/fr.tsv"
@@ -85,7 +85,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "French UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "204e00346d16c9f32697381f990bf3d138361a9e4237fcd961a2ce1d69355be9"
sha256 = "2f25c13e15f306a1adbec4978648015e25a4178936350a4123ff2a752fe03efc"
[[asset]]
path = "crates/ui-egui/src/i18n/de.tsv"
@@ -96,7 +96,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "German UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "dcf84dbffb1b1b37f3826ce88f9ea6dd4bc52aee800914f4bc21b8009aebe550"
sha256 = "ca9c1ebeac08e194b20bc8d2b7836ed8dab50affdce905c47a4a76b9b5ad171f"
[[asset]]
path = "crates/ui-egui/src/i18n/te.tsv"
@@ -107,7 +107,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Telugu UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "8ba90267efc380425d88bab543d88345cb9de3ce983f9a1a1f2879d6f3e6206b"
sha256 = "2d35261ae57f6c641630adb98254dc75e164ae759a18a6156b45db044a1c45ba"
[[asset]]
path = "crates/ui-egui/src/i18n/it.tsv"
@@ -118,7 +118,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Italian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "73244fda2e227dc1d0b2362d6e7de726a0aa07d93e6fb87bb18a69c7b7829fc4"
sha256 = "6fc0b69e7d7f63cbc2d672e162c7b61f807c6c182727def155397476e2351bbf"
[[asset]]
path = "crates/ui-egui/src/i18n/pl.tsv"
@@ -129,7 +129,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Polish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "31062d686391ba9d6dbfe0ab1a34a58924333bb6d1bfaa2f68433ff3352c2455"
sha256 = "413da7472d0558b555e48216ab5078a302580e998274e10007369ca46d6c8196"
[[asset]]
path = "crates/ui-egui/src/i18n/ru.tsv"
@@ -140,7 +140,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Russian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "0164c540c1d3363329cb5125dc30a5c6dc1321d5ed68ec705a51bef12850a7a5"
sha256 = "aaa593ea03a42cfe44dcd8054b01207e788be8f29becbe37d10eed42f946714b"
[[asset]]
path = "crates/ui-egui/src/i18n/hu.tsv"
@@ -151,7 +151,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Hungarian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "49ebab7b33137af1754bf28abb7b52ee86d9a0ab837281dcb9741a7310dd69fa"
sha256 = "166c745d7e80af7d36baaddb6027284b7aff0b61e42bc55eaac0dc8982e7fb3c"
[[asset]]
path = "crates/ui-egui/src/i18n/bg.tsv"
@@ -162,7 +162,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Bulgarian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "268f5707b1b905067d597a7b9e75fecc9f8d6c9d227813450391c5cae7505f99"
sha256 = "47e9c4b1aa621cf05cc39fa2da1986a970f73377f2759dfc4128fdc5f0bdc4af"
[[asset]]
path = "crates/ui-egui/src/i18n/kk.tsv"
@@ -173,7 +173,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Kazakh UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "087167049187f00cceb87af9744cb4017bd903c80adbf1e5e49c0b1e0b6352bc"
sha256 = "2237b9e378863361254d7a267c1a6887fbe2e0638aba15d4956e2fbef35daf80"
[[asset]]
path = "crates/ui-egui/src/i18n/ja.tsv"
@@ -184,7 +184,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Japanese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "5e74d56a13284204077b0c39acb7fe22039fcba886a7eb75eeab0f211d18184f"
sha256 = "38c3086beaad4a2b0e13cb26b97eaadc97a1f3871c9e59d3b411ec4bfe9686e5"
[[asset]]
path = "crates/ui-egui/src/i18n/uk.tsv"
@@ -195,7 +195,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Ukrainian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "748f6f45a6e72c164b6b215b2d3617495f420ab1d175d6cfa3b8a73e6631a01d"
sha256 = "a6b7ce0fdd44827951b0873e319fa381919be6e05fa5f919965b8f8df658416a"
[[asset]]
path = "crates/ui-egui/src/i18n/ar.tsv"
@@ -206,7 +206,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Arabic UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "1367bc29cf3288b0fa9246f3af41cf5a176cb795882795a94f386a5d3a753f23"
sha256 = "40613047ce409b34d97489ef422aedd392ff2251fb383a8d3d5c411f3560d6e4"
[[asset]]
path = "crates/ui-egui/src/i18n/tr.tsv"
@@ -217,7 +217,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Turkish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "b52d09fd8a30cb2adacfaa8dab55d39e555e6812546ac3bc2d7886dd21e9bf2d"
sha256 = "cae07bcc17be4f3ebd882bb987d5da53891fbcfdc76e41db05623119248ca762"
[[asset]]
path = "crates/ui-egui/src/i18n/lt.tsv"
@@ -228,7 +228,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Lithuanian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "9b9e1516828841f1685b4a02cf9b79f917182395af46907831ba60c301b66644"
sha256 = "72a3d59cda8ce1d5c39a51a69f06dc2cd9f60698c448b1036e70e4e7d6c65e4b"
[[asset]]
@@ -3363,7 +3363,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Slovene UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "06d2b8e6b9b719c9f3a82bc4e6b5c3dacd00c6f44fd3092e1b834d43464ab5a9"
sha256 = "33629fdae4b1dd288c6cdc9c479810df61fe1dcb9470941289b8719c649df6ca"
[[asset]]
path = "vendor/vello_common/assets/probe.png"
+1
View File
@@ -1615,6 +1615,7 @@
Sent to {printer} أُرسل إلى {printer}
Sent to {printer}: {msg} أُرسل إلى {printer}: {msg}
Looking for printers… جارٍ البحث عن الطابعات…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. لم يُعثر على أي طابعة. تحقّق من أن الطابعة مثبّتة وأن خدمة التخزين المؤقت للطباعة تعمل، ثم افتح «طباعة» مرة أخرى.
Sending to {printer}… جارٍ الإرسال إلى {printer}…
Choose a folder for the searchable files اختر مجلدًا للملفات القابلة للبحث
Files are combined from top to bottom. Leave Pages empty to take every page. تُدمج الملفات من الأعلى إلى الأسفل. اترك «الصفحات» فارغًا لأخذ كل الصفحات.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -1576,6 +1576,7 @@
Sent to {printer} Изпратено до {printer}
Sent to {printer}: {msg} Изпратено до {printer}: {msg}
Looking for printers… Търсене на принтери…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Не са намерени принтери. Проверете дали принтерът е инсталиран и дали услугата за опашка за печат работи, след което отворете „Печат“ отново.
Sending to {printer}… Изпращане до {printer}…
Choose a folder for the searchable files Изберете папка за файловете с възможност за търсене
Files are combined from top to bottom. Leave Pages empty to take every page. Файловете се обединяват отгоре надолу. Оставете „Страници“ празно, за да се вземат всички страници.
Can't render this file because it contains an unexpected character in line 8 and column 16.
+1
View File
@@ -2263,6 +2263,7 @@ certificate Subject Subjekt
Remove page Odebrat stránku
Remove {n} pages Odebrat stránky ({n})
Looking for printers… Hledání tiskáren…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Nebyly nalezeny žádné tiskárny. Zkontrolujte, že je tiskárna nainstalovaná a zařazování tisku běží, a pak znovu otevřete Tisk.
Sending to {printer}… Odesílání na {printer}…
Fill colour Barva výplně
Fill colour: none Barva výplně: žádná
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -1609,6 +1609,7 @@
Sent to {printer} An {printer} gesendet
Sent to {printer}: {msg} An {printer} gesendet: {msg}
Looking for printers… Drucker werden gesucht…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Es wurden keine Drucker gefunden. Prüfen Sie, ob der Drucker installiert ist und die Druckwarteschlange läuft, und öffnen Sie dann „Drucken“ erneut.
Sending to {printer}… Wird an {printer} gesendet…
Choose a folder for the searchable files Wähle einen Ordner für die durchsuchbaren Dateien
Files are combined in this order. Leave Pages empty to take every page. Die Dateien werden in dieser Reihenfolge kombiniert. Lass „Seiten“ leer, um alle Seiten zu übernehmen.
Can't render this file because it contains an unexpected character in line 6 and column 51.
+1
View File
@@ -2247,6 +2247,7 @@ comment menu Edit Επεξεργασία
Fill & Sign signature Υπογραφή από το εργαλείο «Συμπλήρωση και υπογραφή»
Choose image… Επιλογή εικόνας…
Looking for printers… Αναζήτηση εκτυπωτών…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Δεν βρέθηκαν εκτυπωτές. Ελέγξτε ότι ο εκτυπωτής είναι εγκατεστημένος και ότι η ουρά εκτύπωσης εκτελείται και, στη συνέχεια, ανοίξτε ξανά την Εκτύπωση.
Sending to {printer}… Αποστολή στον {printer}…
Enter permissions password… Εισαγωγή κωδικού δικαιωμάτων…
Permissions password Κωδικός δικαιωμάτων
Can't render this file because it contains an unexpected character in line 475 and column 9.
+1
View File
@@ -1619,6 +1619,7 @@
Sent to {printer} Enviado a {printer}
Sent to {printer}: {msg} Enviado a {printer}: {msg}
Looking for printers… Buscando impresoras…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. No se encontró ninguna impresora. Compruebe que la impresora está instalada y que la cola de impresión está en marcha, y vuelva a abrir Imprimir.
Sending to {printer}… Enviando a {printer}…
Choose a folder for the searchable files Elige una carpeta para los archivos con búsqueda
Files are combined in this order. Leave Pages empty to take every page. Los archivos se combinan en este orden. Deja Páginas vacío para incluir todas las páginas.
Can't render this file because it contains an unexpected character in line 6 and column 60.
+1
View File
@@ -1604,6 +1604,7 @@
Sent to {printer} Envoyé à {printer}
Sent to {printer}: {msg} Envoyé à {printer} : {msg}
Looking for printers… Recherche des imprimantes…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Aucune imprimante trouvée. Vérifiez que l’imprimante est installée et que le spouleur d’impression fonctionne, puis rouvrez Imprimer.
Sending to {printer}… Envoi à {printer}…
Choose a folder for the searchable files Choisissez un dossier pour les fichiers recherchables
Files are combined in this order. Leave Pages empty to take every page. Les fichiers sont combinés dans cet ordre. Laissez Pages vide pour prendre toutes les pages.
Can't render this file because it contains an unexpected character in line 6 and column 39.
+1
View File
@@ -1594,6 +1594,7 @@
Sent to {printer} Elküldve ide: {printer}
Sent to {printer}: {msg} Elküldve ide: {printer}: {msg}
Looking for printers… Nyomtatók keresése…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Nem található nyomtató. Ellenőrizze, hogy a nyomtató telepítve van-e, és fut-e a nyomtatási sorkezelő, majd nyissa meg újra a Nyomtatást.
Sending to {printer}… Küldés ide: {printer}…
Choose a folder for the searchable files Válassz mappát a kereshető fájloknak
Files are combined in this order. Leave Pages empty to take every page. A fájlok ebben a sorrendben egyesülnek. Hagyd üresen az Oldalak mezőt, ha minden oldalt kéred.
Can't render this file because it contains an unexpected character in line 7 and column 44.
+1
View File
@@ -1620,6 +1620,7 @@
Sent to {printer} Inviato a {printer}
Sent to {printer}: {msg} Inviato a {printer}: {msg}
Looking for printers… Ricerca delle stampanti…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Nessuna stampante trovata. Verifica che la stampante sia installata e che lo spooler di stampa sia in esecuzione, quindi riapri Stampa.
Sending to {printer}… Invio a {printer}…
Choose a folder for the searchable files Scegli una cartella per i file ricercabili
Files are combined from top to bottom. Leave Pages empty to take every page. I file vengono combinati dall'alto verso il basso. Lascia vuoto Pagine per prendere tutte le pagine.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -1625,6 +1625,7 @@
Sent to {printer} {printer} に送信しました
Sent to {printer}: {msg} {printer} に送信しました: {msg}
Looking for printers… プリンターを検索しています…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. プリンターが見つかりません。プリンターがインストールされ、印刷スプーラーが動作していることを確認してから、もう一度[印刷]を開いてください。
Sending to {printer}… {printer} に送信しています…
Choose a folder for the searchable files 検索可能なファイルの保存先フォルダーを選択
Files are combined from top to bottom. Leave Pages empty to take every page. ファイルは上から順に結合されます。すべてのページを使用する場合は「ページ」を空欄にしてください。
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -2237,6 +2237,7 @@ key Space Бос орын
Fill & Sign signature «Толтыру және қол қою» қолтаңбасы
Choose image… Сурет таңдау…
Looking for printers… Принтерлер ізделуде…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Принтерлер табылмады. Принтердің орнатылғанын және басып шығару кезегі қызметінің жұмыс істеп тұрғанын тексеріп, «Басып шығару» терезесін қайта ашыңыз.
Sending to {printer}… {printer} құрылғысына жіберілуде…
Enter permissions password… Рұқсаттар құпиясөзін енгізу…
Permissions password Рұқсаттар құпиясөзі
Can't render this file because it contains an unexpected character in line 824 and column 9.
+1
View File
@@ -705,6 +705,7 @@
Locked Užrakinta
Looking for PDFs… Ieškoma PDF failų…
Looking for printers… Ieškoma spausdintuvų…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Spausdintuvų nerasta. Patikrinkite, ar spausdintuvas įdiegtas ir ar veikia spausdinimo eilė, tada vėl atverkite Spausdinti.
Low Resolution (150 dpi) Maža raiška (150 dpi)
Low resolution Maža raiška
Magnification Didinimas
Can't render this file because it contains an unexpected character in line 401 and column 9.
+1
View File
@@ -1606,6 +1606,7 @@
Sent to {printer} Wysłano do {printer}
Sent to {printer}: {msg} Wysłano do {printer}: {msg}
Looking for printers… Wyszukiwanie drukarek…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Nie znaleziono drukarek. Sprawdź, czy drukarka jest zainstalowana, a bufor wydruku działa, i ponownie otwórz Drukuj.
Sending to {printer}… Wysyłanie do {printer}…
Choose a folder for the searchable files Wybierz folder dla plików z możliwością wyszukiwania
Files are combined from top to bottom. Leave Pages empty to take every page. Pliki są łączone od góry do dołu. Pozostaw pole Strony puste, aby uwzględnić wszystkie strony.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -1510,6 +1510,7 @@
Sent to {printer} Enviado para {printer}
Sent to {printer}: {msg} Enviado para {printer}: {msg}
Looking for printers… Procurando impressoras…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Nenhuma impressora encontrada. Verifique se a impressora está instalada e se o spooler de impressão está em execução e abra Imprimir novamente.
Sending to {printer}… Enviando para {printer}…
Choose a folder for the searchable files Escolha uma pasta para os arquivos pesquisáveis
Files are combined in this order. Leave Pages empty to take every page. Os arquivos são combinados nesta ordem. Deixe Páginas em branco para incluir todas as páginas.
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -1616,6 +1616,7 @@
Sent to {printer} Отправлено на {printer}
Sent to {printer}: {msg} Отправлено на {printer}: {msg}
Looking for printers… Поиск принтеров…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Принтеры не найдены. Проверьте, что принтер установлен, а диспетчер печати запущен, и снова откройте «Печать».
Sending to {printer}… Отправка на {printer}…
Choose a folder for the searchable files Выберите папку для доступных для поиска файлов
Files are combined from top to bottom. Leave Pages empty to take every page. Файлы объединяются сверху вниз. Оставьте «Страницы» пустыми, чтобы взять все страницы.
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -2226,6 +2226,7 @@ key Shift Shift
key Space Preslednica
@plural {n} object selected|{n} objects selected {n} izbran objekt|{n} izbrana objekta|{n} izbrani objekti|{n} izbranih objektov
Looking for printers… Iskanje tiskalnikov…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Ni najdenih tiskalnikov. Preverite, ali je tiskalnik nameščen in ali tiskalna vrsta deluje, nato znova odprite Natisni.
Sending to {printer}… Pošiljanje na {printer}…
Float panel Odtrgaj razdelek
Inspector Inšpektor
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -1595,6 +1595,7 @@ action wizard Start ప్రారంభించు
Sent to {printer} {printer}కు పంపబడింది
Sent to {printer}: {msg} {printer}కు పంపబడింది: {msg}
Looking for printers… ప్రింటర్ల కోసం వెతుకుతోంది…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. ప్రింటర్లు ఏవీ కనుగొనబడలేదు. ప్రింటర్ ఇన్‌స్టాల్ అయిందో, ప్రింట్ స్పూలర్ నడుస్తోందో తనిఖీ చేసి, ముద్రణను మళ్లీ తెరవండి.
Sending to {printer}… {printer}కు పంపుతోంది…
Choose a folder for the searchable files వెతకగలిగే ఫైల్‌ల కోసం ఒక ఫోల్డర్‌ను ఎంచుకోండి
Files are combined in this order. Leave Pages empty to take every page. ఫైల్‌లు ఈ క్రమంలో కలపబడతాయి. అన్ని పేజీలను తీసుకోవడానికి పేజీలు ఫీల్డ్‌ను ఖాళీగా వదలండి.
Can't render this file because it contains an unexpected character in line 13 and column 16.
+1
View File
@@ -2183,6 +2183,7 @@ key Space Boşluk
# Printing and multi-object selection
Looking for printers… Yazıcılar aranıyor…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Yazıcı bulunamadı. Yazıcının yüklü olduğunu ve yazdırma biriktiricisinin çalıştığını denetleyip Yazdır'ı yeniden açın.
Sending to {printer}… {printer} yazıcısına gönderiliyor…
Column select Sütun seçimi
@plural {n} object selected|{n} objects selected {n} nesne seçildi
Can't render this file because it contains an unexpected character in line 823 and column 9.
+1
View File
@@ -1613,6 +1613,7 @@
Sent to {printer} Надіслано на {printer}
Sent to {printer}: {msg} Надіслано на {printer}: {msg}
Looking for printers… Пошук принтерів…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Принтери не знайдено. Перевірте, що принтер установлено, а диспетчер друку працює, і знову відкрийте «Друк».
Sending to {printer}… Надсилання на {printer}…
Choose a folder for the searchable files Виберіть теку для файлів із пошуком
Files are combined from top to bottom. Leave Pages empty to take every page. Файли об’єднуються згори донизу. Залиште «Сторінки» порожнім, щоб узяти всі сторінки.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -1583,6 +1583,7 @@
Sent to {printer} 已发送到{printer}
Sent to {printer}: {msg} 已发送到{printer}:{msg}
Looking for printers… 正在查找打印机…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. 未找到打印机。请检查打印机是否已安装、打印后台处理程序是否在运行,然后重新打开“打印”。
Sending to {printer}… 正在发送到{printer}…
Choose a folder for the searchable files 选择可搜索文件的文件夹
Files are combined from top to bottom. Leave Pages empty to take every page. 文件按从上到下的顺序合并。页码留空表示取全部页面。
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -1529,6 +1529,7 @@
Sent to {printer} 已傳送到{printer}
Sent to {printer}: {msg} 已傳送到{printer}:{msg}
Looking for printers… 正在尋找印表機…
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. 找不到印表機。請確認印表機已安裝、列印多工緩衝處理器正在執行,然後重新開啟「列印」。
Sending to {printer}… 正在傳送到{printer}…
Choose a folder for the searchable files 選擇可搜尋檔案的資料夾
Files are combined from top to bottom. Leave Pages empty to take every page. 檔案將按從上到下的順序合併。頁碼留空表示取全部頁面。
Can't render this file because it contains an unexpected character in line 9 and column 16.
+31 -4
View File
@@ -232,6 +232,13 @@ fn listed_printers() -> Vec<spool::Printer> {
}
}
/// The first list is still being read and the user hasn't chosen yet (#160): no printer is
/// selected only because none is known yet, so the dialog says it is looking rather than
/// offering Save as PDF, and its button waits. Printing then would have saved a PDF.
fn still_looking(d: &PrintDraft) -> bool {
d.printers_loading && d.printer.is_none() && !d.printer_picked
}
/// A printer's name as the dialog shows it.
fn printer_label(name: &str) -> String {
if name == crate::web_print::BROWSER_PRINTER { crate::web_print::browser_printer_label().to_string() } else { name.to_string() }
@@ -676,7 +683,11 @@ pub(crate) fn body(
// The browser's print dialog sets copies, two-sided printing and colour itself.
let browser = d.printer.as_deref() == Some(crate::web_print::BROWSER_PRINTER);
ui.horizontal(|ui| {
let shown = d.printer.as_deref().map_or_else(|| tl!("Save as PDF").to_string(), printer_label);
let shown = match d.printer.as_deref() {
Some(p) => printer_label(p),
None if still_looking(d) => tl!("Looking for printers…").to_string(),
None => tl!("Save as PDF").to_string(),
};
egui::ComboBox::from_id_salt("printer").selected_text(shown).width(260.0).show_ui(ui, |ui| {
if d.printers_loading {
ui.add_enabled(false, egui::Label::new(tl!("Looking for printers…")));
@@ -690,7 +701,11 @@ pub(crate) fn body(
};
ui.selectable_value(&mut d.printer, Some(p.name.clone()), label);
}
ui.selectable_value(&mut d.printer, None, tl!("Save as PDF"));
// Chosen even when it was already the selection, so the list arriving
// later doesn't replace it with the default printer.
if ui.selectable_value(&mut d.printer, None, tl!("Save as PDF")).clicked() {
d.printer_picked = true;
}
});
let tip = if spool::HAS_PRINTER_PREFERENCES {
tl!("Opens the printer driver's preferences. They are saved for every print from this computer; the copies, two-sided, grayscale and paper chosen here still apply.")
@@ -718,6 +733,17 @@ pub(crate) fn body(
d.driver_error = None;
}
ui.end_row();
// The spooler answered with no printer at all (#160): say so, rather than
// leaving Save as PDF looking like the only thing PdfCraft can do.
if !d.printers_loading && d.printers.is_empty() {
ui.label("");
ui.label(
egui::RichText::new(tl!("No printers were found. Check that the printer is installed and the print spooler is running, then open Print again."))
.small()
.color(t.text_muted),
);
ui.end_row();
}
ui.label(tl!("Copies:"));
ui.add_enabled_ui(!browser, |ui| {
ui.horizontal(|ui| {
@@ -1048,8 +1074,9 @@ pub(crate) fn body(
ui.add_space(12.0);
let (mut go, mut cancel) = (false, false);
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
let label = if d.printer.is_some() { "Print" } else { "Save as PDF" };
if ui.add_enabled_ui(settings.is_ok() && !sheets.is_empty(), |ui| widgets::pill_button(ui, label, true)).inner.clicked() {
let looking = still_looking(d);
let label = if d.printer.is_some() || looking { tl!("Print") } else { tl!("Save as PDF") };
if ui.add_enabled_ui(settings.is_ok() && !sheets.is_empty() && !looking, |ui| widgets::pill_button(ui, label, true)).inner.clicked() {
go = true;
}
if widgets::pill_button(ui, tl!("Cancel"), false).clicked() {
+23
View File
@@ -1,5 +1,6 @@
//! The Print dialog in the real shell (egui_kittest): settings, preview sheets, Save as PDF.
use egui::accesskit::Role;
use egui_kittest::Harness;
use egui_kittest::kittest::{NodeT, Queryable};
use pdfcraft_ui_egui::{Dialog, PdfCraftApp};
@@ -277,6 +278,11 @@ fn printers_listed_in_the_background_preselect_the_default_unless_one_was_picked
assert_eq!(h.state().dialog, Some(Dialog::Print), "the dialog doesn't wait for the printers");
assert!(h.state().print_draft.printers_loading);
assert_eq!(h.state().print_draft.printer, None);
// Nothing is known yet (#160): the dialog says it is looking, and Print waits instead of
// saving a PDF.
h.get_by_value("Looking for printers…");
assert!(h.get_by_role_and_label(Role::Button, "Print").accesskit_node().is_disabled(), "Print waits for the list");
assert!(h.query_by_label("Save as PDF").is_none(), "not offered as the choice while looking");
drop(hold);
let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10);
while h.state().print_draft.printers_loading && std::time::Instant::now() < deadline {
@@ -401,3 +407,20 @@ fn print_as_image_is_an_advanced_choice_that_saves_pictures() {
assert_eq!(pictures, 1, "the page is one picture");
let _ = std::fs::remove_file(out);
}
/// The spooler answering with no printers at all says so (#160), and Save as PDF still works.
#[test]
fn an_empty_printer_list_says_none_were_found() {
use std::sync::Arc;
let mut h = harness();
h.state_mut().printer_source = Some(Arc::new(Vec::new));
assert!(h.state_mut().execute("print.dialog"));
let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10);
while h.state().print_draft.printers_loading && std::time::Instant::now() < deadline {
h.run_steps(1);
std::thread::sleep(std::time::Duration::from_millis(5));
}
h.run_steps(2);
h.get_by_label_contains("No printers were found");
assert!(!h.get_by_role_and_label(Role::Button, "Save as PDF").accesskit_node().is_disabled());
}