@@ -148,6 +148,22 @@ function isChineseLanguage(language = getUserLanguage()) {
148148 ) ;
149149}
150150
151+ // User notification helper
152+ function showDownloadError ( filename ) {
153+ const isChinese = isChineseLanguage ( ) ;
154+ const message = isChinese
155+ ? `下载失败: ${ filename } `
156+ : `Download failed: ${ filename } ` ;
157+
158+ if ( window . Notification && Notification . permission === "granted" ) {
159+ new Notification ( isChinese ? "下载错误" : "Download Error" , {
160+ body : message ,
161+ } ) ;
162+ } else {
163+ console . error ( message ) ;
164+ }
165+ }
166+
151167// Unified file detection - replaces both isDownloadLink and isFileLink
152168function isDownloadableFile ( url ) {
153169 try {
@@ -251,7 +267,7 @@ document.addEventListener("DOMContentLoaded", () => {
251267 }
252268
253269 // write the ArrayBuffer to a binary, and you're done
254- const userLanguage = navigator . language || navigator . userLanguage ;
270+ const userLanguage = getUserLanguage ( ) ;
255271 invoke ( "download_file_by_binary" , {
256272 params : {
257273 filename,
@@ -260,16 +276,18 @@ document.addEventListener("DOMContentLoaded", () => {
260276 } ,
261277 } ) . catch ( ( error ) => {
262278 console . error ( "Failed to download data URI file:" , filename , error ) ;
279+ showDownloadError ( filename ) ;
263280 } ) ;
264281 } catch ( error ) {
265282 console . error ( "Failed to process data URI:" , dataURI , error ) ;
283+ showDownloadError ( filename || "file" ) ;
266284 }
267285 }
268286
269287 function downloadFromBlobUrl ( blobUrl , filename ) {
270288 convertBlobUrlToBinary ( blobUrl )
271289 . then ( ( binary ) => {
272- const userLanguage = navigator . language || navigator . userLanguage ;
290+ const userLanguage = getUserLanguage ( ) ;
273291 invoke ( "download_file_by_binary" , {
274292 params : {
275293 filename,
@@ -278,10 +296,12 @@ document.addEventListener("DOMContentLoaded", () => {
278296 } ,
279297 } ) . catch ( ( error ) => {
280298 console . error ( "Failed to download blob file:" , filename , error ) ;
299+ showDownloadError ( filename ) ;
281300 } ) ;
282301 } )
283302 . catch ( ( error ) => {
284303 console . error ( "Failed to convert blob to binary:" , blobUrl , error ) ;
304+ showDownloadError ( filename ) ;
285305 } ) ;
286306 }
287307
@@ -659,13 +679,16 @@ document.addEventListener("DOMContentLoaded", () => {
659679 }
660680 } else {
661681 // Regular HTTP(S) image
662- const userLanguage = navigator . language || navigator . userLanguage ;
682+ const userLanguage = getUserLanguage ( ) ;
663683 invoke ( "download_file" , {
664684 params : {
665685 url : imageUrl ,
666686 filename : filename ,
667687 language : userLanguage ,
668688 } ,
689+ } ) . catch ( ( error ) => {
690+ console . error ( "Failed to download image:" , filename , error ) ;
691+ showDownloadError ( filename ) ;
669692 } ) ;
670693 }
671694 }
@@ -713,7 +736,7 @@ document.addEventListener("DOMContentLoaded", () => {
713736
714737 // Simplified menu builder
715738 function buildMenuItems ( type , data ) {
716- const userLanguage = navigator . language || navigator . userLanguage ;
739+ const userLanguage = getUserLanguage ( ) ;
717740 const items = [ ] ;
718741
719742 switch ( type ) {
@@ -740,6 +763,9 @@ document.addEventListener("DOMContentLoaded", () => {
740763 const filename = getFilenameFromUrl ( data . url ) ;
741764 invoke ( "download_file" , {
742765 params : { url : data . url , filename, language : userLanguage } ,
766+ } ) . catch ( ( error ) => {
767+ console . error ( "Failed to download file:" , filename , error ) ;
768+ showDownloadError ( filename ) ;
743769 } ) ;
744770 } ) ,
745771 ) ;
0 commit comments