diff --git a/apps/readest-app/public/locales/ar/translation.json b/apps/readest-app/public/locales/ar/translation.json index eb15eb7d..a8055eb2 100644 --- a/apps/readest-app/public/locales/ar/translation.json +++ b/apps/readest-app/public/locales/ar/translation.json @@ -1107,5 +1107,6 @@ "System Screen Brightness": "سطوع شاشة النظام", "Page:": "صفحة:", "Page: {{number}}": "صفحة: {{number}}", - "Annotation page number": "رقم صفحة التعליق" + "Annotation page number": "رقم صفحة التعליق", + "Translating...": "جارٍ الترجمة..." } diff --git a/apps/readest-app/public/locales/bn/translation.json b/apps/readest-app/public/locales/bn/translation.json index 421c8476..91215968 100644 --- a/apps/readest-app/public/locales/bn/translation.json +++ b/apps/readest-app/public/locales/bn/translation.json @@ -1059,5 +1059,6 @@ "System Screen Brightness": "সিস্টেম স্ক্রিন উজ্জ্বলতা", "Page:": "পৃষ্ঠা:", "Page: {{number}}": "পৃষ্ঠা: {{number}}", - "Annotation page number": "টীকা পৃষ্ঠা নম্বর" + "Annotation page number": "টীকা পৃষ্ঠা নম্বর", + "Translating...": "অনুবাদ করা হচ্ছে..." } diff --git a/apps/readest-app/public/locales/bo/translation.json b/apps/readest-app/public/locales/bo/translation.json index f22e0bf8..e1db69f4 100644 --- a/apps/readest-app/public/locales/bo/translation.json +++ b/apps/readest-app/public/locales/bo/translation.json @@ -1047,5 +1047,6 @@ "System Screen Brightness": "མ་ལག་ཤེལ་སྒོའི་གསལ་ཚད།", "Page:": "ཤོག་ལྷེ།:", "Page: {{number}}": "ཤོག་ལྷེ།: {{number}}", - "Annotation page number": "མཆན་འགྲེལ་ཤོག་ཨང་།" + "Annotation page number": "མཆན་འགྲེལ་ཤོག་ཨང་།", + "Translating...": "ཡིག་བསྒྱུར་བྱེད་བཞིན་པ།..." } diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index 252466fb..eb183512 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -1059,5 +1059,6 @@ "System Screen Brightness": "System-Bildschirmhelligkeit", "Page:": "Seite:", "Page: {{number}}": "Seite: {{number}}", - "Annotation page number": "Seitenzahl der Anmerkung" + "Annotation page number": "Seitenzahl der Anmerkung", + "Translating...": "Übersetzen..." } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index e177a3ce..a720dbcf 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -1059,5 +1059,6 @@ "System Screen Brightness": "Φωτεινότητα οθόνης συστήματος", "Page:": "Σελίδα:", "Page: {{number}}": "Σελίδα: {{number}}", - "Annotation page number": "Αριθμός σελίδας σχολίου" + "Annotation page number": "Αριθμός σελίδας σχολίου", + "Translating...": "Μετάφραση..." } diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index 6929e7b0..d9241f0f 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -1071,5 +1071,6 @@ "System Screen Brightness": "Brillo de pantalla del sistema", "Page:": "Página:", "Page: {{number}}": "Página: {{number}}", - "Annotation page number": "Número de página de la anotación" + "Annotation page number": "Número de página de la anotación", + "Translating...": "Traduciendo..." } diff --git a/apps/readest-app/public/locales/fa/translation.json b/apps/readest-app/public/locales/fa/translation.json index 4836b390..32996be4 100644 --- a/apps/readest-app/public/locales/fa/translation.json +++ b/apps/readest-app/public/locales/fa/translation.json @@ -1059,5 +1059,6 @@ "System Screen Brightness": "روشنایی صفحه نمایش سیستم", "Page:": "صفحه:", "Page: {{number}}": "صفحه: {{number}}", - "Annotation page number": "شماره صفحه یادداشت" + "Annotation page number": "شماره صفحه یادداشت", + "Translating...": "در حال ترجمه..." } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index e58f8d9d..2970cc3f 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -1071,5 +1071,6 @@ "System Screen Brightness": "Luminosité de l'écran système", "Page:": "Page :", "Page: {{number}}": "Page : {{number}}", - "Annotation page number": "Numéro de page de l'annotation" + "Annotation page number": "Numéro de page de l'annotation", + "Translating...": "Traduction en cours..." } diff --git a/apps/readest-app/public/locales/he/translation.json b/apps/readest-app/public/locales/he/translation.json index cc127a5e..c2c16753 100644 --- a/apps/readest-app/public/locales/he/translation.json +++ b/apps/readest-app/public/locales/he/translation.json @@ -1071,5 +1071,6 @@ "System Screen Brightness": "בהירות מסך המערכת", "Page:": "עמוד:", "Page: {{number}}": "עמוד: {{number}}", - "Annotation page number": "מספר עמוד הערה" + "Annotation page number": "מספר עמוד הערה", + "Translating...": "מתרגם..." } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index f4612df6..f007bdcf 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -1059,5 +1059,6 @@ "System Screen Brightness": "सिस्टम स्क्रीन चमक", "Page:": "पृष्ठ:", "Page: {{number}}": "पृष्ठ: {{number}}", - "Annotation page number": "व्याख्या पृष्ठ संख्या" + "Annotation page number": "व्याख्या पृष्ठ संख्या", + "Translating...": "अनुवाद हो रहा है..." } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index 491e5167..351a0c24 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -1047,5 +1047,6 @@ "System Screen Brightness": "Kecerahan Layar Sistem", "Page:": "Halaman:", "Page: {{number}}": "Halaman: {{number}}", - "Annotation page number": "Nomor halaman anotasi" + "Annotation page number": "Nomor halaman anotasi", + "Translating...": "Menerjemahkan..." } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index f192bc9a..59b1b017 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -1071,5 +1071,6 @@ "System Screen Brightness": "Luminosità dello schermo del sistema", "Page:": "Pagina:", "Page: {{number}}": "Pagina: {{number}}", - "Annotation page number": "Numero di pagina dell'annotazione" + "Annotation page number": "Numero di pagina dell'annotazione", + "Translating...": "Traduzione..." } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index 7b1f1c1e..20195cda 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -1047,5 +1047,6 @@ "System Screen Brightness": "システムの画面の明るさ", "Page:": "ページ:", "Page: {{number}}": "ページ: {{number}}", - "Annotation page number": "注釈のページ番号" + "Annotation page number": "注釈のページ番号", + "Translating...": "翻訳中..." } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index 7003a941..22d7d72a 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -1047,5 +1047,6 @@ "System Screen Brightness": "시스템 화면 밝기", "Page:": "페이지:", "Page: {{number}}": "페이지: {{number}}", - "Annotation page number": "주석 페이지 번호" + "Annotation page number": "주석 페이지 번호", + "Translating...": "번역 중..." } diff --git a/apps/readest-app/public/locales/ms/translation.json b/apps/readest-app/public/locales/ms/translation.json index 3560e651..d59d7d10 100644 --- a/apps/readest-app/public/locales/ms/translation.json +++ b/apps/readest-app/public/locales/ms/translation.json @@ -1047,5 +1047,6 @@ "System Screen Brightness": "Kecerahan Skrin Sistem", "Page:": "Halaman:", "Page: {{number}}": "Halaman: {{number}}", - "Annotation page number": "Nombor halaman anotasi" + "Annotation page number": "Nombor halaman anotasi", + "Translating...": "Menterjemah..." } diff --git a/apps/readest-app/public/locales/nl/translation.json b/apps/readest-app/public/locales/nl/translation.json index 6a92ac57..8e9407e8 100644 --- a/apps/readest-app/public/locales/nl/translation.json +++ b/apps/readest-app/public/locales/nl/translation.json @@ -1059,5 +1059,6 @@ "System Screen Brightness": "Systeemhelderheid van het scherm", "Page:": "Pagina:", "Page: {{number}}": "Pagina: {{number}}", - "Annotation page number": "Annotatiepaginanummer" + "Annotation page number": "Annotatiepaginanummer", + "Translating...": "Vertalen..." } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index 2dc92b92..9f82bc42 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -1083,5 +1083,6 @@ "System Screen Brightness": "Jasność ekranu systemowego", "Page:": "Strona:", "Page: {{number}}": "Strona: {{number}}", - "Annotation page number": "Numer strony adnotacji" + "Annotation page number": "Numer strony adnotacji", + "Translating...": "Tłumaczenie..." } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index 66f096ba..b5c44399 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -1071,5 +1071,6 @@ "System Screen Brightness": "Brilho da tela do sistema", "Page:": "Página:", "Page: {{number}}": "Página: {{number}}", - "Annotation page number": "Número de página da anotação" + "Annotation page number": "Número de página da anotação", + "Translating...": "Traduzindo..." } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index 18ef3bba..a70092c2 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -1083,5 +1083,6 @@ "System Screen Brightness": "Систেমная яркость экрана", "Page:": "Страница:", "Page: {{number}}": "Страница: {{number}}", - "Annotation page number": "Номер страницы аннотации" + "Annotation page number": "Номер страницы аннотации", + "Translating...": "Перевод..." } diff --git a/apps/readest-app/public/locales/si/translation.json b/apps/readest-app/public/locales/si/translation.json index 86330272..aca2d93e 100644 --- a/apps/readest-app/public/locales/si/translation.json +++ b/apps/readest-app/public/locales/si/translation.json @@ -1059,5 +1059,6 @@ "System Screen Brightness": "පද්ධති තිර දීප්තිය", "Page:": "පිටුව:", "Page: {{number}}": "පිටුව: {{number}}", - "Annotation page number": "විවරණ පිටු අංකය" + "Annotation page number": "විවරණ පිටු අංකය", + "Translating...": "පරිවර්තනය වෙමින් පවතී..." } diff --git a/apps/readest-app/public/locales/sv/translation.json b/apps/readest-app/public/locales/sv/translation.json index 9f9a0d86..7dd2354e 100644 --- a/apps/readest-app/public/locales/sv/translation.json +++ b/apps/readest-app/public/locales/sv/translation.json @@ -1059,5 +1059,6 @@ "System Screen Brightness": "Systemets skärmljusstyrka", "Page:": "Sida:", "Page: {{number}}": "Sida: {{number}}", - "Annotation page number": "Annoteringssidnummer" + "Annotation page number": "Annoteringssidnummer", + "Translating...": "Översätter..." } diff --git a/apps/readest-app/public/locales/ta/translation.json b/apps/readest-app/public/locales/ta/translation.json index 797af81f..09eb1793 100644 --- a/apps/readest-app/public/locales/ta/translation.json +++ b/apps/readest-app/public/locales/ta/translation.json @@ -1059,5 +1059,6 @@ "System Screen Brightness": "கணினித் திரை பிரகாசம்", "Page:": "பக்கம்:", "Page: {{number}}": "பக்கம்: {{number}}", - "Annotation page number": "சிறுகுறிப்புப் பக்க எண்" + "Annotation page number": "சிறுகுறிப்புப் பக்க எண்", + "Translating...": "மொழிபெயர்க்கிறது..." } diff --git a/apps/readest-app/public/locales/th/translation.json b/apps/readest-app/public/locales/th/translation.json index 2b12630e..8f326210 100644 --- a/apps/readest-app/public/locales/th/translation.json +++ b/apps/readest-app/public/locales/th/translation.json @@ -1047,5 +1047,6 @@ "System Screen Brightness": "ความสว่างหน้าจอระบบ", "Page:": "หน้า:", "Page: {{number}}": "หน้า: {{number}}", - "Annotation page number": "หมายเลขหน้าคำอธิบายประกอบ" + "Annotation page number": "หมายเลขหน้าคำอธิบายประกอบ", + "Translating...": "กำลังแปล..." } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index 73b4652b..7a6b334c 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -1059,5 +1059,6 @@ "System Screen Brightness": "Sistem Ekran Parlaklığı", "Page:": "Sayfa:", "Page: {{number}}": "Sayfa: {{number}}", - "Annotation page number": "Açıklama sayfa numarası" + "Annotation page number": "Açıklama sayfa numarası", + "Translating...": "Çevriliyor..." } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index d3d9b445..133bc828 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -1083,5 +1083,6 @@ "System Screen Brightness": "Системна яскравість екрана", "Page:": "Сторінка:", "Page: {{number}}": "Сторінка: {{number}}", - "Annotation page number": "Номер сторінки анотації" + "Annotation page number": "Номер сторінки анотації", + "Translating...": "Переклад..." } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index 76d87431..4869960d 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -1047,5 +1047,6 @@ "System Screen Brightness": "Độ sáng màn hình hệ thống", "Page:": "Trang:", "Page: {{number}}": "Trang: {{number}}", - "Annotation page number": "Số trang chú thích" + "Annotation page number": "Số trang chú thích", + "Translating...": "Đang dịch..." } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index f7d020b0..b129a5e0 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -1047,5 +1047,6 @@ "System Screen Brightness": "系统屏幕亮度", "Page:": "页面:", "Page: {{number}}": "页面: {{number}}", - "Annotation page number": "批注页码" + "Annotation page number": "批注页码", + "Translating...": "翻译中..." } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index 8aa8747f..9897d74d 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -1047,5 +1047,6 @@ "System Screen Brightness": "系統螢幕亮度", "Page:": "頁面:", "Page: {{number}}": "頁面: {{number}}", - "Annotation page number": "註解頁碼" + "Annotation page number": "註解頁碼", + "Translating...": "翻譯中..." } diff --git a/apps/readest-app/src/app/reader/components/FoliateViewer.tsx b/apps/readest-app/src/app/reader/components/FoliateViewer.tsx index 43608190..f84a52cc 100644 --- a/apps/readest-app/src/app/reader/components/FoliateViewer.tsx +++ b/apps/readest-app/src/app/reader/components/FoliateViewer.tsx @@ -1,3 +1,4 @@ +import clsx from 'clsx'; import React, { useEffect, useRef, useState, useCallback } from 'react'; import { convertBlobUrlToDataUrl, BookDoc, getDirection } from '@/libs/document'; import { BookConfig, PageInfo } from '@/types/book'; @@ -611,7 +612,10 @@ const FoliateViewer: React.FC<{ tabIndex={-1} role='document' aria-label={_('Book Content')} - className='foliate-viewer h-[100%] w-[100%] focus:outline-none' + className={clsx( + 'foliate-viewer h-[100%] w-[100%] focus:outline-none', + viewState?.loading && 'bg-base-100', + )} style={{ paddingTop: showViewMargins ? insets.top : 0, paddingBottom: showViewMargins ? insets.bottom : 0, @@ -620,7 +624,11 @@ const FoliateViewer: React.FC<{ {...touchHandlers} /> - {!docLoaded.current && loading && } + {((!docLoaded.current && loading) || viewState?.loading) && ( +
+ +
+ )} {syncState === 'conflict' && conflictDetails && ( (null); const translatedElements = useRef([]); const allTextNodes = useRef([]); + const translationQueue = useRef([]); + const activeTranslations = useRef(0); + const MAX_CONCURRENT_TRANSLATIONS = 5; + const pendingDOMUpdates = useRef void>>([]); + const batchTimerRef = useRef | null>(null); + const hintTimerRef = useRef | null>(null); const toggleTranslationVisibility = (visible: boolean) => { translatedElements.current.forEach((element) => { @@ -49,8 +58,21 @@ export function useTextTranslation( translateRef.current = translate; }, [translate]); + const hintInitialTranslating = () => { + setIsLoading(bookKey, true); + eventDispatcher.dispatch('hint', { + bookKey, + message: _('Translating...'), + }); + hintTimerRef.current = setTimeout(() => { + hintTimerRef.current = null; + setIsLoading(bookKey, false); + }, 2000); + }; + const observeTextNodes = () => { if (!view || !enabled.current) return; + const observer = createTranslationObserver(); observerRef.current = observer; const nodes = walkTextNodes(view, ['pre', 'code', 'math']); @@ -64,6 +86,13 @@ export function useTextTranslation( }; const updateTranslation = () => { + translationQueue.current = []; + activeTranslations.current = 0; + if (batchTimerRef.current) { + clearTimeout(batchTimerRef.current); + batchTimerRef.current = null; + } + pendingDOMUpdates.current = []; translatedElements.current.forEach((element) => { const translationTargets = element.querySelectorAll('.translation-target'); translationTargets.forEach((target) => target.remove()); @@ -76,48 +105,86 @@ export function useTextTranslation( }; const createTranslationObserver = () => { + const visibleElements = new Set(); return new IntersectionObserver( (entries) => { - let beforeIntersectedElement: HTMLElement | null = null; - let lastIntersectedElement: HTMLElement | null = null; for (const entry of entries) { - if (!entry.isIntersecting) { - if (!lastIntersectedElement) { - beforeIntersectedElement = entry.target as HTMLElement; - } - continue; + if (entry.isIntersecting) { + visibleElements.add(entry.target as HTMLElement); + } else { + visibleElements.delete(entry.target as HTMLElement); } - const currentElement = entry.target as HTMLElement; - translateElement(currentElement); - lastIntersectedElement = currentElement; } - if (beforeIntersectedElement) { - translateElement(beforeIntersectedElement); + + if (visibleElements.size === 0) return; + + const nodes = allTextNodes.current; + if (nodes.length === 0) return; + + let firstIdx = nodes.length; + let lastIdx = -1; + for (const el of visibleElements) { + const idx = nodes.indexOf(el); + if (idx !== -1) { + if (idx < firstIdx) firstIdx = idx; + if (idx > lastIdx) lastIdx = idx; + } } - if (lastIntersectedElement) { - preTranslateNextElements(lastIntersectedElement, 2); + + if (lastIdx === -1) return; + + const startIdx = Math.max(0, firstIdx - 1); + const endIdx = Math.min(nodes.length - 1, lastIdx + 2); + + for (let i = startIdx; i <= endIdx; i++) { + const node = nodes[i]; + if (node) { + scheduleTranslation(node); + } } }, - { - rootMargin: '1280px', - threshold: 0, - }, + { threshold: 0 }, ); }; - const preTranslateNextElements = (currentElement: HTMLElement, count: number) => { - if (!allTextNodes.current || count <= 0) return; - const currentIndex = allTextNodes.current.indexOf(currentElement); - if (currentIndex === -1) { - return; - } + const scheduleTranslation = (el: HTMLElement) => { + if (!enabled.current) return; + if (el.classList.contains('translation-target')) return; + if (el.querySelector('.translation-target')) return; + if (translationQueue.current.indexOf(el) !== -1) return; + translationQueue.current.push(el); + drainTranslationQueue(); + }; - const nextElements = allTextNodes.current.slice(currentIndex + 1, currentIndex + 1 + count); - nextElements.forEach((element, index) => { + const drainTranslationQueue = () => { + while ( + activeTranslations.current < MAX_CONCURRENT_TRANSLATIONS && + translationQueue.current.length > 0 + ) { + const el = translationQueue.current.shift()!; + if (el.querySelector('.translation-target') || !enabled.current) continue; + activeTranslations.current++; + translateElement(el).finally(() => { + activeTranslations.current--; + drainTranslationQueue(); + }); + } + if (translationQueue.current.length === 0 && activeTranslations.current === 0) { setTimeout(() => { - translateElement(element); - }, index * 500); - }); + setIsLoading(bookKey, false); + }, 500); + } + }; + + const batchDOMUpdate = (update: () => void) => { + pendingDOMUpdates.current.push(update); + if (!batchTimerRef.current) { + batchTimerRef.current = setTimeout(() => { + batchTimerRef.current = null; + const updates = pendingDOMUpdates.current.splice(0); + updates.forEach((fn) => fn()); + }, 50); + } }; const recreateTranslationObserver = () => { @@ -183,8 +250,6 @@ export function useTextTranslation( } }; - updateSourceNodes(el); - try { const translated = await translateRef.current([text]); const translatedText = translated[0]; @@ -211,8 +276,12 @@ export function useTextTranslation( if (el.querySelector('.translation-target')) { return; } - el.appendChild(wrapper); - translatedElements.current.push(el); + batchDOMUpdate(() => { + if (!enabled.current || el.querySelector('.translation-target')) return; + updateSourceNodes(el); + el.appendChild(wrapper); + translatedElements.current.push(el); + }); } catch (err) { console.warn('Translation failed:', err); } @@ -260,11 +329,11 @@ export function useTextTranslation( for (let i = beforeStart; i <= afterEnd; i++) { const node = nodes[i]; if (node) { - translateElement(node); + scheduleTranslation(node); } } }, 500), - [translateElement], + [scheduleTranslation], ); useEffect(() => { @@ -316,15 +385,29 @@ export function useTextTranslation( if ('renderer' in view) { view.addEventListener('load', observeTextNodes); + view.addEventListener('load', hintInitialTranslating); } else { observeTextNodes(); } return () => { if ('renderer' in view) { view.removeEventListener('load', observeTextNodes); + view.removeEventListener('load', hintInitialTranslating); } observerRef.current?.disconnect(); translatedElements.current = []; + translationQueue.current = []; + activeTranslations.current = 0; + if (batchTimerRef.current) { + clearTimeout(batchTimerRef.current); + batchTimerRef.current = null; + } + if (hintTimerRef.current) { + clearTimeout(hintTimerRef.current); + hintTimerRef.current = null; + } + pendingDOMUpdates.current = []; + setIsLoading(bookKey, false); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [view]); diff --git a/apps/readest-app/src/store/readerStore.ts b/apps/readest-app/src/store/readerStore.ts index 2b2212a9..8485d51d 100644 --- a/apps/readest-app/src/store/readerStore.ts +++ b/apps/readest-app/src/store/readerStore.ts @@ -51,6 +51,7 @@ interface ReaderStore { setHoveredBookKey: (key: string | null) => void; setBookmarkRibbonVisibility: (key: string, visible: boolean) => void; setTTSEnabled: (key: string, enabled: boolean) => void; + setIsLoading: (key: string, loading: boolean) => void; setIsSyncing: (key: string, syncing: boolean) => void; setProgress: ( key: string, @@ -393,6 +394,17 @@ export const useReaderStore = create((set, get) => ({ }, })), + setIsLoading: (key: string, loading: boolean) => + set((state) => ({ + viewStates: { + ...state.viewStates, + [key]: { + ...state.viewStates[key]!, + loading, + }, + }, + })), + setIsSyncing: (key: string, syncing: boolean) => set((state) => ({ viewStates: { diff --git a/packages/foliate-js b/packages/foliate-js index 8b931a78..423edcb3 160000 --- a/packages/foliate-js +++ b/packages/foliate-js @@ -1 +1 @@ -Subproject commit 8b931a780595beefba06ebbe5e86a570db6fed63 +Subproject commit 423edcb3a83628a919aa168bfcd1d432f696ef5c