diff --git a/src-tauri/packaging/flatpak/de.u8array.zplab.yml b/src-tauri/packaging/flatpak/de.u8array.zplab.yml new file mode 100644 index 00000000..6be47233 --- /dev/null +++ b/src-tauri/packaging/flatpak/de.u8array.zplab.yml @@ -0,0 +1,51 @@ +# Flathub manifest. Flathub builds this itself from the release deb, release.yml has no Flatpak leg. +app-id: de.u8array.zplab +runtime: org.gnome.Platform +runtime-version: "50" +sdk: org.gnome.Sdk +command: ZPLab +finish-args: + # Raw TCP to printers, Labelary previews, the loopback MCP server. + - --share=network + # The system print queue runs through libcups. + - --socket=cups + # The usblp nodes under /dev/usb are outside --device=usb. + - --device=all + # Saved printer and database passwords live in the Secret Service. + - --talk-name=org.freedesktop.secrets + - --socket=wayland + - --socket=fallback-x11 + - --share=ipc + # The GTK file dialogs are not portal aware. + - --filesystem=home +modules: + - name: zplab + buildsystem: simple + rename-desktop-file: ZPLab.desktop + rename-icon: ZPLab + build-commands: + - ar x ZPLab.deb + - tar -xf data.tar.* + - install -Dm755 usr/bin/ZPLab /app/bin/ZPLab + - install -Dm755 usr/bin/zplab-mcp /app/bin/zplab-mcp + - install -Dm644 usr/share/applications/ZPLab.desktop /app/share/applications/ZPLab.desktop + - for size in 32x32 128x128; do install -Dm644 "usr/share/icons/hicolor/$size/apps/ZPLab.png" "/app/share/icons/hicolor/$size/apps/ZPLab.png"; done + # Tauri files the 256 px icon under a size no theme lookup reads. + - install -Dm644 usr/share/icons/hicolor/256x256@2/apps/ZPLab.png /app/share/icons/hicolor/256x256/apps/ZPLab.png + - install -Dm644 de.u8array.zplab.metainfo.xml /app/share/metainfo/de.u8array.zplab.metainfo.xml + # The packaged metainfo launches the deb's desktop file name. + - sed -i 's#ZPLab.desktop#de.u8array.zplab.desktop#' /app/share/metainfo/de.u8array.zplab.metainfo.xml + sources: + - type: file + dest-filename: ZPLab.deb + only-arches: [x86_64] + url: https://github.com/u8array/ZPLab/releases/download/v0.7.1/ZPLab_0.7.1_amd64.deb + sha256: fc9044106420d1349227c74d259949c73305709882da3e733d8e347648ba9c4a + x-checker-data: + type: json + url: https://api.github.com/repos/u8array/ZPLab/releases/latest + version-query: .tag_name | sub("^v"; "") + url-query: .assets[] | select(.name | test("_amd64\\.deb$")) | .browser_download_url + # The deb of a release carries the metainfo as it was before that release's own entry. + - type: file + path: ../linux/de.u8array.zplab.metainfo.xml diff --git a/src-tauri/packaging/flatpak/flathub.json b/src-tauri/packaging/flatpak/flathub.json new file mode 100644 index 00000000..637604e8 --- /dev/null +++ b/src-tauri/packaging/flatpak/flathub.json @@ -0,0 +1,3 @@ +{ + "only-arches": ["x86_64"] +} diff --git a/src-tauri/packaging/linux/de.u8array.zplab.metainfo.xml b/src-tauri/packaging/linux/de.u8array.zplab.metainfo.xml index f93608d0..cf080770 100644 --- a/src-tauri/packaging/linux/de.u8array.zplab.metainfo.xml +++ b/src-tauri/packaging/linux/de.u8array.zplab.metainfo.xml @@ -78,4 +78,13 @@ https://github.com/u8array/ZPLab + + + + https://github.com/u8array/ZPLab/releases/tag/v0.7.1 + + + https://github.com/u8array/ZPLab/releases/tag/v0.7.0 + + diff --git a/src-tauri/src/package.rs b/src-tauri/src/package.rs index a28af31d..326161f5 100644 --- a/src-tauri/src/package.rs +++ b/src-tauri/src/package.rs @@ -16,3 +16,8 @@ pub fn is_packaged() -> bool { pub fn is_packaged() -> bool { false } + +/// The file marks every sandbox, even one started with a cleared environment. +pub fn is_flatpak() -> bool { + cfg!(target_os = "linux") && std::path::Path::new("/.flatpak-info").exists() +} diff --git a/src-tauri/src/updates.rs b/src-tauri/src/updates.rs index 45a4ed50..00b7282d 100644 --- a/src-tauri/src/updates.rs +++ b/src-tauri/src/updates.rs @@ -1,9 +1,11 @@ use tauri::{AppHandle, Config}; /// Tauri's Windows updater runs the NSIS setup, which cannot replace a packaged install. -/// The Store variant also ships without plugins.updater. +/// The Store variant also ships without plugins.updater. Flathub updates a Flatpak itself. pub fn self_update_enabled(config: &Config) -> bool { - config.plugins.0.contains_key("updater") && !crate::package::is_packaged() + config.plugins.0.contains_key("updater") + && !crate::package::is_packaged() + && !crate::package::is_flatpak() } #[tauri::command] diff --git a/src-tauri/src/usb.rs b/src-tauri/src/usb.rs index d0509b86..70152344 100644 --- a/src-tauri/src/usb.rs +++ b/src-tauri/src/usb.rs @@ -389,6 +389,10 @@ const UDEV_RULE: &str = include_str!("../packaging/udev/70-zplab.rules"); #[cfg(target_os = "linux")] #[tauri::command] pub async fn setup_usb_access() -> Result<(), String> { + // No pkexec in the sandbox and the host /etc is out of reach. + if crate::package::is_flatpak() { + return Err("flatpak".to_string()); + } // Used by AppImage (no installer) and as a repair path. Writes to // /etc/udev/rules.d (writable on immutable distros, the right place for a // runtime rule); set -e so a failed step surfaces instead of being swallowed. diff --git a/src/components/Output/PrintToZebraDialog.tsx b/src/components/Output/PrintToZebraDialog.tsx index 912686ff..0928eea0 100644 --- a/src/components/Output/PrintToZebraDialog.tsx +++ b/src/components/Output/PrintToZebraDialog.tsx @@ -230,7 +230,7 @@ export function PrintToZebraDialog({ zpl, onClose }: Props) { setUsbStatus({ type: "idle" }); } catch (e) { // Failed or cancelled: keep usbNeedsSetup so the button stays available. - setUsbStatus({ type: "error", message: errorMessage(e) }); + setUsbStatus({ type: "error", message: e === "flatpak" ? t.zebraPrint.usbSetupFlatpak : errorMessage(e) }); } } diff --git a/src/components/Output/PrintToZebraDialog.usb.test.tsx b/src/components/Output/PrintToZebraDialog.usb.test.tsx new file mode 100644 index 00000000..ad2c7f3f --- /dev/null +++ b/src/components/Output/PrintToZebraDialog.usb.test.tsx @@ -0,0 +1,60 @@ +// @vitest-environment jsdom +import { describe, it, expect, afterEach, beforeEach, vi } from "vitest"; +import { render, cleanup, act, fireEvent, waitFor } from "@testing-library/react"; +import { PrintToZebraDialog } from "./PrintToZebraDialog"; +import { useLabelStore } from "../../store/labelStore"; +import { DEFAULT_PRINT_TARGET } from "../../lib/printTarget"; +import { fallbackTranslations as en } from "../../locales"; + +vi.mock("../../lib/platform", async (importOriginal) => ({ ...(await importOriginal>()), isDesktopShell: true })); +vi.mock("../../lib/localPrint", async (importOriginal) => ({ + ...(await importOriginal>()), + listLocalPrinters: vi.fn().mockResolvedValue([]), +})); +// vi.mock is hoisted above this const, so the factory reaches it through a closure. +const setupUsbAccess = vi.fn(); +vi.mock("../../lib/usbPrint", async (importOriginal) => ({ + ...(await importOriginal>()), + listUsbPrinters: vi.fn().mockResolvedValue([{ id: "usb1", name: "Zebra ZD230", vendor_id: "0a5f" }]), + sendZplUsb: vi.fn().mockResolvedValue({ kind: "permission_denied" }), + setupUsbAccess: () => setupUsbAccess(), +})); + +afterEach(cleanup); + +beforeEach(() => { + setupUsbAccess.mockReset(); + act(() => { + useLabelStore.setState({ zebraPrintSource: "label", dataset: null, columnMapping: null, printTarget: { ...DEFAULT_PRINT_TARGET, transport: "usb" } }); + }); +}); + +describe("PrintToZebraDialog USB access", () => { + it("shows the manual route when the sandbox refuses to install the udev rule", async () => { + setupUsbAccess.mockRejectedValue("flatpak"); + const r = render(); + await waitFor(() => expect(r.getByText(/Zebra ZD230/)).toBeTruthy()); + await act(async () => { + fireEvent.click(r.getByText(en.zebraPrint.send)); + }); + await act(async () => { + fireEvent.click(r.getByText(en.zebraPrint.usbSetupAccess)); + }); + expect(setupUsbAccess).toHaveBeenCalledTimes(1); + expect(r.getByText(en.zebraPrint.usbSetupFlatpak)).toBeTruthy(); + expect(r.getByText(en.zebraPrint.usbSetupAccess)).toBeTruthy(); + }); + + it("keeps the raw reason for any other failure", async () => { + setupUsbAccess.mockRejectedValue("setup cancelled"); + const r = render(); + await waitFor(() => expect(r.getByText(/Zebra ZD230/)).toBeTruthy()); + await act(async () => { + fireEvent.click(r.getByText(en.zebraPrint.send)); + }); + await act(async () => { + fireEvent.click(r.getByText(en.zebraPrint.usbSetupAccess)); + }); + expect(r.getByText("setup cancelled")).toBeTruthy(); + }); +}); diff --git a/src/locales/ar.ts b/src/locales/ar.ts index 1ea8921b..f202da8b 100644 --- a/src/locales/ar.ts +++ b/src/locales/ar.ts @@ -826,7 +826,7 @@ const ar = { checkUpdates: 'التحقق من التحديثات', checkingUpdates: 'جارٍ التحقق…', upToDate: 'أنت على أحدث إصدار.', - updatesViaStore: 'التحديثات تصل عبر Microsoft Store.', + updatesViaStore: 'التحديثات تصل عبر المتجر الذي ثبّت ZPLab.', }, preview: { providerHeading: 'عارض المعاينة', @@ -1790,6 +1790,7 @@ const ar = { tabUsb: 'USB', usbPermissionDenied: 'لا يمكن الوصول إلى طابعة USB. انقر على «إعداد الوصول» لمنح الإذن.', usbSetupAccess: 'إعداد الوصول', + usbSetupFlatpak: 'داخل Flatpak، لا يمكن للتطبيق تثبيت قاعدة udev بنفسه. ثبّت الملف 70-zplab.rules من مستودع ZPLab على النظام المضيف، ثم أعد توصيل الطابعة.', usbNotFound: 'لم يتم العثور على طابعة USB، أعد توصيلها وقم بالتحديث.', }, pdfExport: { diff --git a/src/locales/bg.ts b/src/locales/bg.ts index c7e47646..5a18186e 100644 --- a/src/locales/bg.ts +++ b/src/locales/bg.ts @@ -826,7 +826,7 @@ const bg = { checkUpdates: 'Проверка за актуализации', checkingUpdates: 'Проверка…', upToDate: 'Използвате най-новата версия.', - updatesViaStore: 'Актуализациите пристигат през Microsoft Store.', + updatesViaStore: 'Актуализациите пристигат през магазина, който инсталира ZPLab.', }, preview: { providerHeading: 'Визуализатор за преглед', @@ -1790,6 +1790,7 @@ const bg = { tabUsb: 'USB', usbPermissionDenied: 'Няма достъп до USB принтера. Щракнете върху Настройване на достъп, за да го предоставите.', usbSetupAccess: 'Настройване на достъп', + usbSetupFlatpak: 'В Flatpak приложението не може само да инсталира правилото за udev. Инсталирайте 70-zplab.rules от хранилището на ZPLab на хост системата, след което включете принтера отново.', usbNotFound: 'USB принтерът не е намерен, включете го отново и обновете.', }, pdfExport: { diff --git a/src/locales/cs.ts b/src/locales/cs.ts index c3e9f9e5..0ae94ed5 100644 --- a/src/locales/cs.ts +++ b/src/locales/cs.ts @@ -826,7 +826,7 @@ const cs = { checkUpdates: 'Zkontrolovat aktualizace', checkingUpdates: 'Kontrola…', upToDate: 'Máte nejnovější verzi.', - updatesViaStore: 'Aktualizace přicházejí přes Microsoft Store.', + updatesViaStore: 'Aktualizace přicházejí přes obchod, který nainstaloval ZPLab.', }, preview: { providerHeading: 'Vykreslovač náhledu', @@ -1790,6 +1790,7 @@ const cs = { tabUsb: 'USB', usbPermissionDenied: 'Bez přístupu k tiskárně USB. Přístup udělíte kliknutím na Nastavit přístup.', usbSetupAccess: 'Nastavit přístup', + usbSetupFlatpak: 'Uvnitř Flatpaku si aplikace nemůže pravidlo udev nainstalovat sama. Nainstalujte 70-zplab.rules z repozitáře ZPLab na hostitelský systém a tiskárnu znovu připojte.', usbNotFound: 'Tiskárna USB nebyla nalezena, znovu ji zapojte a obnovte.', }, pdfExport: { diff --git a/src/locales/da.ts b/src/locales/da.ts index a7bd518d..f2643305 100644 --- a/src/locales/da.ts +++ b/src/locales/da.ts @@ -826,7 +826,7 @@ const da = { checkUpdates: 'Søg efter opdateringer', checkingUpdates: 'Søger…', upToDate: 'Du har den nyeste version.', - updatesViaStore: 'Opdateringer kommer via Microsoft Store.', + updatesViaStore: 'Opdateringer kommer via den butik, der installerede ZPLab.', }, preview: { providerHeading: 'Forhåndsvisningsrenderer', @@ -1790,6 +1790,7 @@ const da = { tabUsb: 'USB', usbPermissionDenied: 'Ingen adgang til USB-printeren. Klik på Konfigurer adgang for at give den.', usbSetupAccess: 'Konfigurer adgang', + usbSetupFlatpak: 'Inde i Flatpak kan appen ikke selv installere udev-reglen. Installer 70-zplab.rules fra ZPLab-repositoriet på værtssystemet, og tilslut derefter printeren igen.', usbNotFound: 'USB-printer ikke fundet. Tilslut den igen, og opdater.', }, pdfExport: { diff --git a/src/locales/de.ts b/src/locales/de.ts index e092f790..a0733b8c 100644 --- a/src/locales/de.ts +++ b/src/locales/de.ts @@ -826,7 +826,7 @@ const de = { checkUpdates: 'Nach Updates suchen', checkingUpdates: 'Suche läuft…', upToDate: 'Du bist auf dem neuesten Stand.', - updatesViaStore: 'Updates kommen über den Microsoft Store.', + updatesViaStore: 'Updates kommen über den Store, der ZPLab installiert hat.', }, preview: { providerHeading: 'Vorschau-Renderer', @@ -1048,6 +1048,7 @@ const de = { tabUsb: 'USB', usbPermissionDenied: 'Kein Zugriff auf den USB-Drucker. Klicke auf Zugriff einrichten.', usbSetupAccess: 'Zugriff einrichten', + usbSetupFlatpak: 'Innerhalb von Flatpak kann die App die udev-Regel nicht selbst installieren. Installiere 70-zplab.rules aus dem ZPLab-Repository auf dem Host und schließe den Drucker danach erneut an.', usbNotFound: 'USB-Drucker nicht gefunden, neu einstecken und aktualisieren.', }, pdfExport: { diff --git a/src/locales/el.ts b/src/locales/el.ts index c97af0b1..e42b6b60 100644 --- a/src/locales/el.ts +++ b/src/locales/el.ts @@ -826,7 +826,7 @@ const el = { checkUpdates: 'Έλεγχος για ενημερώσεις', checkingUpdates: 'Έλεγχος…', upToDate: 'Έχετε την πιο πρόσφατη έκδοση.', - updatesViaStore: 'Οι ενημερώσεις έρχονται μέσω του Microsoft Store.', + updatesViaStore: 'Οι ενημερώσεις έρχονται μέσω του καταστήματος που εγκατέστησε το ZPLab.', }, preview: { providerHeading: 'Μηχανή απόδοσης προεπισκόπησης', @@ -1790,6 +1790,7 @@ const el = { tabUsb: 'USB', usbPermissionDenied: 'Δεν υπάρχει πρόσβαση στον εκτυπωτή USB. Κάντε κλικ στο Ρύθμιση πρόσβασης για να την παραχωρήσετε.', usbSetupAccess: 'Ρύθμιση πρόσβασης', + usbSetupFlatpak: 'Μέσα στο Flatpak η εφαρμογή δεν μπορεί να εγκαταστήσει μόνη της τον κανόνα udev. Εγκαταστήστε το 70-zplab.rules από το αποθετήριο ZPLab στο σύστημα υποδοχής και συνδέστε ξανά τον εκτυπωτή.', usbNotFound: 'Ο εκτυπωτής USB δεν βρέθηκε. Συνδέστε τον ξανά και ανανεώστε.', }, pdfExport: { diff --git a/src/locales/en.ts b/src/locales/en.ts index 22207788..30df6d5f 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -826,7 +826,7 @@ const en = { checkUpdates: 'Check for updates', checkingUpdates: 'Checking…', upToDate: 'You are up to date.', - updatesViaStore: 'Updates arrive through the Microsoft Store.', + updatesViaStore: 'Updates arrive through the store that installed ZPLab.', }, preview: { providerHeading: 'Preview renderer', @@ -1048,6 +1048,7 @@ const en = { tabUsb: 'USB', usbPermissionDenied: 'No access to the USB printer. Click Set up access to grant it.', usbSetupAccess: 'Set up access', + usbSetupFlatpak: 'Inside Flatpak the app cannot install the udev rule itself. Install 70-zplab.rules from the ZPLab repository on the host, then re-plug the printer.', usbNotFound: 'USB printer not found, re-plug it and refresh.', }, pdfExport: { diff --git a/src/locales/es.ts b/src/locales/es.ts index 8929d779..7e9ddd9e 100644 --- a/src/locales/es.ts +++ b/src/locales/es.ts @@ -826,7 +826,7 @@ const es = { checkUpdates: 'Buscar actualizaciones', checkingUpdates: 'Comprobando…', upToDate: 'Ya tienes la última versión.', - updatesViaStore: 'Las actualizaciones llegan a través de Microsoft Store.', + updatesViaStore: 'Las actualizaciones llegan a través de la tienda que instaló ZPLab.', }, preview: { providerHeading: 'Renderizador de vista previa', @@ -1790,6 +1790,7 @@ const es = { tabUsb: 'USB', usbPermissionDenied: 'Sin acceso a la impresora USB. Haz clic en Configurar acceso para concederlo.', usbSetupAccess: 'Configurar acceso', + usbSetupFlatpak: 'Dentro de Flatpak, la aplicación no puede instalar la regla udev por sí misma. Instala 70-zplab.rules desde el repositorio de ZPLab en el host y luego vuelve a conectar la impresora.', usbNotFound: 'Impresora USB no encontrada, vuelve a conectarla y actualiza.', }, pdfExport: { diff --git a/src/locales/et.ts b/src/locales/et.ts index c03a7c34..caee8d1d 100644 --- a/src/locales/et.ts +++ b/src/locales/et.ts @@ -826,7 +826,7 @@ const et = { checkUpdates: 'Otsi uuendusi', checkingUpdates: 'Otsin…', upToDate: 'Teil on uusim versioon.', - updatesViaStore: 'Uuendused tulevad Microsoft Store kaudu.', + updatesViaStore: 'Uuendused tulevad poe kaudu, mis paigaldas rakenduse ZPLab.', }, preview: { providerHeading: 'Eelvaate renderdaja', @@ -1790,6 +1790,7 @@ const et = { tabUsb: 'USB', usbPermissionDenied: 'USB-printerile puudub juurdepääs. Klõpsa Seadista juurdepääs, et see anda.', usbSetupAccess: 'Seadista juurdepääs', + usbSetupFlatpak: 'Flatpaki sees ei saa rakendus ise udev-reeglit paigaldada. Paigalda 70-zplab.rules ZPLab-i hoidlast hostsüsteemi ja ühenda printer uuesti.', usbNotFound: 'USB-printerit ei leitud. Ühenda see uuesti ja värskenda.', }, pdfExport: { diff --git a/src/locales/fa.ts b/src/locales/fa.ts index d2a11df9..8d0ad15d 100644 --- a/src/locales/fa.ts +++ b/src/locales/fa.ts @@ -826,7 +826,7 @@ const fa = { checkUpdates: 'بررسی به‌روزرسانی‌ها', checkingUpdates: 'در حال بررسی…', upToDate: 'شما از آخرین نسخه استفاده می‌کنید.', - updatesViaStore: 'به‌روزرسانی‌ها از طریق Microsoft Store می‌رسند.', + updatesViaStore: 'به‌روزرسانی‌ها از طریق فروشگاهی می‌رسند که ZPLab را نصب کرده است.', }, preview: { providerHeading: 'موتور پیش‌نمایش', @@ -1790,6 +1790,7 @@ const fa = { tabUsb: 'USB', usbPermissionDenied: 'دسترسی به چاپگر USB وجود ندارد. برای اعطای دسترسی روی «تنظیم دسترسی» کلیک کنید.', usbSetupAccess: 'تنظیم دسترسی', + usbSetupFlatpak: 'داخل Flatpak، برنامه نمی‌تواند قانون udev را خودش نصب کند. فایل 70-zplab.rules را از مخزن ZPLab روی میزبان نصب کنید، سپس چاپگر را دوباره وصل کنید.', usbNotFound: 'چاپگر USB یافت نشد، آن را دوباره وصل کنید و به‌روزرسانی کنید.', }, pdfExport: { diff --git a/src/locales/fi.ts b/src/locales/fi.ts index 8a367b82..45117c7a 100644 --- a/src/locales/fi.ts +++ b/src/locales/fi.ts @@ -826,7 +826,7 @@ const fi = { checkUpdates: 'Tarkista päivitykset', checkingUpdates: 'Tarkistetaan…', upToDate: 'Sinulla on uusin versio.', - updatesViaStore: 'Päivitykset saapuvat Microsoft Storen kautta.', + updatesViaStore: 'Päivitykset saapuvat sen kaupan kautta, joka asensi sovelluksen ZPLab.', }, preview: { providerHeading: 'Esikatselun renderöijä', @@ -1790,6 +1790,7 @@ const fi = { tabUsb: 'USB', usbPermissionDenied: 'Ei käyttöoikeutta USB-tulostimeen. Napsauta Määritä käyttöoikeus myöntääksesi sen.', usbSetupAccess: 'Määritä käyttöoikeus', + usbSetupFlatpak: 'Flatpakin sisällä sovellus ei voi asentaa udev-sääntöä itse. Asenna 70-zplab.rules ZPLab-tietovarastosta isäntäjärjestelmään ja kytke tulostin uudelleen.', usbNotFound: 'USB-tulostinta ei löytynyt. Kytke se uudelleen ja päivitä.', }, pdfExport: { diff --git a/src/locales/fr.ts b/src/locales/fr.ts index 8a79562d..7e7d77e0 100644 --- a/src/locales/fr.ts +++ b/src/locales/fr.ts @@ -826,7 +826,7 @@ const fr = { checkUpdates: 'Rechercher des mises à jour', checkingUpdates: 'Vérification…', upToDate: 'Vous êtes à jour.', - updatesViaStore: 'Les mises à jour arrivent via le Microsoft Store.', + updatesViaStore: 'Les mises à jour arrivent via la boutique qui a installé ZPLab.', }, preview: { providerHeading: "Moteur d'aperçu", @@ -1790,6 +1790,7 @@ const fr = { tabUsb: 'USB', usbPermissionDenied: "Aucun accès à l'imprimante USB. Clique sur Configurer l'accès pour l'autoriser.", usbSetupAccess: "Configurer l'accès", + usbSetupFlatpak: "À l'intérieur de Flatpak, l'application ne peut pas installer la règle udev elle-même. Installe 70-zplab.rules depuis le dépôt ZPLab sur l'hôte, puis rebranche l'imprimante.", usbNotFound: 'Imprimante USB introuvable, rebranche-la et actualise.', }, pdfExport: { diff --git a/src/locales/he.ts b/src/locales/he.ts index 0b3f491c..2cc94b39 100644 --- a/src/locales/he.ts +++ b/src/locales/he.ts @@ -826,7 +826,7 @@ const he = { checkUpdates: 'בדיקת עדכונים', checkingUpdates: 'בודק…', upToDate: 'אתה מעודכן.', - updatesViaStore: 'העדכונים מגיעים דרך Microsoft Store.', + updatesViaStore: 'העדכונים מגיעים דרך החנות שהתקינה את ZPLab.', }, preview: { providerHeading: 'מנוע תצוגה מקדימה', @@ -1790,6 +1790,7 @@ const he = { tabUsb: 'USB', usbPermissionDenied: "אין גישה למדפסת ה-USB. לחץ על 'הגדרת גישה' כדי להעניק אותה.", usbSetupAccess: 'הגדרת גישה', + usbSetupFlatpak: 'בתוך Flatpak האפליקציה לא יכולה להתקין את כלל ה-udev בעצמה. התקן את 70-zplab.rules ממאגר ZPLab על המארח, ואז חבר את המדפסת מחדש.', usbNotFound: 'מדפסת ה-USB לא נמצאה, חבר אותה מחדש ורענן.', }, pdfExport: { diff --git a/src/locales/hr.ts b/src/locales/hr.ts index 09733e2c..bbb2c885 100644 --- a/src/locales/hr.ts +++ b/src/locales/hr.ts @@ -826,7 +826,7 @@ const hr = { checkUpdates: 'Provjeri ažuriranja', checkingUpdates: 'Provjeravam…', upToDate: 'Imate najnoviju verziju.', - updatesViaStore: 'Ažuriranja stižu putem Microsoft Storea.', + updatesViaStore: 'Ažuriranja stižu putem trgovine koja je instalirala ZPLab.', }, preview: { providerHeading: 'Prikaz pregleda', @@ -1790,6 +1790,7 @@ const hr = { tabUsb: 'USB', usbPermissionDenied: 'Nema pristupa USB pisaču. Kliknite Postavi pristup da biste ga odobrili.', usbSetupAccess: 'Postavi pristup', + usbSetupFlatpak: 'Unutar Flatpaka aplikacija ne može sama instalirati udev pravilo. Instalirajte 70-zplab.rules iz ZPLab repozitorija na glavnom sustavu, zatim ponovno priključite pisač.', usbNotFound: 'USB pisač nije pronađen. Ponovno ga priključite i osvježite.', }, pdfExport: { diff --git a/src/locales/hu.ts b/src/locales/hu.ts index 92b13258..e399180b 100644 --- a/src/locales/hu.ts +++ b/src/locales/hu.ts @@ -826,7 +826,7 @@ const hu = { checkUpdates: 'Frissítések keresése', checkingUpdates: 'Keresés…', upToDate: 'A legújabb verziót használja.', - updatesViaStore: 'A frissítéseket a Microsoft Store kézbesíti.', + updatesViaStore: 'A frissítéseket az a bolt kézbesíti, amely telepítette a ZPLab alkalmazást.', }, preview: { providerHeading: 'Előnézet-megjelenítő', @@ -1790,6 +1790,7 @@ const hu = { tabUsb: 'USB', usbPermissionDenied: 'Nincs hozzáférés az USB-nyomtatóhoz. Kattintson a Hozzáférés beállítása gombra az engedélyezéshez.', usbSetupAccess: 'Hozzáférés beállítása', + usbSetupFlatpak: 'A Flatpakon belül az alkalmazás nem tudja magától telepíteni az udev szabályt. Telepítse a 70-zplab.rules fájlt a ZPLab tárolóból a gazdagépre, majd csatlakoztassa újra a nyomtatót.', usbNotFound: 'Az USB-nyomtató nem található. Csatlakoztassa újra, és frissítsen.', }, pdfExport: { diff --git a/src/locales/it.ts b/src/locales/it.ts index 7d9450b8..4767d585 100644 --- a/src/locales/it.ts +++ b/src/locales/it.ts @@ -826,7 +826,7 @@ const it = { checkUpdates: 'Controlla aggiornamenti', checkingUpdates: 'Controllo…', upToDate: 'Hai la versione più recente.', - updatesViaStore: 'Gli aggiornamenti arrivano tramite Microsoft Store.', + updatesViaStore: 'Gli aggiornamenti arrivano tramite lo store che ha installato ZPLab.', }, preview: { providerHeading: 'Motore di anteprima', @@ -1790,6 +1790,7 @@ const it = { tabUsb: 'USB', usbPermissionDenied: 'Nessun accesso alla stampante USB. Fai clic su Configura accesso per concederlo.', usbSetupAccess: 'Configura accesso', + usbSetupFlatpak: "All'interno di Flatpak l'app non può installare la regola udev da sola. Installa 70-zplab.rules dal repository ZPLab sull'host, poi ricollega la stampante.", usbNotFound: 'Stampante USB non trovata, ricollegala e aggiorna.', }, pdfExport: { diff --git a/src/locales/ja.ts b/src/locales/ja.ts index 5733e987..0fa11014 100644 --- a/src/locales/ja.ts +++ b/src/locales/ja.ts @@ -826,7 +826,7 @@ const ja = { checkUpdates: 'アップデートを確認', checkingUpdates: '確認中…', upToDate: '最新の状態です。', - updatesViaStore: 'アップデートはMicrosoft Store経由で届きます。', + updatesViaStore: 'アップデートはZPLabをインストールしたストア経由で届きます。', }, preview: { providerHeading: 'プレビューのレンダラー', @@ -1790,6 +1790,7 @@ const ja = { tabUsb: 'USB', usbPermissionDenied: 'USBプリンターにアクセスできません。「アクセスを設定」をクリックして許可してください。', usbSetupAccess: 'アクセスを設定', + usbSetupFlatpak: 'Flatpak内ではアプリが自分でudevルールをインストールできません。ホスト側でZPLabリポジトリから70-zplab.rulesをインストールし、プリンターを再接続してください。', usbNotFound: 'USBプリンターが見つかりません。再接続して更新してください。', }, pdfExport: { diff --git a/src/locales/ko.ts b/src/locales/ko.ts index e581f151..18ea6f3a 100644 --- a/src/locales/ko.ts +++ b/src/locales/ko.ts @@ -826,7 +826,7 @@ const ko = { checkUpdates: '업데이트 확인', checkingUpdates: '확인 중…', upToDate: '최신 상태입니다.', - updatesViaStore: '업데이트는 Microsoft Store를 통해 제공됩니다.', + updatesViaStore: '업데이트는 ZPLab을 설치한 스토어를 통해 제공됩니다.', }, preview: { providerHeading: '미리보기 렌더러', @@ -1790,6 +1790,7 @@ const ko = { tabUsb: 'USB', usbPermissionDenied: "USB 프린터에 액세스할 수 없습니다. '액세스 설정'을 클릭하여 권한을 부여하세요.", usbSetupAccess: '액세스 설정', + usbSetupFlatpak: 'Flatpak 내부에서는 앱이 직접 udev 규칙을 설치할 수 없습니다. 호스트에서 ZPLab 저장소의 70-zplab.rules를 설치한 뒤 프린터를 다시 연결하세요.', usbNotFound: 'USB 프린터를 찾을 수 없습니다. 다시 연결한 후 새로 고침하세요.', }, pdfExport: { diff --git a/src/locales/lt.ts b/src/locales/lt.ts index 3a99406d..2ed8f4da 100644 --- a/src/locales/lt.ts +++ b/src/locales/lt.ts @@ -826,7 +826,7 @@ const lt = { checkUpdates: 'Tikrinti atnaujinimus', checkingUpdates: 'Tikrinama…', upToDate: 'Turite naujausią versiją.', - updatesViaStore: 'Atnaujinimai pasiekia per Microsoft Store.', + updatesViaStore: 'Atnaujinimai pasiekia per parduotuvę, kuri įdiegė ZPLab.', }, preview: { providerHeading: 'Peržiūros atvaizdavimo įrankis', @@ -1790,6 +1790,7 @@ const lt = { tabUsb: 'USB', usbPermissionDenied: 'Nėra prieigos prie USB spausdintuvo. Spustelėkite Nustatyti prieigą, kad ją suteiktumėte.', usbSetupAccess: 'Nustatyti prieigą', + usbSetupFlatpak: 'Flatpak aplinkoje programa negali pati įdiegti udev taisyklės. Įdiekite 70-zplab.rules iš ZPLab saugyklos pagrindinėje sistemoje, tada iš naujo prijunkite spausdintuvą.', usbNotFound: 'USB spausdintuvas nerastas. Prijunkite jį iš naujo ir atnaujinkite.', }, pdfExport: { diff --git a/src/locales/lv.ts b/src/locales/lv.ts index 02d75c61..df006f73 100644 --- a/src/locales/lv.ts +++ b/src/locales/lv.ts @@ -826,7 +826,7 @@ const lv = { checkUpdates: 'Meklēt atjauninājumus', checkingUpdates: 'Pārbauda…', upToDate: 'Jums ir jaunākā versija.', - updatesViaStore: 'Atjauninājumus nodrošina Microsoft Store.', + updatesViaStore: 'Atjauninājumus nodrošina veikals, kas instalēja ZPLab.', }, preview: { providerHeading: 'Priekšskatījuma renderētājs', @@ -1790,6 +1790,7 @@ const lv = { tabUsb: 'USB', usbPermissionDenied: 'Nav piekļuves USB printerim. Noklikšķiniet uz Iestatīt piekļuvi, lai to piešķirtu.', usbSetupAccess: 'Iestatīt piekļuvi', + usbSetupFlatpak: 'Flatpak iekšienē lietotne nevar pati instalēt udev kārtulu. Instalējiet 70-zplab.rules no ZPLab repozitorija resursdatorā un pēc tam atkārtoti pievienojiet printeri.', usbNotFound: 'USB printeris nav atrasts. Pievienojiet to atkārtoti un atsvaidziniet.', }, pdfExport: { diff --git a/src/locales/nl.ts b/src/locales/nl.ts index eb93aabd..ff113031 100644 --- a/src/locales/nl.ts +++ b/src/locales/nl.ts @@ -826,7 +826,7 @@ const nl = { checkUpdates: 'Controleren op updates', checkingUpdates: 'Controleren…', upToDate: 'Je hebt de nieuwste versie.', - updatesViaStore: 'Updates komen via de Microsoft Store.', + updatesViaStore: 'Updates komen via de store die ZPLab heeft geïnstalleerd.', }, preview: { providerHeading: 'Voorbeeldrenderer', @@ -1790,6 +1790,7 @@ const nl = { tabUsb: 'USB', usbPermissionDenied: 'Geen toegang tot de USB-printer. Klik op Toegang instellen om toegang te verlenen.', usbSetupAccess: 'Toegang instellen', + usbSetupFlatpak: 'Binnen Flatpak kan de app de udev-regel niet zelf installeren. Installeer 70-zplab.rules uit de ZPLab-repository op de host en sluit de printer vervolgens opnieuw aan.', usbNotFound: 'USB-printer niet gevonden. Sluit deze opnieuw aan en vernieuw.', }, pdfExport: { diff --git a/src/locales/no.ts b/src/locales/no.ts index a6a8c653..59720fda 100644 --- a/src/locales/no.ts +++ b/src/locales/no.ts @@ -826,7 +826,7 @@ const no = { checkUpdates: 'Se etter oppdateringer', checkingUpdates: 'Søker…', upToDate: 'Du har den nyeste versjonen.', - updatesViaStore: 'Oppdateringer kommer via Microsoft Store.', + updatesViaStore: 'Oppdateringer kommer via butikken som installerte ZPLab.', }, preview: { providerHeading: 'Forhåndsvisningsmotor', @@ -1790,6 +1790,7 @@ const no = { tabUsb: 'USB', usbPermissionDenied: 'Ingen tilgang til USB-skriveren. Klikk på Konfigurer tilgang for å gi den.', usbSetupAccess: 'Konfigurer tilgang', + usbSetupFlatpak: 'Inne i Flatpak kan appen ikke installere udev-regelen selv. Installer 70-zplab.rules fra ZPLab-repositoriet på verten, og koble deretter skriveren til på nytt.', usbNotFound: 'Fant ikke USB-skriveren. Koble den til på nytt, og oppdater.', }, pdfExport: { diff --git a/src/locales/pl.ts b/src/locales/pl.ts index 032a0ba1..eeaebf04 100644 --- a/src/locales/pl.ts +++ b/src/locales/pl.ts @@ -826,7 +826,7 @@ const pl = { checkUpdates: 'Sprawdź aktualizacje', checkingUpdates: 'Sprawdzanie…', upToDate: 'Masz najnowszą wersję.', - updatesViaStore: 'Aktualizacje docierają przez Microsoft Store.', + updatesViaStore: 'Aktualizacje docierają przez sklep, który zainstalował ZPLab.', }, preview: { providerHeading: 'Silnik podglądu', @@ -1790,6 +1790,7 @@ const pl = { tabUsb: 'USB', usbPermissionDenied: 'Brak dostępu do drukarki USB. Kliknij Skonfiguruj dostęp, aby go przyznać.', usbSetupAccess: 'Skonfiguruj dostęp', + usbSetupFlatpak: 'Wewnątrz Flatpaka aplikacja nie może sama zainstalować reguły udev. Zainstaluj 70-zplab.rules z repozytorium ZPLab na hoście, a następnie podłącz drukarkę ponownie.', usbNotFound: 'Nie znaleziono drukarki USB, podłącz ją ponownie i odśwież.', }, pdfExport: { diff --git a/src/locales/pt.ts b/src/locales/pt.ts index d60ff898..0083d598 100644 --- a/src/locales/pt.ts +++ b/src/locales/pt.ts @@ -826,7 +826,7 @@ const pt = { checkUpdates: 'Verificar atualizações', checkingUpdates: 'Verificando…', upToDate: 'Você está atualizado.', - updatesViaStore: 'As atualizações chegam através da Microsoft Store.', + updatesViaStore: 'As atualizações chegam através da loja que instalou ZPLab.', }, preview: { providerHeading: 'Renderizador de pré-visualização', @@ -1790,6 +1790,7 @@ const pt = { tabUsb: 'USB', usbPermissionDenied: 'Sem acesso à impressora USB. Clique em Configurar acesso para conceder.', usbSetupAccess: 'Configurar acesso', + usbSetupFlatpak: 'Dentro do Flatpak, a aplicação não pode instalar a regra udev por si própria. Instale o 70-zplab.rules a partir do repositório ZPLab no anfitrião e depois volte a ligar a impressora.', usbNotFound: 'Impressora USB não encontrada, reconecte-a e atualize.', }, pdfExport: { diff --git a/src/locales/ro.ts b/src/locales/ro.ts index 6d95435f..fd055a4f 100644 --- a/src/locales/ro.ts +++ b/src/locales/ro.ts @@ -826,7 +826,7 @@ const ro = { checkUpdates: 'Caută actualizări', checkingUpdates: 'Se verifică…', upToDate: 'Aveți cea mai recentă versiune.', - updatesViaStore: 'Actualizările ajung prin Microsoft Store.', + updatesViaStore: 'Actualizările ajung prin magazinul care a instalat ZPLab.', }, preview: { providerHeading: 'Motor de previzualizare', @@ -1790,6 +1790,7 @@ const ro = { tabUsb: 'USB', usbPermissionDenied: 'Fără acces la imprimanta USB. Fă clic pe Configurează accesul pentru a-l acorda.', usbSetupAccess: 'Configurează accesul', + usbSetupFlatpak: 'În interiorul Flatpak, aplicația nu poate instala regula udev singură. Instalează 70-zplab.rules din depozitul ZPLab pe sistemul-host, apoi reconectează imprimanta.', usbNotFound: 'Imprimanta USB nu a fost găsită, reconecteaz-o și reîmprospătează.', }, pdfExport: { diff --git a/src/locales/sk.ts b/src/locales/sk.ts index b9c3d4a9..e611bd58 100644 --- a/src/locales/sk.ts +++ b/src/locales/sk.ts @@ -826,7 +826,7 @@ const sk = { checkUpdates: 'Skontrolovať aktualizácie', checkingUpdates: 'Kontrola…', upToDate: 'Máte najnovšiu verziu.', - updatesViaStore: 'Aktualizácie prichádzajú cez Microsoft Store.', + updatesViaStore: 'Aktualizácie prichádzajú cez obchod, ktorý nainštaloval ZPLab.', }, preview: { providerHeading: 'Vykresľovač náhľadu', @@ -1790,6 +1790,7 @@ const sk = { tabUsb: 'USB', usbPermissionDenied: 'Žiadny prístup k tlačiarni USB. Prístup udelíte kliknutím na Nastaviť prístup.', usbSetupAccess: 'Nastaviť prístup', + usbSetupFlatpak: 'Vo Flatpaku si aplikácia nemôže pravidlo udev nainštalovať sama. Nainštalujte 70-zplab.rules z repozitára ZPLab na hostiteľský systém a potom znova pripojte tlačiareň.', usbNotFound: 'Tlačiareň USB sa nenašla, znova ju zapojte a obnovte.', }, pdfExport: { diff --git a/src/locales/sl.ts b/src/locales/sl.ts index bc595e92..ab60acfc 100644 --- a/src/locales/sl.ts +++ b/src/locales/sl.ts @@ -826,7 +826,7 @@ const sl = { checkUpdates: 'Preveri posodobitve', checkingUpdates: 'Preverjanje…', upToDate: 'Imate najnovejšo različico.', - updatesViaStore: 'Posodobitve prihajajo prek Microsoft Store.', + updatesViaStore: 'Posodobitve prihajajo prek trgovine, ki je namestila ZPLab.', }, preview: { providerHeading: 'Izrisovalnik predogleda', @@ -1790,6 +1790,7 @@ const sl = { tabUsb: 'USB', usbPermissionDenied: 'Ni dostopa do tiskalnika USB. Za dodelitev kliknite Nastavi dostop.', usbSetupAccess: 'Nastavi dostop', + usbSetupFlatpak: 'Znotraj Flatpaka aplikacija ne more sama namestiti pravila udev. Namestite 70-zplab.rules iz repozitorija ZPLab na gostitelja in nato tiskalnik znova priključite.', usbNotFound: 'Tiskalnika USB ni mogoče najti, znova ga priključite in osvežite.', }, pdfExport: { diff --git a/src/locales/sr.ts b/src/locales/sr.ts index dc1049a9..72b9e8f2 100644 --- a/src/locales/sr.ts +++ b/src/locales/sr.ts @@ -826,7 +826,7 @@ const sr = { checkUpdates: 'Провери ажурирања', checkingUpdates: 'Провера…', upToDate: 'Имате најновију верзију.', - updatesViaStore: 'Ажурирања стижу путем Microsoft Storea.', + updatesViaStore: 'Ажурирања стижу путем продавнице која је инсталирала ZPLab.', }, preview: { providerHeading: 'Prikazivač pregleda', @@ -1790,6 +1790,7 @@ const sr = { tabUsb: 'USB', usbPermissionDenied: 'Нема приступа USB штампачу. Кликните на Подеси приступ да бисте га омогућили.', usbSetupAccess: 'Подеси приступ', + usbSetupFlatpak: 'Унутар Flatpak-а апликација не може сама да инсталира udev правило. Инсталирајте 70-zplab.rules из ZPLab репозиторијума на хост систем, затим поново прикључите штампач.', usbNotFound: 'USB штампач није пронађен, поново га прикључите и освежите.', }, pdfExport: { diff --git a/src/locales/sv.ts b/src/locales/sv.ts index 92941bb6..04381c50 100644 --- a/src/locales/sv.ts +++ b/src/locales/sv.ts @@ -826,7 +826,7 @@ const sv = { checkUpdates: 'Sök efter uppdateringar', checkingUpdates: 'Söker…', upToDate: 'Du har den senaste versionen.', - updatesViaStore: 'Uppdateringar kommer via Microsoft Store.', + updatesViaStore: 'Uppdateringar kommer via butiken som installerade ZPLab.', }, preview: { providerHeading: 'Förhandsgranskningsrenderare', @@ -1790,6 +1790,7 @@ const sv = { tabUsb: 'USB', usbPermissionDenied: 'Ingen åtkomst till USB-skrivaren. Klicka på Konfigurera åtkomst för att ge den.', usbSetupAccess: 'Konfigurera åtkomst', + usbSetupFlatpak: 'Inuti Flatpak kan appen inte installera udev-regeln själv. Installera 70-zplab.rules från ZPLab-förrådet på värden och anslut sedan skrivaren igen.', usbNotFound: 'USB-skrivaren hittades inte. Anslut den igen och uppdatera.', }, pdfExport: { diff --git a/src/locales/tr.ts b/src/locales/tr.ts index a6b96fd1..b3a9a836 100644 --- a/src/locales/tr.ts +++ b/src/locales/tr.ts @@ -826,7 +826,7 @@ const tr = { checkUpdates: 'Güncellemeleri denetle', checkingUpdates: 'Denetleniyor…', upToDate: 'En güncel sürümü kullanıyorsunuz.', - updatesViaStore: 'Güncellemeler Microsoft Store üzerinden gelir.', + updatesViaStore: "Güncellemeler, ZPLab'ı yükleyen mağaza üzerinden gelir.", }, preview: { providerHeading: 'Önizleme oluşturucu', @@ -1790,6 +1790,7 @@ const tr = { tabUsb: 'USB', usbPermissionDenied: "USB yazıcıya erişilemiyor. İzin vermek için Erişimi ayarla'ya tıklayın.", usbSetupAccess: 'Erişimi ayarla', + usbSetupFlatpak: 'Flatpak içinde uygulama udev kuralını kendi başına yükleyemez. ZPLab deposundan 70-zplab.rules dosyasını ana makineye yükleyin, ardından yazıcıyı yeniden takın.', usbNotFound: 'USB yazıcı bulunamadı, yeniden takıp yenileyin.', }, pdfExport: { diff --git a/src/locales/zh-hans.ts b/src/locales/zh-hans.ts index e7a4e3f6..b6a8ab08 100644 --- a/src/locales/zh-hans.ts +++ b/src/locales/zh-hans.ts @@ -826,7 +826,7 @@ const zhHans = { checkUpdates: '检查更新', checkingUpdates: '正在检查…', upToDate: '已是最新版本。', - updatesViaStore: '更新通过 Microsoft Store 提供。', + updatesViaStore: '更新通过安装 ZPLab 的商店提供。', }, preview: { providerHeading: '预览渲染方式', @@ -1790,6 +1790,7 @@ const zhHans = { tabUsb: 'USB', usbPermissionDenied: '无法访问 USB 打印机。点击「设置访问权限」以授予权限。', usbSetupAccess: '设置访问权限', + usbSetupFlatpak: '在 Flatpak 中,应用无法自行安装 udev 规则。请在主机上从 ZPLab 仓库安装 70-zplab.rules,然后重新插拔打印机。', usbNotFound: '未找到 USB 打印机,请重新插入并刷新。', }, pdfExport: { diff --git a/src/locales/zh-hant.ts b/src/locales/zh-hant.ts index 8ad1604d..ee332e3e 100644 --- a/src/locales/zh-hant.ts +++ b/src/locales/zh-hant.ts @@ -826,7 +826,7 @@ const zhHant = { checkUpdates: '檢查更新', checkingUpdates: '檢查中…', upToDate: '已是最新版本。', - updatesViaStore: '更新透過 Microsoft Store 提供。', + updatesViaStore: '更新透過安裝 ZPLab 的商店提供。', }, preview: { providerHeading: '預覽算繪方式', @@ -1790,6 +1790,7 @@ const zhHant = { tabUsb: 'USB', usbPermissionDenied: '無法存取 USB 印表機。點按「設定存取權限」以授予權限。', usbSetupAccess: '設定存取權限', + usbSetupFlatpak: '在 Flatpak 中,應用程式無法自行安裝 udev 規則。請在主機上從 ZPLab 儲存庫安裝 70-zplab.rules,然後重新插拔印表機。', usbNotFound: '找不到 USB 印表機,請重新插入並重新整理。', }, pdfExport: {