From 471865e4a38460d31d0027e89adac399ce1e4809 Mon Sep 17 00:00:00 2001 From: Dimitris Kaitantzidis <44621809+DimK10@users.noreply.github.com> Date: Mon, 8 Apr 2024 23:23:03 +0300 Subject: [PATCH 01/59] Closes #359 (#1047) --- .../controller/api/SplitPDFController.java | 6 ++++ .../software/SPDF/model/PdfMetadata.java | 19 +++++++++++ .../software/SPDF/utils/PdfUtils.java | 33 ++++++++++++++++--- 3 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 src/main/java/stirling/software/SPDF/model/PdfMetadata.java diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java index e415aa9d..51efa644 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java @@ -27,7 +27,9 @@ import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.PdfMetadata; import stirling.software.SPDF.model.api.PDFWithPageNums; +import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.WebResponseUtils; @RestController @@ -49,6 +51,7 @@ public class SplitPDFController { // open the pdf document PDDocument document = Loader.loadPDF(file.getBytes()); + PdfMetadata metadata = PdfUtils.extractMetadataFromPdf(document); int totalPages = document.getNumberOfPages(); List pageNumbers = request.getPageNumbersList(document, false); System.out.println( @@ -75,6 +78,9 @@ public class SplitPDFController { } previousPageNumber = splitPoint + 1; + // Transfer metadata to split pdf + PdfUtils.setMetadataToPdf(splitDocument, metadata); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); splitDocument.save(baos); diff --git a/src/main/java/stirling/software/SPDF/model/PdfMetadata.java b/src/main/java/stirling/software/SPDF/model/PdfMetadata.java new file mode 100644 index 00000000..35054bc8 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/PdfMetadata.java @@ -0,0 +1,19 @@ +package stirling.software.SPDF.model; + +import java.util.Calendar; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class PdfMetadata { + private String author; + private String producer; + private String title; + private String creator; + private String subject; + private String keywords; + private Calendar creationDate; + private Calendar modificationDate; +} diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index 3d16f131..f51eff2a 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -19,11 +19,8 @@ import javax.imageio.stream.ImageOutputStream; import org.apache.pdfbox.Loader; import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.*; import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; -import org.apache.pdfbox.pdmodel.PDResources; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.PDXObject; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; @@ -39,6 +36,8 @@ import org.springframework.web.multipart.MultipartFile; import io.github.pixee.security.Filenames; +import stirling.software.SPDF.model.PdfMetadata; + public class PdfUtils { private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class); @@ -421,4 +420,30 @@ public class PdfUtils { logger.info("PDF successfully saved to byte array"); return baos.toByteArray(); } + + public static PdfMetadata extractMetadataFromPdf(PDDocument pdf) { + return PdfMetadata.builder() + .author(pdf.getDocumentInformation().getAuthor()) + .producer(pdf.getDocumentInformation().getProducer()) + .title(pdf.getDocumentInformation().getTitle()) + .creator(pdf.getDocumentInformation().getCreator()) + .subject(pdf.getDocumentInformation().getSubject()) + .keywords(pdf.getDocumentInformation().getKeywords()) + .creationDate(pdf.getDocumentInformation().getCreationDate()) + .modificationDate(pdf.getDocumentInformation().getModificationDate()) + .build(); + } + + public static PDDocument setMetadataToPdf(PDDocument pdf, PdfMetadata pdfMetadata) { + pdf.getDocumentInformation().setAuthor(pdfMetadata.getAuthor()); + pdf.getDocumentInformation().setProducer(pdfMetadata.getProducer()); + pdf.getDocumentInformation().setTitle(pdfMetadata.getTitle()); + pdf.getDocumentInformation().setCreator(pdfMetadata.getCreator()); + pdf.getDocumentInformation().setSubject(pdfMetadata.getSubject()); + pdf.getDocumentInformation().setKeywords(pdfMetadata.getKeywords()); + pdf.getDocumentInformation().setCreationDate(pdfMetadata.getCreationDate()); + pdf.getDocumentInformation().setModificationDate(pdfMetadata.getModificationDate()); + + return pdf; + } } From 59a19b00917fa1eb58f3246835c0bef10fe92308 Mon Sep 17 00:00:00 2001 From: Ludy Date: Mon, 8 Apr 2024 22:25:14 +0200 Subject: [PATCH 02/59] Update messages_de_DE.properties (#1045) --- src/main/resources/messages_de_DE.properties | 86 ++++++++++---------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 722c9d9d..f5a53881 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -57,15 +57,15 @@ usernameExistsMessage=Neuer Benutzername existiert bereits. invalidUsernameMessage=Ungültiger Benutzername. Der Benutzername darf nur Buchstaben und Zahlen enthalten. deleteCurrentUserMessage=Der aktuell angemeldete Benutzer kann nicht gelöscht werden. deleteUsernameExistsMessage=Der Benutzername existiert nicht und kann nicht gelöscht werden. -error=Error -oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color +error=Fehler +oops=Hoppla! +help=Hilfe +goHomepage=Zur Startseite gehen +joinDiscord=Unserem Discord-Server beitreten +seeDockerHub=Docker Hub ansehen +visitGithub=GitHub-Repository besuchen +donate=Spenden +color=Farbe sponsor=Sponsor @@ -78,8 +78,8 @@ pipeline.uploadButton=Benutzerdefinierter Upload pipeline.configureButton=Konfigurieren pipeline.defaultOption=Benutzerdefiniert pipeline.submitButton=Speichern -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help +pipeline.help=Hilfe für Pipeline +pipeline.scanHelp=Hilfe zum Ordnerscan ###################### # Pipeline Options # @@ -374,17 +374,17 @@ getPdfInfo.tags=infomation,daten,statistik home.extractPage.title=Seite(n) extrahieren home.extractPage.desc=Extrahiert ausgewählte Seiten aus einer PDF -extractPage.tags=extrahieren +extractPage.tags=extrahieren,seite home.PdfToSinglePage.title=PDF zu einer Seite zusammenfassen home.PdfToSinglePage.desc=Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen -PdfToSinglePage.tags=einzelseite +PdfToSinglePage.tags=einzelseite,zusammenfassen home.showJS.title=Javascript anzeigen home.showJS.desc=Alle Javascript Funktionen in einer PDF anzeigen -showJS.tags=js +showJS.tags=js,javascript home.autoRedact.title=Automatisch zensieren/schwärzen home.autoRedact.desc=Automatisches Zensieren (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text @@ -392,7 +392,7 @@ autoRedact.tags=zensieren,schwärzen home.tableExtraxt.title=Tabelle extrahieren home.tableExtraxt.desc=Tabelle aus PDF in CSV extrahieren -tableExtraxt.tags=CSV +tableExtraxt.tags=CSV,tabelle,extrahieren home.autoSizeSplitPDF.title=Teilen nach Größe/Anzahl @@ -415,11 +415,11 @@ AddStampRequest.tags=stempeln,bild hinzufügen,bild zentrieren,wasserzeichen,pdf home.PDFToBook.title=PDF zum Buch home.PDFToBook.desc=Konvertiert PDF mit Calibre in Buch-/Comic-Formate -PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +PDFToBook.tags=buch,comic,calibre,convert,manga,amazon,kindle home.BookToPDF.title=Buch als PDF home.BookToPDF.desc=Konvertiert Buch-/Comic-Formate mithilfe von Calibre in PDF -BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +BookToPDF.tags=buch,comic,calibre,convert,manga,amazon,kindle ########################### @@ -467,7 +467,7 @@ pdfToSinglePage.submit=Zusammenfassen pageExtracter.title=Seiten extrahieren pageExtracter.header=Seiten extrahieren pageExtracter.submit=Extrahieren -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(z.B. 1,2,8 oder 4,7,12-16 oder 2n-1) #getPdfInfo @@ -770,23 +770,23 @@ merge.submit=Zusammenführen pdfOrganiser.title=Seiten anordnen pdfOrganiser.header=PDF Seitenorganisation pdfOrganiser.submit=Seiten anordnen -pdfOrganiser.mode=Mode -pdfOrganiser.mode.1=Custom Page Order -pdfOrganiser.mode.2=Reverse Order -pdfOrganiser.mode.3=Duplex Sort -pdfOrganiser.mode.4=Booklet Sort -pdfOrganiser.mode.5=Side Stitch Booklet Sort -pdfOrganiser.mode.6=Odd-Even Split -pdfOrganiser.mode.7=Remove First -pdfOrganiser.mode.8=Remove Last -pdfOrganiser.mode.9=Remove First and Last -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode=Modus +pdfOrganiser.mode.1=Benutzerdefinierte Seitenreihenfolge +pdfOrganiser.mode.2=Umgekehrte Reihenfolge +pdfOrganiser.mode.3=Duplex-Sortierung +pdfOrganiser.mode.4=Heftsortierung +pdfOrganiser.mode.5=Seitenheftungs-Heftsortierung +pdfOrganiser.mode.6=Ungerade-Gerade-Teilung +pdfOrganiser.mode.7=Erste entfernen +pdfOrganiser.mode.8=Letzte entfernen +pdfOrganiser.mode.9=Erste und letzte entfernen +pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1) #multiTool multiTool.title=PDF-Multitool multiTool.header=PDF-Multitool -multiTool.uploadPrompts=Please Upload PDF +multiTool.uploadPrompts=Bitte PDF hochladen #view pdf viewPdf.title=PDF anzeigen @@ -797,7 +797,7 @@ pageRemover.title=Seiten entfernen pageRemover.header=PDF Seiten entfernen pageRemover.pagesToDelete=Seiten zu entfernen (geben Sie eine Kommagetrennte Liste der Seitenzahlen an): pageRemover.submit=Seiten löschen -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(z.B. 1,2,6 oder 1-10,15-30) #rotate @@ -886,7 +886,7 @@ watermark.selectText.8=Wasserzeichen Typ: watermark.selectText.9=Wasserzeichen-Bild: watermark.submit=Wasserzeichen hinzufügen watermark.type.1=Text -watermark.type.2=Image +watermark.type.2=Bild #Change permissions @@ -1032,15 +1032,15 @@ licenses.license=Lizenz # error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=Entschuldigung für das Problem! +error.needHelp=Brauchst du Hilfe / Ein Problem gefunden? +error.contactTip=Wenn du weiterhin Probleme hast, zögere nicht, uns um Hilfe zu bitten. Du kannst ein Ticket auf unserer GitHub-Seite einreichen oder uns über Discord kontaktieren: +error.404.head=404 - Seite nicht gefunden | Ups, wir sind im Code gestolpert! +error.404.1=Wir können die gesuchte Seite nicht finden. +error.404.2=Etwas ist schiefgelaufen +error.github=Ein Ticket auf GitHub einreichen +error.showStack=Stack-Trace anzeigen +error.copyStack=Stack-Trace kopieren +error.githubSubmit=GitHub - Ein Ticket einreichen +error.discordSubmit=Discord - Unterstützungsbeitrag einreichen From ec83b9a17d21028f2bcd79885f95e3989d5fda78 Mon Sep 17 00:00:00 2001 From: CocoMaster-AI <138378888+cocomastergo@users.noreply.github.com> Date: Tue, 9 Apr 2024 04:27:36 +0800 Subject: [PATCH 03/59] Update ja_JP,ko_KR,ru_RU,zh_TW.properties (#1036) --- src/main/resources/messages_ja_JP.properties | 42 ++++++++++---------- src/main/resources/messages_ko_KR.properties | 42 ++++++++++---------- src/main/resources/messages_ru_RU.properties | 42 ++++++++++---------- src/main/resources/messages_zh_TW.properties | 42 ++++++++++---------- 4 files changed, 84 insertions(+), 84 deletions(-) diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 844cab24..c29686ab 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -57,16 +57,16 @@ usernameExistsMessage=新しいユーザー名はすでに存在します。 invalidUsernameMessage=ユーザー名が無効です。ユーザー名にはアルファベットと数字のみを使用してください。 deleteCurrentUserMessage=現在ログインしているユーザーは削除できません。 deleteUsernameExistsMessage=そのユーザー名は存在しないため削除できません。 -error=Error -oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color -sponsor=Sponsor +error=エラー +oops=おっと! +help=ヘルプ +goHomepage=ホームページへ移動 +joinDiscord=Discordサーバーに参加する +seeDockerHub=Docker Hubを見る +visitGithub=Githubリポジトリを訪問する +donate=寄付する +color=色 +sponsor=スポンサー @@ -1032,15 +1032,15 @@ licenses.license=ライセンス # error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=問題が発生したことをお詫び申し上げます! +error.needHelp=助けが必要/問題が見つかりましたか? +error.contactTip=まだ問題が解決していない場合は、お手数ですが、GitHubページでチケットを提出するか、Discordで私たちに連絡してください: +error.404.head=404 - ページが見つかりません | おっと、コードでつまずきました! +error.404.1=あなたが探しているページが見つかりません。 +error.404.2=何か問題が発生しました +error.github=GitHubでチケットを提出 +error.showStack=スタックトレースを表示 +error.copyStack=スタックトレースをコピー +error.githubSubmit=GitHub - チケットを提出 +error.discordSubmit=Discord - サポート投稿を提出 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 5a6cc068..9438da61 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -57,16 +57,16 @@ usernameExistsMessage=새 사용자명이 이미 존재합니다. invalidUsernameMessage=사용자 이름이 잘못되었습니다. 사용자 이름에는 알파벳 문자와 숫자만 포함되어야 합니다. deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다. deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다. -error=Error -oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color -sponsor=Sponsor +error=오류 +oops=어머나! +help=도움말 +goHomepage=홈페이지로 이동 +joinDiscord=Discord 서버에 참여하기 +seeDockerHub=Docker Hub에서 확인하기 +visitGithub=GitHub 저장소 방문하기 +donate=기부하기 +color=색상 +sponsor=스폰서 @@ -1032,15 +1032,15 @@ licenses.license=라이센스 # error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=문제를 끼친 점 죄송합니다! +error.needHelp=도움이 필요하신가요 / 문제가 있으신가요? +error.contactTip=여전히 문제가 해결되지 않는다면 망설이지 마시고 도움을 요청하십시오. GitHub 페이지에서 티켓을 제출하거나 Discord를 통해 우리에게 연락하실 수 있습니다: +error.404.head=404 - 페이지를 찾을 수 없습니다 | 이런, 코드에 걸려 넘어졌어요! +error.404.1=원하시는 페이지를 찾을 수가 없네요. +error.404.2=문제가 발생했습니다 +error.github=GitHub에서 티켓 제출 +error.showStack=스택 추적 보기 +error.copyStack=스택 추적 복사 +error.githubSubmit=GitHub - 티켓 제출 +error.discordSubmit=Discord - 문의 게시 diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 500fc515..d96b2e43 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -57,16 +57,16 @@ usernameExistsMessage=Новое имя пользователя уже суще invalidUsernameMessage=Недопустимое имя пользователя, Имя пользователя должно содержать только буквы алфавита и цифры. deleteCurrentUserMessage=Невозможно удалить пользователя, вошедшего в систему. deleteUsernameExistsMessage=Имя пользователя не существует и не может быть удалено. -error=Error -oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color -sponsor=Sponsor +error=Ошибка +oops=Ой! +help=Помощь +goHomepage=Перейти на главную страницу +joinDiscord=Присоединиться к нашему серверу Discord +seeDockerHub=Посмотреть в Docker Hub +visitGithub=Посетить репозиторий на GitHub +donate=Пожертвовать +color=Цвет +sponsor=Спонсор @@ -1032,15 +1032,15 @@ licenses.license=Лицензия # error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=Извините за проблему! +error.needHelp=Нужна помощь / Нашли проблему? +error.contactTip=Если у вас все еще есть проблемы, не стесняйтесь обращаться к нам за помощью. Вы можете отправить заявку на нашей странице GitHub или связаться с нами через Discord: +error.404.head=404 - Страница не найдена | Ой, мы запутались в коде! +error.404.1=Мы не можем найти страницу, которую вы ищете. +error.404.2=Произошла ошибка +error.github=Отправить заявку на GitHub +error.showStack=Показать стек вызовов +error.copyStack=Скопировать стек вызовов +error.githubSubmit=GitHub - Отправить заявку +error.discordSubmit=Discord - Отправить запрос в поддержку diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index d3aedcd3..db9a3c78 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -57,16 +57,16 @@ usernameExistsMessage=新使用者名稱已存在。 invalidUsernameMessage=使用者名無效,使用者名只能包含字母字元和數位。 deleteCurrentUserMessage=無法刪除目前登錄的使用者。 deleteUsernameExistsMessage=使用者名不存在,無法刪除。 -error=Error -oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color -sponsor=Sponsor +error=錯誤 +oops=哎呀! +help=幫助 +goHomepage=前往首頁 +joinDiscord=加入我們的Discord服務器 +seeDockerHub=查看Docker Hub +visitGithub=訪問Github存儲庫 +donate=捐贈 +color=顏色 +sponsor=贊助 @@ -1032,15 +1032,15 @@ licenses.license=許可證 # error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=對於這個問題,我們感到抱歉! +error.needHelp=需要幫助/發現了一個問題? +error.contactTip=如果你仍然遇到問題,請不要猶豫,隨時向我們尋求幫助。你可以在我們的GitHub頁面提交工單,或通過Discord與我們聯繋: +error.404.head=404 - 找不到頁面 | 哎呀,我們在代碼中走錯了路! +error.404.1=我們好像找不到你正在尋找的頁面。 +error.404.2=出了點錯誤 +error.github=在GitHub上提交工單 +error.showStack=顯示堆疊追蹤 +error.copyStack=複製堆疊追蹤 +error.githubSubmit=GitHub - 提交工單 +error.discordSubmit=Discord - 提交支援帖子 From 9a57842eceb0e3356a306399893eb563f0dc3a82 Mon Sep 17 00:00:00 2001 From: vkykalo Date: Mon, 8 Apr 2024 23:27:55 +0300 Subject: [PATCH 04/59] Feature: Add Ukrainian Language Support (#1039) * Add uk_UA lang * Add added error translation block into uk_UA lang --------- Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- src/main/resources/messages_uk_UA.properties | 1077 +++++++++++++++++ src/main/resources/static/images/flags/ua.svg | 6 + .../templates/fragments/languages.html | 2 + 3 files changed, 1085 insertions(+) create mode 100644 src/main/resources/messages_uk_UA.properties create mode 100644 src/main/resources/static/images/flags/ua.svg diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties new file mode 100644 index 00000000..e2c7d6e2 --- /dev/null +++ b/src/main/resources/messages_uk_UA.properties @@ -0,0 +1,1077 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr=left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=Оберіть PDF(и) +multiPdfPrompt=Оберіть PDFи (2+) +multiPdfDropPrompt=Оберіть (або перетягніть) всі необхідні PDFи +imgPrompt=Оберіть зображення(я) +genericSubmit=Надіслати +processTimeWarning=Увага: Цей процес може тривати до хвилини в залежності від розміру файлу. +pageOrderPrompt=Порядок сторінок (введіть список номерів сторінок через кому): +pageSelectionPrompt=Користувацький вибір сторінки (введіть список номерів сторінок через кому 1,5,6 або функції типу 2n+1) : +goToPage=Вперед +true=Правда +false=Брехня +unknown=Невідомо +save=Зберегти +saveToBrowser=Зберегти в браузері +close=Закрити +filesSelected=файлів обрано +noFavourites=Немає вибраного +downloadComplete=Завантаження завершено +bored=Нудно чекати? +alphabet=Алфавіт +downloadPdf=Завантажити PDF +text=Текст +font=Шрифт +selectFillter=-- Вибрати -- +pageNum=номер сторінки +sizes.small=Малий +sizes.medium=Середній +sizes.large=Великий +sizes.x-large=Дуже великий +error.pdfPassword=Документ PDF захищено паролем, і пароль не був наданий або був невірним +delete=Видалити +username=Ім'я користувача +password=Пароль +welcome=Ласкаво просимо +property=Властивість +black=Чорний +white=Білий +red=Червоний +green=Зелений +blue=Синій +custom=Звичай... +WorkInProgess=Робота триває, може не працювати або глючити, будь ласка, повідомляйте про будь-які проблеми! +poweredBy=Працює на +yes=Так +no=Ні +changedCredsMessage=Облікові дані змінено! +notAuthenticatedMessage=Користувач не пройшов перевірку автентичності. +userNotFoundMessage=Користувача не знайдено. +incorrectPasswordMessage=Поточний пароль невірний. +usernameExistsMessage=Нове ім'я користувача вже існує. +invalidUsernameMessage=Недійсне ім'я користувача, Ім'я користувача повинно містити тільки літери алфавіту та цифри. +deleteCurrentUserMessage=Неможливо видалити користувача, який увійшов в систему. +deleteUsernameExistsMessage=Ім'я користувача не існує і не може бути видалено. + + +############### +# Pipeline # +############### +pipeline.header=Меню конвеєрної обробки (Бета) +pipeline.uploadButton=Завантажити Користувацький +pipeline.configureButton=Налаштування +pipeline.defaultOption=Користувацький +pipeline.submitButton=Надіслати +pipeline.help=Довідка з конвеєрної обробки +pipeline.scanHelp=Довідка зі сканування папок + + +###################### +# Pipeline Options # +###################### +pipelineOptions.header=Налаштування конвеєрної обробки +pipelineOptions.pipelineNameLabel=Назва конвеєра +pipelineOptions.saveSettings=Зберегти налаштування операції +pipelineOptions.pipelineNamePrompt=Введіть назву конвеєра тут +pipelineOptions.selectOperation=Вибрати операцію +pipelineOptions.addOperationButton=Додати операцію +pipelineOptions.pipelineHeader=Конвеєр: +pipelineOptions.saveButton=Завантажити +pipelineOptions.validateButton=Перевірити + + +############# +# NAVBAR # +############# +navbar.convert=Конвертувати +navbar.security=Безпека +navbar.other=Інше +navbar.darkmode=Темний режим +navbar.pageOps=Операції зі сторінкою +navbar.settings=Налаштування + + +############# +# SETTINGS # +############# +settings.title=Налаштування +settings.update=Доступне оновлення +settings.appVersion=Версія додатку: +settings.downloadOption.title=Виберіть варіант завантаження (для завантаження одного файлу без zip): +settings.downloadOption.1=Відкрити в тому ж вікні +settings.downloadOption.2=Відкрити в новому вікні +settings.downloadOption.3=Завантажити файл +settings.zipThreshold=Zip-файли, коли кількість завантажених файлів перевищує +settings.signOut=Вийти +settings.accountSettings=Налаштування акаунта + + +changeCreds.title=Змінити облікові дані +changeCreds.header=Оновіть дані вашого облікового запису +changeCreds.changePassword=Ви використовуєте заводські облікові дані для входу. Будь ласка, введіть новий пароль +changeCreds.newUsername=Нове ім'я користувача +changeCreds.oldPassword=Поточний пароль +changeCreds.newPassword=Новий пароль +changeCreds.confirmNewPassword=Підтвердіть новий пароль +changeCreds.submit=Надіслати зміни + + +account.title=Налаштування акаунта +account.accountSettings=Налаштування акаунта +account.adminSettings=Налаштування адміністратора - Перегляд і додавання користувачів +account.userControlSettings=Налаштування контролю користувача +account.changeUsername=Змінити ім'я користувача +account.newUsername=Нове ім'я користувача +account.password=Підтвердження пароля +account.oldPassword=Старий пароль +account.newPassword=Новий пароль +account.changePassword=Змінити пароль +account.confirmNewPassword=Підтвердіть новий пароль +account.signOut=Вийти +account.yourApiKey=Ваш API-ключ +account.syncTitle=Синхронізувати налаштування браузера з обліковим записом +account.settingsCompare=Порівняння налаштувань: +account.property=Властивість +account.webBrowserSettings=Налаштування веб-браузера +account.syncToBrowser=Синхронізувати обліковий запис -> Браузер +account.syncToAccount=Синхронізувати обліковий запис <- Браузер + + +adminUserSettings.title=Налаштування контролю користувача +adminUserSettings.header=Налаштування контролю користувача адміністратора +adminUserSettings.admin=Адміністратор +adminUserSettings.user=Користувач +adminUserSettings.addUser=Додати нового користувача +adminUserSettings.usernameInfo=Ім'я користувача має містити тільки літери та цифри, без пробілів та спеціальних символів. +adminUserSettings.roles=Ролі +adminUserSettings.role=Роль +adminUserSettings.actions=Дії +adminUserSettings.apiUser=Обмежений користувач API +adminUserSettings.extraApiUser=Додатковий обмежений користувач API +adminUserSettings.webOnlyUser=Тільки веб-користувач +adminUserSettings.demoUser=Демо-користувач (без налаштованих параметрів) +adminUserSettings.internalApiUser=Внутрішній користувач API +adminUserSettings.forceChange=Примусити користувача змінити пароль при вході в систему +adminUserSettings.submit=Зберегти користувача + + +############# +# HOME-PAGE # +############# +home.desc=Ваш локальний універсальний магазин для всіх ваших потреб у PDF. +home.searchBar=Пошук функцій... + + +home.viewPdf.title=Перегляд PDF +home.viewPdf.desc=Перегляд, анотація, додавання тексту або зображень +viewPdf.tags=view,read,annotate,text,image + + +home.multiTool.title=Мультіінструмент PDF +home.multiTool.desc=Об'єднання, поворот, зміна порядку та видалення сторінок +multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side + + +home.merge.title=Об'єднати +home.merge.desc=Легко об'єднуйте кілька PDF-файлів у один. +merge.tags=merge,Page operations,Back end,server side + + +home.split.title=Розділити +home.split.desc=Розділіть PDF-файли на кілька документів +split.tags=Page operations,divide,Multi Page,cut,server side + + +home.rotate.title=Повернути +home.rotate.desc=Легко повертайте ваші PDF-файли. +rotate.tags=server side + + +home.imageToPdf.title=Зображення в PDF +home.imageToPdf.desc=Перетворення зображення (PNG, JPEG, GIF) в PDF. +imageToPdf.tags=conversion,img,jpg,picture,photo + + +home.pdfToImage.title=PDF в зображення +home.pdfToImage.desc=Перетворення PDF в зображення. (PNG, JPEG, GIF) +pdfToImage.tags=conversion,img,jpg,picture,photo + + +home.pdfOrganiser.title=Реорганізація +home.pdfOrganiser.desc=Видалення/перестановка сторінок у будь-якому порядку +pdfOrganiser.tags=duplex,even,odd,sort,move + + +home.addImage.title=Додати зображення +home.addImage.desc=Додає зображення у вказане місце в PDF (в розробці) +addImage.tags=img,jpg,picture,photo + + +home.watermark.title=Додати водяний знак +home.watermark.desc=Додайте свій водяний знак до документа PDF. +watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo + + +home.permissions.title=Змінити дозволи +home.permissions.desc=Змініть дозволи вашого документа PDF +permissions.tags=read,write,edit,print + + +home.removePages.title=Видалення +home.removePages.desc=Видаліть непотрібні сторінки з документа PDF. +removePages.tags=Remove pages,delete pages + + +home.addPassword.title=Додати пароль +home.addPassword.desc=Зашифруйте документ PDF паролем. +addPassword.tags=secure,security + + +home.removePassword.title=Видалити пароль +home.removePassword.desc=Зніміть захист паролем з вашого документа PDF. +removePassword.tags=secure,Decrypt,security,unpassword,delete password + + +home.compressPdfs.title=Стиснути +home.compressPdfs.desc=Стискайте PDF-файли, щоб зменшити їх розмір. +compressPdfs.tags=squish,small,tiny + + +home.changeMetadata.title=Змінити метадані +home.changeMetadata.desc=Змінити/видалити/додати метадані з документа PDF +changeMetadata.tags=Title,author,date,creation,time,publisher,producer,stats + + +home.fileToPDF.title=Конвертувати файл в PDF +home.fileToPDF.desc=Конвертуйте майже будь-який файл в PDF (DOCX, PNG, XLS, PPT, TXT та інші) +fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint + + +home.ocr.title=OCR/Очищення сканування +home.ocr.desc=Очищення сканування та виявлення тексту на зображеннях у файлі PDF та повторне додавання його як текст. +ocr.tags=recognition,text,image,scan,read,identify,detection,editable + + +home.extractImages.title=Витягнути зображення +home.extractImages.desc=Витягує всі зображення з PDF і зберігає їх у zip +extractImages.tags=picture,photo,save,archive,zip,capture,grab + + +home.pdfToPDFA.title=PDF в PDF/A +home.pdfToPDFA.desc=Перетворення PDF в PDF/A для довготривалого зберігання +pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation + + +home.PDFToWord.title=PDF в Word +home.PDFToWord.desc=Перетворення PDF в формати Word (DOC, DOCX та ODT) +PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile + + +home.PDFToPresentation.title=PDF в презентацію +home.PDFToPresentation.desc=Перетворення PDF в формати презентацій (PPT, PPTX та ODP) +PDFToPresentation.tags=slides,show,office,microsoft + + +home.PDFToText.title=PDF в Text/RTF +home.PDFToText.desc=Перетворення PDF в текстовий або RTF формат +PDFToText.tags=richformat,richtextformat,rich text format + + +home.PDFToHTML.title=PDF в HTML +home.PDFToHTML.desc=Перетворення PDF в формат HTML +PDFToHTML.tags=web content,browser friendly + + +home.PDFToXML.title=PDF в XML +home.PDFToXML.desc=Перетворення PDF в формат XML +PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert + + +home.ScannerImageSplit.title=Виявлення/розділення відсканованих фотографій +home.ScannerImageSplit.desc=Розділяє кілька фотографій з фото/PDF +ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize + + +home.sign.title=Підпис +home.sign.desc=Додає підпис до PDF за допомогою малюнка, тексту або зображення +sign.tags=authorize,initials,drawn-signature,text-sign,image-signature + + +home.flatten.title=Згладжування +home.flatten.desc=Видалення всіх інтерактивних елементів та форм з PDF +flatten.tags=static,deactivate,non-interactive,streamline + + +home.repair.title=Ремонт +home.repair.desc=Намагається відновити пошкоджений/зламаний PDF +repair.tags=fix,restore,correction,recover + + +home.removeBlanks.title=Видалити порожні сторінки +home.removeBlanks.desc=Виявляє та видаляє порожні сторінки з документа +removeBlanks.tags=cleanup,streamline,non-content,organize + + +home.removeAnnotations.title=Видалити анотації +home.removeAnnotations.desc=Видаляє всі коментарі/анотації з PDF +removeAnnotations.tags=comments,highlight,notes,markup,remove + + +home.compare.title=Порівняння +home.compare.desc=Порівнює та показує різницю між двома PDF-документами +compare.tags=differentiate,contrast,changes,analysis + + +home.certSign.title=Підписати сертифікатом +home.certSign.desc=Підписати PDF сертифікатом/ключем (PEM/P12) +certSign.tags=authenticate,PEM,P12,official,encrypt + + +home.pageLayout.title=Об'єднати сторінки +home.pageLayout.desc=Об'єднання кількох сторінок документа PDF в одну сторінку +pageLayout.tags=merge,composite,single-view,organize + + +home.scalePages.title=Змінити розмір/масштаб сторінки +home.scalePages.desc=Змінити розмір/масштаб сторінки та/або її вмісту. +scalePages.tags=resize,modify,dimension,adapt + + +home.pipeline.title=Конвеєр (розширений) +home.pipeline.desc=Виконуйте кілька дій з PDF-файлами, визначаючи сценарії конвеєрної обробки. +pipeline.tags=automate,sequence,scripted,batch-process + + +home.add-page-numbers.title=Додати номера сторінок +home.add-page-numbers.desc=Додає номера сторінок по всьому документу в заданому місці +add-page-numbers.tags=paginate,label,organize,index + + +home.auto-rename.title=Автоматичне перейменування PDF-файлу +home.auto-rename.desc=Автоматичне перейменування файлу PDF на основі його виявленого заголовку +auto-rename.tags=auto-detect,header-based,organize,relabel + + +home.adjust-contrast.title=Налаштування кольорів/контрастності +home.adjust-contrast.desc=Налаштування контрастності, насиченості та яскравості файлу PDF +adjust-contrast.tags=color-correction,tune,modify,enhance + + +home.crop.title=Обрізати PDF-файл +home.crop.desc=Обрізати PDF-файл, щоб зменшити його розмір (текст залишається!) +crop.tags=trim,shrink,edit,shape + + +home.autoSplitPDF.title=Автоматичне розділення сторінок +home.autoSplitPDF.desc=Автоматичне розділення відсканованого PDF-файлу за допомогою фізичного роздільника відсканованих сторінок QR-коду +autoSplitPDF.tags=QR-based,separate,scan-segment,organize + + +home.sanitizePdf.title=Санітарна обробка +home.sanitizePdf.desc=Видалення скриптів та інших елементів з PDF-файлів +sanitizePdf.tags=clean,secure,safe,remove-threats + + +home.URLToPDF.title=URL/сайт у PDF +home.URLToPDF.desc=Конвертує будь-який http(s)URL у PDF +URLToPDF.tags=web-capture,save-page,web-to-doc,archive + + +home.HTMLToPDF.title=HTML у PDF +home.HTMLToPDF.desc=Конвертує будь-який HTML-файл або zip-файл у PDF. +HTMLToPDF.tags=markup,web-content,transformation,convert + + +home.MarkdownToPDF.title=Markdown у PDF +home.MarkdownToPDF.desc=Конвертує будь-який файл Markdown у PDF +MarkdownToPDF.tags=markup,web-content,transformation,convert + + +home.getPdfInfo.title=Отримати ВСЮ інформацію у форматі PDF +home.getPdfInfo.desc=Збирає будь-яку можливу інформацію у PDF-файлах. +getPdfInfo.tags=infomation,data,stats,statistics + + +home.extractPage.title=Видобути сторінку(и) +home.extractPage.desc=Видобуває обрані сторінки з PDF +extractPage.tags=extract + + +home.PdfToSinglePage.title=PDF на одну велику сторінку +home.PdfToSinglePage.desc=Об'єднує всі сторінки PDF в одну велику сторінку. +PdfToSinglePage.tags=single page + + +home.showJS.title=Показати Javascript +home.showJS.desc=Шукає та відображає будь-який JS, вбудований у PDF-файл. +showJS.tags=JS + + +home.autoRedact.title=Автоматичне редагування +home.autoRedact.desc=Автоматичне затемнення (чорніння) тексту в PDF на основі вхідного тексту +autoRedact.tags=Redact,Hide,black out,black,marker,hidden + + +home.tableExtract.title=PDF у CSV +home.tableExtract.desc=Видобуває таблиці з PDF та перетворює їх у CSV +tableExtract.tags=CSV,Table Extraction,extract,convert + + +home.autoSizeSplitPDF.title=Автоматичне розділення за розміром/кількістю +home.autoSizeSplitPDF.desc=Розділяє один PDF на кілька документів на основі розміру, кількості сторінок або кількості документів +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Накладення PDF +home.overlay-pdfs.desc=Накладення одного PDF поверх іншого PDF +overlay-pdfs.tags=Overlay + + +home.split-by-sections.title=Розділення PDF за секціями +home.split-by-sections.desc=Розділення кожної сторінки PDF на менші горизонтальні та вертикальні секції +split-by-sections.tags=Section Split, Divide, Customize + + +home.AddStampRequest.title=Додати печатку на PDF +home.AddStampRequest.desc=Додавання текстової або зображення печатки у вказані місця +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + +home.PDFToBook.title=PDF у книгу/комікс +home.PDFToBook.desc=Конвертує PDF у формат книги/комікса за допомогою calibre +PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle + + +home.BookToPDF.title=Книга у PDF +home.BookToPDF.desc=Конвертує формати книги/комікса у PDF за допомогою calibre +BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle + + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=Вхід +login.header=Вхід +login.signin=Увійти +login.rememberme=Запам'ятати мене +login.invalid=Недійсне ім'я користувача або пароль. +login.locked=Ваш обліковий запис заблоковано. +login.signinTitle=Будь ласка, увійдіть + + +#auto-redact +autoRedact.title=Автоматичне редагування +autoRedact.header=Автоматичне редагування +autoRedact.colorLabel=Колір +autoRedact.textsToRedactLabel=Текст для приховування (кожен рядок окремо) +autoRedact.textsToRedactPlaceholder=наприклад \nКонфіденційно \nЦілком таємно +autoRedact.useRegexLabel=Використовувати регулярні вирази +autoRedact.wholeWordSearchLabel=Пошук цілих слів +autoRedact.customPaddingLabel=Додаткове заповнення за користувацьким значенням +autoRedact.convertPDFToImageLabel=Перетворити PDF в зображення PDF (використовується для видалення тексту поза межами) +autoRedact.submitButton=Надіслати + + +#showJS +showJS.title=Показати Javascript +showJS.header=Показати Javascript +showJS.downloadJS=Завантажити Javascript +showJS.submit=Показати + + +#pdfToSinglePage +pdfToSinglePage.title=PDF на одну сторінку +pdfToSinglePage.header=PDF на одну сторінку +pdfToSinglePage.submit=Перетворити на одну сторінку + + +#pageExtracter +pageExtracter.title=Видобути сторінки +pageExtracter.header=Видобути сторінки +pageExtracter.submit=Видобути +pageExtracter.placeholder=(наприклад 1,2,8 або 4,7,12-16 або 2n-1) + + +#getPdfInfo +getPdfInfo.title=Отримати інформацію в PDF +getPdfInfo.header=Отримати інформацію в PDF +getPdfInfo.submit=Отримати інформацію +getPdfInfo.downloadJson=Завантажити JSON + + +#markdown-to-pdf +MarkdownToPDF.title=Markdown у PDF +MarkdownToPDF.header=Markdown у PDF +MarkdownToPDF.submit=Конвертувати +MarkdownToPDF.help=Робота в процесі +MarkdownToPDF.credit=Використовує WeasyPrint + + +#url-to-pdf +URLToPDF.title=URL у PDF +URLToPDF.header=URL у PDF +URLToPDF.submit=Конвертувати +URLToPDF.credit=Використовує WeasyPrint + + +#html-to-pdf +HTMLToPDF.title=HTML у PDF +HTMLToPDF.header=HTML у PDF +HTMLToPDF.help=Приймає файли HTML та ZIP-файли, що містять html/css/зображення тощо. +HTMLToPDF.submit=Конвертувати +HTMLToPDF.credit=Використовує WeasyPrint +HTMLToPDF.zoom=Рівень масштабування для відображення веб-сайту. +HTMLToPDF.pageWidth=Ширина сторінки в сантиметрах. (Порожньо - за замовчуванням) +HTMLToPDF.pageHeight=Висота сторінки в сантиметрах. (Порожньо - за замовчуванням) +HTMLToPDF.marginTop=Верхній відступ сторінки в міліметрах. (Порожньо - за замовчуванням) +HTMLToPDF.marginBottom=Нижній відступ сторінки в міліметрах. (Порожньо - за замовчуванням) +HTMLToPDF.marginLeft=Лівий відступ сторінки в міліметрах. (Порожньо - за замовчуванням) +HTMLToPDF.marginRight=Правий відступ сторінки в міліметрах. (Порожньо - за замовчуванням) +HTMLToPDF.printBackground=Відтворити фон веб-сайтів. +HTMLToPDF.defaultHeader=Включити заголовок за замовчуванням (Ім'я та номер сторінки) +HTMLToPDF.cssMediaType=Змінити тип медіа CSS сторінки. +HTMLToPDF.none=Немає +HTMLToPDF.print=Друк +HTMLToPDF.screen=Екран + + +#AddStampRequest +AddStampRequest.header=Поставити печатку на PDF +AddStampRequest.title=Поставити печатку на PDF +AddStampRequest.stampType=Тип печатки +AddStampRequest.stampText=Текст печатки +AddStampRequest.stampImage=Зображення печатки +AddStampRequest.alphabet=Алфавіт +AddStampRequest.fontSize=Розмір шрифту/зображення +AddStampRequest.rotation=Обертання +AddStampRequest.opacity=Прозорість +AddStampRequest.position=Позиція +AddStampRequest.overrideX=Перевизначити координату X +AddStampRequest.overrideY=Перевизначити координату Y +AddStampRequest.customMargin=Користувацький відступ +AddStampRequest.customColor=Користувацький колір тексту +AddStampRequest.submit=Надіслати + + +#sanitizePDF +sanitizePDF.title=Дезінфекція PDF +sanitizePDF.header=Дезінфекція PDF файлу +sanitizePDF.selectText.1=Видалити JavaScript +sanitizePDF.selectText.2=Видалити вбудовані файли +sanitizePDF.selectText.3=Видалити метадані +sanitizePDF.selectText.4=Видалити посилання +sanitizePDF.selectText.5=Видалити шрифти +sanitizePDF.submit=Дезінфекція + + +#addPageNumbers +addPageNumbers.title=Додати номери сторінок +addPageNumbers.header=Додати номери сторінок +addPageNumbers.selectText.1=Виберіть PDF-файл: +addPageNumbers.selectText.2=Розмір поля +addPageNumbers.selectText.3=Позиція +addPageNumbers.selectText.4=Стартовий номер +addPageNumbers.selectText.5=Сторінки для нумерації +addPageNumbers.selectText.6=Свій текст +addPageNumbers.customTextDesc=Користувацький текст +addPageNumbers.numberPagesDesc=Які сторінки нумерувати, за замовчуванням 'всі', також приймає 1-5 або 2,5,9 тощо. +addPageNumbers.customNumberDesc=За замовчуванням {n}, також можна використовувати 'Сторінка {n} з {total}', 'Текст-{n}', '{filename}-{n}' +addPageNumbers.submit=Додати номери сторінок + + +#auto-rename +auto-rename.title=Автоматичне перейменування +auto-rename.header=Автоматичне перейменування PDF +auto-rename.submit=Автоматичне перейменування + + +#adjustContrast +adjustContrast.title=Налаштування контрастності +adjustContrast.header=Налаштування контрастності +adjustContrast.contrast=Контраст: +adjustContrast.brightness=Яскравість: +adjustContrast.saturation=Насиченість: +adjustContrast.download=Завантажити + + +#crop +crop.title=Обрізати +crop.header=Обрізати зображення +crop.submit=Надіслати + + +#autoSplitPDF +autoSplitPDF.title=Автоматичне розділення PDF +autoSplitPDF.header=Автоматичне розділення PDF +autoSplitPDF.description=Друк, вставка, сканування, завантаження і дозвольте нам автоматично розділити ваші документи. Не потребує ручного сортування. +autoSplitPDF.selectText.1=Друк кількох окремих аркушів (підійде чорно-білий варіант). +autoSplitPDF.selectText.2=Скануйте всі документи одночасно, вставляючи між ними роздільний аркуш. +autoSplitPDF.selectText.3=Завантажте один великий відсканований PDF-файл, і нехай Stirling PDF зробить все інше. +autoSplitPDF.selectText.4=Роздільні сторінки автоматично виявляються і видаляються, забезпечуючи акуратний кінцевий документ. +autoSplitPDF.formPrompt=Надіслати PDF-файл, що містить роздільні сторінки Stirling-PDF: +autoSplitPDF.duplexMode=Дуплексний режим (сканування спереду і ззаду) +autoSplitPDF.dividerDownload1=Завантажити 'Auto Splitter Divider (minimal).pdf' +autoSplitPDF.dividerDownload2=Завантажити 'Auto Splitter Divider (with instructions).pdf' +autoSplitPDF.submit=Надіслати + + +#pipeline +pipeline.title=Пайплайн + +#pageLayout +pageLayout.title=Многосторінковий макет +pageLayout.header=Многосторінковий макет +pageLayout.pagesPerSheet=Сторінок на одному аркуші: +pageLayout.addBorder=Додати рамки +pageLayout.submit=Відправити + +#scalePages +scalePages.title=Відрегулювати масштаб сторінки +scalePages.header=Відрегулювати масштаб сторінки +scalePages.pageSize=Розмір сторінки документа. +scalePages.scaleFactor=Рівень масштабування (обрізки) сторінки. +scalePages.submit=Відправити + +#certSign +certSign.title=Підпис сертифікатом +certSign.header=Підпишіть PDF своїм сертифікатом (робота в процесі) +certSign.selectPDF=Виберіть файл PDF для підпису: +certSign.jksNote=Примітка: Якщо ваш тип сертифіката не зазначений нижче, будь ласка, конвертуйте його в файл сховища Java Keystore (.jks), використовуючи утиліту командного рядка keytool. Потім виберіть опцію файлу .jks нижче. +certSign.selectKey=Виберіть файл закритого ключа (формат PKCS#8, може бути .pem або .der): +certSign.selectCert=Виберіть файл сертифіката (формат X.509, може бути .pem або .der): +certSign.selectP12=Виберіть файл сховища ключів PKCS#12 (.p12 або .pfx) (необов'язково, якщо він наданий, він повинен містити ваш закритий ключ і сертифікат): +certSign.selectJKS=Виберіть файл сховища Java Keystore (.jks або .keystore): +certSign.certType=Тип сертифіката +certSign.password=Введіть пароль до сховища ключів або особистого ключа (якщо є): +certSign.showSig=Показати підпис +certSign.reason=Причина +certSign.location=Місцезнаходження +certSign.name=Ім'я +certSign.submit=Підписати PDF + + +#removeBlanks +removeBlanks.title=Видалити порожні +removeBlanks.header=Видалити порожні сторінки +removeBlanks.threshold=Поріг: +removeBlanks.thresholdDesc=Поріг для визначення того, наскільки білим має бути білий піксель +removeBlanks.whitePercent=Відсоток білого (%): +removeBlanks.whitePercentDesc=Загальний відсоток білого на сторінці, для видалення +removeBlanks.submit=Видалити порожні + + +#removeAnnotations +removeAnnotations.title=Видалити анотації +removeAnnotations.header=Видалити анотації +removeAnnotations.submit=Видалити + + +#compare +compare.title=Порівняння +compare.header=Порівняння PDF +compare.document.1=Документ 1 +compare.document.2=Документ 2 +compare.submit=Порівняти + + +#BookToPDF +BookToPDF.title=Книги та комікси в PDF +BookToPDF.header=Конвертувати книгу в PDF +BookToPDF.credit=Використовується Calibre +BookToPDF.submit=Конвертувати + + +#PDFToBook +PDFToBook.title=PDF в книгу +PDFToBook.header=PDF в книгу +PDFToBook.selectText.1=Формат +PDFToBook.credit=Використовується Calibre +PDFToBook.submit=Конвертувати + + +#sign +sign.title=Підпис +sign.header=Підписати PDF +sign.upload=Завантажити зображення +sign.draw=Намалювати підпис +sign.text=Ввід тексту +sign.clear=Очистити +sign.add=Додати + + +#repair +repair.title=Ремонт +repair.header=Ремонт PDF +repair.submit=Ремонтувати + + +#flatten +flatten.title=Згладжування +flatten.header=Згладжування PDF +flatten.submit=Згладити + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=Пороговий кут: +ScannerImageSplit.selectText.2=Встановлює мінімальний абсолютний кут, необхідний для повороту зображення (за замовчуванням: 10). +ScannerImageSplit.selectText.3=Толерантність: +ScannerImageSplit.selectText.4=Визначає діапазон зміни кольору навколо передбачуваного кольору фону (за замовчуванням: 30). +ScannerImageSplit.selectText.5=Мінімальна площа: +ScannerImageSplit.selectText.6=Встановлює мінімальний поріг площі для фотографії (за замовчуванням: 10000). +ScannerImageSplit.selectText.7=Мінімальна площа контуру: +ScannerImageSplit.selectText.8=Встановлює мінімальний поріг площі контуру для фотографії +ScannerImageSplit.selectText.9=Розмір рамки: +ScannerImageSplit.selectText.10=Встановлює розмір додаваної та видаляної рамки, щоб запобігти появі білих рамок на виході (за замовчуванням: 1). + + +#OCR +ocr.title=OCR/Очищення сканування +ocr.header=Очищення сканування / OCR (Optical Character Recognition) Розпізнавання тексту +ocr.selectText.1=Виберіть мови, які повинні бути виявлені у PDF-файлі (перелічені ті, які виявлені на даний момент): +ocr.selectText.2=Створіть текстовий файл, що містить текст OCR, разом із PDF-файлом, обробленим OCR. +ocr.selectText.3=Правильні сторінки були відскановані під перекошеним кутом шляхом повороту їх на місце +ocr.selectText.4=Очистіть сторінку, щоб зменшити шанси, що OCR знайде текст на фоновому шумі. (без зміни виходу) +ocr.selectText.5=Очистіть сторінку, щоб зменшити шанси, що OCR знайде текст на фоновому шумі, підтримує очищення виводу. +ocr.selectText.6=Ігнорує сторінки з інтерактивним текстом, розпізнає лише сторінки з зображеннями +ocr.selectText.7=Примусове розпізнавання символів, буде розпізнавати кожну сторінку, видаляючи всі елементи початкового тексту +ocr.selectText.8=Звичайний (буде помилка, якщо PDF містить текст) +ocr.selectText.9=Додаткові налаштування +ocr.selectText.10=Режим OCR +ocr.selectText.11=Видалити зображення після OCR (видаляє ВСІ зображення, корисно лише в тому випадку, якщо вони є частиною етапу перетворення) +ocr.selectText.12=Тип рендеру (розширений) +ocr.help=Прочитайте цю документацію про те, як використовувати це для інших мов і/або використовувати не в докері. +ocr.credit=Цей сервіс використовує OCRmyPDF та Tesseract для OCR. +ocr.submit=Обробка PDF з OCR + + +#extractImages +extractImages.title=Витягнути зображення +extractImages.header=Витягнути зображення +extractImages.selectText=Виберіть формат зображення для перетворення витягнутих зображень у +extractImages.submit=Витягнути + + +#File to PDF +fileToPDF.title=Файл у PDF +fileToPDF.header=Конвертувати будь-який файл у PDF +fileToPDF.credit=Цей сервіс використовує LibreOffice та Unoconv для перетворення файлів. +fileToPDF.supportedFileTypes=Підтримувані типи файлів повинні включати нижченаведені, однак повний оновлений список підтримуваних форматів дивіться у документації LibreOffice. +fileToPDF.submit=Перетворити у PDF + + +#compress +compress.title=Стиснути +compress.header=Стиснути PDF +compress.credit=Ця служба використовує Ghostscript для стиснення/оптимізації PDF. +compress.selectText.1=Ручний режим - від 1 до 4 +compress.selectText.2=Рівень оптимізації: +compress.selectText.3=4 (Жахливо для текстових зображень) +compress.selectText.4=Автоматичний режим - автоматично налаштовує якість для отримання PDF точного розміру +compress.selectText.5=Очікуваний розмір PDF (наприклад, 25 МБ, 10,8 МБ, 25 КБ) +compress.submit=Стиснути + + +#Add image +addImage.title=Додати зображення +addImage.header=Додати зображення в PDF +addImage.everyPage=Кожна сторінка? +addImage.upload=Додати зображення +addImage.submit=Додати зображення + + +#merge +merge.title=Об'єднати +merge.header=Об'єднання кількох PDF-файлів (2+) +merge.sortByName=Сортування за ім'ям +merge.sortByDate=Сортування за датою +merge.submit=Об'єднати + + +#pdfOrganiser +pdfOrganiser.title=Організатор сторінок +pdfOrganiser.header=Організатор PDF-сторінок +pdfOrganiser.submit=Переупорядкувати сторінки +pdfOrganiser.mode=Режим +pdfOrganiser.mode.1=Користувацький порядок сторінок +pdfOrganiser.mode.2=Зворотній порядок +pdfOrganiser.mode.3=Сортування дуплексом +pdfOrganiser.mode.4=Сортування брошурою +pdfOrganiser.mode.5=Сортування брошурою зі степлером з боку +pdfOrganiser.mode.6=Розділення на парні та непарні сторінки +pdfOrganiser.mode.7=Видалити першу +pdfOrganiser.mode.8=Видалити останню +pdfOrganiser.mode.9=Видалити першу та останню +pdfOrganiser.placeholder=(наприклад, 1,3,2 або 4-8,2,10-12 або 2n-1) + + +#multiTool +multiTool.title=Мультіінструмент PDF +multiTool.header=Мультіінструмент PDF +multiTool.uploadPrompts=Будь ласка, завантажте PDF + + +#viewPdf +viewPdf.title=Переглянути PDF +viewPdf.header=Переглянути PDF + + +#pageRemover +pageRemover.title=Видалення сторінок +pageRemover.header=Видалення сторінок PDF +pageRemover.pagesToDelete=Сторінки для видалення (введіть список номерів сторінок через кому): +pageRemover.submit=Видалити сторінки +pageRemover.placeholder=(наприклад, 1,2,6 або 1-10,15-30) + + +#rotate +rotate.title=Повернути PDF +rotate.header=Повернути PDF +rotate.selectAngle=Виберіть кут повороту (кратний 90 градусам): +rotate.submit=Повернути + + +#split +split.title=Розділити PDF +split.header=Розділити PDF +split.desc.1=Числа, які ви вибрали, це номери сторінок, на яких ви хочете зробити розділ. +split.desc.2=Таким чином, вибір 1,3,7-8 розділить 10-сторінковий документ на 6 окремих PDF-файлів з: +split.desc.3=Документ #1: Сторінка 1 +split.desc.4=Документ #2: Сторінки 2 і 3 +split.desc.5=Документ #3: Сторінки 4, 5 і 6 +split.desc.6=Документ #4: Сторінка 7 +split.desc.7=Документ #5: Сторінка 8 +split.desc.8=Документ #6: Сторінки 9 і 10 +split.splitPages=Введіть сторінки для розділення: +split.submit=Розділити + + +#imageToPDF +imageToPDF.title=Зображення в PDF +imageToPDF.header=Зображення в PDF +imageToPDF.submit=Конвертувати +imageToPDF.selectLabel=Виберіть режим відображення зображення +imageToPDF.fillPage=Заповнення сторінки +imageToPDF.fitDocumentToImage=Підігнати документ під зображення +imageToPDF.maintainAspectRatio=Зберегти пропорції +imageToPDF.selectText.2=Автоматичний поворот PDF +imageToPDF.selectText.3=Логіка для кількох файлів (активується лише при роботі з декількома зображеннями) +imageToPDF.selectText.4=Об'єднати в один PDF +imageToPDF.selectText.5=Перетворення в окремі PDF-файли + + +#pdfToImage +pdfToImage.title=PDF в зображення +pdfToImage.header=PDF в зображення +pdfToImage.selectText=Формат зображення +pdfToImage.singleOrMultiple=Тип результату зображення +pdfToImage.single=Одне велике зображення +pdfToImage.multi=Декілька зображень +pdfToImage.colorType=Тип кольору +pdfToImage.color=Колір +pdfToImage.grey=Відтінки сірого +pdfToImage.blackwhite=Чорно-білий (може втратити дані!) +pdfToImage.submit=Конвертувати + + +#addPassword +addPassword.title=Додати пароль +addPassword.header=Додати пароль (зашифрувати) +addPassword.selectText.1=Оберіть PDF для шифрування +addPassword.selectText.2=Пароль +addPassword.selectText.3=Довжина ключа шифрування +addPassword.selectText.4=Вищі значення сильніші, але нижчі значення мають кращу сумісність. +addPassword.selectText.5=Дозволи на встановлення +addPassword.selectText.6=Запобігти збірці документа +addPassword.selectText.7=Запобігти вилученню контенту +addPassword.selectText.8=Запобігти вилученню для доступності +addPassword.selectText.9=Заборонити заповнення форм +addPassword.selectText.10=Запобігти модифікації +addPassword.selectText.11=Заборонити модифікацію анотацій +addPassword.selectText.12=Заборонити друк +addPassword.selectText.13=Заборонити друк різних форматів +addPassword.selectText.14=Власницький пароль +addPassword.selectText.15=Обмежує, що можна робити з документом після його відкриття (не підтримується всіма програмами читання) +addPassword.selectText.16=Обмежує відкриття самого документа +addPassword.submit=Шифрувати + + +#watermark +watermark.title=Додати водяний знак +watermark.header=Додати водяний знак +watermark.selectText.1=Виберіть PDF, щоб додати водяний знак: +watermark.selectText.2=Текст водяного знаку: +watermark.selectText.3=Розмір шрифту: +watermark.selectText.4=Обертання (0-360): +watermark.selectText.5=widthSpacer (проміжок між кожним водяним знаком по горизонталі): +watermark.selectText.6=heightSpacer (проміжок між кожним водяним знаком по вертикалі): +watermark.selectText.7=Непрозорість (0% - 100%): +watermark.selectText.8=Тип водяного знаку: +watermark.selectText.9=Зображення водяного знаку: +watermark.submit=Додати водяний знак +watermark.type.1=Текст +watermark.type.2=Зображення + + +#Change permissions +permissions.title=Змінити дозволи +permissions.header=Змінити дозволи +permissions.warning=Попередження про те, що ці дозволи не можна змінити, рекомендується встановити їх за допомогою пароля на сторінці додавання пароля. +permissions.selectText.1=Виберіть PDF, щоб змінити дозволи +permissions.selectText.2=Дозволи на встановлення +permissions.selectText.3=Запобігти збірці документа +permissions.selectText.4=Запобігти вилученню контенту +permissions.selectText.5=Запобігти вилученню для доступності +permissions.selectText.6=Заборонити заповнення форм +permissions.selectText.7=Запобігти модифікації +permissions.selectText.8=Заборонити модифікацію анотацій +permissions.selectText.9=Заборонити друк +permissions.selectText.10=Заборонити друк різних форматів +permissions.submit=Змінити + + +#remove password +removePassword.title=Видалити пароль +removePassword.header=Видалити пароль (Розшифрувати) +removePassword.selectText.1=Виберіть PDF для розшифрування +removePassword.selectText.2=Пароль +removePassword.submit=Видалити + + +#changeMetadata +changeMetadata.title=Заголовок: +changeMetadata.header=Змінити метадані +changeMetadata.selectText.1=Будь ласка, відредагуйте змінні, які ви хочете змінити +changeMetadata.selectText.2=Видалити всі метадані +changeMetadata.selectText.3=Показати користувацькі метадані: +changeMetadata.author=Автор: +changeMetadata.creationDate=Дата створення (yyyy/MM/dd HH:mm:ss): +changeMetadata.creator=Створювач: +changeMetadata.keywords=Ключові слова: +changeMetadata.modDate=Дата зміни (yyyy/MM/dd HH:mm:ss): +changeMetadata.producer=Виробник: +changeMetadata.subject=Тема: +changeMetadata.trapped=Пастка: +changeMetadata.selectText.4=Інші метадані: +changeMetadata.selectText.5=Додати користувацький запис метаданих +changeMetadata.submit=Змінити + + +#pdfToPDFA +pdfToPDFA.title=PDF в PDF/A +pdfToPDFA.header=PDF в PDF/A +pdfToPDFA.credit=Цей сервіс використовує OCRmyPDF для перетворення у формат PDF/A +pdfToPDFA.submit=Конвертувати +pdfToPDFA.tip=Наразі не працює для кількох вхідних файлів одночасно + + +#PDFToWord +PDFToWord.title=PDF в Word +PDFToWord.header=PDF в Word +PDFToWord.selectText.1=Формат вихідного файлу +PDFToWord.credit=Цей сервіс використовує LibreOffice для перетворення файлів. +PDFToWord.submit=Конвертувати + + +#PDFToPresentation +PDFToPresentation.title=PDF в Презентацію +PDFToPresentation.header=PDF в Презентацію +PDFToPresentation.selectText.1=Формат вихідного файлу +PDFToPresentation.credit=Цей сервіс використовує LibreOffice для перетворення файлів. +PDFToPresentation.submit=Конвертувати + + +#PDFToText +PDFToText.title=PDF в Text/RTF +PDFToText.header=PDF в Text/RTF +PDFToText.selectText.1=Формат вихідного файлу +PDFToText.credit=Цей сервіс використовує LibreOffice для перетворення файлів. +PDFToText.submit=Конвертувати + + +#PDFToHTML +PDFToHTML.title=PDF в HTML +PDFToHTML.header=PDF в HTML +PDFToHTML.credit=Цей сервіс використовує pdftohtml для перетворення файлів. +PDFToHTML.submit=Конвертувати + + +#PDFToXML +PDFToXML.title=PDF в XML +PDFToXML.header=PDF в XML +PDFToXML.credit=Цей сервіс використовує LibreOffice для перетворення файлів. +PDFToXML.submit=Конвертувати + + +#PDFToCSV +PDFToCSV.title=PDF в CSV +PDFToCSV.header=PDF в CSV +PDFToCSV.prompt=Виберіть сторінку для витягу таблиці +PDFToCSV.submit=Конвертувати + + +#split-by-size-or-count +split-by-size-or-count.title=Розділити PDF за розміром або кількістю +split-by-size-or-count.header=Розділити PDF за розміром або кількістю +split-by-size-or-count.type.label=Виберіть тип розділення +split-by-size-or-count.type.size=За розміром +split-by-size-or-count.type.pageCount=За кількістю сторінок +split-by-size-or-count.type.docCount=За кількістю документів +split-by-size-or-count.value.label=Введіть значення +split-by-size-or-count.value.placeholder=Введіть розмір (наприклад, 2MB або 3KB) або кількість (наприклад, 5) +split-by-size-or-count.submit=Надіслати + + +#overlay-pdfs +overlay-pdfs.header=Накладення файлів PDF +overlay-pdfs.baseFile.label=Виберіть основний файл PDF +overlay-pdfs.overlayFiles.label=Виберіть файл(и) для накладення +overlay-pdfs.mode.label=Виберіть режим накладення +overlay-pdfs.mode.sequential=Послідовне накладення +overlay-pdfs.mode.interleaved=Перехресне накладення +overlay-pdfs.mode.fixedRepeat=Накладення з фіксованим повторенням +overlay-pdfs.counts.label=Кількість накладень (для режиму з фіксованим повторенням) +overlay-pdfs.counts.placeholder=Введіть через кому кількість повторень (наприклад, 2,3,1) +overlay-pdfs.position.label=Виберіть позицію накладення +overlay-pdfs.position.foreground=Над основним +overlay-pdfs.position.background=За основним +overlay-pdfs.submit=Надіслати + + +#split-by-sections +split-by-sections.title=Розділити PDF за розділами +split-by-sections.header=Розділити PDF на секції +split-by-sections.horizontal.label=Горизонтальні розділи +split-by-sections.vertical.label=Вертикальні розділи +split-by-sections.horizontal.placeholder=Введіть кількість горизонтальних розділів +split-by-sections.vertical.placeholder=Введіть кількість вертикальних розділів +split-by-sections.submit=Розділити PDF +split-by-sections.merge=Об'єднати в один PDF + +#licenses +licenses.nav=Ліцензії +licenses.title=Ліцензії від третіх сторін +licenses.header=Ліцензії від третіх сторін +licenses.module=Модуль +licenses.version=Версія +licenses.license=Ліцензія + +# error +error.sorry=Вибачте за незручності! +error.needHelp=Потрібна допомога / Знайшли проблему? +error.contactTip=Якщо у вас досі виникають проблеми, не соромтеся звертатися до нас за допомогою. Ви можете надіслати запит на нашій сторінці GitHub або зв'язатися з нами через Discord: +error.404.head=404 - Сторінку не знайдено | Ой, ми заплуталися в коді! +error.404.1=Ми не можемо знайти сторінку, яку ви шукаєте. +error.404.2=Щось пішло не так +error.github=Надіслати запит на GitHub +error.showStack=Показати стек викликів +error.copyStack=Скопіювати стек викликів +error.githubSubmit=GitHub - Надіслати запит +error.discordSubmit=Discord - Надіслати повідомлення підтримки \ No newline at end of file diff --git a/src/main/resources/static/images/flags/ua.svg b/src/main/resources/static/images/flags/ua.svg new file mode 100644 index 00000000..a339eb1b --- /dev/null +++ b/src/main/resources/static/images/flags/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html index bb8c0071..416aedd9 100644 --- a/src/main/resources/templates/fragments/languages.html +++ b/src/main/resources/templates/fragments/languages.html @@ -26,4 +26,6 @@ icon Hungarian icon हिन्दी icon Srpski + icon Українська + From 3dbfde534e466499174aa61b22330241ef1f4d8f Mon Sep 17 00:00:00 2001 From: Eric <71648843+sbplat@users.noreply.github.com> Date: Mon, 8 Apr 2024 16:28:57 -0400 Subject: [PATCH 05/59] fix: missing pdf to html endpoint (#1043) * fix: missing pdf to html endpoint * refactor: remove unused variable --------- Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- .../api/converters/ConvertPDFToHtml.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java new file mode 100644 index 00000000..beafd389 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java @@ -0,0 +1,32 @@ +package stirling.software.SPDF.controller.api.converters; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +import stirling.software.SPDF.model.api.PDFFile; +import stirling.software.SPDF.utils.PDFToFile; + +@RestController +@Tag(name = "Convert", description = "Convert APIs") +@RequestMapping("/api/v1/convert") +public class ConvertPDFToHtml { + + @PostMapping(consumes = "multipart/form-data", value = "/pdf/html") + @Operation( + summary = "Convert PDF to HTML", + description = + "This endpoint converts a PDF file to HTML format. Input:PDF Output:HTML Type:SISO") + public ResponseEntity processPdfToHTML(@ModelAttribute PDFFile request) + throws Exception { + MultipartFile inputFile = request.getFileInput(); + PDFToFile pdfToFile = new PDFToFile(); + return pdfToFile.processPdfToHtml(inputFile); + } +} From d53be3aa148d7b0d38f92293f622fa41ecb73eea Mon Sep 17 00:00:00 2001 From: Ludy Date: Mon, 8 Apr 2024 22:29:13 +0200 Subject: [PATCH 06/59] add Ukrainian README, languages.html and correction FR, IT (#1044) --- README.md | 7 ++++--- src/main/resources/messages_fr_FR.properties | 1 - src/main/resources/messages_it_IT.properties | 1 + src/main/resources/templates/fragments/languages.html | 1 - 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bb7674b5..48375245 100644 --- a/README.md +++ b/README.md @@ -157,7 +157,7 @@ Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR ## Supported Languages -Stirling PDF currently supports 26! +Stirling PDF currently supports 27! | Language | Progress | | ------------------------------------------- | -------------------------------------- | @@ -165,12 +165,12 @@ Stirling PDF currently supports 26! | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | Arabic (العربية) (ar_AR) | ![58%](https://geps.dev/progress/58) | | German (Deutsch) (de_DE) | ![95%](https://geps.dev/progress/95) | -| French (Français) (fr_FR) | ![99%](https://geps.dev/progress/99) | +| French (Français) (fr_FR) | ![94%](https://geps.dev/progress/94) | | Spanish (Español) (es_ES) | ![95%](https://geps.dev/progress/95) | | Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | | Traditional Chinese (繁體中文) (zh_TW) | ![97%](https://geps.dev/progress/97) | | Catalan (Català) (ca_CA) | ![65%](https://geps.dev/progress/65) | -| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | +| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | | Swedish (Svenska) (sv_SE) | ![58%](https://geps.dev/progress/58) | | Polish (Polski) (pl_PL) | ![60%](https://geps.dev/progress/60) | | Romanian (Română) (ro_RO) | ![58%](https://geps.dev/progress/58) | @@ -187,6 +187,7 @@ Stirling PDF currently supports 26! | Hungarian (Magyar) (hu_HU) | ![87%](https://geps.dev/progress/87) | | Bulgarian (Български) (bg_BG) | ![82%](https://geps.dev/progress/82) | | Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![89%](https://geps.dev/progress/89) | +| Ukrainian (Українська) (uk_UA) | ![98%](https://geps.dev/progress/98) | ## Contributing (creating issues, translations, fixing bugs, etc.) diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index ebcbb9db..e682f2db 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -70,7 +70,6 @@ sponsor=Sponsor - ############### # Pipeline # ############### diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 08647a8b..5cb4841e 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -80,6 +80,7 @@ pipeline.defaultOption=Personalizzato pipeline.submitButton=Invia pipeline.help=Aiuto sulla pipeline pipeline.scanHelp=Aiuto per la scansione delle cartelle + ###################### # Pipeline Options # ###################### diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html index 416aedd9..57f00e8e 100644 --- a/src/main/resources/templates/fragments/languages.html +++ b/src/main/resources/templates/fragments/languages.html @@ -27,5 +27,4 @@ icon हिन्दी icon Srpski icon Українська - From 6b186d5d8e65464d01a1a43a4291c261be963768 Mon Sep 17 00:00:00 2001 From: Foivos Proestakis <115726918+foivospro@users.noreply.github.com> Date: Mon, 8 Apr 2024 23:29:31 +0300 Subject: [PATCH 07/59] Improve Greek translation (#1046) * Update and Improve Greek translation # Update Greek Translations ## Description - Updated translations for all pages and content on the website. - Corrected grammatical errors or typos in the Greek translation. - Improved the overall readability and flow of the translated text. This commit aims to enhance the user experience for Greek-speaking users of the website. * Update messages_el_GR.properties --- src/main/resources/messages_el_GR.properties | 332 +++++++++---------- 1 file changed, 166 insertions(+), 166 deletions(-) diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index ce8ebcae..5168a1a8 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -10,18 +10,18 @@ multiPdfDropPrompt=Επιλογή (ή τράβηγμα αρχείου και α imgPrompt=Επιλογή Εικόνας(Εικόνων) genericSubmit=Υποβολή processTimeWarning=Προσοχή: Αυτή η διαδικασία μπορεί να διαρκέσει έως και ένα λεπτό ανάλογα με το μέγεθος του αρχείου -pageOrderPrompt=Προσαρμοσμένη Σειρά Σελίδας (Προσθέστε μία λίστε απο αριθμούς σελιδών, χωρισμένες με κόμμα ή συναρτήσεις όπως 2n+1) : -pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : -goToPage=Go +pageOrderPrompt=Προσαρμοσμένη Σειρά Σελίδας (Προσθέστε μία λίστα απο αριθμούς σελιδών, χωρισμένες με κόμμα ή συναρτήσεις όπως 2n+1) : +pageSelectionPrompt=Προσαρμοσμένη Επιλογή Σελίδας (Προσθέστε μία λίστα απο αριθμούς σελιδών, χωρισμένες με κόμμα 1,5,6 ή συναρτήσεις όπως 2n+1): +goToPage=Πήγαινε true=Αληθές false=Λανθασμένο unknown=Άγνωστο save=Αποθήκευση -saveToBrowser=Save to Browser +saveToBrowser=Αποθήκευση στο Browser close=Κλείσιμο filesSelected=αρχεία που επιλέχθηκαν noFavourites=Κανένα αγαπήμενο δεν έχει προστεθεί -downloadComplete=Download Complete +downloadComplete=Η Λήψη Ολοκληρώθηκε bored=Βαριέστε να περιμένετε; alphabet=Αλφάβητο downloadPdf=Κατέβασμα του PDF @@ -45,54 +45,54 @@ red=Κόκκινο green=Πράσινο blue=Μπλέ custom=Προσαρμογή... -WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! -poweredBy=Powered by -yes=Yes -no=No +WorkInProgess=Εργασία σε εξέλιξη, Ενδέχεται να μην λειτουργεί ή να έχει λάθη, Παρακαλώ αναφέρετε τυχόν προβλήματα! +poweredBy=Τροφοδοτείται από +yes=Ναι +no=Όχι changedCredsMessage=Τα διαπιστευτήρια έχουν αλλάξει! notAuthenticatedMessage=Ο χρήστης δεν έχει αυθεντικοποιηθεί. userNotFoundMessage=Ο χρήστης δεν βρέθηκε. incorrectPasswordMessage=Ο τρέχων κωδικός πρόσβασης είναι λανθασμένος. usernameExistsMessage=Το νέο όνομα χρήστη υπάρχει ήδη. -invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. -error=Error -oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color -sponsor=Sponsor +invalidUsernameMessage=Μη έγκυρο όνομα χρήστη, το όνομα χρήστη πρέπει να περιέχει μόνο αλφαβητικούς χαρακτήρες και αριθμούς. +deleteCurrentUserMessage=Δεν είναι δυνατή η διαγραφή του τρέχοντος συνδεδεμένου χρήστη. +deleteUsernameExistsMessage=Το όνομα χρήστη δεν υπάρχει και δεν μπορεί να διαγραφεί. +error=Σφάλμα +oops=Ωχ! +help=Βοήθεια +goHomepage=Πήγαινε στην Αρχική Σελίδα +joinDiscord=Εγγραφείτε στο Server του Discord μας +seeDockerHub=Βλέπε το Docker Hub +visitGithub=Επισκεφθείτε το Αποθετήριο του Github +donate=Δωρισε +color=Χρώμα +sponsor=Yποστηρικτής ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Beta) +pipeline.header=Μενού Pipeline (Beta) pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure +pipeline.configureButton=Διαμόρφωσε pipeline.defaultOption=Custom -pipeline.submitButton=Submit -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help +pipeline.submitButton=Υποβολή +pipeline.help=Βοήθεια για το Pipeline +pipeline.scanHelp=Βοήθεια για Σάρωση Φακέλων ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.selectOperation=Select Operation -pipelineOptions.addOperationButton=Add operation +pipelineOptions.header=Διαμόρφωση Pipeline +pipelineOptions.pipelineNameLabel=Όνομα Pipeline +pipelineOptions.saveSettings=Αποθήκευση Ρυθμίσεων Λειτουργίας +pipelineOptions.pipelineNamePrompt=Εισαγάγετε το όνομα του pipeline εδώ +pipelineOptions.selectOperation=Επιλέξτε Λειτουργία +pipelineOptions.addOperationButton=Προσθήκη λειτουργίας pipelineOptions.pipelineHeader=Pipeline: -pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.saveButton=Λήψη +pipelineOptions.validateButton=Επικυρώνω @@ -112,12 +112,12 @@ navbar.settings=Ρυθμίσεις ############# settings.title=Ρυθμίσεις settings.update=Υπάρχει διαθέσιμη ενημέρωση -settings.appVersion=Έκδοση εφαρμογής: App Version: +settings.appVersion=Έκδοση εφαρμογής: settings.downloadOption.title=Επιλέξετε την επιλογή λήψης (Για λήψεις μεμονωμένων αρχείων χωρίς zip): settings.downloadOption.1=Άνοιγμα στο ίδιο παράθυρο settings.downloadOption.2=Άνοιγμα σε νέο παράθυρο settings.downloadOption.3=Λήψη αρχείου -settings.zipThreshold=Zip αρχεία όταν ο αριθμός των ληφθέντων αρχείων είναι πολύ μεγάλος +settings.zipThreshold=Αρχεία Zip όταν ο αριθμός των ληφθέντων αρχείων είναι πολύ μεγάλος settings.signOut=Αποσύνδεση settings.accountSettings=Ρυθμίσεις Λογαριασμού @@ -125,7 +125,7 @@ settings.accountSettings=Ρυθμίσεις Λογαριασμού changeCreds.title=Αλλαγή Διαπιστευτηρίων changeCreds.header=Ενημέρωση των λεπτομερειών του Λογαριασμού σας -changeCreds.changePassword=You are using default login credentials. Please enter a new password +changeCreds.changePassword=Χρησιμοποιείτε προεπιλεγμένα διαπιστευτήρια σύνδεσης. Εισαγάγετε έναν νέο κωδικό πρόσβασης changeCreds.newUsername=Νέο Όνομα Χρήστη changeCreds.oldPassword=Τρέχων Κωδικός Πρόσβασης changeCreds.newPassword=Νέος Κωδικός Πρόσβασης @@ -165,10 +165,10 @@ adminUserSettings.roles=Ρόλοι adminUserSettings.role=Ρόλος adminUserSettings.actions=Ενέργειες adminUserSettings.apiUser=Περιορισμένος Χρήστης για διεπαφή προγραμματισμού εφαρμογών (API User) -adminUserSettings.extraApiUser=Additional Limited API User +adminUserSettings.extraApiUser=Πρόσθετος Περιορισμένος Χρήστης για Διεπαφή Προγραμματισμού Εφαρμογών (API User) adminUserSettings.webOnlyUser=Χρήστης μόνο Ιστού -adminUserSettings.demoUser=Demo User (No custom settings) -adminUserSettings.internalApiUser=Internal API User +adminUserSettings.demoUser=Demo χρήστης (Χωρίς προσαρμοσμένες ρυθμίσεις) +adminUserSettings.internalApiUser=Εσωτερικός API χρήστης adminUserSettings.forceChange=Αναγκάστε τον χρήστη να αλλάξει το όνομα χρήστη/κωδικό πρόσβασης κατά τη σύνδεση adminUserSettings.submit=Αποθήκευση Χρήστη @@ -176,7 +176,7 @@ adminUserSettings.submit=Αποθήκευση Χρήστη # HOME-PAGE # ############# home.desc=Η τοπικά φιλοξενούμενη one-stop-shop σας για όλες τις ανάγκες σας σε PDF. -home.searchBar=Search for features... +home.searchBar=Αναζήτηση για χαρακτηριστικά... home.viewPdf.title=Εμφάνιση PDF @@ -197,7 +197,7 @@ split.tags=Page operations,divide,Multi Page,cut,server side home.rotate.title=Περιστροφή home.rotate.desc=Περιστροφή των PDF σας με εύκολο τρόπο. -rotate.tags=server side +rotate.tags=από την πλευρά του server home.imageToPdf.title=Εικόνα σε PDF @@ -390,35 +390,35 @@ home.autoRedact.title=Αυτόματο Μαύρισμα Κειμένου home.autoRedact.desc=Αυτόματη επεξεργασία (Μαύρισμα) κείμενου σε PDF με βάση το κείμενο εισαγωγής autoRedact.tags=Redact,Hide,black out,black,marker,hidden -home.tableExtraxt.title=PDF to CSV -home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV +home.tableExtraxt.title=PDF σε CSV +home.tableExtraxt.desc=Εξάγει πίνακες από PDF μετατρέποντάς το σε CSV tableExtraxt.tags=CSV,Table Extraction,extract,convert -home.autoSizeSplitPDF.title=Auto Split by Size/Count -home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count +home.autoSizeSplitPDF.title=Αυτόματη διαίρεση κατά μέγεθος/πλήθος +home.autoSizeSplitPDF.desc=Διαχωρίστε ένα μόνο PDF σε πολλά έγγραφα με βάση το μέγεθος, τον αριθμό σελίδων ή τον αριθμό εγγράφων autoSizeSplitPDF.tags=pdf,split,document,organization -home.overlay-pdfs.title=Overlay PDFs -home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF +home.overlay-pdfs.title=Επικάλυψη PDFs +home.overlay-pdfs.desc=Επικαλύπτει αρχεία PDF πάνω σε άλλο PDF overlay-pdfs.tags=Overlay -home.split-by-sections.title=Split PDF by Sections -home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections +home.split-by-sections.title=Διαχωρισμός PDF ανά ενότητες +home.split-by-sections.desc=Διαχωρίστε κάθε σελίδα ενός PDF σε μικρότερες οριζόντιες και κάθετες ενότητες split-by-sections.tags=Section Split, Divide, Customize -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations +home.AddStampRequest.title=Προσθήκη σφραγίδας σε PDF +home.AddStampRequest.desc=Προσθέστε κείμενο ή προσθέστε σφραγίδες εικόνας σε καθορισμένες τοποθεσίες AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre +home.PDFToBook.title=PDF σε Book +home.PDFToBook.desc=Μετατρέπει τις μορφές PDF σε Book/Comic χρησιμοποιώντας calibre PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre +home.BookToPDF.title=Book σε PDF +home.BookToPDF.desc=Μετατρέπει τις μορφές Books/Comics σε PDF χρησιμοποιώντας calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle @@ -467,7 +467,7 @@ pdfToSinglePage.submit=Μετατροπή σε Μονή Σελίδα pageExtracter.title=Εξαγωγή Σελίδων pageExtracter.header=EΕξαγωγή Σελίδων pageExtracter.submit=Εξαγωγή -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(π.χ. 1,2,8 ή 4,7,12-16 ή 2n-1) #getPdfInfo @@ -499,37 +499,37 @@ HTMLToPDF.header=HTML σε PDF HTMLToPDF.help=Δέχεται αρχεία τύπου HTML και τύπου ZIP που περιέχουν html/css/εικόνες κ.λπ. που απαιτούνται HTMLToPDF.submit=Μετατροπή HTMLToPDF.credit=Χρησιμοποιεί WeasyPrint -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print +HTMLToPDF.zoom=Επίπεδο ζουμ για την εμφάνιση του ιστότοπου. +HTMLToPDF.pageWidth=Το πλάτος της σελίδας σε εκατοστά. (Κενό έως προεπιλογή) +HTMLToPDF.pageHeight=Το ύψος της σελίδας σε εκατοστά. (Κενό έως προεπιλογή) +HTMLToPDF.marginTop=Το επάνω περιθώριο της σελίδας σε χιλιοστά. (Κενό έως προεπιλογή) +HTMLToPDF.marginBottom=Κάτω περιθώριο σελίδας σε χιλιοστά. (Κενό έως προεπιλογή) +HTMLToPDF.marginLeft=Το αριστερό περιθώριο της σελίδας σε χιλιοστά. (Κενό έως προεπιλογή) +HTMLToPDF.marginRight=Το δεξί περιθώριο της σελίδας σε χιλιοστά. (Κενό έως προεπιλογή) +HTMLToPDF.printBackground=Αποδώστε το φόντο των ιστοσελίδων. +HTMLToPDF.defaultHeader=Ενεργοποίηση προεπιλεγμένης κεφαλίδας (Όνομα και αριθμός σελίδας) +HTMLToPDF.cssMediaType=Αλλάξτε τον τύπο μέσων (media type )CSS της σελίδας. +HTMLToPDF.none=Κανένα +HTMLToPDF.print=Εκτύπωσε HTMLToPDF.screen=Screen #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=Σφραγίδα PDF +AddStampRequest.title=Σφραγίδα PDF +AddStampRequest.stampType=Τύπος σφραγίδας +AddStampRequest.stampText=Κείμενο σφραγίδας +AddStampRequest.stampImage=Εικόνα σφραγίδας +AddStampRequest.alphabet=Αλφάβητο +AddStampRequest.fontSize=Μέγεθος γραμματοσειράς/εικόνας +AddStampRequest.rotation=Περιστροφή +AddStampRequest.opacity=Αδιαφάνεια +AddStampRequest.position=Θέση +AddStampRequest.overrideX=Override Συντεταγμένης X +AddStampRequest.overrideY=Override Συντεταγμένης Ψ +AddStampRequest.customMargin=Προσαρμοσμένο Περιθώριο +AddStampRequest.customColor=Προσαρμοσμένο χρώμα κειμένου +AddStampRequest.submit=Υποβολή #sanitizePDF @@ -618,11 +618,11 @@ scalePages.submit=Υποβολή certSign.title=Υπογραφή Πιστοποιητικού certSign.header=Υπογράψτε ένα αρχείο PDF με το πιστοποιητικό σας (Εργασία σε εξέλιξη) certSign.selectPDF=Επιλογή αρχείου PDF για υπογραφή: -certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.jksNote=Σημείωση: Εάν ο τύπος πιστοποιητικού σας δεν αναφέρεται παρακάτω, μετατρέψτε το σε αρχείο Java Keystore (.jks) χρησιμοποιώντας το εργαλείο γραμμής εντολών keytool. Στη συνέχεια, επιλέξτε την επιλογή αρχείου .jks παρακάτω. certSign.selectKey=Επιλέξτε το αρχείο του ιδιωτικού κλειδιού σας (μορφή PKCS#8, μπορεί να είναι .pem ή .der): certSign.selectCert=Επιλέξτε το αρχείο πιστοποιητικού σας (μορφή X.509, μπορεί να είναι .pem ή .der): certSign.selectP12=Επιλέξτε το αρχείο PKCS#12 Keystore (.p12 ή .pfx) (Προαιρετικό, εάν παρέχεται, θα πρέπει να περιέχει το ιδιωτικό κλειδί και το πιστοποιητικό σας): -certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=Επιλέξτε το αρχείο Java Keystore (.jks ή .keystore): certSign.certType=Τύπος Πιστοποιητικού certSign.password=Εισαγάγετε τον κωδικό του Keystore ή του Ιδιωτικού Κλειδιού (εάν υπάρχει): certSign.showSig=Εμφάνιση Υπογραφής @@ -643,9 +643,9 @@ removeBlanks.submit=Αφαίρεση Κενών #removeAnnotations -removeAnnotations.title=Remove Annotations -removeAnnotations.header=Remove Annotations -removeAnnotations.submit=Remove +removeAnnotations.title=Κατάργηση σχολιασμών +removeAnnotations.header=Κατάργηση σχολιασμών +removeAnnotations.submit=Κατάργηση #compare @@ -656,17 +656,17 @@ compare.document.2=Έγγραφο 2 compare.submit=Σύγκριση #BookToPDF -BookToPDF.title=Books and Comics to PDF -BookToPDF.header=Book to PDF -BookToPDF.credit=Uses Calibre -BookToPDF.submit=Convert +BookToPDF.title=Books και Comics σε PDF +BookToPDF.header=Book σε PDF +BookToPDF.credit=Χρησιμοποιεί Caliber +BookToPDF.submit=Μετατροπή #PDFToBook -PDFToBook.title=PDF to Book -PDFToBook.header=PDF to Book -PDFToBook.selectText.1=Format -PDFToBook.credit=Uses Calibre -PDFToBook.submit=Convert +PDFToBook.title=PDF σε Book +PDFToBook.header=PDF σε Book +PDFToBook.selectText.1=Μορφή +PDFToBook.credit=Χρησιμοποιεί Caliber +PDFToBook.submit=Μετατροπή #sign sign.title=Υπογραφή @@ -753,7 +753,7 @@ compress.submit=Συμπίεση #Add image addImage.title=Προσθήκη Εικόνας addImage.header=Προσθήκη Εικόνας σε PDF -addImage.everyPage=Κάθε Σελίδα? +addImage.everyPage=Κάθε Σελίδα; addImage.upload=Προσθήκη Εικόνας addImage.submit=Προσθήκη Εικόνας @@ -771,40 +771,40 @@ pdfOrganiser.title=Διοργανωτής σελίδας pdfOrganiser.header=Διοργανωτής σελίδας PDF pdfOrganiser.submit=Αναδιάταξη σελίδων pdfOrganiser.mode=Mode -pdfOrganiser.mode.1=Custom Page Order -pdfOrganiser.mode.2=Reverse Order -pdfOrganiser.mode.3=Duplex Sort -pdfOrganiser.mode.4=Booklet Sort +pdfOrganiser.mode.1=Προσαρμοσμένη Σειρά Σελίδας +pdfOrganiser.mode.2=Αντίστροφη Σειρά +pdfOrganiser.mode.3=Ταξινόμηση Διπλής Όψης (Duplex Sort) +pdfOrganiser.mode.4=Ταξινόμηση Φυλλαδίου (Booklet Sort) pdfOrganiser.mode.5=Side Stitch Booklet Sort -pdfOrganiser.mode.6=Odd-Even Split -pdfOrganiser.mode.7=Remove First -pdfOrganiser.mode.8=Remove Last -pdfOrganiser.mode.9=Remove First and Last -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode.6=Διαίρεση Μονού-Ζυγού +pdfOrganiser.mode.7=Αφαίρεση Πρώτου +pdfOrganiser.mode.8=Αφαίρεση Τελευταίου +pdfOrganiser.mode.9=Αφαίρεση Πρώτου και Τελευταίου +pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1) #multiTool multiTool.title=PDF Πολυεργαλείο multiTool.header=PDF Πολυεργαλείο -multiTool.uploadPrompts=Please Upload PDF +multiTool.uploadPrompts=Ανεβάστε το PDF #view pdf -viewPdf.title=View PDF -viewPdf.header=View PDF +viewPdf.title=Προβολή PDF +viewPdf.header=Προβολή PDF #pageRemover pageRemover.title=Αφαιρετής Σελίδων pageRemover.header=Αφαιρετής Σελίδων PDF pageRemover.pagesToDelete=Σελίδες προς διαγραφή (Εισαγάγετε μια λίστα με αριθμούς σελίδων διαχωρισμένων με κόμματα): pageRemover.submit=Αφαίρεση Σελίδων -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(π.χ. 1,2,6 ή 1-10,15-30) #rotate rotate.title=Περιστροφή PDF rotate.header=Περιστροφή PDF -rotate.selectAngle=Select rotation angle (in multiples of 90 degrees): -rotate.submit=Rotate +rotate.selectAngle=Επιλέξτε γωνία περιστροφής (σε πολλαπλάσια των 90 μοιρών): +rotate.submit=Περιστροφή #split-pdfs @@ -885,8 +885,8 @@ watermark.selectText.7=Αδιαφάνεια (Opacity) (0% - 100%): watermark.selectText.8=Τύπος Υδατογραφήματος: watermark.selectText.9=Εικόνα Υδατογραφήματος: watermark.submit=Προσθήκη Υδατογραφήματος -watermark.type.1=Text -watermark.type.2=Image +watermark.type.1=Κείμενο +watermark.type.2=Εικόνα #Change permissions @@ -938,7 +938,7 @@ pdfToPDFA.title=PDF σε PDF/A pdfToPDFA.header=PDF σε PDF/A pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί OCRmyPDF για PDF/A μετατροπή pdfToPDFA.submit=Μετατροπή -pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα #PDFToWord @@ -979,68 +979,68 @@ PDFToXML.credit=Αυτή η υπηρεσία χρησιμοποιεί LibreOffic PDFToXML.submit=Μετατροπή #PDFToCSV -PDFToCSV.title=PDF ?? CSV -PDFToCSV.header=PDF ?? CSV -PDFToCSV.prompt=Choose page to extract table -PDFToCSV.submit=????????? +PDFToCSV.title=PDF σε CSV +PDFToCSV.header=PDF σε CSV +PDFToCSV.prompt=Επιλέξτε σελίδα για εξαγωγή πίνακα +PDFToCSV.submit=Εξαξωγή #split-by-size-or-count -split-by-size-or-count.title=Split PDF by Size or Count -split-by-size-or-count.header=Split PDF by Size or Count -split-by-size-or-count.type.label=Select Split Type -split-by-size-or-count.type.size=By Size -split-by-size-or-count.type.pageCount=By Page Count -split-by-size-or-count.type.docCount=By Document Count -split-by-size-or-count.value.label=Enter Value -split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) -split-by-size-or-count.submit=Submit +split-by-size-or-count.title=Διαχωρίστε το PDF Κατά Μέγεθος ή Μέτρηση +split-by-size-or-count.header=Διαχωρίστε το PDF Κατά Μέγεθος ή Μέτρηση +split-by-size-or-count.type.label=Επιλέξτε Τύπος Διαχωρισμού +split-by-size-or-count.type.size=Ανά Μέγεθος +split-by-size-or-count.type.pageCount=Ανά αριθμό σελίδων +split-by-size-or-count.type.docCount=Ανά αριθμό εγγράφων +split-by-size-or-count.value.label=Εισαγάγετε τιμή +split-by-size-or-count.value.placeholder=Εισαγάγετε μέγεθος (π.χ. 2MB ή 3KB) ή μέτρηση (π.χ. 5) +split-by-size-or-count.submit=Υποβολή #overlay-pdfs -overlay-pdfs.header=Overlay PDF Files -overlay-pdfs.baseFile.label=Select Base PDF File -overlay-pdfs.overlayFiles.label=Select Overlay PDF Files -overlay-pdfs.mode.label=Select Overlay Mode -overlay-pdfs.mode.sequential=Sequential Overlay -overlay-pdfs.mode.interleaved=Interleaved Overlay -overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay -overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode) -overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) -overlay-pdfs.position.label=Select Overlay Position +overlay-pdfs.header=Επικάλυψη αρχείων PDF +overlay-pdfs.baseFile.label=Επιλέξτε Βασικό αρχείο PDF +overlay-pdfs.overlayFiles.label=Επιλέξτε Επικάλυψη αρχείων PDF +overlay-pdfs.mode.label=Επιλέξτε Λειτουργία Επικάλυψης +overlay-pdfs.mode.sequential=Διαδοχική Επικάλυψη +overlay-pdfs.mode.interleaved=Επικάλυψη με Παρεμβολή +overlay-pdfs.mode.fixedRepeat=Διορθώθηκε η Επικάλυψη Επανάληψης +overlay-pdfs.counts.label=Μετρήσεις επικάλυψης (για σταθερή λειτουργία επανάληψης) +overlay-pdfs.counts.placeholder=Εισαγάγετε μετρήσεις διαχωρισμένες με κόμματα (π.χ. 2,3,1) +overlay-pdfs.position.label=Επιλέξτε Θέση Επικάλυψης overlay-pdfs.position.foreground=Foreground overlay-pdfs.position.background=Background -overlay-pdfs.submit=Submit +overlay-pdfs.submit=Υποβολή #split-by-sections -split-by-sections.title=Split PDF by Sections -split-by-sections.header=Split PDF into Sections -split-by-sections.horizontal.label=Horizontal Divisions -split-by-sections.vertical.label=Vertical Divisions -split-by-sections.horizontal.placeholder=Enter number of horizontal divisions -split-by-sections.vertical.placeholder=Enter number of vertical divisions -split-by-sections.submit=Split PDF -split-by-sections.merge=Merge Into One PDF +split-by-sections.title=Διαχωρισμός PDF ανά ενότητες +split-by-sections.header=Διαχωρίστε το PDF σε Ενότητες +split-by-sections.horizontal.label=Οριζόντιες Διαιρέσεις +split-by-sections.vertical.label=Κάθετες Διαιρέσεις +split-by-sections.horizontal.placeholder=Εισαγάγετε τον αριθμό των οριζόντιων διαιρέσεων +split-by-sections.vertical.placeholder=Εισαγάγετε τον αριθμό των κάθετων διαιρέσεων +split-by-sections.submit=Διαχωρισμός PDF +split-by-sections.merge=Συγχώνευση σε ένα PDF #licenses -licenses.nav=Licenses -licenses.title=3rd Party Licenses -licenses.header=3rd Party Licenses +licenses.nav=Άδειες +licenses.title=3rd Party Άδειες +licenses.header=3rd Party Άδειες licenses.module=Module -licenses.version=Version -licenses.license=License +licenses.version=Εκδοχή +licenses.license=Άδεια # error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=Συγγνώμη για το ζήτημα! +error.needHelp=Χρειάζεστε βοήθεια / Βρήκατε πρόβλημα; +error.contactTip=Εάν εξακολουθείτε να αντιμετωπίζετε προβλήματα, μη διστάσετε να επικοινωνήσετε μαζί μας για βοήθεια. Μπορείτε να υποβάλετε ένα ticket στη σελίδα μας στο GitHub ή να επικοινωνήσετε μαζί μας μέσω του Discord: +error.404.head=404 - Η σελίδα δεν βρέθηκε | Oops, we tripped in the code! +error.404.1=Δεν μπορούμε να βρούμε τη σελίδα που ψάχνετε. +error.404.2=Κάτι πήγε στραβά +error.github=Υποβάλετε ένα ticket στο GitHub +error.showStack=Εμφάνιση Stack Trace +error.copyStack=Αντιγραφή Stack Trace +error.githubSubmit=GitHub - Υποβάλετε ένα ticket +error.discordSubmit=Discord - Υποβάλετε ένα Support post From 7dd16795887eaee84d86ac2ef4de29b59cd9cc6c Mon Sep 17 00:00:00 2001 From: Ludy Date: Mon, 8 Apr 2024 22:37:30 +0200 Subject: [PATCH 08/59] Ukrainian - add missing strings (#1048) add missing strings --- src/main/resources/messages_uk_UA.properties | 85 +++++++------------- 1 file changed, 27 insertions(+), 58 deletions(-) diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index e2c7d6e2..e6ca925f 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr=left to right, rtl = right to left) +# the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr pdfPrompt=Оберіть PDF(и) @@ -57,6 +57,17 @@ usernameExistsMessage=Нове ім'я користувача вже існує. invalidUsernameMessage=Недійсне ім'я користувача, Ім'я користувача повинно містити тільки літери алфавіту та цифри. deleteCurrentUserMessage=Неможливо видалити користувача, який увійшов в систему. deleteUsernameExistsMessage=Ім'я користувача не існує і не може бути видалено. +error=Error +oops=Oops! +help=Help +goHomepage=Go to Homepage +joinDiscord=Join our Discord server +seeDockerHub=See Docker Hub +visitGithub=Visit Github Repository +donate=Donate +color=Color +sponsor=Sponsor + ############### @@ -70,7 +81,6 @@ pipeline.submitButton=Надіслати pipeline.help=Довідка з конвеєрної обробки pipeline.scanHelp=Довідка зі сканування папок - ###################### # Pipeline Options # ###################### @@ -85,6 +95,8 @@ pipelineOptions.saveButton=Завантажити pipelineOptions.validateButton=Перевірити + + ############# # NAVBAR # ############# @@ -95,7 +107,6 @@ navbar.darkmode=Темний режим navbar.pageOps=Операції зі сторінкою navbar.settings=Налаштування - ############# # SETTINGS # ############# @@ -111,6 +122,7 @@ settings.signOut=Вийти settings.accountSettings=Налаштування акаунта + changeCreds.title=Змінити облікові дані changeCreds.header=Оновіть дані вашого облікового запису changeCreds.changePassword=Ви використовуєте заводські облікові дані для входу. Будь ласка, введіть новий пароль @@ -120,7 +132,6 @@ changeCreds.newPassword=Новий пароль changeCreds.confirmNewPassword=Підтвердіть новий пароль changeCreds.submit=Надіслати зміни - account.title=Налаштування акаунта account.accountSettings=Налаштування акаунта account.adminSettings=Налаштування адміністратора - Перегляд і додавання користувачів @@ -141,7 +152,6 @@ account.webBrowserSettings=Налаштування веб-браузера account.syncToBrowser=Синхронізувати обліковий запис -> Браузер account.syncToAccount=Синхронізувати обліковий запис <- Браузер - adminUserSettings.title=Налаштування контролю користувача adminUserSettings.header=Налаштування контролю користувача адміністратора adminUserSettings.admin=Адміністратор @@ -159,7 +169,6 @@ adminUserSettings.internalApiUser=Внутрішній користувач API adminUserSettings.forceChange=Примусити користувача змінити пароль при вході в систему adminUserSettings.submit=Зберегти користувача - ############# # HOME-PAGE # ############# @@ -171,22 +180,18 @@ home.viewPdf.title=Перегляд PDF home.viewPdf.desc=Перегляд, анотація, додавання тексту або зображень viewPdf.tags=view,read,annotate,text,image - home.multiTool.title=Мультіінструмент PDF home.multiTool.desc=Об'єднання, поворот, зміна порядку та видалення сторінок multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side - home.merge.title=Об'єднати home.merge.desc=Легко об'єднуйте кілька PDF-файлів у один. merge.tags=merge,Page operations,Back end,server side - home.split.title=Розділити home.split.desc=Розділіть PDF-файли на кілька документів split.tags=Page operations,divide,Multi Page,cut,server side - home.rotate.title=Повернути home.rotate.desc=Легко повертайте ваші PDF-файли. rotate.tags=server side @@ -196,12 +201,10 @@ home.imageToPdf.title=Зображення в PDF home.imageToPdf.desc=Перетворення зображення (PNG, JPEG, GIF) в PDF. imageToPdf.tags=conversion,img,jpg,picture,photo - home.pdfToImage.title=PDF в зображення home.pdfToImage.desc=Перетворення PDF в зображення. (PNG, JPEG, GIF) pdfToImage.tags=conversion,img,jpg,picture,photo - home.pdfOrganiser.title=Реорганізація home.pdfOrganiser.desc=Видалення/перестановка сторінок у будь-якому порядку pdfOrganiser.tags=duplex,even,odd,sort,move @@ -211,12 +214,10 @@ home.addImage.title=Додати зображення home.addImage.desc=Додає зображення у вказане місце в PDF (в розробці) addImage.tags=img,jpg,picture,photo - home.watermark.title=Додати водяний знак home.watermark.desc=Додайте свій водяний знак до документа PDF. watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - home.permissions.title=Змінити дозволи home.permissions.desc=Змініть дозволи вашого документа PDF permissions.tags=read,write,edit,print @@ -226,17 +227,14 @@ home.removePages.title=Видалення home.removePages.desc=Видаліть непотрібні сторінки з документа PDF. removePages.tags=Remove pages,delete pages - home.addPassword.title=Додати пароль home.addPassword.desc=Зашифруйте документ PDF паролем. addPassword.tags=secure,security - home.removePassword.title=Видалити пароль home.removePassword.desc=Зніміть захист паролем з вашого документа PDF. removePassword.tags=secure,Decrypt,security,unpassword,delete password - home.compressPdfs.title=Стиснути home.compressPdfs.desc=Стискайте PDF-файли, щоб зменшити їх розмір. compressPdfs.tags=squish,small,tiny @@ -261,27 +259,22 @@ home.extractImages.title=Витягнути зображення home.extractImages.desc=Витягує всі зображення з PDF і зберігає їх у zip extractImages.tags=picture,photo,save,archive,zip,capture,grab - home.pdfToPDFA.title=PDF в PDF/A home.pdfToPDFA.desc=Перетворення PDF в PDF/A для довготривалого зберігання pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - home.PDFToWord.title=PDF в Word home.PDFToWord.desc=Перетворення PDF в формати Word (DOC, DOCX та ODT) PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - home.PDFToPresentation.title=PDF в презентацію home.PDFToPresentation.desc=Перетворення PDF в формати презентацій (PPT, PPTX та ODP) PDFToPresentation.tags=slides,show,office,microsoft - home.PDFToText.title=PDF в Text/RTF home.PDFToText.desc=Перетворення PDF в текстовий або RTF формат PDFToText.tags=richformat,richtextformat,rich text format - home.PDFToHTML.title=PDF в HTML home.PDFToHTML.desc=Перетворення PDF в формат HTML PDFToHTML.tags=web content,browser friendly @@ -291,97 +284,78 @@ home.PDFToXML.title=PDF в XML home.PDFToXML.desc=Перетворення PDF в формат XML PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - home.ScannerImageSplit.title=Виявлення/розділення відсканованих фотографій home.ScannerImageSplit.desc=Розділяє кілька фотографій з фото/PDF ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - home.sign.title=Підпис home.sign.desc=Додає підпис до PDF за допомогою малюнка, тексту або зображення sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - home.flatten.title=Згладжування home.flatten.desc=Видалення всіх інтерактивних елементів та форм з PDF flatten.tags=static,deactivate,non-interactive,streamline - home.repair.title=Ремонт home.repair.desc=Намагається відновити пошкоджений/зламаний PDF repair.tags=fix,restore,correction,recover - home.removeBlanks.title=Видалити порожні сторінки home.removeBlanks.desc=Виявляє та видаляє порожні сторінки з документа removeBlanks.tags=cleanup,streamline,non-content,organize - home.removeAnnotations.title=Видалити анотації home.removeAnnotations.desc=Видаляє всі коментарі/анотації з PDF removeAnnotations.tags=comments,highlight,notes,markup,remove - home.compare.title=Порівняння home.compare.desc=Порівнює та показує різницю між двома PDF-документами compare.tags=differentiate,contrast,changes,analysis - home.certSign.title=Підписати сертифікатом home.certSign.desc=Підписати PDF сертифікатом/ключем (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt - home.pageLayout.title=Об'єднати сторінки home.pageLayout.desc=Об'єднання кількох сторінок документа PDF в одну сторінку pageLayout.tags=merge,composite,single-view,organize - home.scalePages.title=Змінити розмір/масштаб сторінки home.scalePages.desc=Змінити розмір/масштаб сторінки та/або її вмісту. scalePages.tags=resize,modify,dimension,adapt - home.pipeline.title=Конвеєр (розширений) home.pipeline.desc=Виконуйте кілька дій з PDF-файлами, визначаючи сценарії конвеєрної обробки. pipeline.tags=automate,sequence,scripted,batch-process - home.add-page-numbers.title=Додати номера сторінок home.add-page-numbers.desc=Додає номера сторінок по всьому документу в заданому місці add-page-numbers.tags=paginate,label,organize,index - home.auto-rename.title=Автоматичне перейменування PDF-файлу home.auto-rename.desc=Автоматичне перейменування файлу PDF на основі його виявленого заголовку auto-rename.tags=auto-detect,header-based,organize,relabel - home.adjust-contrast.title=Налаштування кольорів/контрастності home.adjust-contrast.desc=Налаштування контрастності, насиченості та яскравості файлу PDF adjust-contrast.tags=color-correction,tune,modify,enhance - home.crop.title=Обрізати PDF-файл home.crop.desc=Обрізати PDF-файл, щоб зменшити його розмір (текст залишається!) crop.tags=trim,shrink,edit,shape - home.autoSplitPDF.title=Автоматичне розділення сторінок home.autoSplitPDF.desc=Автоматичне розділення відсканованого PDF-файлу за допомогою фізичного роздільника відсканованих сторінок QR-коду autoSplitPDF.tags=QR-based,separate,scan-segment,organize - home.sanitizePdf.title=Санітарна обробка home.sanitizePdf.desc=Видалення скриптів та інших елементів з PDF-файлів sanitizePdf.tags=clean,secure,safe,remove-threats - home.URLToPDF.title=URL/сайт у PDF home.URLToPDF.desc=Конвертує будь-який http(s)URL у PDF URLToPDF.tags=web-capture,save-page,web-to-doc,archive - home.HTMLToPDF.title=HTML у PDF home.HTMLToPDF.desc=Конвертує будь-який HTML-файл або zip-файл у PDF. HTMLToPDF.tags=markup,web-content,transformation,convert @@ -411,15 +385,13 @@ home.showJS.title=Показати Javascript home.showJS.desc=Шукає та відображає будь-який JS, вбудований у PDF-файл. showJS.tags=JS - home.autoRedact.title=Автоматичне редагування home.autoRedact.desc=Автоматичне затемнення (чорніння) тексту в PDF на основі вхідного тексту autoRedact.tags=Redact,Hide,black out,black,marker,hidden - -home.tableExtract.title=PDF у CSV -home.tableExtract.desc=Видобуває таблиці з PDF та перетворює їх у CSV -tableExtract.tags=CSV,Table Extraction,extract,convert +home.tableExtraxt.title=PDF у CSV +home.tableExtraxt.desc=Видобуває таблиці з PDF та перетворює їх у CSV +tableExtraxt.tags=CSV,Table Extraction,extract,convert home.autoSizeSplitPDF.title=Автоматичне розділення за розміром/кількістю @@ -451,7 +423,6 @@ home.BookToPDF.title=Книга у PDF home.BookToPDF.desc=Конвертує формати книги/комікса у PDF за допомогою calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle - ########################### # # # WEB PAGES # @@ -515,6 +486,7 @@ MarkdownToPDF.help=Робота в процесі MarkdownToPDF.credit=Використовує WeasyPrint + #url-to-pdf URLToPDF.title=URL у PDF URLToPDF.header=URL у PDF @@ -626,6 +598,7 @@ autoSplitPDF.submit=Надіслати #pipeline pipeline.title=Пайплайн + #pageLayout pageLayout.title=Многосторінковий макет pageLayout.header=Многосторінковий макет @@ -640,6 +613,7 @@ scalePages.pageSize=Розмір сторінки документа. scalePages.scaleFactor=Рівень масштабування (обрізки) сторінки. scalePages.submit=Відправити + #certSign certSign.title=Підпис сертифікатом certSign.header=Підпишіть PDF своїм сертифікатом (робота в процесі) @@ -681,14 +655,12 @@ compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Порівняти - #BookToPDF BookToPDF.title=Книги та комікси в PDF BookToPDF.header=Конвертувати книгу в PDF BookToPDF.credit=Використовується Calibre BookToPDF.submit=Конвертувати - #PDFToBook PDFToBook.title=PDF в книгу PDFToBook.header=PDF в книгу @@ -696,7 +668,6 @@ PDFToBook.selectText.1=Формат PDFToBook.credit=Використовується Calibre PDFToBook.submit=Конвертувати - #sign sign.title=Підпис sign.header=Підписати PDF @@ -817,12 +788,10 @@ multiTool.title=Мультіінструмент PDF multiTool.header=Мультіінструмент PDF multiTool.uploadPrompts=Будь ласка, завантажте PDF - -#viewPdf +#view pdf viewPdf.title=Переглянути PDF viewPdf.header=Переглянути PDF - #pageRemover pageRemover.title=Видалення сторінок pageRemover.header=Видалення сторінок PDF @@ -838,7 +807,7 @@ rotate.selectAngle=Виберіть кут повороту (кратний 90 rotate.submit=Повернути -#split +#split-pdfs split.title=Розділити PDF split.header=Розділити PDF split.desc.1=Числа, які ви вибрали, це номери сторінок, на яких ви хочете зробити розділ. @@ -853,7 +822,7 @@ split.splitPages=Введіть сторінки для розділення: split.submit=Розділити -#imageToPDF +#merge imageToPDF.title=Зображення в PDF imageToPDF.header=Зображення в PDF imageToPDF.submit=Конвертувати @@ -1009,14 +978,12 @@ PDFToXML.header=PDF в XML PDFToXML.credit=Цей сервіс використовує LibreOffice для перетворення файлів. PDFToXML.submit=Конвертувати - #PDFToCSV PDFToCSV.title=PDF в CSV PDFToCSV.header=PDF в CSV PDFToCSV.prompt=Виберіть сторінку для витягу таблиці PDFToCSV.submit=Конвертувати - #split-by-size-or-count split-by-size-or-count.title=Розділити PDF за розміром або кількістю split-by-size-or-count.header=Розділити PDF за розміром або кількістю @@ -1063,6 +1030,7 @@ licenses.module=Модуль licenses.version=Версія licenses.license=Ліцензія + # error error.sorry=Вибачте за незручності! error.needHelp=Потрібна допомога / Знайшли проблему? @@ -1074,4 +1042,5 @@ error.github=Надіслати запит на GitHub error.showStack=Показати стек викликів error.copyStack=Скопіювати стек викликів error.githubSubmit=GitHub - Надіслати запит -error.discordSubmit=Discord - Надіслати повідомлення підтримки \ No newline at end of file +error.discordSubmit=Discord - Надіслати повідомлення підтримки + From 0f367c23aa43e671786c0cfee44cd89459aa5428 Mon Sep 17 00:00:00 2001 From: Dimitris Kaitantzidis <44621809+DimK10@users.noreply.github.com> Date: Mon, 8 Apr 2024 23:53:00 +0300 Subject: [PATCH 09/59] 359 split metadata lost (#1049) * Closes #359 * Adds a minor fix, the modified date should be changed after a modification is made. --- src/main/java/stirling/software/SPDF/utils/PdfUtils.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index f51eff2a..24f51c6a 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -6,6 +6,7 @@ import java.awt.image.RenderedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Calendar; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -434,7 +435,7 @@ public class PdfUtils { .build(); } - public static PDDocument setMetadataToPdf(PDDocument pdf, PdfMetadata pdfMetadata) { + public static void setMetadataToPdf(PDDocument pdf, PdfMetadata pdfMetadata) { pdf.getDocumentInformation().setAuthor(pdfMetadata.getAuthor()); pdf.getDocumentInformation().setProducer(pdfMetadata.getProducer()); pdf.getDocumentInformation().setTitle(pdfMetadata.getTitle()); @@ -442,8 +443,6 @@ public class PdfUtils { pdf.getDocumentInformation().setSubject(pdfMetadata.getSubject()); pdf.getDocumentInformation().setKeywords(pdfMetadata.getKeywords()); pdf.getDocumentInformation().setCreationDate(pdfMetadata.getCreationDate()); - pdf.getDocumentInformation().setModificationDate(pdfMetadata.getModificationDate()); - - return pdf; + pdf.getDocumentInformation().setModificationDate(Calendar.getInstance()); } } From 66d5f3e4b5d529eec673cfb256f52d875bb7c38c Mon Sep 17 00:00:00 2001 From: Ludy Date: Tue, 9 Apr 2024 00:33:58 +0200 Subject: [PATCH 10/59] add sync-readme (#1051) --- .github/workflows/sync_files.yml | 87 +++++++++++++++++++++++++++++ .github/workflows/sync_versions.yml | 51 ----------------- 2 files changed, 87 insertions(+), 51 deletions(-) create mode 100644 .github/workflows/sync_files.yml delete mode 100644 .github/workflows/sync_versions.yml diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml new file mode 100644 index 00000000..eba5a019 --- /dev/null +++ b/.github/workflows/sync_files.yml @@ -0,0 +1,87 @@ +name: Sync Files + +on: + push: + branches: + - main + paths: + - "build.gradle" + - "src/main/resources/messages_*.properties" + +permissions: + contents: write + pull-requests: write + +jobs: + sync-versions: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.1.1 + - name: Set up Python + uses: actions/setup-python@v5.1.0 + with: + python-version: "3.x" + - name: Install dependencies + run: pip install pyyaml + - name: Sync versions + run: python .github/scripts/gradle_to_chart.py + - name: Set up git config + run: | + git config --global user.email "GitHub Action " + git config --global user.name "GitHub Action " + - name: Run git add + run: | + git add . + git diff --staged --quiet || git commit -m ":floppy_disk: Sync Versions + > Made via sync_files.yml" || echo "no changes" + - name: Create Pull Request + uses: peter-evans/create-pull-request@v6.0.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Update files + committer: GitHub Action + author: GitHub Action + signoff: true + branch: sync_version + title: ":floppy_disk: Update Version" + body: | + Auto-generated by [create-pull-request][1] + + [1]: https://github.com/peter-evans/create-pull-request + draft: false + delete-branch: true + sync-readme: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.1.1 + - name: Set up Python + uses: actions/setup-python@v5.1.0 + with: + python-version: "3.x" + - name: Sync README + run: python scripts/counter_translation.py + - name: Set up git config + run: | + git config --global user.email "GitHub Action " + git config --global user.name "GitHub Action " + - name: Run git add + run: | + git add . + git diff --staged --quiet || git commit -m ":memo: Sync README + > Made via sync_files.yml" || echo "no changes" + - name: Create Pull Request + uses: peter-evans/create-pull-request@v6.0.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Update files + committer: GitHub Action + author: GitHub Action + signoff: true + branch: sync_readme + title: ":memo: Update README: Translation Progress Table" + body: | + Auto-generated by [create-pull-request][1] + + [1]: https://github.com/peter-evans/create-pull-request + draft: false + delete-branch: true diff --git a/.github/workflows/sync_versions.yml b/.github/workflows/sync_versions.yml deleted file mode 100644 index dce4b4b4..00000000 --- a/.github/workflows/sync_versions.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Sync Versions - -on: - push: - branches: - - main - paths: - - "build.gradle" - -permissions: - contents: write - pull-requests: write - -jobs: - sync-versions: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4.1.1 - - name: Set up Python - uses: actions/setup-python@v5.0.0 - with: - python-version: '3.x' - - name: Install dependencies - run: pip install pyyaml - - name: Sync versions - run: python .github/scripts/gradle_to_chart.py - - name: Set up git config - run: | - git config --global user.email "GitHub Action " - git config --global user.name "GitHub Action " - - name: Run git add - run: | - git add . - git diff --staged --quiet || git commit -m ":floppy_disk: Sync Versions - > Made via sync_versions.yml" || echo "no changes" - - name: Create Pull Request - uses: peter-evans/create-pull-request@v6.0.0 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: Update files - committer: GitHub Action - author: GitHub Action - signoff: true - branch: sync_version - title: ":floppy_disk: Update Version" - body: | - Auto-generated by [create-pull-request][1] - - [1]: https://github.com/peter-evans/create-pull-request - draft: false - delete-branch: true From 5564f378e542a0ec379c28d44514b3b07402373c Mon Sep 17 00:00:00 2001 From: "pixeebot[bot]" <104101892+pixeebot[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 06:52:52 +0100 Subject: [PATCH 11/59] (Sonar) Fix "`String#replace` should be preferred to `String#replaceAll`" (#1056) Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com> --- src/main/java/stirling/software/SPDF/utils/GeneralUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index 18e890c4..1d7f7b01 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -185,7 +185,7 @@ public class GeneralUtils { // Insert multiplication between a number and 'n' (e.g., "4n" becomes "4*n") String withMultiplication = expression.replaceAll("(\\d)n", "$1*n"); // Now replace 'n' with its current value - return withMultiplication.replaceAll("n", String.valueOf(nValue)); + return withMultiplication.replace("n", String.valueOf(nValue)); } private static List handlePart(String part, int totalPages, int offset) { From 35a4462a86c374e996667130bc6c3c78cdb17448 Mon Sep 17 00:00:00 2001 From: Ludy Date: Tue, 9 Apr 2024 18:47:53 +0200 Subject: [PATCH 12/59] replace comma to dot (#1057) In several countries the comma is used as a decimal, the PR will replace the comma with a dot. --- src/main/java/stirling/software/SPDF/utils/GeneralUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index 1d7f7b01..61b72da6 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -88,6 +88,7 @@ public class GeneralUtils { } sizeStr = sizeStr.trim().toUpperCase(); + sizeStr = sizeStr.replace(",", ".").replace(" ", ""); try { if (sizeStr.endsWith("KB")) { return (long) From 276b6e521ab7081a221bef40af4aaf6398312372 Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Thu, 11 Apr 2024 23:40:05 +0200 Subject: [PATCH 13/59] Update messages_it_IT.properties (#1062) --- src/main/resources/messages_it_IT.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 5cb4841e..a7223018 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -189,7 +189,7 @@ multiTool.tags=Strumento multiplo,operazione multipla,interfaccia utente,trascin home.merge.title=Unisci home.merge.desc=Unisci facilmente più PDF in uno. -merge.tags=unione,operazioni sulla pagina,back end,lato server +merge.tags=unione,operazioni sulla pagina,back-end,lato server home.split.title=Dividi home.split.desc=Dividi un singolo PDF in più documenti. From 032388a8e3c1d9a18d49b317b3f0258540c1461c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 22:49:12 +0100 Subject: [PATCH 14/59] :memo: Update README: Translation Progress Table (#1063) :memo: Sync README > Made via sync_files.yml Co-authored-by: GitHub Action action@github.com --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 48375245..b9009640 100644 --- a/README.md +++ b/README.md @@ -164,23 +164,23 @@ Stirling PDF currently supports 27! | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | Arabic (العربية) (ar_AR) | ![58%](https://geps.dev/progress/58) | -| German (Deutsch) (de_DE) | ![95%](https://geps.dev/progress/95) | +| German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) | | French (Français) (fr_FR) | ![94%](https://geps.dev/progress/94) | | Spanish (Español) (es_ES) | ![95%](https://geps.dev/progress/95) | | Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | -| Traditional Chinese (繁體中文) (zh_TW) | ![97%](https://geps.dev/progress/97) | +| Traditional Chinese (繁體中文) (zh_TW) | ![99%](https://geps.dev/progress/99) | | Catalan (Català) (ca_CA) | ![65%](https://geps.dev/progress/65) | | Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | | Swedish (Svenska) (sv_SE) | ![58%](https://geps.dev/progress/58) | | Polish (Polski) (pl_PL) | ![60%](https://geps.dev/progress/60) | | Romanian (Română) (ro_RO) | ![58%](https://geps.dev/progress/58) | -| Korean (한국어) (ko_KR) | ![92%](https://geps.dev/progress/92) | +| Korean (한국어) (ko_KR) | ![94%](https://geps.dev/progress/94) | | Portuguese Brazilian (Português) (pt_BR) | ![74%](https://geps.dev/progress/74) | -| Russian (Русский) (ru_RU) | ![92%](https://geps.dev/progress/92) | +| Russian (Русский) (ru_RU) | ![94%](https://geps.dev/progress/94) | | Basque (Euskara) (eu_ES) | ![76%](https://geps.dev/progress/76) | -| Japanese (日本語) (ja_JP) | ![92%](https://geps.dev/progress/92) | +| Japanese (日本語) (ja_JP) | ![94%](https://geps.dev/progress/94) | | Dutch (Nederlands) (nl_NL) | ![92%](https://geps.dev/progress/92) | -| Greek (Ελληνικά) (el_GR) | ![77%](https://geps.dev/progress/77) | +| Greek (Ελληνικά) (el_GR) | ![92%](https://geps.dev/progress/92) | | Turkish (Türkçe) (tr_TR) | ![99%](https://geps.dev/progress/99) | | Indonesia (Bahasa Indonesia) (id_ID) | ![87%](https://geps.dev/progress/87) | | Hindi (हिंदी) (hi_IN) | ![88%](https://geps.dev/progress/88) | From ace4e200b130a8006778121de4c2692ffe13242d Mon Sep 17 00:00:00 2001 From: Ludy Date: Sun, 14 Apr 2024 23:07:03 +0200 Subject: [PATCH 15/59] Fix: Resolve Username Case Sensitivity Issue in Login Flow (#1070) * Fix: Username changing The only situation where the username must be unique is when changing the username. * Update UserController.java --- .../CustomAuthenticationFailureHandler.java | 2 +- .../SPDF/config/security/FirstLoginFilter.java | 2 +- .../config/security/InitialSecuritySetup.java | 2 +- .../SPDF/config/security/UserService.java | 14 +++++++++----- .../SPDF/controller/api/UserController.java | 15 ++++++++------- .../SPDF/controller/web/AccountWebController.java | 4 ++-- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java index 038e087f..f4f5a37d 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java @@ -56,7 +56,7 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF } private boolean isDemoUser(String username) { - Optional user = userService.findByUsername(username); + Optional user = userService.findByUsernameIgnoreCase(username); return user.isPresent() && user.get().getAuthorities().stream() .anyMatch(authority -> "ROLE_DEMO_USER".equals(authority.getAuthority())); diff --git a/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java b/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java index b272327a..5936ea3f 100644 --- a/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java @@ -39,7 +39,7 @@ public class FirstLoginFilter extends OncePerRequestFilter { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null && authentication.isAuthenticated()) { - Optional user = userService.findByUsername(authentication.getName()); + Optional user = userService.findByUsernameIgnoreCase(authentication.getName()); if ("GET".equalsIgnoreCase(method) && user.isPresent() && user.get().isFirstLogin() diff --git a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java index 3b396b15..0d87ca48 100644 --- a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java +++ b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java @@ -38,7 +38,7 @@ public class InitialSecuritySetup { initialUsername, initialPassword, Role.ADMIN.getRoleId(), true); } } - if (!userService.usernameExists(Role.INTERNAL_API_USER.getRoleId())) { + if (!userService.usernameExistsIgnoreCase(Role.INTERNAL_API_USER.getRoleId())) { userService.saveUser( Role.INTERNAL_API_USER.getRoleId(), UUID.randomUUID().toString(), diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index 666baa93..83f38bd7 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -62,7 +62,7 @@ public class UserService implements UserServiceInterface { public User addApiKeyToUser(String username) { User user = userRepository - .findByUsername(username) + .findByUsernameIgnoreCase(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); user.setApiKey(generateApiKey()); @@ -76,7 +76,7 @@ public class UserService implements UserServiceInterface { public String getApiKeyForUser(String username) { User user = userRepository - .findByUsername(username) + .findByUsernameIgnoreCase(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); return user.getApiKey(); } @@ -103,7 +103,7 @@ public class UserService implements UserServiceInterface { } public boolean validateApiKeyForUser(String username, String apiKey) { - Optional userOpt = userRepository.findByUsername(username); + Optional userOpt = userRepository.findByUsernameIgnoreCase(username); return userOpt.isPresent() && userOpt.get().getApiKey().equals(apiKey); } @@ -136,7 +136,7 @@ public class UserService implements UserServiceInterface { } public void deleteUser(String username) { - Optional userOpt = userRepository.findByUsername(username); + Optional userOpt = userRepository.findByUsernameIgnoreCase(username); if (userOpt.isPresent()) { for (Authority authority : userOpt.get().getAuthorities()) { if (authority.getAuthority().equals(Role.INTERNAL_API_USER.getRoleId())) { @@ -151,12 +151,16 @@ public class UserService implements UserServiceInterface { return userRepository.findByUsername(username).isPresent(); } + public boolean usernameExistsIgnoreCase(String username) { + return userRepository.findByUsernameIgnoreCase(username).isPresent(); + } + public boolean hasUsers() { return userRepository.count() > 0; } public void updateUserSettings(String username, Map updates) { - Optional userOpt = userRepository.findByUsername(username); + Optional userOpt = userRepository.findByUsernameIgnoreCase(username); if (userOpt.isPresent()) { User user = userOpt.get(); Map settingsMap = user.getSettings(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index 598a832d..a7a40a0a 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -43,7 +43,7 @@ public class UserController { @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/register") public String register(@ModelAttribute UsernameAndPass requestModel, Model model) { - if (userService.usernameExists(requestModel.getUsername())) { + if (userService.usernameExistsIgnoreCase(requestModel.getUsername())) { model.addAttribute("error", "Username already exists"); return "register"; } @@ -70,7 +70,8 @@ public class UserController { return new RedirectView("/account?messageType=notAuthenticated"); } - Optional userOpt = userService.findByUsernameIgnoreCase(principal.getName()); + // The username MUST be unique when renaming + Optional userOpt = userService.findByUsername(principal.getName()); if (userOpt == null || userOpt.isEmpty()) { return new RedirectView("/account?messageType=userNotFound"); @@ -113,7 +114,7 @@ public class UserController { return new RedirectView("/change-creds?messageType=notAuthenticated"); } - Optional userOpt = userService.findByUsername(principal.getName()); + Optional userOpt = userService.findByUsernameIgnoreCase(principal.getName()); if (userOpt == null || userOpt.isEmpty()) { return new RedirectView("/change-creds?messageType=userNotFound"); @@ -146,7 +147,7 @@ public class UserController { return new RedirectView("/account?messageType=notAuthenticated"); } - Optional userOpt = userService.findByUsername(principal.getName()); + Optional userOpt = userService.findByUsernameIgnoreCase(principal.getName()); if (userOpt == null || userOpt.isEmpty()) { return new RedirectView("/account?messageType=userNotFound"); @@ -207,7 +208,7 @@ public class UserController { return new RedirectView("/addUsers?messageType=usernameExists"); } } - if (userService.usernameExists(username)) { + if (userService.usernameExistsIgnoreCase(username)) { return new RedirectView("/addUsers?messageType=usernameExists"); } try { @@ -231,7 +232,7 @@ public class UserController { public RedirectView deleteUser( @PathVariable(name = "username") String username, Authentication authentication) { - if (!userService.usernameExists(username)) { + if (!userService.usernameExistsIgnoreCase(username)) { return new RedirectView("/addUsers?messageType=deleteUsernameExists"); } @@ -239,7 +240,7 @@ public class UserController { String currentUsername = authentication.getName(); // Check if the provided username matches the current session's username - if (currentUsername.equals(username)) { + if (currentUsername.equalsIgnoreCase(username)) { return new RedirectView("/addUsers?messageType=deleteCurrentUser"); } invalidateUserSessions(username); diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java index d27f510a..c9ffc19d 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java @@ -95,7 +95,7 @@ public class AccountWebController { // Fetch user details from the database Optional user = - userRepository.findByUsername( + userRepository.findByUsernameIgnoreCase( username); // Assuming findByUsername method exists if (!user.isPresent()) { // Handle error appropriately @@ -145,7 +145,7 @@ public class AccountWebController { // Fetch user details from the database Optional user = - userRepository.findByUsername( + userRepository.findByUsernameIgnoreCase( username); // Assuming findByUsername method exists if (!user.isPresent()) { // Handle error appropriately From 73f90885b448d009262a76d48044355f24ca881f Mon Sep 17 00:00:00 2001 From: diemade Date: Sat, 20 Apr 2024 11:45:58 +0200 Subject: [PATCH 16/59] Update messages_de_DE.properties (#1069) Only full sentences should end in a period, Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> --- src/main/resources/messages_de_DE.properties | 56 ++++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index f5a53881..535a2236 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -188,58 +188,58 @@ home.multiTool.desc=Seiten zusammenführen, drehen, neu anordnen und entfernen multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side home.merge.title=Zusammenführen -home.merge.desc=Mehrere PDF-Dateien zu einer einzigen zusammenführen. +home.merge.desc=Mehrere PDF-Dateien zu einer einzigen zusammenführen merge.tags=zusammenführen,seitenvorgänge,back end,serverseite home.split.title=Aufteilen -home.split.desc=PDFs in mehrere Dokumente aufteilen. +home.split.desc=PDFs in mehrere Dokumente aufteilen split.tags=seitenoperationen,teilen,mehrseitig,ausschneiden,serverseitig home.rotate.title=Drehen -home.rotate.desc=Drehen Sie Ihre PDFs ganz einfach. +home.rotate.desc=Drehen Sie Ihre PDFs ganz einfach rotate.tags=serverseitig home.imageToPdf.title=Bild zu PDF -home.imageToPdf.desc=Konvertieren Sie ein Bild (PNG, JPEG, GIF) in ein PDF. +home.imageToPdf.desc=Konvertieren Sie ein Bild (PNG, JPEG, GIF) in ein PDF imageToPdf.tags=konvertierung,img,jpg,bild,foto home.pdfToImage.title=PDF zu Bild -home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF). +home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF) pdfToImage.tags=konvertierung,img,jpg,bild,foto home.pdfOrganiser.title=Organisieren -home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern. +home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern pdfOrganiser.tags=duplex,gerade,ungerade,sortieren,verschieben home.addImage.title=Bild einfügen -home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit). +home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit) addImage.tags=img,jpg,bild,foto home.watermark.title=Wasserzeichen hinzufügen -home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu. +home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu watermark.tags=text,wiederholend,beschriftung,besitzen,urheberrecht,marke,img,jpg,bild,foto home.permissions.title=Berechtigungen ändern -home.permissions.desc=Die Berechtigungen für Ihr PDF-Dokument verändern. +home.permissions.desc=Die Berechtigungen für Ihr PDF-Dokument verändern permissions.tags=lesen,schreiben,bearbeiten,drucken home.removePages.title=Entfernen -home.removePages.desc=Ungewollte Seiten aus dem PDF entfernen. +home.removePages.desc=Ungewollte Seiten aus dem PDF entfernen removePages.tags=seiten entfernen,seiten löschen home.addPassword.title=Passwort hinzufügen -home.addPassword.desc=Das PDF mit einem Passwort verschlüsseln. +home.addPassword.desc=Das PDF mit einem Passwort verschlüsseln addPassword.tags=sicher,sicherheit home.removePassword.title=Passwort entfernen -home.removePassword.desc=Den Passwortschutz eines PDFs entfernen. +home.removePassword.desc=Den Passwortschutz eines PDFs entfernen removePassword.tags=sichern,entschlüsseln,sicherheit,passwort aufheben,passwort löschen home.compressPdfs.title=Komprimieren -home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren. +home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren compressPdfs.tags=komprimieren,verkleinern,minimieren @@ -252,7 +252,7 @@ home.fileToPDF.desc=Konvertieren Sie nahezu jede Datei in PDF (DOCX, PNG, XLS, P fileToPDF.tags=transformation,format,dokument,bild,folie,text,konvertierung,büro,dokumente,word,excel,powerpoint home.ocr.title=Führe OCR/Cleanup-Scans aus -home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu. +home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu ocr.tags=erkennung,text,bild,scannen,lesen,identifizieren,erkennung,bearbeitbar @@ -445,7 +445,7 @@ autoRedact.textsToRedactLabel=Zu zensierender Text (einer pro Zeile) autoRedact.textsToRedactPlaceholder=z.B. \nVertraulich \nStreng geheim autoRedact.useRegexLabel=Regex verwenden autoRedact.wholeWordSearchLabel=Ganzes Wort suchen -autoRedact.customPaddingLabel=Benutzerdefinierte Extra-Padding +autoRedact.customPaddingLabel=Zensierten Bereich vergrößern autoRedact.convertPDFToImageLabel=PDF in PDF-Bild konvertieren (zum Entfernen von Text hinter dem Kasten) autoRedact.submitButton=Zensieren @@ -499,16 +499,16 @@ HTMLToPDF.header=HTML zu PDF HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc. HTMLToPDF.submit=Konvertieren HTMLToPDF.credit=Verwendet WeasyPrint -HTMLToPDF.zoom=Zoomstufe zur Darstellung der Website. -HTMLToPDF.pageWidth=Breite der Seite in Zentimetern. (Leer auf Standard) -HTMLToPDF.pageHeight=Höhe der Seite in Zentimetern. (Leer auf Standard) -HTMLToPDF.marginTop=Oberer Rand der Seite in Millimetern. (Leer auf Standard) -HTMLToPDF.marginBottom=Unterer Rand der Seite in Millimetern. (Leer auf Standard) -HTMLToPDF.marginLeft=Linker Rand der Seite in Millimetern. (Leer auf Standard) -HTMLToPDF.marginRight=Linker Rand der Seite in Millimetern. (Leer auf Standard) -HTMLToPDF.printBackground=Den Hintergrund der Website rendern. +HTMLToPDF.zoom=Zoomstufe zur Darstellung der Website +HTMLToPDF.pageWidth=Breite der Seite in Zentimetern (Leer auf Standard) +HTMLToPDF.pageHeight=Höhe der Seite in Zentimetern (Leer auf Standard) +HTMLToPDF.marginTop=Oberer Rand der Seite in Millimetern (Leer auf Standard) +HTMLToPDF.marginBottom=Unterer Rand der Seite in Millimetern (Leer auf Standard) +HTMLToPDF.marginLeft=Linker Rand der Seite in Millimetern (Leer auf Standard) +HTMLToPDF.marginRight=Linker Rand der Seite in Millimetern (Leer auf Standard) +HTMLToPDF.printBackground=Den Hintergrund der Website rendern HTMLToPDF.defaultHeader=Standardkopfzeile aktivieren (Name und Seitenzahl) -HTMLToPDF.cssMediaType=CSS-Medientyp der Seite ändern. +HTMLToPDF.cssMediaType=CSS-Medientyp der Seite ändern HTMLToPDF.none=Keine HTMLToPDF.print=Drucken HTMLToPDF.screen=Bildschirm @@ -609,8 +609,8 @@ pageLayout.submit=Abschicken #scalePages scalePages.title=Seitengröße anpassen scalePages.header=Seitengröße anpassen -scalePages.pageSize=Format der Seiten des Dokuments. -scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite. +scalePages.pageSize=Format der Seiten des Dokuments +scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite scalePages.submit=Abschicken @@ -753,7 +753,7 @@ compress.submit=Komprimieren #Add image addImage.title=Bild hinzufügen addImage.header=Ein Bild einfügen -addImage.everyPage=Jede Seite? +addImage.everyPage=In jede Seite einfügen? addImage.upload=Bild hinzufügen addImage.submit=Bild hinzufügen @@ -938,7 +938,7 @@ pdfToPDFA.title=PDF zu PDF/A pdfToPDFA.header=PDF zu PDF/A pdfToPDFA.credit=Dieser Dienst verwendet OCRmyPDF für die PDF/A-Konvertierung pdfToPDFA.submit=Konvertieren -pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.tip=Dieser Dienst kann nur einzelne Eingangsdateien verarbeiten. #PDFToWord From 06a178cc03024ee266f66cacd56133ce17f2e2e0 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 20 Apr 2024 14:46:49 +0100 Subject: [PATCH 17/59] Cache form inputs between runs (#1066) * Changes! * lang --- .../api/SplitPdfBySizeController.java | 208 ++++++++++-------- .../api/security/SanitizeController.java | 26 ++- src/main/resources/messages_ar_AR.properties | 14 +- src/main/resources/messages_bg_BG.properties | 14 +- src/main/resources/messages_ca_CA.properties | 14 +- src/main/resources/messages_de_DE.properties | 14 +- src/main/resources/messages_el_GR.properties | 14 +- src/main/resources/messages_en_GB.properties | 14 +- src/main/resources/messages_en_US.properties | 14 +- src/main/resources/messages_es_ES.properties | 14 +- src/main/resources/messages_eu_ES.properties | 14 +- src/main/resources/messages_fr_FR.properties | 14 +- src/main/resources/messages_hi_IN.properties | 14 +- src/main/resources/messages_hu_HU.properties | 14 +- src/main/resources/messages_id_ID.properties | 14 +- src/main/resources/messages_it_IT.properties | 14 +- src/main/resources/messages_ja_JP.properties | 14 +- src/main/resources/messages_ko_KR.properties | 14 +- src/main/resources/messages_nl_NL.properties | 14 +- src/main/resources/messages_pl_PL.properties | 14 +- src/main/resources/messages_pt_BR.properties | 14 +- src/main/resources/messages_pt_PT.properties | 14 +- src/main/resources/messages_ro_RO.properties | 14 +- src/main/resources/messages_ru_RU.properties | 14 +- .../resources/messages_sr_LATN_RS.properties | 14 +- src/main/resources/messages_sv_SE.properties | 14 +- src/main/resources/messages_tr_TR.properties | 14 +- src/main/resources/messages_uk_UA.properties | 26 ++- src/main/resources/messages_zh_CN.properties | 14 +- src/main/resources/messages_zh_TW.properties | 14 +- .../resources/static/js/cacheFormInputs.js | 82 +++++++ src/main/resources/static/js/settings.js | 9 + .../resources/templates/fragments/common.html | 2 +- .../resources/templates/fragments/navbar.html | 6 +- 34 files changed, 569 insertions(+), 168 deletions(-) create mode 100644 src/main/resources/static/js/cacheFormInputs.js diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java index 45d2dd38..40ac2d16 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java @@ -4,8 +4,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -41,117 +39,137 @@ public class SplitPdfBySizeController { + " if 10MB and each page is 1MB and you enter 2MB then 5 docs each 2MB (rounded so that it accepts 1.9MB but not 2.1MB) Input:PDF Output:ZIP-PDF Type:SISO") public ResponseEntity autoSplitPdf(@ModelAttribute SplitPdfBySizeOrCountRequest request) throws Exception { - List splitDocumentsBoas = new ArrayList(); MultipartFile file = request.getFileInput(); - PDDocument sourceDocument = Loader.loadPDF(file.getBytes()); - - // 0 = size, 1 = page count, 2 = doc count - int type = request.getSplitType(); - String value = request.getSplitValue(); - - if (type == 0) { // Split by size - long maxBytes = GeneralUtils.convertSizeToBytes(value); - long currentSize = 0; - PDDocument currentDoc = new PDDocument(); - - for (PDPage page : sourceDocument.getPages()) { - ByteArrayOutputStream pageOutputStream = new ByteArrayOutputStream(); - PDDocument tempDoc = new PDDocument(); - tempDoc.addPage(page); - tempDoc.save(pageOutputStream); - tempDoc.close(); - - long pageSize = pageOutputStream.size(); - if (currentSize + pageSize > maxBytes) { - // Save and reset current document - splitDocumentsBoas.add(currentDocToByteArray(currentDoc)); - currentDoc = new PDDocument(); - currentSize = 0; - } - - currentDoc.addPage(page); - currentSize += pageSize; - } - // Add the last document if it contains any pages - if (currentDoc.getPages().getCount() != 0) { - splitDocumentsBoas.add(currentDocToByteArray(currentDoc)); - } - } else if (type == 1) { // Split by page count - int pageCount = Integer.parseInt(value); - int currentPageCount = 0; - PDDocument currentDoc = new PDDocument(); - - for (PDPage page : sourceDocument.getPages()) { - currentDoc.addPage(page); - currentPageCount++; - - if (currentPageCount == pageCount) { - // Save and reset current document - splitDocumentsBoas.add(currentDocToByteArray(currentDoc)); - currentDoc = new PDDocument(); - currentPageCount = 0; - } - } - // Add the last document if it contains any pages - if (currentDoc.getPages().getCount() != 0) { - splitDocumentsBoas.add(currentDocToByteArray(currentDoc)); - } - } else if (type == 2) { // Split by doc count - int documentCount = Integer.parseInt(value); - int totalPageCount = sourceDocument.getNumberOfPages(); - int pagesPerDocument = totalPageCount / documentCount; - int extraPages = totalPageCount % documentCount; - int currentPageIndex = 0; - - for (int i = 0; i < documentCount; i++) { - PDDocument currentDoc = new PDDocument(); - int pagesToAdd = pagesPerDocument + (i < extraPages ? 1 : 0); - - for (int j = 0; j < pagesToAdd; j++) { - currentDoc.addPage(sourceDocument.getPage(currentPageIndex++)); - } - - splitDocumentsBoas.add(currentDocToByteArray(currentDoc)); - } - } else { - throw new IllegalArgumentException("Invalid argument for split type"); - } - - sourceDocument.close(); - Path zipFile = Files.createTempFile("split_documents", ".zip"); String filename = Filenames.toSimpleFileName(file.getOriginalFilename()) .replaceFirst("[.][^.]+$", ""); - byte[] data; + byte[] data = null; + try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile)); + PDDocument sourceDocument = Loader.loadPDF(file.getBytes())) { - try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { - for (int i = 0; i < splitDocumentsBoas.size(); i++) { - String fileName = filename + "_" + (i + 1) + ".pdf"; - ByteArrayOutputStream baos = splitDocumentsBoas.get(i); - byte[] pdf = baos.toByteArray(); + int type = request.getSplitType(); + String value = request.getSplitValue(); - ZipEntry pdfEntry = new ZipEntry(fileName); - zipOut.putNextEntry(pdfEntry); - zipOut.write(pdf); - zipOut.closeEntry(); + if (type == 0) { + long maxBytes = GeneralUtils.convertSizeToBytes(value); + handleSplitBySize(sourceDocument, maxBytes, zipOut, filename); + } else if (type == 1) { + int pageCount = Integer.parseInt(value); + handleSplitByPageCount(sourceDocument, pageCount, zipOut, filename); + } else if (type == 2) { + int documentCount = Integer.parseInt(value); + handleSplitByDocCount(sourceDocument, documentCount, zipOut, filename); + } else { + throw new IllegalArgumentException("Invalid argument for split type"); } + } catch (Exception e) { e.printStackTrace(); } finally { data = Files.readAllBytes(zipFile); - Files.delete(zipFile); + Files.deleteIfExists(zipFile); } return WebResponseUtils.bytesToWebResponse( data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM); } - private ByteArrayOutputStream currentDocToByteArray(PDDocument document) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - document.save(baos); - document.close(); - return baos; + private void handleSplitBySize( + PDDocument sourceDocument, long maxBytes, ZipOutputStream zipOut, String baseFilename) + throws IOException { + long currentSize = 0; + PDDocument currentDoc = new PDDocument(); + int fileIndex = 1; + + for (int pageIndex = 0; pageIndex < sourceDocument.getNumberOfPages(); pageIndex++) { + PDPage page = sourceDocument.getPage(pageIndex); + ByteArrayOutputStream pageOutputStream = new ByteArrayOutputStream(); + + try (PDDocument tempDoc = new PDDocument()) { + PDPage importedPage = tempDoc.importPage(page); // This creates a new PDPage object + tempDoc.save(pageOutputStream); + } + + long pageSize = pageOutputStream.size(); + if (currentSize + pageSize > maxBytes) { + if (currentDoc.getNumberOfPages() > 0) { + saveDocumentToZip(currentDoc, zipOut, baseFilename, fileIndex++); + currentDoc.close(); // Make sure to close the document + currentDoc = new PDDocument(); + currentSize = 0; + } + } + + PDPage newPage = new PDPage(page.getCOSObject()); // Re-create the page + currentDoc.addPage(newPage); + currentSize += pageSize; + } + + if (currentDoc.getNumberOfPages() != 0) { + saveDocumentToZip(currentDoc, zipOut, baseFilename, fileIndex++); + currentDoc.close(); + } + } + + private void handleSplitByPageCount( + PDDocument sourceDocument, int pageCount, ZipOutputStream zipOut, String baseFilename) + throws IOException { + int currentPageCount = 0; + PDDocument currentDoc = new PDDocument(); + int fileIndex = 1; + for (PDPage page : sourceDocument.getPages()) { + currentDoc.addPage(page); + currentPageCount++; + + if (currentPageCount == pageCount) { + // Save and reset current document + saveDocumentToZip(currentDoc, zipOut, baseFilename, fileIndex++); + currentDoc = new PDDocument(); + currentPageCount = 0; + } + } + // Add the last document if it contains any pages + if (currentDoc.getPages().getCount() != 0) { + saveDocumentToZip(currentDoc, zipOut, baseFilename, fileIndex++); + } + } + + private void handleSplitByDocCount( + PDDocument sourceDocument, + int documentCount, + ZipOutputStream zipOut, + String baseFilename) + throws IOException { + int totalPageCount = sourceDocument.getNumberOfPages(); + int pagesPerDocument = totalPageCount / documentCount; + int extraPages = totalPageCount % documentCount; + int currentPageIndex = 0; + int fileIndex = 1; + for (int i = 0; i < documentCount; i++) { + PDDocument currentDoc = new PDDocument(); + int pagesToAdd = pagesPerDocument + (i < extraPages ? 1 : 0); + + for (int j = 0; j < pagesToAdd; j++) { + currentDoc.addPage(sourceDocument.getPage(currentPageIndex++)); + } + + saveDocumentToZip(currentDoc, zipOut, baseFilename, fileIndex++); + } + } + + private void saveDocumentToZip( + PDDocument document, ZipOutputStream zipOut, String baseFilename, int index) + throws IOException { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + document.save(outStream); + document.close(); // Close the document to free resources + + // Create a new zip entry + ZipEntry zipEntry = new ZipEntry(baseFilename + "_" + index + ".pdf"); + zipOut.putNextEntry(zipEntry); + zipOut.write(outStream.toByteArray()); + zipOut.closeEntry(); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java index f33df3aa..dd2c79da 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java @@ -139,25 +139,29 @@ public class SanitizeController { for (PDPage page : allPages) { PDResources res = page.getResources(); - - // Remove embedded files from the PDF - res.getCOSObject().removeItem(COSName.getPDFName("EmbeddedFiles")); + if (res != null && res.getCOSObject() != null) { + res.getCOSObject().removeItem(COSName.getPDFName("EmbeddedFiles")); + } } } private void sanitizeMetadata(PDDocument document) { - PDMetadata metadata = document.getDocumentCatalog().getMetadata(); - if (metadata != null) { - document.getDocumentCatalog().setMetadata(null); + if (document.getDocumentCatalog() != null) { + PDMetadata metadata = document.getDocumentCatalog().getMetadata(); + if (metadata != null) { + document.getDocumentCatalog().setMetadata(null); + } } } private void sanitizeLinks(PDDocument document) throws IOException { for (PDPage page : document.getPages()) { for (PDAnnotation annotation : page.getAnnotations()) { - if (annotation instanceof PDAnnotationLink) { + if (annotation != null && annotation instanceof PDAnnotationLink) { PDAction action = ((PDAnnotationLink) annotation).getAction(); - if (action instanceof PDActionLaunch || action instanceof PDActionURI) { + if (action != null + && (action instanceof PDActionLaunch + || action instanceof PDActionURI)) { ((PDAnnotationLink) annotation).setAction(null); } } @@ -167,7 +171,11 @@ public class SanitizeController { private void sanitizeFonts(PDDocument document) { for (PDPage page : document.getPages()) { - page.getResources().getCOSObject().removeItem(COSName.getPDFName("Font")); + if (page != null + && page.getResources() != null + && page.getResources().getCOSObject() != null) { + page.getResources().getCOSObject().removeItem(COSName.getPDFName("Font")); + } } } } diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 8985d647..44329a7b 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=تنزيل الملف settings.zipThreshold=ملفات مضغوطة عند تجاوز عدد الملفات التي تم تنزيلها settings.signOut=Sign Out settings.accountSettings=Account Settings - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Change Credentials changeCreds.header=Update Your Account Details @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.submit=Split PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 68ab7af5..71983955 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Изтегли файл settings.zipThreshold=Архивирайте файловете, когато броят на изтеглените файлове надвишава settings.signOut=Изход settings.accountSettings=Настройки на акаунта - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Промяна на идентификационните данни changeCreds.header=Актуализирайте данните за акаунта си @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.submit=Split PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index b73be3d7..1c5fcea3 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Descarrega Arxiu settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi settings.signOut=Sortir settings.accountSettings=Account Settings - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Change Credentials changeCreds.header=Update Your Account Details @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.submit=Split PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 535a2236..57ea05a1 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Datei herunterladen settings.zipThreshold=Dateien komprimieren, wenn die Anzahl der heruntergeladenen Dateien überschritten wird settings.signOut=Abmelden settings.accountSettings=Kontoeinstellungen - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Anmeldeinformationen ändern changeCreds.header=Aktualisieren Sie Ihre Kontodaten @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Anzahl vertikaler Teiler eingeben split-by-sections.submit=PDF teilen split-by-sections.merge=In eine PDF zusammenfügen + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Lizenzen licenses.title=Lizenzen von Drittanbietern diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 5168a1a8..dac14ac7 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Λήψη αρχείου settings.zipThreshold=Αρχεία Zip όταν ο αριθμός των ληφθέντων αρχείων είναι πολύ μεγάλος settings.signOut=Αποσύνδεση settings.accountSettings=Ρυθμίσεις Λογαριασμού - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Αλλαγή Διαπιστευτηρίων changeCreds.header=Ενημέρωση των λεπτομερειών του Λογαριασμού σας @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Εισαγάγετε τον αριθμό split-by-sections.submit=Διαχωρισμός PDF split-by-sections.merge=Συγχώνευση σε ένα PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Άδειες licenses.title=3rd Party Άδειες diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index d35476bd..bae8f923 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Download file settings.zipThreshold=Zip files when the number of downloaded files exceeds settings.signOut=Sign Out settings.accountSettings=Account Settings - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Change Credentials changeCreds.header=Update Your Account Details @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.submit=Split PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 78e19201..1126d0ce 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Download file settings.zipThreshold=Zip files when the number of downloaded files exceeds settings.signOut=Sign Out settings.accountSettings=Account Settings - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Change Credentials changeCreds.header=Update Your Account Details @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.submit=Split PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index dd779cbc..0da4273f 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Descargar el archivo settings.zipThreshold=Archivos ZIP cuando excede el número de archivos descargados settings.signOut=Desconectar settings.accountSettings=Configuración de la cuenta - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Cambiar Credenciales changeCreds.header=Actualice los detalles de su cuenta @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Introduzca el número de divisiones verti split-by-sections.submit=Dividir PDF split-by-sections.merge=Unir en Un PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licencias licenses.title=Licencias de terceros diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index a2c515b5..ec20aa7f 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Deskargatu fitxategia settings.zipThreshold=ZIP fitxategiak deskargatutako fitxategi kopurua gainditzen denean settings.signOut=Saioa itxi settings.accountSettings=Kontuaren ezarpenak - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Change Credentials changeCreds.header=Update Your Account Details @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.submit=Split PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index e682f2db..23578dcc 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Télécharger le fichier settings.zipThreshold=Compresser les fichiers en ZIP lorsque le nombre de fichiers téléchargés dépasse settings.signOut=Déconnexion settings.accountSettings=Paramètres du compte - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Modifiez vos identifiants changeCreds.header=Mettez à jour vos identifiants de connexion @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Entrer le nombre de divisions verticales split-by-sections.submit=Diviser le PDF split-by-sections.merge=Fusionner en un seul PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licences licenses.title=Licences tierces diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 9a50fc77..898e223f 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=फ़ाइल डाउनलोड करें settings.zipThreshold=जब डाउनलोड की गई फ़ाइलों की संख्या सीमा से अधिक हो settings.signOut=साइन आउट settings.accountSettings=खाता सेटिंग्स - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=क्रेडेंशियल बदलें changeCreds.header=अपना खाता विवरण अपडेट करें @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=लंबवत विभाजन की split-by-sections.submit=PDF को विभाजित करें split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index f8621054..03f7f2b3 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Töltse le a fájlt settings.zipThreshold=Fájlok tömörítése, ha a letöltött fájlok száma meghaladja settings.signOut=Kijelentkezés settings.accountSettings=Fiókbeállítások - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Hitelesítés megváltoztatása changeCreds.header=Frissítse fiókadatait @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Adja meg a függőleges szakaszok számá split-by-sections.submit=Felosztás split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 6286bf9d..697bb17b 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Unduh berkas settings.zipThreshold=Berkas zip ketika jumlah berkas yang diunduh melebihi settings.signOut=Keluar settings.accountSettings=Pengaturan Akun - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Ubah Kredensial changeCreds.header=Perbarui Detail Akun Anda @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Input angka untuk pembagian vertikal split-by-sections.submit=Pisahkan PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index a7223018..a913d534 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Scarica file settings.zipThreshold=Comprimi file in .zip quando il numero di download supera settings.signOut=Logout settings.accountSettings=Impostazioni Account - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Cambia credenziali changeCreds.header=Aggiorna i dettagli del tuo account @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Inserire il numero di divisioni verticali split-by-sections.submit=Dividi PDF split-by-sections.merge=Unisci in un unico PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenze licenses.title=Licenze di terze parti diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index c29686ab..b4260c5a 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=ファイルをダウンロード settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する settings.signOut=サインアウト settings.accountSettings=アカウント設定 - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=資格情報の変更 changeCreds.header=アカウントの詳細を更新する @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=垂直方向の分割数を選択 split-by-sections.submit=分割 split-by-sections.merge=1 つの PDF に結合するかどうか + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=ライセンス licenses.title=サードパーティライセンス diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 9438da61..d78d7159 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=다운로드 settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기 settings.signOut=로그아웃 settings.accountSettings=계정 설정 - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=계정 정보 변경 changeCreds.header=계정 정보 업데이트 @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=수직 분할 수를 입력합니다 split-by-sections.submit=PDF 분할 split-by-sections.merge=하나의 PDF로 병합 + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=라이센스 licenses.title=제3자 라이선스 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index d2b6fec3..38bdfdf0 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Download bestand settings.zipThreshold=Bestanden zippen wanneer het aantal gedownloade bestanden meer is dan settings.signOut=Uitloggen settings.accountSettings=Account instellingen - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Inloggegevens wijzigen changeCreds.header=Werk je accountgegevens bij @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Voer het aantal verticale secties in split-by-sections.submit=PDF splitsen split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenties licenses.title=Licenties van derden diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index b9dffda4..7f72cc23 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Pobierz plik settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy settings.signOut=Sign Out settings.accountSettings=Account Settings - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Change Credentials changeCreds.header=Update Your Account Details @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.submit=Split PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index a9845e38..5a8d3d1f 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=⇬ Fazer download do arquivo settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados exceder settings.signOut=Sign Out settings.accountSettings=Account Settings - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Change Credentials changeCreds.header=Update Your Account Details @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.submit=Split PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 03a37c0c..4abeed7f 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=⇬ Fazer download do ficheiro settings.zipThreshold=Compactar ficheiros quando o número de ficheiros baixados exceder settings.signOut=Terminar Sessão settings.accountSettings=Configuração de Conta - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Alterar senha changeCreds.header=Alterar dados da sua conta @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Introduza o número de divisões verticai split-by-sections.submit=Dividir PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenças licenses.title=Licenças de terceiros diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 15e72483..7edcc2d2 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Descarcă fișierul settings.zipThreshold=Împachetează fișierele când numărul de fișiere descărcate depășește settings.signOut=Sign Out settings.accountSettings=Account Settings - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Change Credentials changeCreds.header=Update Your Account Details @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.submit=Split PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index d96b2e43..b0d5cfc7 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Загрузить файл settings.zipThreshold=Zip-файлы, когда количество загруженных файлов превышает settings.signOut=Выйти settings.accountSettings=Настройки аккаунта - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Изменить учетные данные changeCreds.header=Обновите данные вашей учетной записи @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Введите количество ве split-by-sections.submit=Разделить PDF split-by-sections.merge=Объединить в один PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Лицензии licenses.title=Лицензии от третьих сторон diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 0c5911b4..db5499bc 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Preuzmi fajl settings.zipThreshold=Zipuj fajlove kada pređe broj preuzetih fajlova settings.signOut=Odjava settings.accountSettings=Podešavanja naloga - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Promeni pristupne podatke changeCreds.header=Ažurirajte detalje svog naloga @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Unesite broj vertikalnih podele split-by-sections.submit=Razdvoji PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index b27577c8..a5d7e5f2 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Ladda ner fil settings.zipThreshold=Zip-filer när antalet nedladdade filer överskrider settings.signOut=Sign Out settings.accountSettings=Account Settings - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Change Credentials changeCreds.header=Update Your Account Details @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.submit=Split PDF split-by-sections.merge=Merge Into One PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 1320dcc9..bf79403d 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=Dosyayı indir settings.zipThreshold=İndirilen dosya sayısı şu değeri aştığında zip dosyası oluştur: settings.signOut=Oturumu Kapat settings.accountSettings=Hesap Ayarları - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Giriş Bilgilerini Değiştir changeCreds.header=Hesap Detaylarınızı Güncelleyin @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Dikey bölme sayısını girin split-by-sections.submit=PDF'yi Böl split-by-sections.merge=Bir PDF'de Birleştirin + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Lisanslar licenses.title=3. Taraf Lisansları diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index e6ca925f..8016ebd7 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr = left to right, rtl = right to left) +# the direction that the language is written (ltr=left to right, rtl = right to left) language.direction=ltr pdfPrompt=Оберіть PDF(и) @@ -120,8 +120,9 @@ settings.downloadOption.3=Завантажити файл settings.zipThreshold=Zip-файли, коли кількість завантажених файлів перевищує settings.signOut=Вийти settings.accountSettings=Налаштування акаунта - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=Змінити облікові дані changeCreds.header=Оновіть дані вашого облікового запису @@ -132,6 +133,8 @@ changeCreds.newPassword=Новий пароль changeCreds.confirmNewPassword=Підтвердіть новий пароль changeCreds.submit=Надіслати зміни + + account.title=Налаштування акаунта account.accountSettings=Налаштування акаунта account.adminSettings=Налаштування адміністратора - Перегляд і додавання користувачів @@ -152,6 +155,7 @@ account.webBrowserSettings=Налаштування веб-браузера account.syncToBrowser=Синхронізувати обліковий запис -> Браузер account.syncToAccount=Синхронізувати обліковий запис <- Браузер + adminUserSettings.title=Налаштування контролю користувача adminUserSettings.header=Налаштування контролю користувача адміністратора adminUserSettings.admin=Адміністратор @@ -244,12 +248,10 @@ home.changeMetadata.title=Змінити метадані home.changeMetadata.desc=Змінити/видалити/додати метадані з документа PDF changeMetadata.tags=Title,author,date,creation,time,publisher,producer,stats - home.fileToPDF.title=Конвертувати файл в PDF home.fileToPDF.desc=Конвертуйте майже будь-який файл в PDF (DOCX, PNG, XLS, PPT, TXT та інші) fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - home.ocr.title=OCR/Очищення сканування home.ocr.desc=Очищення сканування та виявлення тексту на зображеннях у файлі PDF та повторне додавання його як текст. ocr.tags=recognition,text,image,scan,read,identify,detection,editable @@ -403,12 +405,10 @@ home.overlay-pdfs.title=Накладення PDF home.overlay-pdfs.desc=Накладення одного PDF поверх іншого PDF overlay-pdfs.tags=Overlay - home.split-by-sections.title=Розділення PDF за секціями home.split-by-sections.desc=Розділення кожної сторінки PDF на менші горизонтальні та вертикальні секції split-by-sections.tags=Section Split, Divide, Customize - home.AddStampRequest.title=Додати печатку на PDF home.AddStampRequest.desc=Додавання текстової або зображення печатки у вказані місця AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize @@ -418,11 +418,11 @@ home.PDFToBook.title=PDF у книгу/комікс home.PDFToBook.desc=Конвертує PDF у формат книги/комікса за допомогою calibre PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle - home.BookToPDF.title=Книга у PDF home.BookToPDF.desc=Конвертує формати книги/комікса у PDF за допомогою calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle + ########################### # # # WEB PAGES # @@ -606,6 +606,7 @@ pageLayout.pagesPerSheet=Сторінок на одному аркуші: pageLayout.addBorder=Додати рамки pageLayout.submit=Відправити + #scalePages scalePages.title=Відрегулювати масштаб сторінки scalePages.header=Відрегулювати масштаб сторінки @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=Введіть кількість вер split-by-sections.submit=Розділити PDF split-by-sections.merge=Об'єднати в один PDF + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=Ліцензії licenses.title=Ліцензії від третіх сторін diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index c3fee992..f1fb4ced 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=下载文件 settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。 settings.signOut=登出 settings.accountSettings=帐号设定 - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=更改凭证 changeCreds.header=更新您的账户详情 @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=输入垂直分割数 split-by-sections.submit=分割PDF split-by-sections.merge=是否合并为一个pdf + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=许可证 licenses.title=第三方许可证 diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index db9a3c78..b2d09e10 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -120,8 +120,9 @@ settings.downloadOption.3=下載檔案 settings.zipThreshold=當下載的檔案數量超過時,壓縮檔案 settings.signOut=登出 settings.accountSettings=帳戶設定 - - +settings.bored.help=Enables easter egg game +settings.cacheInputs.name=Save form inputs +settings.cacheInputs.help=Enable to store previously used inputs for future runs changeCreds.title=變更憑證 changeCreds.header=更新您的帳戶詳細資訊 @@ -1022,6 +1023,15 @@ split-by-sections.vertical.placeholder=輸入垂直劃分的數量 split-by-sections.submit=分割 PDF split-by-sections.merge=是否合併為一個pdf + +#printFile +printFile.title=Print File +printFile.header=Print File to Printer +printFile.selectText.1=Select File to Print +printFile.selectText.2=Enter Printer Name +printFile.submit=Print + + #licenses licenses.nav=許可證 licenses.title=第三方許可證 diff --git a/src/main/resources/static/js/cacheFormInputs.js b/src/main/resources/static/js/cacheFormInputs.js new file mode 100644 index 00000000..e61b4449 --- /dev/null +++ b/src/main/resources/static/js/cacheFormInputs.js @@ -0,0 +1,82 @@ +document.addEventListener("DOMContentLoaded", function() { + + var cacheInputs = localStorage.getItem("cacheInputs") || "disabled"; + if (cacheInputs !== "enabled") { + return; // Stop execution if caching is not enabled + } + + // Function to generate a key based on the form's action attribute + function generateStorageKey(form) { + const action = form.getAttribute('action'); + if (!action || action.length < 3) { + return null; // Not a valid action, return null to skip processing + } + return 'formData_' + encodeURIComponent(action); + } + + // Function to save form data to localStorage + function saveFormData(form) { + const formKey = generateStorageKey(form); + if (!formKey) return; // Skip if no valid key + + const formData = {}; + const elements = form.elements; + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + // Skip elements without names, passwords, files, hidden fields, and submit/reset buttons + if (!element.name || + element.type === 'password' || + element.type === 'file' || + //element.type === 'hidden' || + element.type === 'submit' || + element.type === 'reset') { + continue; + } + // Handle checkboxes: store only if checked + if (element.type === 'checkbox') { + if (element.checked) { + formData[element.name] = element.value; + } else { + continue; // Skip unchecked boxes + } + } else { + // Skip saving empty values + if (element.value === "" || element.value == null) { + continue; + } + formData[element.name] = element.value; + } + } + localStorage.setItem(formKey, JSON.stringify(formData)); + } + + // Function to load form data from localStorage + function loadFormData(form) { + const formKey = generateStorageKey(form); + if (!formKey) return; // Skip if no valid key + + const savedData = localStorage.getItem(formKey); + if (savedData) { + const formData = JSON.parse(savedData); + for (const key in formData) { + if (formData.hasOwnProperty(key) && form.elements[key]) { + const element = form.elements[key]; + if (element.type === 'checkbox') { + element.checked = true; + } else { + element.value = formData[key]; + } + } + } + } + } + + // Attach event listeners and load data for all forms + const forms = document.querySelectorAll('form'); + forms.forEach(form => { + form.addEventListener('submit', function(event) { + saveFormData(form); + }); + loadFormData(form); + }); +}); diff --git a/src/main/resources/static/js/settings.js b/src/main/resources/static/js/settings.js index 77a55a3f..8f6289af 100644 --- a/src/main/resources/static/js/settings.js +++ b/src/main/resources/static/js/settings.js @@ -31,3 +31,12 @@ document.getElementById("boredWaiting").addEventListener("change", function () { boredWaiting = this.checked ? "enabled" : "disabled"; localStorage.setItem("boredWaiting", boredWaiting); }); + +var cacheInputs = localStorage.getItem("cacheInputs") || "disabled"; +document.getElementById("cacheInputs").checked = cacheInputs === "enabled"; + +document.getElementById("cacheInputs").addEventListener("change", function () { + cacheInputs = this.checked ? "enabled" : "disabled"; + localStorage.setItem("cacheInputs", cacheInputs); +}); + diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html index 98bf27e9..3d6cc9fd 100644 --- a/src/main/resources/templates/fragments/common.html +++ b/src/main/resources/templates/fragments/common.html @@ -60,7 +60,7 @@ - + diff --git a/src/main/resources/templates/fragments/navbar.html b/src/main/resources/templates/fragments/navbar.html index c2a8ec26..09b833dd 100644 --- a/src/main/resources/templates/fragments/navbar.html +++ b/src/main/resources/templates/fragments/navbar.html @@ -210,9 +210,13 @@
- +
+
+ + +
Account Settings - \ No newline at end of file + From e74a8e434b1dd8f7a3c68cd42f03d13f7584a7a0 Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Sun, 21 Apr 2024 10:16:05 +0200 Subject: [PATCH 22/59] Update messages_it_IT.properties (#1096) --- src/main/resources/messages_it_IT.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index a913d534..7b14e61f 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -120,9 +120,9 @@ settings.downloadOption.3=Scarica file settings.zipThreshold=Comprimi file in .zip quando il numero di download supera settings.signOut=Logout settings.accountSettings=Impostazioni Account -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.bored.help=Abilita easter egg game +settings.cacheInputs.name=Salva gli input del modulo +settings.cacheInputs.help=Abilitare per memorizzare gli input utilizzati in precedenza per esecuzioni future changeCreds.title=Cambia credenziali changeCreds.header=Aggiorna i dettagli del tuo account @@ -1025,11 +1025,11 @@ split-by-sections.merge=Unisci in un unico PDF #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=Stampa file +printFile.header=Stampa file su stampante +printFile.selectText.1=Seleziona file da stampare +printFile.selectText.2=Inserire il nome della stampante +printFile.submit=Stampare #licenses From a5000fbbc56ab253494f928cb4836873fcef2287 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sun, 21 Apr 2024 13:15:18 +0200 Subject: [PATCH 23/59] UI: settings show/hide update display (#1072) * UI: settings show/hide update display This PR replaces the PR #1003 In this PR, the visual for available update is added to the foreground. There are new settings to generally show/hide the update display, and only administrators receive the update display. * change to `Bean` * Update AppUpdateShowService.java * add update message * revision service * change shouldShow * Update githubVersion.js * rm folder * Update AppUpdateService.java --- README.md | 2 + .../SPDF/config/AppUpdateService.java | 25 ++++++++++ .../SPDF/config/ShowAdminInterface.java | 7 +++ .../config/security/AppUpdateAuthService.java | 46 +++++++++++++++++++ .../controller/web/OtherWebController.java | 1 + .../SPDF/model/ApplicationProperties.java | 22 +++++++++ src/main/resources/messages_ar_AR.properties | 1 + src/main/resources/messages_bg_BG.properties | 1 + src/main/resources/messages_ca_CA.properties | 1 + src/main/resources/messages_de_DE.properties | 1 + src/main/resources/messages_el_GR.properties | 1 + src/main/resources/messages_en_GB.properties | 1 + src/main/resources/messages_en_US.properties | 1 + src/main/resources/messages_es_ES.properties | 1 + src/main/resources/messages_eu_ES.properties | 1 + src/main/resources/messages_fr_FR.properties | 1 + src/main/resources/messages_hi_IN.properties | 1 + src/main/resources/messages_hu_HU.properties | 1 + src/main/resources/messages_id_ID.properties | 1 + src/main/resources/messages_it_IT.properties | 1 + src/main/resources/messages_ja_JP.properties | 1 + src/main/resources/messages_ko_KR.properties | 1 + src/main/resources/messages_nl_NL.properties | 1 + src/main/resources/messages_pl_PL.properties | 1 + src/main/resources/messages_pt_BR.properties | 1 + src/main/resources/messages_pt_PT.properties | 1 + src/main/resources/messages_ro_RO.properties | 1 + src/main/resources/messages_ru_RU.properties | 1 + .../resources/messages_sr_LATN_RS.properties | 1 + src/main/resources/messages_sv_SE.properties | 1 + src/main/resources/messages_tr_TR.properties | 1 + src/main/resources/messages_uk_UA.properties | 1 + src/main/resources/messages_zh_CN.properties | 1 + src/main/resources/messages_zh_TW.properties | 1 + src/main/resources/settings.yml.template | 4 +- src/main/resources/static/css/home.css | 35 ++++++++++++++ src/main/resources/static/images/update.svg | 1 + src/main/resources/static/js/githubVersion.js | 24 +++++++++- src/main/resources/static/js/homecard.js | 6 +++ .../resources/templates/fragments/navbar.html | 5 +- src/main/resources/templates/home.html | 9 ++++ 41 files changed, 210 insertions(+), 5 deletions(-) create mode 100644 src/main/java/stirling/software/SPDF/config/AppUpdateService.java create mode 100644 src/main/java/stirling/software/SPDF/config/ShowAdminInterface.java create mode 100644 src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java create mode 100644 src/main/resources/static/images/update.svg diff --git a/README.md b/README.md index d7d2e1aa..5249e3cc 100644 --- a/README.md +++ b/README.md @@ -225,6 +225,8 @@ system: defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow customStaticFilePath: '/customFiles/static/' # Directory path for custom static files + showUpdate: true # see when a new update is available + showUpdateOnlyAdmin: false # Only admins can see when a new update is available, depending on showUpdate it must be set to 'true' #ui: # appName: exampleAppName # Application's visible name diff --git a/src/main/java/stirling/software/SPDF/config/AppUpdateService.java b/src/main/java/stirling/software/SPDF/config/AppUpdateService.java new file mode 100644 index 00000000..7c7a9a49 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/AppUpdateService.java @@ -0,0 +1,25 @@ +package stirling.software.SPDF.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; + +import stirling.software.SPDF.model.ApplicationProperties; + +@Service +class AppUpdateService { + + @Autowired private ApplicationProperties applicationProperties; + + @Autowired(required = false) + ShowAdminInterface showAdmin; + + @Bean(name = "shouldShow") + @Scope("request") + public boolean shouldShow() { + boolean showUpdate = applicationProperties.getSystem().getShowUpdate(); + boolean showAdminResult = (showAdmin != null) ? showAdmin.getShowUpdateOnlyAdmins() : true; + return showUpdate && showAdminResult; + } +} diff --git a/src/main/java/stirling/software/SPDF/config/ShowAdminInterface.java b/src/main/java/stirling/software/SPDF/config/ShowAdminInterface.java new file mode 100644 index 00000000..e49376e2 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/ShowAdminInterface.java @@ -0,0 +1,7 @@ +package stirling.software.SPDF.config; + +public interface ShowAdminInterface { + default boolean getShowUpdateOnlyAdmins() { + return true; + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java b/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java new file mode 100644 index 00000000..0da07c61 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java @@ -0,0 +1,46 @@ +package stirling.software.SPDF.config.security; + +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +import stirling.software.SPDF.config.ShowAdminInterface; +import stirling.software.SPDF.model.ApplicationProperties; +import stirling.software.SPDF.model.User; +import stirling.software.SPDF.repository.UserRepository; + +@Service +class AppUpdateAuthService implements ShowAdminInterface { + + @Autowired private UserRepository userRepository; + @Autowired private ApplicationProperties applicationProperties; + + public boolean getShowUpdateOnlyAdmins() { + boolean showUpdate = applicationProperties.getSystem().getShowUpdate(); + if (!showUpdate) { + return showUpdate; + } + + boolean showUpdateOnlyAdmin = applicationProperties.getSystem().getShowUpdateOnlyAdmin(); + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication == null || !authentication.isAuthenticated()) { + return !showUpdateOnlyAdmin; + } + + if (authentication.getName().equalsIgnoreCase("anonymousUser")) { + return !showUpdateOnlyAdmin; + } + + Optional user = userRepository.findByUsername(authentication.getName()); + if (user.isPresent() && showUpdateOnlyAdmin) { + return "ROLE_ADMIN".equals(user.get().getRolesAsString()); + } + + return showUpdate; + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java index b93a89e4..b373d17a 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java @@ -17,6 +17,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; @Controller @Tag(name = "Misc", description = "Miscellaneous APIs") public class OtherWebController { + @GetMapping("/compress-pdf") @Hidden public String compressPdfForm(Model model) { diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index a41d641c..1a2aeaec 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -210,6 +210,24 @@ public class ApplicationProperties { private String rootURIPath; private String customStaticFilePath; private Integer maxFileSize; + private boolean showUpdate; + private Boolean showUpdateOnlyAdmin; + + public boolean getShowUpdateOnlyAdmin() { + return showUpdateOnlyAdmin; + } + + public void setShowUpdateOnlyAdmin(boolean showUpdateOnlyAdmin) { + this.showUpdateOnlyAdmin = showUpdateOnlyAdmin; + } + + public boolean getShowUpdate() { + return showUpdate; + } + + public void setShowUpdate(boolean showUpdate) { + this.showUpdate = showUpdate; + } private Boolean enableAlphaFunctionality; @@ -275,6 +293,10 @@ public class ApplicationProperties { + maxFileSize + ", enableAlphaFunctionality=" + enableAlphaFunctionality + + ", showUpdate=" + + showUpdate + + ", showUpdateOnlyAdmin=" + + showUpdateOnlyAdmin + "]"; } } diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 44329a7b..ac90792a 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -112,6 +112,7 @@ navbar.settings=إعدادات ############# settings.title=الإعدادات settings.update=التحديث متاح +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=إصدار التطبيق: settings.downloadOption.title=تحديد خيار التنزيل (للتنزيلات ذات الملف الواحد غير المضغوط): settings.downloadOption.1=فتح في نفس النافذة diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 71983955..6262d46d 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -112,6 +112,7 @@ navbar.settings=Настройки ############# settings.title=Настройки settings.update=Налична актуализация +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Версия на приложението: settings.downloadOption.title=Изберете опция за изтегляне (за изтегляния на един файл без да е архивиран): settings.downloadOption.1=Отваряне в същия прозорец diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 1c5fcea3..6071b16b 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -112,6 +112,7 @@ navbar.settings=Opcions ############# settings.title=Opcions settings.update=Actualització Disponible +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Versió App: settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no zip): settings.downloadOption.1=Obre mateixa finestra diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 57ea05a1..729597be 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -112,6 +112,7 @@ navbar.settings=Einstellungen ############# settings.title=Einstellungen settings.update=Update verfügbar +settings.updateAvailable={0} ist die aktuelle installierte Version. Eine neue Version ({1}) ist verfügbar. settings.appVersion=App-Version: settings.downloadOption.title=Download-Option wählen (für einzelne Dateien, die keine Zip-Downloads sind): settings.downloadOption.1=Im selben Fenster öffnen diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index dac14ac7..93ab31e2 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -112,6 +112,7 @@ navbar.settings=Ρυθμίσεις ############# settings.title=Ρυθμίσεις settings.update=Υπάρχει διαθέσιμη ενημέρωση +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Έκδοση εφαρμογής: settings.downloadOption.title=Επιλέξετε την επιλογή λήψης (Για λήψεις μεμονωμένων αρχείων χωρίς zip): settings.downloadOption.1=Άνοιγμα στο ίδιο παράθυρο diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index bae8f923..30bcb9fd 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -112,6 +112,7 @@ navbar.settings=Settings ############# settings.title=Settings settings.update=Update available +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=App Version: settings.downloadOption.title=Choose download option (For single file non zip downloads): settings.downloadOption.1=Open in same window diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 1126d0ce..3f0c7afb 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -112,6 +112,7 @@ navbar.settings=Settings ############# settings.title=Settings settings.update=Update available +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=App Version: settings.downloadOption.title=Choose download option (For single file non zip downloads): settings.downloadOption.1=Open in same window diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 0da4273f..bdb42a94 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -112,6 +112,7 @@ navbar.settings=Configuración ############# settings.title=Configuración settings.update=Actualización disponible +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Versión de la aplicación: settings.downloadOption.title=Elegir la opción de descarga (para descargas de un solo archivo sin ZIP): settings.downloadOption.1=Abrir en la misma ventana diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index ec20aa7f..1f8f6b6d 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -112,6 +112,7 @@ navbar.settings=Ezarpenak ############# settings.title=Ezarpenak settings.update=Eguneratze eskuragarria +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Aplikazioaren bertsioa: settings.downloadOption.title=Hautatu deskargatzeko aukera (fitxategi bakarra deskargatzeko ZIP gabe): settings.downloadOption.1=Ireki leiho berean diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 23578dcc..3aa55d09 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -112,6 +112,7 @@ navbar.settings=Paramètres ############# settings.title=Paramètres settings.update=Mise à jour disponible +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Version de l’application : settings.downloadOption.title=Choisissez l’option de téléchargement (pour les téléchargements à fichier unique non ZIP) : settings.downloadOption.1=Ouvrir dans la même fenêtre diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 898e223f..b660d678 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -112,6 +112,7 @@ navbar.settings=सेटिंग्स ############# settings.title=सेटिंग्स settings.update=अपडेट उपलब्ध है +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=ऐप संस्करण: settings.downloadOption.title=डाउनलोड विकल्प चुनें (एकल फ़ाइल गैर-ज़िप डाउनलोड के लिए): settings.downloadOption.1=एक ही विंडो में खोलें diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 03f7f2b3..c9a4957b 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -112,6 +112,7 @@ navbar.settings=Beállítások ############# settings.title=Beállítások settings.update=Frisítés elérhető +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=App Verzió: settings.downloadOption.title=Válassza ki a letöltési lehetőséget (Egyetlen fájl esetén a nem tömörített letöltésekhez): settings.downloadOption.1=Nyissa meg ugyanabban az ablakban diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 697bb17b..3cbcc872 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -112,6 +112,7 @@ navbar.settings=Pengaturan ############# settings.title=Pengaturan settings.update=Pembaruan tersedia +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Versi Aplikasi: settings.downloadOption.title=Pilih opsi unduhan (Untuk unduhan berkas tunggal non zip): settings.downloadOption.1=Buka di jendela yang sama diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 7b14e61f..140a27f7 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -112,6 +112,7 @@ navbar.settings=Impostazioni ############# settings.title=Impostazioni settings.update=Aggiornamento disponibile +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Versione App: settings.downloadOption.title=Scegli opzione di download (Per file singoli non compressi): settings.downloadOption.1=Apri in questa finestra diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index b4260c5a..fed17883 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -112,6 +112,7 @@ navbar.settings=設定 ############# settings.title=設定 settings.update=利用可能なアップデート +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Appバージョン: settings.downloadOption.title=ダウンロードオプション (zip以外の単一ファイル): settings.downloadOption.1=同じウィンドウで開く diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index d78d7159..3b1d3441 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -112,6 +112,7 @@ navbar.settings=설정 ############# settings.title=설정 settings.update=업데이트 가능 +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=앱 버전: settings.downloadOption.title=다운로드 옵션 선택 (zip 파일이 아닌 단일 파일 다운로드 시): settings.downloadOption.1=현재 창에서 열기 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index 38bdfdf0..e5668210 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -112,6 +112,7 @@ navbar.settings=Instellingen ############# settings.title=Instellingen settings.update=Update beschikbaar +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=App versie: settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddownloads zonder zip): settings.downloadOption.1=Open in hetzelfde venster diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 7f72cc23..c94f72cb 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -112,6 +112,7 @@ navbar.settings=Ustawienia ############# settings.title=Ustawienia settings.update=Dostępna aktualizacja +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Wersia aplikacji: settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP): settings.downloadOption.1=Otwórz w tym samym oknie diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index 5a8d3d1f..b03402be 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -112,6 +112,7 @@ navbar.settings=Configurações ############# settings.title=Configurações settings.update=Atualização disponível +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Versão do aplicativo: settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de arquivo único): settings.downloadOption.1=Abrir na mesma janela diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 4abeed7f..c1662afe 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -112,6 +112,7 @@ navbar.settings=Configurações ############# settings.title=Configurações settings.update=Atualização disponível +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Versão da aplicação: settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de ficheiro único): settings.downloadOption.1=Abrir na mesma janela diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 7edcc2d2..949f34cf 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -112,6 +112,7 @@ navbar.settings=Setări ############# settings.title=Setări settings.update=Actualizare disponibilă +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Versiune aplicație: settings.downloadOption.title=Alege opțiunea de descărcare (pentru descărcarea unui singur fișier non-zip): settings.downloadOption.1=Deschide în aceeași fereastră diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index b0d5cfc7..3d20fc0b 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -112,6 +112,7 @@ navbar.settings=Настройки ############# settings.title=Настройки settings.update=Доступно обновление +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Версия приложения: settings.downloadOption.title=Выберите вариант загрузки (для загрузки одного файла без zip): settings.downloadOption.1=Открыть в том же окне diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index db5499bc..7cdd2f24 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -112,6 +112,7 @@ navbar.settings=Podešavanja ############# settings.title=Podešavanja settings.update=Dostupno ažuriranje +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Verzija aplikacije: settings.downloadOption.title=Odaberite opciju preuzimanja (Za preuzimanje pojedinačnih fajlova bez zip formata): settings.downloadOption.1=Otvori u istom prozoru diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index a5d7e5f2..afa34270 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -112,6 +112,7 @@ navbar.settings=Inställningar ############# settings.title=Inställningar settings.update=Uppdatering tillgänglig +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Appversion: settings.downloadOption.title=Välj nedladdningsalternativ (för nedladdning av en fil utan zip): settings.downloadOption.1=Öppnas i samma fönster diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index cb7cbb07..2ec0bd6b 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -112,6 +112,7 @@ navbar.settings=Ayarlar ############# settings.title=Ayarlar settings.update=Güncelleme mevcut +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Uygulama Sürümü: settings.downloadOption.title=İndirme seçeneği seçin (Zip olmayan tek dosya indirmeler için): settings.downloadOption.1=Aynı pencerede aç diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 8016ebd7..8a77d064 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -112,6 +112,7 @@ navbar.settings=Налаштування ############# settings.title=Налаштування settings.update=Доступне оновлення +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=Версія додатку: settings.downloadOption.title=Виберіть варіант завантаження (для завантаження одного файлу без zip): settings.downloadOption.1=Відкрити в тому ж вікні diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index f1fb4ced..f10f3930 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -112,6 +112,7 @@ navbar.settings=设置 ############# settings.title=设置 settings.update=可更新 +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=应用程序版本: settings.downloadOption.title=选择下载选项(单个文件非压缩文件): settings.downloadOption.1=在同一窗口打开 diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index b2d09e10..c2cfbadb 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -112,6 +112,7 @@ navbar.settings=設定 ############# settings.title=設定 settings.update=有更新可用 +settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. settings.appVersion=應用版本: settings.downloadOption.title=選擇下載選項(對於單一檔案非壓縮下載): settings.downloadOption.1=在同一視窗中開啟 diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 0a326e17..b3d6e954 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -12,7 +12,9 @@ system: defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow enableAlphaFunctionality: false # Set to enable functionality which might need more testing before it fully goes live (This feature might make no changes) - + showUpdate: true # see when a new update is available + showUpdateOnlyAdmin: false # Only admins can see when a new update is available, depending on showUpdate it must be set to 'true' + #ui: # appName: exampleAppName # Application's visible name # homeDescription: I am a description # Short description or tagline shown on homepage. diff --git a/src/main/resources/static/css/home.css b/src/main/resources/static/css/home.css index d975dd79..ff8d1cf7 100644 --- a/src/main/resources/static/css/home.css +++ b/src/main/resources/static/css/home.css @@ -89,3 +89,38 @@ .jumbotron { padding: 3rem 3rem; /* Reduce vertical padding */ } + +.lookatme { + opacity: 1; + position: relative; + display: inline-block; +} + +.lookatme::after { + color: #e33100; + text-shadow: 0 0 5px #e33100; + /* in the html, the data-lookatme-text attribute must */ + /* contain the same text as the .lookatme element */ + content: attr(data-lookatme-text); + padding: inherit; + position: absolute; + inset: 0 0 0 0; + z-index: 1; + /* 20 steps / 2 seconds = 10fps */ + -webkit-animation: 2s infinite Pulse steps(20); + animation: 2s infinite Pulse steps(20); +} + +@keyframes Pulse { + from { + opacity: 0; + } + + 50% { + opacity: 1; + } + + to { + opacity: 0; + } +} diff --git a/src/main/resources/static/images/update.svg b/src/main/resources/static/images/update.svg new file mode 100644 index 00000000..3edc4c67 --- /dev/null +++ b/src/main/resources/static/images/update.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/resources/static/js/githubVersion.js b/src/main/resources/static/js/githubVersion.js index e17524d5..b312fd85 100644 --- a/src/main/resources/static/js/githubVersion.js +++ b/src/main/resources/static/js/githubVersion.js @@ -30,19 +30,39 @@ async function getLatestReleaseVersion() { async function checkForUpdate() { // Initialize the update button as hidden - var updateBtn = document.getElementById("update-btn"); + var updateBtn = document.getElementById("update-btn") || null; + var updateLink = document.getElementById("update-link") || null; if (updateBtn !== null) { updateBtn.style.display = "none"; } + if (updateLink !== null) { + console.log("hidden!"); + if (!updateLink.classList.contains("visually-hidden")) { + updateLink.classList.add("visually-hidden"); + } + } const latestVersion = await getLatestReleaseVersion(); console.log("latestVersion=" + latestVersion); console.log("currentVersion=" + currentVersion); console.log("compareVersions(latestVersion, currentVersion) > 0)=" + compareVersions(latestVersion, currentVersion)); if (latestVersion && compareVersions(latestVersion, currentVersion) > 0) { - document.getElementById("update-btn").style.display = "block"; + if (updateBtn != null) { + document.getElementById("update-btn").style.display = "block"; + } + if (updateLink !== null) { + document.getElementById("app-update").innerHTML = updateAvailable.replace("{0}", '' + currentVersion + '').replace("{1}", '' + latestVersion + ''); + if (updateLink.classList.contains("visually-hidden")) { + updateLink.classList.remove("visually-hidden"); + } + } console.log("visible"); } else { + if (updateLink !== null) { + if (!updateLink.classList.contains("visually-hidden")) { + updateLink.classList.add("visually-hidden"); + } + } console.log("hidden"); } } diff --git a/src/main/resources/static/js/homecard.js b/src/main/resources/static/js/homecard.js index 8ac2ef44..c461af3c 100644 --- a/src/main/resources/static/js/homecard.js +++ b/src/main/resources/static/js/homecard.js @@ -46,6 +46,12 @@ function reorderCards() { cards.sort(function (a, b) { var aIsFavorite = localStorage.getItem(a.id) === "favorite"; var bIsFavorite = localStorage.getItem(b.id) === "favorite"; + if (a.id === "update-link") { + return -1; + } + if (b.id === "update-link") { + return 1; + } if (aIsFavorite && !bIsFavorite) { return -1; } diff --git a/src/main/resources/templates/fragments/navbar.html b/src/main/resources/templates/fragments/navbar.html index 09b833dd..414ff51f 100644 --- a/src/main/resources/templates/fragments/navbar.html +++ b/src/main/resources/templates/fragments/navbar.html @@ -3,6 +3,7 @@