From 3875c8f23989ba32644770961bced455e3b53c3b Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Thu, 26 Jun 2025 17:19:30 +0800 Subject: [PATCH] feat: add an option to show remaining pages in chapter (#1478) --- .../public/locales/ar/translation.json | 9 ++++- .../public/locales/de/translation.json | 5 ++- .../public/locales/el/translation.json | 5 ++- .../public/locales/en/translation.json | 4 ++- .../public/locales/es/translation.json | 6 +++- .../public/locales/fr/translation.json | 6 +++- .../public/locales/hi/translation.json | 5 ++- .../public/locales/id/translation.json | 4 ++- .../public/locales/it/translation.json | 6 +++- .../public/locales/ja/translation.json | 4 ++- .../public/locales/ko/translation.json | 4 ++- .../public/locales/nl/translation.json | 5 ++- .../public/locales/pl/translation.json | 7 +++- .../public/locales/pt/translation.json | 6 +++- .../public/locales/ru/translation.json | 7 +++- .../public/locales/tr/translation.json | 5 ++- .../public/locales/uk/translation.json | 7 +++- .../public/locales/vi/translation.json | 4 ++- .../public/locales/zh-CN/translation.json | 4 ++- .../public/locales/zh-TW/translation.json | 4 ++- .../app/reader/components/ProgressInfo.tsx | 14 ++++++-- .../components/settings/LayoutPanel.tsx | 33 ++++++++++++++++++- .../components/settings/NumberInput.tsx | 4 +-- apps/readest-app/src/services/constants.ts | 1 + apps/readest-app/src/types/book.ts | 1 + apps/readest-app/src/types/view.ts | 2 ++ 26 files changed, 136 insertions(+), 26 deletions(-) diff --git a/apps/readest-app/public/locales/ar/translation.json b/apps/readest-app/public/locales/ar/translation.json index 0514c6cb..5076bc91 100644 --- a/apps/readest-app/public/locales/ar/translation.json +++ b/apps/readest-app/public/locales/ar/translation.json @@ -383,5 +383,12 @@ "Book Covers": "أغلفة الكتب", "Fit": "ملاءمة", "Reset {{settings}}": "إعادة تعيين {{settings}}", - "Reset Settings": "إعادة تعيين الإعدادات" + "Reset Settings": "إعادة تعيين الإعدادات", + "{{count}} pages left in chapter_zero": "لم يتبق أي صفحات في هذا الفصل", + "{{count}} pages left in chapter_one": "تبقّت صفحة واحدة في هذا الفصل", + "{{count}} pages left in chapter_two": "تبقّت صفحتان في هذا الفصل", + "{{count}} pages left in chapter_few": "تبقّت {{count}} صفحات في هذا الفصل", + "{{count}} pages left in chapter_many": "تبقّت {{count}} صفحة في هذا الفصل", + "{{count}} pages left in chapter_other": "تبقّى {{count}} صفحة في هذا الفصل", + "Show Remaining Pages": "عرض الصفحات المتبقية" } diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index 987b5adb..90221cb0 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -371,5 +371,8 @@ "Book Covers": "Buchcover", "Fit": "Anpassen", "Reset {{settings}}": "{{settings}} zurücksetzen", - "Reset Settings": "Einstellungen zurücksetzen" + "Reset Settings": "Einstellungen zurücksetzen", + "{{count}} pages left in chapter_one": "{{count}} Seite verbleibend im Kapitel", + "{{count}} pages left in chapter_other": "{{count}} Seiten verbleibend im Kapitel", + "Show Remaining Pages": "Verbleibende Seiten anzeigen" } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index 8f382c4a..125353b1 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -371,5 +371,8 @@ "Book Covers": "Εξώφυλλα βιβλίων", "Fit": "Προσαρμογή", "Reset {{settings}}": "Επαναφορά {{settings}}", - "Reset Settings": "Επαναφορά ρυθμίσεων" + "Reset Settings": "Επαναφορά ρυθμίσεων", + "{{count}} pages left in chapter_one": "Μένει {{count}} σελίδα", + "{{count}} pages left in chapter_other": "Μένουν {{count}} σελίδες", + "Show Remaining Pages": "Εμφάνιση υπολοίπων" } diff --git a/apps/readest-app/public/locales/en/translation.json b/apps/readest-app/public/locales/en/translation.json index 5e52daba..67a2cee7 100644 --- a/apps/readest-app/public/locales/en/translation.json +++ b/apps/readest-app/public/locales/en/translation.json @@ -4,5 +4,7 @@ "Are you sure to delete {{count}} selected book(s)?_one": "Are you sure to delete {{count}} selected book?", "Are you sure to delete {{count}} selected book(s)?_other": "Are you sure to delete {{count}} selected books?", "Search in {{count}} Book(s)..._one": "Search in {{count}} book...", - "Search in {{count}} Book(s)..._other": "Search in {{count}} books..." + "Search in {{count}} Book(s)..._other": "Search in {{count}} books...", + "{{count}} pages left in chapter_one": "{{count}} page left in chapter", + "{{count}} pages left in chapter_other": "{{count}} pages left in chapter" } diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index 9193937c..8f24e694 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -374,5 +374,9 @@ "Book Covers": "Portadas de libros", "Fit": "Encajar", "Reset {{settings}}": "Restablecer {{settings}}", - "Reset Settings": "Restablecer configuración" + "Reset Settings": "Restablecer configuración", + "{{count}} pages left in chapter_one": "{{count}} página restante en el capítulo", + "{{count}} pages left in chapter_many": "{{count}} páginas restantes en el capítulo", + "{{count}} pages left in chapter_other": "{{count}} páginas restantes en el capítulo", + "Show Remaining Pages": "Mostrar resto" } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index ff848461..25a7fcef 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -374,5 +374,9 @@ "Book Covers": "Couvertures de livres", "Fit": "Adapter", "Reset {{settings}}": "Réinitialiser {{settings}}", - "Reset Settings": "Réinitialiser les paramètres" + "Reset Settings": "Réinitialiser les paramètres", + "{{count}} pages left in chapter_one": "{{count}} page restant dans le chapitre", + "{{count}} pages left in chapter_many": "{{count}} pages restantes dans le chapitre", + "{{count}} pages left in chapter_other": "{{count}} pages restantes dans le chapitre", + "Show Remaining Pages": "Voir restantes" } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index bbabf64b..cb58aa9b 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -371,5 +371,8 @@ "Book Covers": "पुस्तक कवर", "Fit": "फिट", "Reset {{settings}}": "रीसेट {{settings}}", - "Reset Settings": "सेटिंग्स रीसेट करें" + "Reset Settings": "सेटिंग्स रीसेट करें", + "{{count}} pages left in chapter_one": "इस अध्याय में {{count}} पृष्ठ शेष हैं", + "{{count}} pages left in chapter_other": "इस अध्याय में {{count}} पृष्ठ शेष हैं", + "Show Remaining Pages": "शेष पृष्ठ दिखाएँ" } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index dda0bfcf..c1e5a189 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -368,5 +368,7 @@ "Book Covers": "Sampul Buku", "Fit": "Pas", "Reset {{settings}}": "Atur Ulang {{settings}}", - "Reset Settings": "Atur Ulang Pengaturan" + "Reset Settings": "Atur Ulang Pengaturan", + "{{count}} pages left in chapter_other": "{{count}} halaman tersisa di bab ini", + "Show Remaining Pages": "Tampilkan halaman tersisa" } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index 9c8ee536..81be6666 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -374,5 +374,9 @@ "Book Covers": "Copertine libri", "Fit": "Adatta", "Reset {{settings}}": "Reimposta {{settings}}", - "Reset Settings": "Reimposta impostazioni" + "Reset Settings": "Reimposta impostazioni", + "{{count}} pages left in chapter_one": "{{count}} pagina rimasta nel capitolo", + "{{count}} pages left in chapter_many": "{{count}} pagine rimaste nel capitolo", + "{{count}} pages left in chapter_other": "{{count}} pagine rimaste nel capitolo", + "Show Remaining Pages": "Mostra pagine rimanenti" } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index 6e136167..8b3e36b9 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -368,5 +368,7 @@ "Book Covers": "書籍の表紙", "Fit": "フィット", "Reset {{settings}}": "{{settings}}をリセット", - "Reset Settings": "設定をリセット" + "Reset Settings": "設定をリセット", + "{{count}} pages left in chapter_other": "{{count}} ページ残り", + "Show Remaining Pages": "残りを表示" } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index 8f9d1dab..ec32bd0c 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -368,5 +368,7 @@ "Book Covers": "책 표지", "Fit": "맞춤", "Reset {{settings}}": "{{settings}} 재설정", - "Reset Settings": "설정 재설정" + "Reset Settings": "설정 재설정", + "{{count}} pages left in chapter_other": "남은 페이지 {{count}}장", + "Show Remaining Pages": "남은 페이지 보기" } diff --git a/apps/readest-app/public/locales/nl/translation.json b/apps/readest-app/public/locales/nl/translation.json index 5328c011..e86c8a5b 100644 --- a/apps/readest-app/public/locales/nl/translation.json +++ b/apps/readest-app/public/locales/nl/translation.json @@ -371,5 +371,8 @@ "Book Covers": "Boekomslagen", "Fit": "Passend maken", "Reset {{settings}}": "Reset {{settings}}", - "Reset Settings": "Instellingen resetten" + "Reset Settings": "Instellingen resetten", + "{{count}} pages left in chapter_one": "Nog {{count}} pagina in hoofdstuk", + "{{count}} pages left in chapter_other": "Nog {{count}} pagina’s in hoofdstuk", + "Show Remaining Pages": "Toon resterende pagina’s" } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index b0e33e0d..9a3a419a 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -377,5 +377,10 @@ "Book Covers": "Okładki książek", "Fit": "Pasuje", "Reset {{settings}}": "Zresetuj {{settings}}", - "Reset Settings": "Zresetuj ustawienia" + "Reset Settings": "Zresetuj ustawienia", + "{{count}} pages left in chapter_one": "Pozostała {{count}} strona w rozdziale", + "{{count}} pages left in chapter_few": "Pozostały {{count}} strony w rozdziale", + "{{count}} pages left in chapter_many": "Pozostało {{count}} stron w rozdziale", + "{{count}} pages left in chapter_other": "Pozostało {{count}} stron w rozdziale", + "Show Remaining Pages": "Pokaż pozostałe strony" } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index 53807d12..3d35fb24 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -374,5 +374,9 @@ "Book Covers": "Capas de Livros", "Fit": "Encaixar", "Reset {{settings}}": "Redefinir {{settings}}", - "Reset Settings": "Redefinir Configurações" + "Reset Settings": "Redefinir Configurações", + "{{count}} pages left in chapter_one": "Falta {{count}} página neste capítulo", + "{{count}} pages left in chapter_many": "Faltam {{count}} páginas neste capítulo", + "{{count}} pages left in chapter_other": "Faltam {{count}} páginas neste capítulo", + "Show Remaining Pages": "Mostrar páginas restantes" } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index 67ad4232..824aae63 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -377,5 +377,10 @@ "Book Covers": "Обложки книг", "Fit": "Подогнать", "Reset {{settings}}": "Сбросить {{settings}}", - "Reset Settings": "Сбросить настройки" + "Reset Settings": "Сбросить настройки", + "{{count}} pages left in chapter_one": "Осталась {{count}} страница в главе", + "{{count}} pages left in chapter_few": "Осталось {{count}} страницы в главе", + "{{count}} pages left in chapter_many": "Осталось {{count}} страниц в главе", + "{{count}} pages left in chapter_other": "Осталось {{count}} страниц в главе", + "Show Remaining Pages": "Показать оставшиеся страницы" } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index 16268658..89145888 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -371,5 +371,8 @@ "Book Covers": "Kitap Kapağı", "Fit": "Uygun", "Reset {{settings}}": "{{settings}}'i Sıfırla", - "Reset Settings": "Ayarları Sıfırla" + "Reset Settings": "Ayarları Sıfırla", + "{{count}} pages left in chapter_one": "Bu bölümde {{count}} sayfa kaldı", + "{{count}} pages left in chapter_other": "Bu bölümde {{count}} sayfa kaldı", + "Show Remaining Pages": "Kalan sayfaları göster" } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index a561bc44..94f11a7f 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -377,5 +377,10 @@ "Book Covers": "Обкладинки книг", "Fit": "Вписати", "Reset {{settings}}": "Скинути {{settings}}", - "Reset Settings": "Скинути налаштування" + "Reset Settings": "Скинути налаштування", + "{{count}} pages left in chapter_one": "Залишилася {{count}} сторінка у розділі", + "{{count}} pages left in chapter_few": "Залишилось {{count}} сторінки у розділі", + "{{count}} pages left in chapter_many": "Залишилось {{count}} сторінок у розділі", + "{{count}} pages left in chapter_other": "Залишилось {{count}} сторінок у розділі", + "Show Remaining Pages": "Показати залишок сторінок" } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index 5fcec4bb..f515579e 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -368,5 +368,7 @@ "Book Covers": "Bìa sách", "Fit": "Vừa vặn", "Reset {{settings}}": "Đặt lại {{settings}}", - "Reset Settings": "Đặt lại cài đặt" + "Reset Settings": "Đặt lại cài đặt", + "{{count}} pages left in chapter_other": "Còn {{count}} trang trong chương", + "Show Remaining Pages": "Hiển thị trang còn lại" } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index e042d8ee..4ed4f33d 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -368,5 +368,7 @@ "Book Covers": "书籍封面", "Fit": "适应", "Reset {{settings}}": "重置{{settings}}", - "Reset Settings": "重置设置" + "Reset Settings": "重置设置", + "{{count}} pages left in chapter_other": "本章剩余 {{count}} 页", + "Show Remaining Pages": "显示剩余页数" } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index 754e7c69..5a8a72ac 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -368,5 +368,7 @@ "Book Covers": "書籍封面", "Fit": "適應", "Reset {{settings}}": "重置{{settings}}", - "Reset Settings": "重置設置" + "Reset Settings": "重置設置", + "{{count}} pages left in chapter_other": "本章剩餘 {{count}} 頁", + "Show Remaining Pages": "顯示剩餘頁數" } diff --git a/apps/readest-app/src/app/reader/components/ProgressInfo.tsx b/apps/readest-app/src/app/reader/components/ProgressInfo.tsx index 0139f904..a77337aa 100644 --- a/apps/readest-app/src/app/reader/components/ProgressInfo.tsx +++ b/apps/readest-app/src/app/reader/components/ProgressInfo.tsx @@ -29,7 +29,8 @@ const ProgressInfoView: React.FC = ({ }) => { const _ = useTranslation(); const { appService } = useEnv(); - const { getViewSettings } = useReaderStore(); + const { getView, getViewSettings } = useReaderStore(); + const view = getView(bookKey); const viewSettings = getViewSettings(bookKey)!; const showDoubleBorder = viewSettings.vertical && viewSettings.doubleBorder; @@ -47,9 +48,12 @@ const ProgressInfoView: React.FC = ({ totalPage: pageinfo.total, }) : ''; - const timeInfo = timeinfo + const timeLeft = timeinfo ? _('{{time}} min left in chapter', { time: Math.round(timeinfo.section) }) : ''; + const { page = 0, pages = 0 } = view?.renderer || {}; + const pageLeft = + pages - 1 > page ? _('{{count}} pages left in chapter', { count: pages - 1 - page }) : ''; return (
= ({ } } > - {viewSettings.showRemainingTime && {timeInfo}} + {viewSettings.showRemainingTime ? ( + {timeLeft} + ) : viewSettings.showRemainingPages ? ( + {pageLeft} + ) : null} {viewSettings.showPageNumber && {pageInfo}}
); diff --git a/apps/readest-app/src/app/reader/components/settings/LayoutPanel.tsx b/apps/readest-app/src/app/reader/components/settings/LayoutPanel.tsx index 71770b78..6a4904a2 100644 --- a/apps/readest-app/src/app/reader/components/settings/LayoutPanel.tsx +++ b/apps/readest-app/src/app/reader/components/settings/LayoutPanel.tsx @@ -64,6 +64,7 @@ const LayoutPanel: React.FC = ({ bookKey, onRegisterRese const [showFooter, setShowFooter] = useState(viewSettings.showFooter!); const [showBarsOnScroll, setShowBarsOnScroll] = useState(viewSettings.showBarsOnScroll!); const [showRemainingTime, setShowRemainingTime] = useState(viewSettings.showRemainingTime!); + const [showRemainingPages, setShowRemainingPages] = useState(viewSettings.showRemainingPages!); const [showPageNumber, setShowPageNumber] = useState(viewSettings.showPageNumber!); const [screenOrientation, setScreenOrientation] = useState(viewSettings.screenOrientation!); @@ -97,6 +98,7 @@ const LayoutPanel: React.FC = ({ bookKey, onRegisterRese showFooter: setShowFooter, showBarsOnScroll: setShowBarsOnScroll, showRemainingTime: setShowRemainingTime, + showRemainingPages: setShowRemainingPages, showPageNumber: setShowPageNumber, }); }; @@ -310,6 +312,11 @@ const LayoutPanel: React.FC = ({ bookKey, onRegisterRese // eslint-disable-next-line react-hooks/exhaustive-deps }, [showRemainingTime]); + useEffect(() => { + saveViewSettings(envConfig, bookKey, 'showRemainingPages', showRemainingPages, false, false); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [showRemainingPages]); + useEffect(() => { saveViewSettings(envConfig, bookKey, 'showPageNumber', showPageNumber, false, false); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -618,7 +625,31 @@ const LayoutPanel: React.FC = ({ bookKey, onRegisterRese className='toggle' checked={showRemainingTime} disabled={!showFooter} - onChange={() => setShowRemainingTime(!showRemainingTime)} + onChange={() => { + if (!showRemainingTime) { + setShowRemainingTime(true); + setShowRemainingPages(false); + } else { + setShowRemainingTime(false); + } + }} + /> + +
+ {_('Show Remaining Pages')} + { + if (!showRemainingPages) { + setShowRemainingPages(true); + setShowRemainingTime(false); + } else { + setShowRemainingPages(false); + } + }} />
diff --git a/apps/readest-app/src/app/reader/components/settings/NumberInput.tsx b/apps/readest-app/src/app/reader/components/settings/NumberInput.tsx index 27d1ebfa..5b2e7248 100644 --- a/apps/readest-app/src/app/reader/components/settings/NumberInput.tsx +++ b/apps/readest-app/src/app/reader/components/settings/NumberInput.tsx @@ -67,7 +67,7 @@ const NumberInput: React.FC = ({ return (
- {label} + {label}
= ({ value={localValue} onChange={handleChange} onBlur={handleOnBlur} - className='input input-ghost settings-content text-base-content w-20 max-w-xs rounded border-0 bg-transparent px-3 py-1 text-right !outline-none' + className='input input-ghost settings-content text-base-content w-16 max-w-xs rounded border-0 bg-transparent py-1 pe-3 ps-1 text-right !outline-none' onFocus={(e) => e.target.select()} />