M3: a Page tools menu in the Pages panel (#4415) (#4583)

* M3: a Page tools menu in the Pages panel (#4415)

The Pages panel's header gets a Page tools menu beside Close: insert a
blank page or pages from a file after the selection, rotate either way,
extract and delete. Each runs the registered command on the selected
thumbnails (the current page when none is) and is greyed out where the
document's security withholds page changes. A menu rather than a row of
buttons, so the thumbnails stay where they were and it fits any width.

* M3: tests drive the Page tools menu's file items too (#4415)

CodeRabbit on #4583: the parity evidence covered rotate, delete, blank
page and permissions through the menu, not Insert pages from a file or
Extract. A test now inserts a picked file's pages and extracts the
selection from the menu; the parity entry cites it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LymhVaGZCWwB9HNEbLzeMM

* M3: the Page tools menu in every catalog (#4415)

Page tools and five of its items, in each language (AI-assisted, not
separately native-reviewed, like the other recent entries). Insert a
blank page after the selection was in the catalogs already and keeps
its translation there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LymhVaGZCWwB9HNEbLzeMM

* chore(ui): keep thumbnail_size's doc line on thumbnail_size

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
This commit is contained in:
Livio Oswald
2026-10-25 10:11:08 -04:00
committed by GitHub
co-authored by Claude Opus 5.5 Brandon Thomas
parent 8708f35b37
commit 71b47b519d
37 changed files with 402 additions and 2 deletions
+8
View File
@@ -2816,3 +2816,11 @@ certificate Version الإصدار
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today اليوم
@plural {n} reply|{n} replies {n} رد|{n} رد|{n} ردّان|{n} ردود|{n} ردًا|{n} رد
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools أدوات الصفحات
Insert pages from a file after the selection… إدراج صفحات من ملف بعد التحديد…
Rotate the selected pages counterclockwise تدوير الصفحات المحددة عكس اتجاه عقارب الساعة
Rotate the selected pages clockwise تدوير الصفحات المحددة باتجاه عقارب الساعة
Extract the selected pages… استخراج الصفحات المحددة…
Delete the selected pages حذف الصفحات المحددة
Can't render this file because it contains an unexpected character in line 6 and column 47.
+8
View File
@@ -2503,3 +2503,11 @@ animation effects Off Изключени
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Днес
@plural {n} reply|{n} replies {n} отговор|{n} отговора
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Инструменти за страници
Insert pages from a file after the selection… Вмъкване на страници от файл след избраното…
Rotate the selected pages counterclockwise Завъртане на избраните страници обратно на часовниковата стрелка
Rotate the selected pages clockwise Завъртане на избраните страници по часовниковата стрелка
Extract the selected pages… Извличане на избраните страници…
Delete the selected pages Изтриване на избраните страници
Can't render this file because it contains an unexpected character in line 8 and column 16.
+8
View File
@@ -2801,3 +2801,11 @@ theme Appearance Aspecte
Delete attachment Elimina l'adjunt
Delete attachment {key} Elimina l'adjunt {key}
@plural {n} reply|{n} replies {n} resposta|{n} respostes
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Eines de pàgina
Insert pages from a file after the selection… Insereix pàgines d'un fitxer després de la selecció…
Rotate the selected pages counterclockwise Gira les pàgines seleccionades en sentit antihorari
Rotate the selected pages clockwise Gira les pàgines seleccionades en sentit horari
Extract the selected pages… Extreu les pàgines seleccionades…
Delete the selected pages Suprimeix les pàgines seleccionades
Can't render this file because it contains an unexpected character in line 7 and column 3.
+8
View File
@@ -2732,3 +2732,11 @@ certificate Version وەشان
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today ئەمڕۆ
@plural {n} reply|{n} replies {n} وەڵام|{n} وەڵام
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools ئامرازەکانی پەڕە
Insert pages from a file after the selection… پەڕەکان لە فایلێکەوە لە دوای هەڵبژاردەکە دابنێ…
Rotate the selected pages counterclockwise پەڕە هەڵبژێردراوەکان پێچەوانەی میلی کاتژمێر بسوڕێنە
Rotate the selected pages clockwise پەڕە هەڵبژێردراوەکان بە ئاڕاستەی میلی کاتژمێر بسوڕێنە
Extract the selected pages… پەڕە هەڵبژێردراوەکان دەربهێنە…
Delete the selected pages پەڕە هەڵبژێردراوەکان بسڕەوە
Can't render this file because it contains an unexpected character in line 6 and column 47.
+8
View File
@@ -2847,3 +2847,11 @@ certificate Version Verze
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Dnes
@plural {n} reply|{n} replies {n} odpověď|{n} odpovědi|{n} odpovědí
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Nástroje stránek
Insert pages from a file after the selection… Vložit stránky ze souboru za výběr…
Rotate the selected pages counterclockwise Otočit vybrané stránky proti směru hodinových ručiček
Rotate the selected pages clockwise Otočit vybrané stránky po směru hodinových ručiček
Extract the selected pages… Extrahovat vybrané stránky…
Delete the selected pages Odstranit vybrané stránky
Can't render this file because it contains an unexpected character in line 6 and column 47.
+8
View File
@@ -2541,3 +2541,11 @@ animation effects Off Aus
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Heute
@plural {n} reply|{n} replies {n} Antwort|{n} Antworten
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Seitenwerkzeuge
Insert pages from a file after the selection… Seiten aus einer Datei nach der Auswahl einfügen…
Rotate the selected pages counterclockwise Ausgewählte Seiten gegen den Uhrzeigersinn drehen
Rotate the selected pages clockwise Ausgewählte Seiten im Uhrzeigersinn drehen
Extract the selected pages… Ausgewählte Seiten extrahieren…
Delete the selected pages Ausgewählte Seiten löschen
Can't render this file because it contains an unexpected character in line 6 and column 51.
+8
View File
@@ -2546,3 +2546,11 @@ animation effects Off Ανενεργά
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Σήμερα
@plural {n} reply|{n} replies {n} απάντηση|{n} απαντήσεις
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Εργαλεία σελίδων
Insert pages from a file after the selection… Εισαγωγή σελίδων από αρχείο μετά την επιλογή…
Rotate the selected pages counterclockwise Περιστροφή των επιλεγμένων σελίδων αριστερόστροφα
Rotate the selected pages clockwise Περιστροφή των επιλεγμένων σελίδων δεξιόστροφα
Extract the selected pages… Εξαγωγή των επιλεγμένων σελίδων…
Delete the selected pages Διαγραφή των επιλεγμένων σελίδων
Can't render this file because it contains an unexpected character in line 482 and column 9.
+8
View File
@@ -2863,3 +2863,11 @@ theme Appearance Aspecto
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Hoy
@plural {n} reply|{n} replies {n} respuesta|{n} respuestas
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Herramientas de página
Insert pages from a file after the selection… Insertar páginas de un archivo después de la selección…
Rotate the selected pages counterclockwise Girar las páginas seleccionadas en sentido antihorario
Rotate the selected pages clockwise Girar las páginas seleccionadas en sentido horario
Extract the selected pages… Extraer las páginas seleccionadas…
Delete the selected pages Eliminar las páginas seleccionadas
Can't render this file because it contains an unexpected character in line 6 and column 60.
+8
View File
@@ -2810,3 +2810,11 @@ theme Appearance Teema
Delete attachment Poista liite
Delete attachment {key} Poista liite {key}
@plural {n} reply|{n} replies {n} vastaus|{n} vastausta
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Sivutyökalut
Insert pages from a file after the selection… Lisää sivuja tiedostosta valinnan jälkeen…
Rotate the selected pages counterclockwise Kierrä valittuja sivuja vastapäivään
Rotate the selected pages clockwise Kierrä valittuja sivuja myötäpäivään
Extract the selected pages… Pura valitut sivut…
Delete the selected pages Poista valitut sivut
Can't render this file because it contains an unexpected character in line 5 and column 47.
+8
View File
@@ -2806,3 +2806,11 @@ certificate Version Version
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Aujourd'hui
@plural {n} reply|{n} replies {n} réponse|{n} réponses
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Outils de page
Insert pages from a file after the selection… Insérer des pages d'un fichier après la sélection…
Rotate the selected pages counterclockwise Faire pivoter les pages sélectionnées dans le sens antihoraire
Rotate the selected pages clockwise Faire pivoter les pages sélectionnées dans le sens horaire
Extract the selected pages… Extraire les pages sélectionnées…
Delete the selected pages Supprimer les pages sélectionnées
Can't render this file because it contains an unexpected character in line 6 and column 39.
+8
View File
@@ -2777,3 +2777,11 @@ theme Appearance स्वरूप
Delete attachment अनुलग्नक हटाएँ
Delete attachment {key} अनुलग्नक {key} हटाएँ
@plural {n} reply|{n} replies {n} जवाब
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools पृष्ठ उपकरण
Insert pages from a file after the selection… चयन के बाद किसी फ़ाइल से पृष्ठ डालें…
Rotate the selected pages counterclockwise चयनित पृष्ठों को वामावर्त घुमाएँ
Rotate the selected pages clockwise चयनित पृष्ठों को दक्षिणावर्त घुमाएँ
Extract the selected pages… चयनित पृष्ठ निकालें…
Delete the selected pages चयनित पृष्ठ हटाएँ
Can't render this file because it contains an unexpected character in line 855 and column 12.
+8
View File
@@ -2539,3 +2539,11 @@ animation effects Off Ki
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Ma
@plural {n} reply|{n} replies {n} válasz|{n} válasz
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Oldaleszközök
Insert pages from a file after the selection… Oldalak beszúrása fájlból a kijelölés után…
Rotate the selected pages counterclockwise A kijelölt oldalak forgatása az óramutató járásával ellentétesen
Rotate the selected pages clockwise A kijelölt oldalak forgatása az óramutató járásával megegyezően
Extract the selected pages… A kijelölt oldalak kibontása…
Delete the selected pages A kijelölt oldalak törlése
Can't render this file because it contains an unexpected character in line 7 and column 44.
+8
View File
@@ -2778,3 +2778,11 @@ theme Appearance Tampilan
Delete attachment Hapus lampiran
Delete attachment {key} Hapus lampiran {key}
@plural {n} reply|{n} replies {n} balasan
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Alat halaman
Insert pages from a file after the selection… Sisipkan halaman dari file setelah pilihan…
Rotate the selected pages counterclockwise Putar halaman yang dipilih berlawanan arah jarum jam
Rotate the selected pages clockwise Putar halaman yang dipilih searah jarum jam
Extract the selected pages… Ekstrak halaman yang dipilih…
Delete the selected pages Hapus halaman yang dipilih
Can't render this file because it contains an unexpected character in line 483 and column 12.
+8
View File
@@ -2772,3 +2772,11 @@ certificate SHA-256 digest Impronta SHA-256
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Oggi
@plural {n} reply|{n} replies {n} risposta|{n} risposte
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Strumenti pagina
Insert pages from a file after the selection… Inserisci pagine da un file dopo la selezione…
Rotate the selected pages counterclockwise Ruota le pagine selezionate in senso antiorario
Rotate the selected pages clockwise Ruota le pagine selezionate in senso orario
Extract the selected pages… Estrai le pagine selezionate…
Delete the selected pages Elimina le pagine selezionate
Can't render this file because it contains an unexpected character in line 6 and column 47.
+8
View File
@@ -2540,3 +2540,11 @@ animation effects Off オフ
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today 今日
@plural {n} reply|{n} replies {n} 件の返信
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools ページツール
Insert pages from a file after the selection… 選択範囲の後にファイルからページを挿入…
Rotate the selected pages counterclockwise 選択したページを反時計回りに回転
Rotate the selected pages clockwise 選択したページを時計回りに回転
Extract the selected pages… 選択したページを抽出…
Delete the selected pages 選択したページを削除
Can't render this file because it contains an unexpected character in line 6 and column 47.
+8
View File
@@ -2538,3 +2538,11 @@ animation effects Off Өшірулі
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Бүгін
@plural {n} reply|{n} replies {n} жауап|{n} жауап
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Бет құралдары
Insert pages from a file after the selection… Таңдаудан кейін файлдан беттер кірістіру…
Rotate the selected pages counterclockwise Таңдалған беттерді сағат тіліне қарсы бұру
Rotate the selected pages clockwise Таңдалған беттерді сағат тілімен бұру
Extract the selected pages… Таңдалған беттерді шығарып алу…
Delete the selected pages Таңдалған беттерді жою
Can't render this file because it contains an unexpected character in line 860 and column 9.
+8
View File
@@ -2777,3 +2777,11 @@ theme Appearance 모양
Delete attachment 첨부 파일 삭제
Delete attachment {key} 첨부 파일 {key} 삭제
@plural {n} reply|{n} replies 답글 {n}개
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools 페이지 도구
Insert pages from a file after the selection… 선택 영역 뒤에 파일에서 페이지 삽입…
Rotate the selected pages counterclockwise 선택한 페이지를 시계 반대 방향으로 회전
Rotate the selected pages clockwise 선택한 페이지를 시계 방향으로 회전
Extract the selected pages… 선택한 페이지 추출…
Delete the selected pages 선택한 페이지 삭제
Can't render this file because it contains an unexpected character in line 855 and column 12.
+8
View File
@@ -2448,3 +2448,11 @@ animation effects Off ປິດ
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today ມື້ນີ້
@plural {n} reply|{n} replies ການຕອບກັບ {n} ລາຍການ
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools ເຄື່ອງມືໜ້າ
Insert pages from a file after the selection… ແຊກໜ້າຈາກໄຟລ໌ຫຼັງການເລືອກ…
Rotate the selected pages counterclockwise ໝູນໜ້າທີ່ເລືອກທວນເຂັມໂມງ
Rotate the selected pages clockwise ໝູນໜ້າທີ່ເລືອກຕາມເຂັມໂມງ
Extract the selected pages… ແຍກໜ້າທີ່ເລືອກອອກ…
Delete the selected pages ລຶບໜ້າທີ່ເລືອກ
Can't render this file because it contains an unexpected character in line 6 and column 32.
+8
View File
@@ -2801,3 +2801,11 @@ theme Appearance Išvaizda
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Šiandien
@plural {n} reply|{n} replies {n} atsakymas|{n} atsakymai|{n} atsakymų
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Puslapių įrankiai
Insert pages from a file after the selection… Įterpti puslapius iš failo po pasirinkimo…
Rotate the selected pages counterclockwise Pasukti pasirinktus puslapius prieš laikrodžio rodyklę
Rotate the selected pages clockwise Pasukti pasirinktus puslapius pagal laikrodžio rodyklę
Extract the selected pages… Išskleisti pasirinktus puslapius…
Delete the selected pages Ištrinti pasirinktus puslapius
Can't render this file because it contains an unexpected character in line 406 and column 9.
+8
View File
@@ -2716,3 +2716,11 @@ key Space Mellomrom
# AI-assisted additions for restoring the last view (#1767) (2026-10-22); not reviewed by a native speaker.
Restore the last view (page, zoom and page display) when a document is opened again Gjenopprett den siste visningen (side, zoom og sidevisning) når et dokument åpnes igjen
@plural {n} reply|{n} replies {n} svar|{n} svar
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Sideverktøy
Insert pages from a file after the selection… Sett inn sider fra en fil etter utvalget…
Rotate the selected pages counterclockwise Roter de valgte sidene mot klokken
Rotate the selected pages clockwise Roter de valgte sidene med klokken
Extract the selected pages… Trekk ut de valgte sidene…
Delete the selected pages Slett de valgte sidene
Can't render this file because it contains an unexpected character in line 8 and column 16.
+8
View File
@@ -2636,3 +2636,11 @@ animation effects Off Wyłączone
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Dzisiaj
@plural {n} reply|{n} replies {n} odpowiedź|{n} odpowiedzi|{n} odpowiedzi
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Narzędzia stron
Insert pages from a file after the selection… Wstaw strony z pliku po zaznaczeniu…
Rotate the selected pages counterclockwise Obróć zaznaczone strony w lewo
Rotate the selected pages clockwise Obróć zaznaczone strony w prawo
Extract the selected pages… Wyodrębnij zaznaczone strony…
Delete the selected pages Usuń zaznaczone strony
Can't render this file because it contains an unexpected character in line 6 and column 47.
+8
View File
@@ -2825,3 +2825,11 @@ theme Appearance Aparência
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Hoje
@plural {n} reply|{n} replies {n} resposta|{n} respostas
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Ferramentas de página
Insert pages from a file after the selection… Inserir páginas de um arquivo após a seleção…
Rotate the selected pages counterclockwise Girar as páginas selecionadas no sentido anti-horário
Rotate the selected pages clockwise Girar as páginas selecionadas no sentido horário
Extract the selected pages… Extrair as páginas selecionadas…
Delete the selected pages Excluir as páginas selecionadas
Can't render this file because it contains an unexpected character in line 9 and column 16.
+8
View File
@@ -2801,3 +2801,11 @@ theme Appearance Aspect
Delete attachment Ștergere atașament
Delete attachment {key} Ștergere atașament {key}
@plural {n} reply|{n} replies {n} răspuns|{n} răspunsuri|{n} de răspunsuri
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Instrumente pentru pagini
Insert pages from a file after the selection… Inserează pagini dintr-un fișier după selecție…
Rotate the selected pages counterclockwise Rotește paginile selectate în sens antiorar
Rotate the selected pages clockwise Rotește paginile selectate în sens orar
Extract the selected pages… Extrage paginile selectate…
Delete the selected pages Șterge paginile selectate
Can't render this file because it contains an unexpected character in line 3 and column 110.
+8
View File
@@ -2453,3 +2453,11 @@ animation effects Off Выкл
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Сегодня
@plural {n} reply|{n} replies {n} ответ|{n} ответа|{n} ответов
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Инструменты страниц
Insert pages from a file after the selection… Вставить страницы из файла после выделения…
Rotate the selected pages counterclockwise Повернуть выбранные страницы против часовой стрелки
Rotate the selected pages clockwise Повернуть выбранные страницы по часовой стрелке
Extract the selected pages… Извлечь выбранные страницы…
Delete the selected pages Удалить выбранные страницы
Can't render this file because it contains an unexpected character in line 9 and column 16.
+8
View File
@@ -2545,3 +2545,11 @@ animation effects Off Izklopljeni
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Danes
@plural {n} reply|{n} replies {n} odgovor|{n} odgovora|{n} odgovori|{n} odgovorov
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Orodja za strani
Insert pages from a file after the selection… Vstavi strani iz datoteke za izborom…
Rotate the selected pages counterclockwise Zavrti izbrane strani v nasprotni smeri urnega kazalca
Rotate the selected pages clockwise Zavrti izbrane strani v smeri urnega kazalca
Extract the selected pages… Izvleci izbrane strani…
Delete the selected pages Izbriši izbrane strani
Can't render this file because it contains an unexpected character in line 9 and column 16.
+8
View File
@@ -2527,3 +2527,11 @@ animation effects Off Joaktiv
Delete attachment Fshi bashkëngjitjen
Delete attachment {key} Fshi bashkëngjitjen {key}
@plural {n} reply|{n} replies {n} përgjigje|{n} përgjigje
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Mjetet e faqes
Insert pages from a file after the selection… Fut faqe nga një skedar pas përzgjedhjes…
Rotate the selected pages counterclockwise Rrotullo faqet e përzgjedhura në drejtim të kundërt me orën
Rotate the selected pages clockwise Rrotullo faqet e përzgjedhura në drejtim të orës
Extract the selected pages… Nxirr faqet e përzgjedhura…
Delete the selected pages Fshi faqet e përzgjedhura
Can't render this file because it contains an unexpected character in line 9 and column 16.
+8
View File
@@ -2449,3 +2449,11 @@ animation effects Off ఆఫ్
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today ఈరోజు
@plural {n} reply|{n} replies {n} ప్రత్యుత్తరం|{n} ప్రత్యుత్తరాలు
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools పేజీ సాధనాలు
Insert pages from a file after the selection… ఎంపిక తర్వాత ఫైల్ నుండి పేజీలను చొప్పించు…
Rotate the selected pages counterclockwise ఎంచుకున్న పేజీలను అపసవ్య దిశలో తిప్పు
Rotate the selected pages clockwise ఎంచుకున్న పేజీలను సవ్య దిశలో తిప్పు
Extract the selected pages… ఎంచుకున్న పేజీలను సంగ్రహించు…
Delete the selected pages ఎంచుకున్న పేజీలను తొలగించు
Can't render this file because it contains an unexpected character in line 13 and column 16.
+8
View File
@@ -2703,3 +2703,11 @@ theme Appearance ลักษณะที่ปรากฏ
# AI-assisted additions for restoring the last view (#1767) (2026-10-22); not reviewed by a native speaker.
Restore the last view (page, zoom and page display) when a document is opened again คืนค่ามุมมองล่าสุด (หน้า การซูม และการแสดงหน้า) เมื่อเปิดเอกสารอีกครั้ง
@plural {n} reply|{n} replies การตอบกลับ {n} รายการ
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools เครื่องมือหน้า
Insert pages from a file after the selection… แทรกหน้าจากไฟล์หลังส่วนที่เลือก…
Rotate the selected pages counterclockwise หมุนหน้าที่เลือกทวนเข็มนาฬิกา
Rotate the selected pages clockwise หมุนหน้าที่เลือกตามเข็มนาฬิกา
Extract the selected pages… แยกหน้าที่เลือกออก…
Delete the selected pages ลบหน้าที่เลือก
Can't render this file because it contains an unexpected character in line 866 and column 12.
+8
View File
@@ -2536,3 +2536,11 @@ animation effects Off Kapalı
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Bugün
@plural {n} reply|{n} replies {n} yanıt
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Sayfa araçları
Insert pages from a file after the selection… Seçimin ardından dosyadan sayfa ekle…
Rotate the selected pages counterclockwise Seçili sayfaları saat yönünün tersine döndür
Rotate the selected pages clockwise Seçili sayfaları saat yönünde döndür
Extract the selected pages… Seçili sayfaları ayıkla…
Delete the selected pages Seçili sayfaları sil
Can't render this file because it contains an unexpected character in line 859 and column 9.
+8
View File
@@ -2562,3 +2562,11 @@ animation effects Off Вимкнено
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today Сьогодні
@plural {n} reply|{n} replies {n} відповідь|{n} відповіді|{n} відповідей
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Інструменти сторінок
Insert pages from a file after the selection… Вставити сторінки з файлу після виділення…
Rotate the selected pages counterclockwise Повернути вибрані сторінки проти годинникової стрілки
Rotate the selected pages clockwise Повернути вибрані сторінки за годинниковою стрілкою
Extract the selected pages… Витягнути вибрані сторінки…
Delete the selected pages Видалити вибрані сторінки
Can't render this file because it contains an unexpected character in line 6 and column 47.
+8
View File
@@ -2807,3 +2807,11 @@ key Space Space
# AI-assisted additions for restoring the last view (#1767) (2026-10-16); not reviewed by a native speaker.
Restore the last view (page, zoom and page display) when a document is opened again Khôi phục chế độ xem gần nhất (trang, thu phóng và hiển thị trang) khi mở lại tài liệu
@plural {n} reply|{n} replies {n} câu trả lời
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools Công cụ trang
Insert pages from a file after the selection… Chèn trang từ tệp sau vùng chọn…
Rotate the selected pages counterclockwise Xoay các trang đã chọn ngược chiều kim đồng hồ
Rotate the selected pages clockwise Xoay các trang đã chọn theo chiều kim đồng hồ
Extract the selected pages… Trích xuất các trang đã chọn…
Delete the selected pages Xóa các trang đã chọn
Can't render this file because it contains an unexpected character in line 493 and column 12.
+8
View File
@@ -2504,3 +2504,11 @@ animation effects Off 关
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today 今天
@plural {n} reply|{n} replies {n} 条回复
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools 页面工具
Insert pages from a file after the selection… 在所选内容后插入文件中的页面…
Rotate the selected pages counterclockwise 逆时针旋转所选页面
Rotate the selected pages clockwise 顺时针旋转所选页面
Extract the selected pages… 提取所选页面…
Delete the selected pages 删除所选页面
Can't render this file because it contains an unexpected character in line 9 and column 16.
+8
View File
@@ -2490,3 +2490,11 @@ animation effects Off 關
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today 今天
@plural {n} reply|{n} replies {n} 則回覆
# Pages panel: the Page tools menu (#4415) (AI-assisted, not separately native-reviewed)
Page tools 頁面工具
Insert pages from a file after the selection… 在所選內容後插入檔案中的頁面…
Rotate the selected pages counterclockwise 逆時針旋轉所選頁面
Rotate the selected pages clockwise 順時針旋轉所選頁面
Extract the selected pages… 擷取所選頁面…
Delete the selected pages 刪除所選頁面
Can't render this file because it contains an unexpected character in line 9 and column 16.
+37
View File
@@ -730,6 +730,11 @@ pub fn right_panel(app: &mut PdfCraftApp, ui: &mut egui::Ui) {
if icons::button(ui, "x", 26.0, false, tl!("Close")).clicked() {
close = true;
}
if panel == RightPanel::Pages
&& let Some(c) = page_tools(ui, !modal && view.panel_drag.is_none() && bm_editable)
{
panel_command = Some(c);
}
// Right to left: close, "…", filter, search (Acrobat's order left to right).
if panel == RightPanel::Comments {
panel_command = crate::comments_panel::header_controls(ui, info, view, doc.comments_hidden());
@@ -1335,6 +1340,38 @@ fn outline_item(ui: &mut egui::Ui, t: &Tokens, info: &DocInfo, item: &OutlineIte
}
}
/// Page tools in the Pages panel's header (#4415): a menu, as Bookmark options is in its panel,
/// to insert a blank page or pages from a file, rotate, extract and delete. Each runs its
/// command on the selected pages (the current page when none is), so it does what Pages ▸ …
/// does; the items say so, apart from the thumbnails' own menu. `enabled` is false while the
/// document may not be assembled or a dialog is open. Returns the command a click asks for.
fn page_tools(ui: &mut egui::Ui, enabled: bool) -> Option<&'static str> {
let tools: [(&'static str, &str); 6] = [
("page.insert_blank", tl!("Insert a blank page after the selection")),
("page.insert", tl!("Insert pages from a file after the selection…")),
("page.rotate_ccw", tl!("Rotate the selected pages counterclockwise")),
("page.rotate", tl!("Rotate the selected pages clockwise")),
("page.extract", tl!("Extract the selected pages…")),
("page.delete", tl!("Delete the selected pages")),
];
let mut picked = None;
ui.add_enabled_ui(enabled, |ui| {
let more = icons::button(ui, "ellipsis", 26.0, false, tl!("Page tools"));
egui::Popup::menu(&more).show(|ui| {
ui.set_min_width(260.0);
for (id, label) in tools {
let Some(spec) = pdfcraft_engine::commands::command(id) else { continue };
let item = egui::Button::image_and_text(icons::image(spec.icon, 16.0, ui.visuals().text_color()), label);
if ui.add(item).clicked() {
picked = Some(id);
ui.close();
}
}
});
});
picked
}
/// Size controls stay above the scroll area, so they remain reachable on long documents.
fn thumbnail_size(ui: &mut egui::Ui, t: &Tokens, view: &mut crate::DocView, enabled: bool) {
let before = view.thumbnail_zoom();
+98
View File
@@ -2157,3 +2157,101 @@ fn full_screen_clicks_turn_pages_whatever_tool_was_on() {
assert!(!h.state().full_screen);
assert_eq!(h.state().quick_tool, QuickTool::Hand, "the tool from before is back");
}
/// #4415: the Pages panel's Page tools menu. Each tool acts on the selected pages (the current
/// page when none is): rotate, delete and insert a blank page here, as Pages ▸ … does.
#[test]
fn the_pages_panel_tools_act_on_the_selected_pages() {
let mut h = harness(&[("panel", "pages")]);
let id = h.state().views[0].id;
let rotations = |h: &Harness<'static, PdfCraftApp>| h.state().session.get(id).unwrap().info.pages.iter().map(|p| p.rotation).collect::<Vec<_>>();
// The panel's Page tools menu, on the right-hand side of the window.
let tool = |h: &mut Harness<'static, PdfCraftApp>, label: &str| {
h.get_all_by_label("Page tools").find(|n| n.rect().left() > 1000.0).expect("Page tools in the Pages panel").click();
h.run_steps(2);
h.get_by_label(label).click();
h.run_steps(3);
};
h.state_mut().views[0].select_pages(&[1, 2]);
h.run_steps(2);
tool(&mut h, "Rotate the selected pages clockwise");
assert_eq!(rotations(&h), [0, 90, 90], "pages 2 and 3, the selection");
tool(&mut h, "Rotate the selected pages counterclockwise");
assert_eq!(rotations(&h), [0, 0, 0]);
h.state_mut().views[0].select_pages(&[0]);
h.run_steps(2);
tool(&mut h, "Delete the selected pages");
assert_eq!(h.state().session.get(id).unwrap().info.pages.len(), 2, "page 1 deleted");
tool(&mut h, "Insert a blank page after the selection");
assert_eq!(h.state().session.get(id).unwrap().info.pages.len(), 3);
h.state_mut().execute("edit.undo");
h.run_steps(2);
assert_eq!(h.state().session.get(id).unwrap().info.pages.len(), 2, "each is one undo step");
}
/// CodeRabbit on #4583: the Page tools menu's file items work from the menu too. Insert pages
/// from a file puts the picked file's pages after the selection; Extract the selected pages
/// opens Extract for the selection and writes it.
#[test]
fn the_pages_panel_tools_insert_from_a_file_and_extract() {
let dir = std::env::temp_dir().join(format!("pdfcraft-page-tools-{}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();
let more = dir.join("more.pdf");
std::fs::write(&more, PAGES).unwrap();
let mut h = harness(&[("panel", "pages")]);
let id = h.state().views[0].id;
let count = |h: &Harness<'static, PdfCraftApp>| h.state().session.get(id).unwrap().info.pages.len();
let tool = |h: &mut Harness<'static, PdfCraftApp>, label: &str| {
h.get_all_by_label("Page tools").find(|n| n.rect().left() > 1000.0).expect("Page tools in the Pages panel").click();
h.run_steps(2);
h.get_by_label(label).click();
h.run_steps(3);
};
assert_eq!(count(&h), 3);
h.state_mut().views[0].select_pages(&[0]);
h.state_mut().pick_override = Some(vec![more.to_string_lossy().into_owned()]);
tool(&mut h, "Insert pages from a file after the selection…");
h.run_steps(3);
assert_eq!(count(&h), 6, "the picked file's three pages are inserted");
let out = dir.join("out");
std::fs::create_dir_all(&out).unwrap();
h.state_mut().export_dir_override = Some(out.to_string_lossy().into_owned());
h.state_mut().views[0].select_pages(&[1, 2]);
tool(&mut h, "Extract the selected pages…");
assert_eq!(h.state().dialog, Some(pdfcraft_ui_egui::Dialog::Extract), "Extract opens for the selection");
h.state_mut().extract_draft = pdfcraft_ui_egui::ExtractDraft { separate: true, ..Default::default() };
h.get_all_by_label("Extract").last().unwrap().click();
h.run_steps(3);
assert_eq!(std::fs::read_dir(&out).unwrap().count(), 2, "the two selected pages, each a file");
let _ = std::fs::remove_dir_all(&dir);
}
/// The Pages panel's Page tools are greyed out on a document whose security doesn't allow
/// page changes: the menu doesn't open, and nothing changes.
#[test]
fn the_pages_panel_tools_are_off_without_page_editing_permission() {
use egui_kittest::kittest::NodeT;
let mut h = harness(&[("panel", "pages")]);
{
let app = h.state_mut();
app.apply_edit(pdfcraft_engine::Edit::Protect(pdfcraft_engine::Protection {
permissions_password: Some("owner".into()),
changes: pdfcraft_engine::Changes::None,
..Default::default()
}));
let bytes = app.session.save_bytes(app.views[0].id).unwrap();
app.open_bytes("restricted.pdf", None, bytes.as_ref().clone()).unwrap();
}
h.run_steps(6);
let i = h.state().active.unwrap();
let id = h.state().views[i].id;
assert!(!h.state().session.get(id).unwrap().allows_assembly());
let tools = h.get_all_by_label("Page tools").find(|n| n.rect().left() > 1000.0).expect("Page tools");
assert!(tools.accesskit_node().is_disabled(), "Page tools is greyed out");
tools.click();
h.run_steps(3);
assert!(h.query_by_label("Delete the selected pages").is_none(), "its menu doesn't open");
assert_eq!(h.state().session.get(id).unwrap().info.pages.len(), 3);
}
@@ -1,6 +1,7 @@
Label = "Pages"
Label = "2"
Button "Close" [off]
Button "Page tools" [off]
Label = "Thumbnail size"
Label = "100%"
Button "Smaller thumbnails" [off]
+2 -2
View File
@@ -1274,8 +1274,8 @@ milestone = "M3"
status = "shipped"
commands = []
tools = []
evidence = ["crates/ui-egui/tests/it/editing.rs::resized_pages_panel_thumbnails_reorder_multiple_pages_and_undo", "crates/ui-egui/tests/it/viewer.rs::pages_panel_thumbnail_zoom_is_bounded_independent_and_survives_reload", "crates/ui-egui/tests/it/viewer.rs::pages_panel_thumbnail_size_controls_show_more_pages_and_keep_the_selection", "crates/ui-egui/tests/it/viewer.rs::pages_panel_thumbnail_zoom_keeps_a_far_current_page_visible", "crates/ui-egui/tests/it/control.rs::thumbnail_size_is_settable_and_inspectable_through_the_control_channel", "crates/ui-egui/tests/it/ui.rs::theme_and_view_options_apply", "crates/ui-egui/tests/it/viewer.rs::going_to_a_far_page_scrolls_its_thumbnail_into_view", "crates/ui-egui/tests/it/viewer.rs::going_to_a_page_in_view_leaves_the_pages_panel_still", "crates/ui-egui/tests/it/viewer.rs::a_page_change_while_thumbnails_are_dragged_does_not_scroll_the_pages_panel"]
notes = "Thumbnail size: 50–150% with a slider and buttons above the scroll area (#3808), independent of document and Organize zoom. Accessible through ui.set thumbnail-zoom and ui.state active.thumbnail_zoom; retained on file reload, not persisted between sessions. The panel follows the current page (#2781): a page whose thumbnail is out of sight scrolls it into view, as little as it takes; a thumbnail already in view, or clicked, leaves the panel still, and a page change while the user scrolls the panel or drags thumbnails does not move it."
evidence = ["crates/ui-egui/tests/it/editing.rs::resized_pages_panel_thumbnails_reorder_multiple_pages_and_undo", "crates/ui-egui/tests/it/viewer.rs::pages_panel_thumbnail_zoom_is_bounded_independent_and_survives_reload", "crates/ui-egui/tests/it/viewer.rs::pages_panel_thumbnail_size_controls_show_more_pages_and_keep_the_selection", "crates/ui-egui/tests/it/viewer.rs::pages_panel_thumbnail_zoom_keeps_a_far_current_page_visible", "crates/ui-egui/tests/it/control.rs::thumbnail_size_is_settable_and_inspectable_through_the_control_channel", "crates/ui-egui/tests/it/ui.rs::theme_and_view_options_apply", "crates/ui-egui/tests/it/viewer.rs::going_to_a_far_page_scrolls_its_thumbnail_into_view", "crates/ui-egui/tests/it/viewer.rs::going_to_a_page_in_view_leaves_the_pages_panel_still", "crates/ui-egui/tests/it/viewer.rs::a_page_change_while_thumbnails_are_dragged_does_not_scroll_the_pages_panel", "crates/ui-egui/tests/it/view.rs::the_pages_panel_tools_act_on_the_selected_pages", "crates/ui-egui/tests/it/view.rs::the_pages_panel_tools_insert_from_a_file_and_extract", "crates/ui-egui/tests/it/view.rs::the_pages_panel_tools_are_off_without_page_editing_permission"]
notes = "Page tools menu in the panel's header (#4415): insert a blank page or pages from a file after the selection, rotate either way, extract and delete, each on the selected pages (the current one when none is), greyed out where the document's security withholds page changes. Thumbnail size: 50–150% with a slider and buttons above the scroll area (#3808), independent of document and Organize zoom. Accessible through ui.set thumbnail-zoom and ui.state active.thumbnail_zoom; retained on file reload, not persisted between sessions. The panel follows the current page (#2781): a page whose thumbnail is out of sight scrolls it into view, as little as it takes; a thumbnail already in view, or clicked, leaves the panel still, and a page change while the user scrolls the panel or drags thumbnails does not move it."
[[feature]]
id = "view.thumbnail-context-ops"