diff --git a/src/components/Fonts/FontManager.tsx b/src/components/Fonts/FontManager.tsx index 6b385106..f4a6affe 100644 --- a/src/components/Fonts/FontManager.tsx +++ b/src/components/Fonts/FontManager.tsx @@ -90,6 +90,9 @@ function AddFontForm({ onDone }: AddFontFormProps) { await loadFontFile(file, printerName); onDone(); } catch { + // Inline hint is the only signal (non-TTF/OTF, oversized, FileReader + // failure). Codebase has no production logging path; specific causes + // are debugged with a devtools breakpoint on this catch. setUploadFailed(true); } finally { setUploading(false); diff --git a/src/locales/ar.ts b/src/locales/ar.ts index 5db7d777..41aca664 100644 --- a/src/locales/ar.ts +++ b/src/locales/ar.ts @@ -256,6 +256,7 @@ const ar = { selectImage: 'اختر صورة…', upload: 'رفع صورة', uploading: 'جارٍ الرفع…', + uploadError: 'تعذر تحميل الصورة', preview: 'معاينة', widthDots: 'العرض (نقاط)', threshold: 'عتبة أحادية', diff --git a/src/locales/bg.ts b/src/locales/bg.ts index 10024910..aa0c5f81 100644 --- a/src/locales/bg.ts +++ b/src/locales/bg.ts @@ -256,6 +256,7 @@ const bg = { selectImage: 'Изберете изображение…', upload: 'Качване на изображение', uploading: 'Качване…', + uploadError: 'Изображението не може да бъде заредено', preview: 'Преглед', widthDots: 'Ширина (точки)', threshold: 'Моно праг', diff --git a/src/locales/cs.ts b/src/locales/cs.ts index 52645dc6..99ada681 100644 --- a/src/locales/cs.ts +++ b/src/locales/cs.ts @@ -256,6 +256,7 @@ const cs = { selectImage: 'Vybrat obrázek…', upload: 'Nahrát obrázek', uploading: 'Nahrávání…', + uploadError: 'Obrázek nelze načíst', preview: 'Náhled', widthDots: 'Šířka (body)', threshold: 'Mono práh', diff --git a/src/locales/da.ts b/src/locales/da.ts index 4d2909af..ceba196e 100644 --- a/src/locales/da.ts +++ b/src/locales/da.ts @@ -256,6 +256,7 @@ const da = { selectImage: 'Vælg billede…', upload: 'Upload billede', uploading: 'Uploader…', + uploadError: 'Kunne ikke indlæse billede', preview: 'Forhåndsvisning', widthDots: 'Bredde (punkter)', threshold: 'Mono-tærskel', diff --git a/src/locales/de.ts b/src/locales/de.ts index 420df759..b278d645 100644 --- a/src/locales/de.ts +++ b/src/locales/de.ts @@ -276,6 +276,7 @@ const de = { selectImage: 'Bild auswählen…', upload: 'Bild hochladen', uploading: 'Hochladen…', + uploadError: 'Bild konnte nicht geladen werden', preview: 'Vorschau', widthDots: 'Breite (Punkte)', threshold: 'Mono-Schwellenwert', diff --git a/src/locales/el.ts b/src/locales/el.ts index 827878c2..eaf6779c 100644 --- a/src/locales/el.ts +++ b/src/locales/el.ts @@ -256,6 +256,7 @@ const el = { selectImage: 'Επιλογή εικόνας…', upload: 'Μεταφόρτωση εικόνας', uploading: 'Μεταφόρτωση…', + uploadError: 'Αδυναμία φόρτωσης εικόνας', preview: 'Προεπισκόπηση', widthDots: 'Πλάτος (κουκκίδες)', threshold: 'Κατώφλι mono', diff --git a/src/locales/en.ts b/src/locales/en.ts index daa38f8d..50f66c42 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -276,6 +276,7 @@ const en = { selectImage: 'Select image…', upload: 'Upload image', uploading: 'Uploading…', + uploadError: 'Could not load image', preview: 'Preview', widthDots: 'Width (dots)', threshold: 'Mono threshold', diff --git a/src/locales/es.ts b/src/locales/es.ts index 317a8654..bd3e57b2 100644 --- a/src/locales/es.ts +++ b/src/locales/es.ts @@ -256,6 +256,7 @@ const es = { selectImage: 'Seleccionar imagen…', upload: 'Subir imagen', uploading: 'Subiendo…', + uploadError: 'No se pudo cargar la imagen', preview: 'Vista previa', widthDots: 'Ancho (puntos)', threshold: 'Umbral mono', diff --git a/src/locales/et.ts b/src/locales/et.ts index 3fe3f0fe..6e76eff6 100644 --- a/src/locales/et.ts +++ b/src/locales/et.ts @@ -256,6 +256,7 @@ const et = { selectImage: 'Vali pilt…', upload: 'Laadi pilt üles', uploading: 'Üleslaadimine…', + uploadError: 'Pildi laadimine ebaõnnestus', preview: 'Eelvaade', widthDots: 'Laius (punktid)', threshold: 'Mono lävi', diff --git a/src/locales/fa.ts b/src/locales/fa.ts index dc99e558..382c30ff 100644 --- a/src/locales/fa.ts +++ b/src/locales/fa.ts @@ -256,6 +256,7 @@ const fa = { selectImage: 'انتخاب تصویر…', upload: 'بارگذاری تصویر', uploading: 'در حال بارگذاری…', + uploadError: 'بارگذاری تصویر ممکن نشد', preview: 'پیش‌نمایش', widthDots: 'عرض (نقاط)', threshold: 'آستانه تک‌رنگ', diff --git a/src/locales/fi.ts b/src/locales/fi.ts index 9c3c7534..43c24da9 100644 --- a/src/locales/fi.ts +++ b/src/locales/fi.ts @@ -256,6 +256,7 @@ const fi = { selectImage: 'Valitse kuva…', upload: 'Lataa kuva', uploading: 'Ladataan…', + uploadError: 'Kuvaa ei voitu ladata', preview: 'Esikatselu', widthDots: 'Leveys (pisteet)', threshold: 'Mono-kynnys', diff --git a/src/locales/fr.ts b/src/locales/fr.ts index edb460ba..736cefde 100644 --- a/src/locales/fr.ts +++ b/src/locales/fr.ts @@ -256,6 +256,7 @@ const fr = { selectImage: 'Sélectionner une image…', upload: 'Télécharger une image', uploading: 'Téléchargement…', + uploadError: 'Impossible de charger l\'image', preview: 'Aperçu', widthDots: 'Largeur (points)', threshold: 'Seuil mono', diff --git a/src/locales/he.ts b/src/locales/he.ts index 1e093cc7..4102d696 100644 --- a/src/locales/he.ts +++ b/src/locales/he.ts @@ -256,6 +256,7 @@ const he = { selectImage: 'בחר תמונה…', upload: 'העלאת תמונה', uploading: 'מעלה…', + uploadError: 'לא ניתן לטעון את התמונה', preview: 'תצוגה מקדימה', widthDots: 'רוחב (נקודות)', threshold: 'סף מונו', diff --git a/src/locales/hr.ts b/src/locales/hr.ts index 45200e92..3a50ce9a 100644 --- a/src/locales/hr.ts +++ b/src/locales/hr.ts @@ -256,6 +256,7 @@ const hr = { selectImage: 'Odaberite sliku…', upload: 'Prenesi sliku', uploading: 'Prenošenje…', + uploadError: 'Sliku nije moguće učitati', preview: 'Pregled', widthDots: 'Širina (točke)', threshold: 'Mono prag', diff --git a/src/locales/hu.ts b/src/locales/hu.ts index ccec1246..12b5d8bf 100644 --- a/src/locales/hu.ts +++ b/src/locales/hu.ts @@ -256,6 +256,7 @@ const hu = { selectImage: 'Kép kiválasztása…', upload: 'Kép feltöltése', uploading: 'Feltöltés…', + uploadError: 'A kép nem tölthető be', preview: 'Előnézet', widthDots: 'Szélesség (pont)', threshold: 'Mono küszöb', diff --git a/src/locales/it.ts b/src/locales/it.ts index 7e09afb6..b34c4b3b 100644 --- a/src/locales/it.ts +++ b/src/locales/it.ts @@ -256,6 +256,7 @@ const it = { selectImage: 'Seleziona immagine…', upload: 'Carica immagine', uploading: 'Caricamento…', + uploadError: 'Impossibile caricare l\'immagine', preview: 'Anteprima', widthDots: 'Larghezza (punti)', threshold: 'Soglia mono', diff --git a/src/locales/ja.ts b/src/locales/ja.ts index 929419f7..711a3ecb 100644 --- a/src/locales/ja.ts +++ b/src/locales/ja.ts @@ -256,6 +256,7 @@ const ja = { selectImage: '画像を選択…', upload: '画像をアップロード', uploading: 'アップロード中…', + uploadError: '画像を読み込めませんでした', preview: 'プレビュー', widthDots: '幅(ドット)', threshold: 'モノクロしきい値', diff --git a/src/locales/ko.ts b/src/locales/ko.ts index 6a46bdf3..b6f454a6 100644 --- a/src/locales/ko.ts +++ b/src/locales/ko.ts @@ -256,6 +256,7 @@ const ko = { selectImage: '이미지 선택…', upload: '이미지 업로드', uploading: '업로드 중…', + uploadError: '이미지를 불러올 수 없습니다', preview: '미리보기', widthDots: '너비 (도트)', threshold: '모노 임계값', diff --git a/src/locales/lt.ts b/src/locales/lt.ts index 33e07159..ab89239f 100644 --- a/src/locales/lt.ts +++ b/src/locales/lt.ts @@ -256,6 +256,7 @@ const lt = { selectImage: 'Pasirinkite vaizdą…', upload: 'Įkelti vaizdą', uploading: 'Įkeliama…', + uploadError: 'Nepavyko įkelti vaizdo', preview: 'Peržiūra', widthDots: 'Plotis (taškai)', threshold: 'Mono slenkstis', diff --git a/src/locales/lv.ts b/src/locales/lv.ts index a9d65a35..7e9c013f 100644 --- a/src/locales/lv.ts +++ b/src/locales/lv.ts @@ -256,6 +256,7 @@ const lv = { selectImage: 'Izvēlēties attēlu…', upload: 'Augšupielādēt attēlu', uploading: 'Augšupielāde…', + uploadError: 'Neizdevās ielādēt attēlu', preview: 'Priekšskatījums', widthDots: 'Platums (punkti)', threshold: 'Mono slieksnis', diff --git a/src/locales/nl.ts b/src/locales/nl.ts index 53db985c..1a2a5b99 100644 --- a/src/locales/nl.ts +++ b/src/locales/nl.ts @@ -256,6 +256,7 @@ const nl = { selectImage: 'Afbeelding selecteren…', upload: 'Afbeelding uploaden', uploading: 'Uploaden…', + uploadError: 'Kon afbeelding niet laden', preview: 'Voorbeeld', widthDots: 'Breedte (punten)', threshold: 'Mono-drempelwaarde', diff --git a/src/locales/no.ts b/src/locales/no.ts index 8166f7ae..3291ca55 100644 --- a/src/locales/no.ts +++ b/src/locales/no.ts @@ -256,6 +256,7 @@ const no = { selectImage: 'Velg bilde…', upload: 'Last opp bilde', uploading: 'Laster opp…', + uploadError: 'Kunne ikke laste bilde', preview: 'Forhåndsvisning', widthDots: 'Bredde (punkter)', threshold: 'Mono-terskel', diff --git a/src/locales/pl.ts b/src/locales/pl.ts index d0c89ff5..770f8731 100644 --- a/src/locales/pl.ts +++ b/src/locales/pl.ts @@ -256,6 +256,7 @@ const pl = { selectImage: 'Wybierz obraz…', upload: 'Prześlij obraz', uploading: 'Przesyłanie…', + uploadError: 'Nie można załadować obrazu', preview: 'Podgląd', widthDots: 'Szerokość (punkty)', threshold: 'Próg mono', diff --git a/src/locales/pt.ts b/src/locales/pt.ts index 849bb82b..4d51a728 100644 --- a/src/locales/pt.ts +++ b/src/locales/pt.ts @@ -256,6 +256,7 @@ const pt = { selectImage: 'Selecionar imagem…', upload: 'Carregar imagem', uploading: 'Carregando…', + uploadError: 'Não foi possível carregar a imagem', preview: 'Pré-visualização', widthDots: 'Largura (pontos)', threshold: 'Limiar mono', diff --git a/src/locales/ro.ts b/src/locales/ro.ts index fd46accb..93ffa9b8 100644 --- a/src/locales/ro.ts +++ b/src/locales/ro.ts @@ -256,6 +256,7 @@ const ro = { selectImage: 'Selectați imaginea…', upload: 'Încărcați imaginea', uploading: 'Se încarcă…', + uploadError: 'Imaginea nu a putut fi încărcată', preview: 'Previzualizare', widthDots: 'Lățime (puncte)', threshold: 'Prag mono', diff --git a/src/locales/sk.ts b/src/locales/sk.ts index 7114d5f4..a097910e 100644 --- a/src/locales/sk.ts +++ b/src/locales/sk.ts @@ -256,6 +256,7 @@ const sk = { selectImage: 'Vybrať obrázok…', upload: 'Nahrať obrázok', uploading: 'Nahrávanie…', + uploadError: 'Obrázok sa nedá načítať', preview: 'Náhľad', widthDots: 'Šírka (body)', threshold: 'Mono prah', diff --git a/src/locales/sl.ts b/src/locales/sl.ts index e2080758..1038be7e 100644 --- a/src/locales/sl.ts +++ b/src/locales/sl.ts @@ -256,6 +256,7 @@ const sl = { selectImage: 'Izberite sliko…', upload: 'Naloži sliko', uploading: 'Nalaganje…', + uploadError: 'Slike ni bilo mogoče naložiti', preview: 'Predogled', widthDots: 'Širina (pike)', threshold: 'Mono prag', diff --git a/src/locales/sr.ts b/src/locales/sr.ts index 2b6f54b0..1a0774e8 100644 --- a/src/locales/sr.ts +++ b/src/locales/sr.ts @@ -256,6 +256,7 @@ const sr = { selectImage: 'Изаберите слику…', upload: 'Отпремите слику', uploading: 'Отпремање…', + uploadError: 'Слика није могла да се учита', preview: 'Преглед', widthDots: 'Ширина (тачке)', threshold: 'Моно праг', diff --git a/src/locales/sv.ts b/src/locales/sv.ts index 9b6b2ca8..db3cf45b 100644 --- a/src/locales/sv.ts +++ b/src/locales/sv.ts @@ -256,6 +256,7 @@ const sv = { selectImage: 'Välj bild…', upload: 'Ladda upp bild', uploading: 'Laddar upp…', + uploadError: 'Kunde inte ladda bilden', preview: 'Förhandsvisning', widthDots: 'Bredd (punkter)', threshold: 'Mono-tröskel', diff --git a/src/locales/tr.ts b/src/locales/tr.ts index f940b3e9..b07ac490 100644 --- a/src/locales/tr.ts +++ b/src/locales/tr.ts @@ -256,6 +256,7 @@ const tr = { selectImage: 'Görsel seçin…', upload: 'Görsel yükle', uploading: 'Yükleniyor…', + uploadError: 'Görsel yüklenemedi', preview: 'Önizleme', widthDots: 'Genişlik (nokta)', threshold: 'Mono eşik', diff --git a/src/locales/zh-hans.ts b/src/locales/zh-hans.ts index 06e5a3c6..781826f7 100644 --- a/src/locales/zh-hans.ts +++ b/src/locales/zh-hans.ts @@ -256,6 +256,7 @@ const zhHans = { selectImage: '选择图片…', upload: '上传图片', uploading: '上传中…', + uploadError: '无法加载图像', preview: '预览', widthDots: '宽度(点)', threshold: '单色阈值', diff --git a/src/locales/zh-hant.ts b/src/locales/zh-hant.ts index d0ff35f8..3d4ffe2d 100644 --- a/src/locales/zh-hant.ts +++ b/src/locales/zh-hant.ts @@ -256,6 +256,7 @@ const zhHant = { selectImage: '選擇圖片…', upload: '上傳圖片', uploading: '上傳中…', + uploadError: '無法載入圖片', preview: '預覽', widthDots: '寬度(點)', threshold: '單色閾值', diff --git a/src/registry/image.tsx b/src/registry/image.tsx index 53e440b3..da7a288a 100644 --- a/src/registry/image.tsx +++ b/src/registry/image.tsx @@ -87,17 +87,25 @@ export const image: ObjectTypeDefinition = { const p = obj.props; const fileRef = useRef(null); const [uploading, setUploading] = useState(false); + const [uploadFailed, setUploadFailed] = useState(false); const cached = getImage(p.imageId); const allImages = getAllImages(); const handleUpload = useCallback(async (file: File) => { setUploading(true); + setUploadFailed(false); try { const entry = await loadImageFile(file); // Pre-generate GFA cache const result = await imageToGFA(entry.dataUrl, p.widthDots, p.threshold); onChange({ imageId: entry.id, _gfaCache: result.zpl }); + } catch { + // Surface the failure inline (non-image MIME, oversized file, decode + // error, GFA exception) and stop. The codebase has no production + // logging path; debugging specific causes (e.g. an obscure MIME) is + // done with a devtools breakpoint on this catch. + setUploadFailed(true); } finally { setUploading(false); } @@ -160,6 +168,9 @@ export const image: ObjectTypeDefinition = { > {uploading ? t.registry.image.uploading : t.registry.image.upload} + {uploadFailed && ( +

{t.registry.image.uploadError}

+ )} {/* Preview thumbnail */}